Statistics
| Revision:

gvsig-oracle / org.gvsig.oracle / trunk / org.gvsig.oracle / org.gvsig.oracle.provider / src / main / java / org / gvsig / oracle / dal / operations / OracleFetchFeatureTypeOperation.java @ 60

History | View | Annotate | Download (9.15 KB)

1

    
2
package org.gvsig.oracle.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 OracleFetchFeatureTypeOperation extends FetchFeatureTypeOperation {
28

    
29
    private static Map<String,GeometryType>databaseGeometryTypes = null;
30
    
31
    public OracleFetchFeatureTypeOperation(
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 OracleFetchFeatureTypeOperation(
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
            int type = rsMetadata.getColumnType(colIndex);
73
            if (type>=2000 && type<=4449) {
74
                    return DataTypes.GEOMETRY;
75
            }
76
            String typeName = rsMetadata.getColumnTypeName(colIndex);
77
        if( "MDSYS.SDO_GEOMETRY".equalsIgnoreCase(typeName) ) {
78
            return DataTypes.GEOMETRY;
79
        }
80
        return super.getDataTypeFromMetadata(rsMetadata, colIndex);
81
    }
82

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

    
145
    private GeometryType getGeometryTypeFromDatabaseTypeName(String typeName) {
146
        if( databaseGeometryTypes==null ) {
147
            GeometryManager manager = GeometryLocator.getGeometryManager();
148
            databaseGeometryTypes = new HashMap<>();
149
            databaseGeometryTypes.put("POINT", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM2D));
150
            databaseGeometryTypes.put("POINTZ", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM3D));
151
            databaseGeometryTypes.put("POINTM", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM2DM));
152
            databaseGeometryTypes.put("POINTZM", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM3DM));
153
            
154
            databaseGeometryTypes.put("LINESTRING", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM2D));
155
            databaseGeometryTypes.put("LINESTRINGZ", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM3D));
156
            databaseGeometryTypes.put("LINESTRINGM", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM2DM));
157
            databaseGeometryTypes.put("LINESTRINGZM", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM3DM));
158
            
159
            databaseGeometryTypes.put("POLYGON", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM2D));
160
            databaseGeometryTypes.put("POLYGONZ", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM3D));
161
            databaseGeometryTypes.put("POLYGONM", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM2DM));
162
            databaseGeometryTypes.put("POLYGONZM", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM3DM));
163

    
164
            databaseGeometryTypes.put("MULTIPOINT", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM2D));
165
            databaseGeometryTypes.put("MULTIPOINTZ", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM3D));
166
            databaseGeometryTypes.put("MULTIPOINTM", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM2DM));
167
            databaseGeometryTypes.put("MULTIPOINTZM", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM3DM));
168

    
169
            databaseGeometryTypes.put("MULTILINESTRING", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM2D));
170
            databaseGeometryTypes.put("MULTILINESTRINGZ", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM3D));
171
            databaseGeometryTypes.put("MULTILINESTRINGM", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM2DM));
172
            databaseGeometryTypes.put("MULTILINESTRINGZM", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM3DM));
173

    
174
            databaseGeometryTypes.put("MULTIPOLYGON", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM2D));
175
            databaseGeometryTypes.put("MULTIPOLYGONZ", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM3D));
176
            databaseGeometryTypes.put("MULTIPOLYGONM", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM2DM));
177
            databaseGeometryTypes.put("MULTIPOLYGONZM", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM3DM));
178

    
179
            databaseGeometryTypes.put("GEOMETRY", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM2D));
180
            databaseGeometryTypes.put("GEOMETRYZ", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM3D));
181
            databaseGeometryTypes.put("GEOMETRYM", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM2DM));
182
            databaseGeometryTypes.put("GEOMETRYZM", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM3DM));
183
        }
184
        return databaseGeometryTypes.get(typeName);
185
    }
186
    
187
}