Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / org.gvsig.fmap.dal.db.h2spatial / src / main / java / org / gvsig / fmap / dal / db / h2spatial / impl / H2SpatialHelper.java @ 32684

History | View | Annotate | Download (10.9 KB)

1
package org.gvsig.fmap.dal.db.h2spatial.impl;
2

    
3
import java.sql.Connection;
4
import java.sql.ResultSetMetaData;
5
import java.sql.SQLException;
6
import java.util.ArrayList;
7
import java.util.Iterator;
8
import java.util.List;
9

    
10
import net.sourceforge.hatbox.MetaNode;
11
import net.sourceforge.hatbox.RTreeDml;
12
import net.sourceforge.hatbox.RTreeSessionDb;
13
import net.sourceforge.hatbox.jts.Proc;
14

    
15
import org.gvsig.fmap.crs.CRSFactory;
16
import org.gvsig.fmap.dal.DALLocator;
17
import org.gvsig.fmap.dal.DataTypes;
18
import org.gvsig.fmap.dal.NewDataStoreParameters;
19
import org.gvsig.fmap.dal.exception.DataException;
20
import org.gvsig.fmap.dal.exception.InitializeException;
21
import org.gvsig.fmap.dal.exception.ReadException;
22
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.EditableFeatureType;
24
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
25
import org.gvsig.fmap.dal.feature.FeatureType;
26
import org.gvsig.fmap.dal.feature.exception.UnsupportedDataTypeException;
27
import org.gvsig.fmap.dal.feature.exception.UnsupportedGeometryException;
28
import org.gvsig.fmap.dal.resource.spi.ResourceManagerProviderServices;
29
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
30
import org.gvsig.fmap.dal.store.jdbc.JDBCHelper;
31
import org.gvsig.fmap.dal.store.jdbc.JDBCHelperUser;
32
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
33
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCException;
34
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException;
35
import org.gvsig.fmap.geom.Geometry;
36
import org.gvsig.fmap.geom.GeometryLocator;
37
import org.gvsig.fmap.geom.GeometryManager;
38
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
39
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
40
import org.gvsig.fmap.geom.primitive.Envelope;
41

    
42
/**
43
 * 
44
 * @author Vicente Caballero Navarro
45
 */
