Statistics
| Revision:

root / trunk / org.gvsig.postgresql / org.gvsig.postgresql.provider / src / main / java / org / gvsig / postgresql / dal / operations / PostgreSQLFetchFeatureTypeOperation.java @ 364

History | View | Annotate | Download (8.7 KB)

1

    
2
package org.gvsig.postgresql.dal.operations;
3

    
4
import java.sql.Connection;
5
import java.sql.ResultSet;
6
import java.sql.ResultSetMetaData;
7
import java.sql.SQLException;
8
import java.sql.Statement;
9
import java.util.HashMap;
10
import java.util.List;
11
import java.util.Map;
12
import org.apache.commons.lang3.StringUtils;
13
import org.cresques.cts.IProjection;
14
import org.gvsig.fmap.dal.DataTypes;
15
import org.gvsig.fmap.dal.exception.DataException;
16
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.EditableFeatureType;
18
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
19
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
20
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
21
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
22
import org.gvsig.fmap.geom.Geometry;
23
import org.gvsig.fmap.geom.GeometryLocator;
24
import org.gvsig.fmap.geom.GeometryManager;
25
import org.gvsig.fmap.geom.type.GeometryType;
26

    
27
public class PostgreSQLFetchFeatureTypeOperation extends FetchFeatureTypeOperation {
28

    
29
    private static Map<String,GeometryType>databaseGeometryTypes = null;
30
    
31
    public PostgreSQLFetchFeatureTypeOperation(
32
            JDBCHelper helper
33
        ) {
34
        super(helper);
35
    }
36

    
37
    private GeometryType getGT(
38
            GeometryManager manager, 
39
            int type, 
40
            int subtype
41
        ) {
42
        try {
43
            return manager.getGeometryType(type, subtype);
44
        } catch (Exception ex) {
45
            return null;
46
        }
47
    }
48
    
49
    public PostgreSQLFetchFeatureTypeOperation(
50
            JDBCHelper helper,
51
            EditableFeatureType featureType,
52
            String dbname,
53
            String schema,
54
            String table,
55
            List<String> primaryKeys,
56
            String defaultGeometryColumn,
57
            IProjection crs
58
        ) {
59
        super(helper, featureType, dbname, schema, table, primaryKeys, defaultGeometryColumn, crs);
60
    }            
61

    
62
    @Override
63
    public void fetch(EditableFeatureType featureType, Connection conn, String dbname, String schema, String table, List<String> pks, String defaultGeometryColumn, IProjection crs) throws DataException {
64
        super.fetch(featureType, conn, dbname, schema, table, pks, defaultGeometryColumn, crs);
65
    }
66

    
67
    @Override
68
    protected int getDataTypeFromMetadata(
69
            ResultSetMetaData rsMetadata,
70
            int colIndex
71
        ) throws SQLException {
72

    
73
        return super.getDataTypeFromMetadata(rsMetadata, colIndex);
74
    }
75
        
76
    @Override
77
    protected void fetchGeometryTypeAndSRS(
78
            EditableFeatureAttributeDescriptor attr,
79
            ResultSetMetaData rsMetadata,
80
            int colIndex
81
        ) {
82
        if( attr.getType()!=DataTypes.GEOMETRY ) {
83
            return;
84
        }
85
        try {
86
            JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
87
            sqlbuilder.select().column().name("f_table_catalog");
88
            sqlbuilder.select().column().name("f_table_schema");
89
            sqlbuilder.select().column().name("f_table_name");
90
            sqlbuilder.select().column().name("f_geometry_column");
91
            sqlbuilder.select().column().name("coord_dimension");
92
            sqlbuilder.select().column().name("srid");
93
            sqlbuilder.select().column().name("type");
94
            sqlbuilder.select().where().set(
95
                    sqlbuilder.eq(
96
                            sqlbuilder.column("f_table_name"),
97
                            sqlbuilder.constant(this.getTablename())
98
                    )
99
            );                
100
            sqlbuilder.select().where().and(
101
                    sqlbuilder.eq(
102
                            sqlbuilder.column("f_geometry_column"),
103
                            sqlbuilder.constant(attr.getName())
104
                    )
105
            );         
106
            sqlbuilder.select().from().table().name("geometry_columns");
107
            Statement st = null;
108
            ResultSet rs = null;
109
            
110
            String srsid = null;
111
            String geometryTypeName = null;
112
            try {
113
                st = this.getConnection().createStatement();
114
                rs = JDBCUtils.executeQuery(st, sqlbuilder.toString());
115
                if (rs.next()) {
116
                    srsid = rs.getString("srid");
117
                    geometryTypeName = rs.getString("type");
118
                }
119
            } finally {
120
                JDBCUtils.closeQuietly(rs);
121
                JDBCUtils.closeQuietly(st);
122
            }
123
            if( !StringUtils.isEmpty(geometryTypeName) ) {
124
                GeometryType gt = getGeometryTypeFromDatabaseTypeName(geometryTypeName);
125
                attr.setGeometryType(gt);
126
            }
127
            if( !StringUtils.isEmpty(srsid) ) {
128
                attr.setSRS(this.helper.getProjectionFromDatabaseCode(srsid));
129
            }
130
        } catch (Exception ex) {
131
            logger.debug("Can't get geometry type and srs from column '"+attr.getName()+"'.",ex);
132
        }
133
    }
134

    
135
    private GeometryType getGeometryTypeFromDatabaseTypeName(String typeName) {
136
        if( databaseGeometryTypes==null ) {
137
            GeometryManager manager = GeometryLocator.getGeometryManager();
138
            databaseGeometryTypes = new HashMap<>();
139
            databaseGeometryTypes.put("POINT", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM2D));
140
            databaseGeometryTypes.put("POINTZ", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM3D));
141
            databaseGeometryTypes.put("POINTM", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM2DM));