46
public class H2SpatialHelper extends JDBCHelper {
47
        private String rsid=null;
48
        private GeometryManager gm;
49

    
50
        public H2SpatialHelper(JDBCHelperUser consumer,
51
                        JDBCConnectionParameters params) throws InitializeException {
52
                super(consumer, params);
53
                gm = GeometryLocator.getGeometryManager();
54
        }
55

    
56
        /* (non-Javadoc)
57
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#initializeResource()
58
         */
59
        protected void initializeResource() throws InitializeException {
60
                ResourceManagerProviderServices manager = (ResourceManagerProviderServices) DALLocator
61
                                .getResourceManager();
62
                H2SpatialResource resource = (H2SpatialResource) manager
63
                                .createAddResource(H2SpatialResource.NAME, new Object[] {
64
                                                params.getUrl(), params.getDBName(),
65
                                                params.getJDBCDriverClassName(),
66
                                                ((H2SpatialConnectionParameters) params).getUseSSL() });
67
                this.setResource(resource);
68
        }
69

    
70
        /* (non-Javadoc)
71
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#loadFeatureType(org.gvsig.fmap.dal.feature.EditableFeatureType, org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters)
72
         */
73
        public void loadFeatureType(EditableFeatureType featureType,
74
                        JDBCStoreParameters storeParams) throws DataException {
75
                if (storeParams.getSQL() != null
76
                                && storeParams.getSQL().trim().length() == 0) {
77
                        loadFeatureType(featureType, storeParams, storeParams.getSQL(),
78
                                        null, null);
79
                } else {
80
                        String sql = "Select * from " + storeParams.tableID();
81
                        loadFeatureType(featureType, storeParams, sql, storeParams
82
                                        .getSchema(), storeParams.getTable());
83
                }
84
        }
85

    
86
        /* (non-Javadoc)
87
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#getFullEnvelopeOfField(org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters, java.lang.String, org.gvsig.fmap.geom.primitive.Envelope)
88
         */
89
        public org.gvsig.fmap.geom.primitive.Envelope getFullEnvelopeOfField(JDBCStoreParameters storeParams,
90
                        String geometryAttrName, Envelope limit) throws DataException {
91
                
92
                Connection con = getConnection();
93
                RTreeDml dml=null;
94
                RTreeSessionDb session=null;
95
                net.sourceforge.hatbox.Envelope hbEnvelope=null;
96
                Envelope gvSigEnvelope = null;
97
                try {
98
                        dml = RTreeDml.createDml(con, storeParams.getSchema(), storeParams.getTable().toUpperCase());
99
                        session = new RTreeSessionDb(con, dml, false);
100
                        hbEnvelope = session.getNode(session.getRootId()).getBounds();
101
                        
102
                        gvSigEnvelope = 
103
                        gm.createEnvelope(hbEnvelope.getMinX(), hbEnvelope.getMinY(), hbEnvelope.getMaxX(), hbEnvelope.getMaxY(), SUBTYPES.GEOM2D);
104
                } catch (SQLException e2) {
105
                        e2.printStackTrace();
106
                } catch (CreateEnvelopeException e) {
107
                        e.printStackTrace();
108
                }
109
                        
110
                session.closeAll();
111
                try {
112
                        con.close();
113
                } catch (SQLException e) {
114
                        e.printStackTrace();
115
                }
116
                return gvSigEnvelope;
117
        }
118

    
119
        /* (non-Javadoc)
120
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#getSqlColumnTypeDescription(org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor)
121
         */
122
        public String getSqlColumnTypeDescription(FeatureAttributeDescriptor attr) {
123

    
124
                switch (attr.getDataType()) {
125

    
126
                case DataTypes.BOOLEAN:
127
                        return "BOOLEAN";
128

    
129
                case DataTypes.BYTE:
130
                        return "SMALLINT";
131

    
132
                case DataTypes.BYTEARRAY:
133
                        return "BYTEA";
134

    
135
                case DataTypes.CHAR:
136
                        return "CHAR";
137

    
138
                case DataTypes.DATE:
139
                        return "DATE";
140

    
141
                case DataTypes.DOUBLE:
142
                        return "DOUBLE";
143

    
144
                case DataTypes.FLOAT:
145
                        return "FLOAT";
146

    
147
                case DataTypes.GEOMETRY:
148
                        return "BLOB";
149

    
150
                case DataTypes.INT:
151
                        return "INTEGER";
152

    
153
                case DataTypes.LONG:
154
                        return "BIGINT";
155

    
156
                case DataTypes.STRING:
157
                        return "VARCHAR("+attr.getSize()+")";
158

    
159
                case DataTypes.TIME:
160
                        return "TIME";
161

    
162
                case DataTypes.TIMESTAMP:
163
                        return "TIMESTAMP";
164

    
165
                default:
166
                        String typeName = (String) attr.getAdditionalInfo("SQLTypeName");
167
                        if (typeName != null) {
168
                                return typeName;
169
                        }
170

    
171
                        throw new UnsupportedDataTypeException(attr.getDataTypeName(), attr
172
                                        .getDataType());
173
                }
174
        }
175

    
176
        /* (non-Javadoc)
177
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#getSqlFieldName(org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor)
178
         */
179
        public String getSqlFieldName(FeatureAttributeDescriptor attribute) {
180
//                if (attribute.getDataType() == DataTypes.GEOMETRY) {
181
//                        return "asBinary(" + super.getSqlFieldName(attribute) + ")";
182
//                }
183
                return super.getSqlFieldName(attribute);
184
        }
185

    
186
        /* (non-Javadoc)
187
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#createAttributeFromJDBC(org.gvsig.fmap.dal.feature.EditableFeatureType, java.sql.Connection, java.sql.ResultSetMetaData, int)
188
         */
189
        protected EditableFeatureAttributeDescriptor createAttributeFromJDBC(
190
                        EditableFeatureType type, Connection conn,
191
                        ResultSetMetaData rsMetadata, int colIndex) throws SQLException {
192
                // if (rsMetadata.getColumnType(colIndex) == java.sql.Types.OTHER) {
193
                if (rsMetadata.getColumnName(colIndex).equalsIgnoreCase("the_geom")) {
194
                        EditableFeatureAttributeDescriptor efad = type.add(rsMetadata
195
                                        .getColumnName(colIndex), DataTypes.GEOMETRY);
196
                        efad.setGeometrySubType(Geometry.SUBTYPES.GEOM2D);
197
                        efad.setGeometryType(Geometry.TYPES.GEOMETRY);
198
                        if (rsid!=null)
199
                                efad.setSRS(CRSFactory.getCRS(rsid));
200
                        return efad;
201
                }
202
                // }
203

    
204
                return super.createAttributeFromJDBC(type, conn, rsMetadata, colIndex);
205
        }
206

    
207
        /* (non-Javadoc)
208
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#allowAutomaticValues()
209
         */
210
        public boolean allowAutomaticValues() {
211
                return Boolean.TRUE;
212
        }
213

    
214
        /* (non-Javadoc)
215
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#getSqlFieldDescription(org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor)
216
         */
217
        public String getSqlFieldDescription(FeatureAttributeDescriptor attr)
218
                        throws DataException {
219
//                return getSqlFieldName(attr)+ " "+ getSqlColumnTypeDescription(attr);
220
                if (attr.getDataType() == DataTypes.GEOMETRY) {
221
                        return null;
222
                }
223
                return super.getSqlFieldDescription(attr);
224
        }
225

    
226
        /* (non-Javadoc)
227
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#supportOffset()
228
         */
229
        public boolean supportOffset() {
230
                return true;
231
        }
232

    
233
        /* (non-Javadoc)
234
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#supportsUnion()
235
         */
236
        public boolean supportsUnion() {
237
                return true;
238
        }
239

    
240
//        public String getH2SpatialGeomType(int geometryType, int geometrySubType) {
241
//                String slGeomType = new String();
242
//                switch (geometryType) {
243
//                case Geometry.TYPES.GEOMETRY:
244
//                        slGeomType = "GEOMETRY";
245
//                        break;
246
//                case Geometry.TYPES.POINT:
247
//                        slGeomType = "POINT";
248
//                        break;
249
//                case Geometry.TYPES.CURVE:
250
//                        slGeomType = "LINESTRING";
251
//                        break;
252
//                case Geometry.TYPES.SURFACE:
253
//                        slGeomType = "POLYGON";
254
//                        break;
255
//                case Geometry.TYPES.MULTIPOINT:
256
//                        slGeomType = "MULTIPOINT";
257
//                        break;
258
//                case Geometry.TYPES.MULTICURVE:
259
//                        slGeomType = "MULTILINESTRING";
260
//                        break;
261
//                case Geometry.TYPES.MULTISURFACE:
262
//                        slGeomType = "MULTIPOLYGON";
263
//                        break;
264
//                default:
265
//                        throw new UnsupportedGeometryException(geometryType,
266
//                                        geometrySubType);
267
//                }
268
//                return slGeomType;
269
//        }
270

    
271
        /* (non-Javadoc)
272
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#getProviderSRID(java.lang.String)
273
         */
274
        public int getProviderSRID(String srs) {
275
//                if (srs != null) {
276
//                        Integer slSRID = (Integer) srsID2slSR.get(srs);
277
//                        if (slSRID != null) {
278
//                                return slSRID.intValue();
279
//                        }
280
//
281
//                        return searchslSRID(srs);
282
//
283
//                }
284
                return -1;
285
        }
286

    
287
//        public int getH2SpatialGeomDimensions(int geometrySubType) {
288
//                switch (geometrySubType) {
289
//                case Geometry.SUBTYPES.GEOM2D:
290
//                        return 2;
291
//                case Geometry.SUBTYPES.GEOM2DM:
292
//                case Geometry.SUBTYPES.GEOM3D:
293
//                        return 3;
294
//
295
//                case Geometry.SUBTYPES.GEOM3DM:
296
//                        return 4;
297
//                default:
298
//                        throw new UnsupportedDataTypeException(
299
//                                        DataTypes.TYPE_NAMES[DataTypes.GEOMETRY],
300
//                                        DataTypes.GEOMETRY);
301
//                }
302
//        }
303

    
304
        public List getSqlGeometyFieldAdd(FeatureAttributeDescriptor attr,
305
                        String table, String schema) {
306
                List sqls = new ArrayList();
307
        return sqls;
308
        }
309

    
310
        
311
        public List getAdditionalSqlToCreate(NewDataStoreParameters ndsp,
312
                        FeatureType fType) {
313
                FeatureAttributeDescriptor attr;
314
                Iterator iter = fType.iterator();
315
                List result = new ArrayList();
316
                H2SpatialNewStoreParameters slNdsp = (H2SpatialNewStoreParameters) ndsp;
317
                while (iter.hasNext()) {
318
                        attr = (FeatureAttributeDescriptor) iter.next();
319
                        if (attr.getDataType() == DataTypes.GEOMETRY) {
320
                                result.addAll(getSqlGeometyFieldAdd(attr, slNdsp.getTable(),
321
                                                slNdsp.getSchema()));
322
                        }
323
                }
324

    
325
                return result;
326
        }
327
        
328
        /* (non-Javadoc)
329
         * @see org.gvsig.fmap.dal.store.jdbc.JDBCHelper#loadSRS_and_shapeType(java.sql.Connection, java.sql.ResultSetMetaData, org.gvsig.fmap.dal.feature.EditableFeatureType, java.lang.String, java.lang.String)
330
         */
331
        protected void loadSRS_and_shapeType(Connection conn,
332
                        ResultSetMetaData rsMetadata, EditableFeatureType featureType,
333
                        String baseSchema, String baseTable)
334
                        throws JDBCException {
335
                try {
336
                        // Sacamos la lista de los attributos geometricos
337
                        EditableFeatureAttributeDescriptor attr;
338
                        Iterator iter = featureType.iterator();
339
                        while (iter.hasNext()) {
340
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
341
                                if (attr.getDataType() == DataTypes.GEOMETRY) {
342
                                        MetaNode metaNode = Proc.spatialMetaData(conn, baseSchema, baseTable.toUpperCase());
343
                                        String epsg = "EPSG:"+metaNode.getSrid();
344
                                        attr.setSRS(CRSFactory.getCRS(epsg));
345
                                        rsid=epsg;
346
                                }
347
                        }
348
                } catch (java.sql.SQLException e) {
349
                        throw new JDBCSQLException(e);
350
                } finally {
351
                }
352

    
353
        }
354
}