142
            databaseGeometryTypes.put("POINTZM", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM3DM));
143
            
144
            databaseGeometryTypes.put("LINESTRING", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM2D));
145
            databaseGeometryTypes.put("LINESTRINGZ", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM3D));
146
            databaseGeometryTypes.put("LINESTRINGM", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM2DM));
147
            databaseGeometryTypes.put("LINESTRINGZM", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM3DM));
148
            
149
            databaseGeometryTypes.put("POLYGON", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM2D));
150
            databaseGeometryTypes.put("POLYGONZ", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM3D));
151
            databaseGeometryTypes.put("POLYGONM", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM2DM));
152
            databaseGeometryTypes.put("POLYGONZM", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM3DM));
153

    
154
            databaseGeometryTypes.put("MULTIPOINT", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM2D));
155
            databaseGeometryTypes.put("MULTIPOINTZ", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM3D));
156
            databaseGeometryTypes.put("MULTIPOINTM", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM2DM));
157
            databaseGeometryTypes.put("MULTIPOINTZM", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM3DM));
158

    
159
            databaseGeometryTypes.put("MULTILINESTRING", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM2D));
160
            databaseGeometryTypes.put("MULTILINESTRINGZ", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM3D));
161
            databaseGeometryTypes.put("MULTILINESTRINGM", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM2DM));
162
            databaseGeometryTypes.put("MULTILINESTRINGZM", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM3DM));
163

    
164
            databaseGeometryTypes.put("MULTIPOLYGON", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM2D));
165
            databaseGeometryTypes.put("MULTIPOLYGONZ", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM3D));
166
            databaseGeometryTypes.put("MULTIPOLYGONM", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM2DM));
167
            databaseGeometryTypes.put("MULTIPOLYGONZM", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM3DM));
168

    
169
            databaseGeometryTypes.put("GEOMETRY", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM2D));
170
            databaseGeometryTypes.put("GEOMETRYZ", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM3D));
171
            databaseGeometryTypes.put("GEOMETRYM", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM2DM));
172
            databaseGeometryTypes.put("GEOMETRYZM", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM3DM));
173
        }
174
        return databaseGeometryTypes.get(typeName);
175
    }
176
    
177
}