Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.db / org.gvsig.fmap.dal.db.jdbc / src / main / java / org / gvsig / fmap / dal / store / jdbc2 / spi / JDBCHelperBase.java @ 43377

History | View | Annotate | Download (14 KB)

1
package org.gvsig.fmap.dal.store.jdbc2.spi;
2

    
3
import org.gvsig.fmap.dal.store.jdbc2.impl.ResulSetControlerBase;
4
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.OperationsFactoryBase;
5
import java.sql.Connection;
6
import java.sql.ResultSet;
7
import java.sql.SQLException;
8
import org.apache.commons.dbcp.BasicDataSource;
9
import org.apache.commons.lang3.BooleanUtils;
10
import org.apache.commons.lang3.StringUtils;
11
import org.cresques.cts.IProjection;
12
import org.gvsig.fmap.crs.CRSFactory;
13
import org.gvsig.fmap.dal.DataTypes;
14
import org.gvsig.fmap.dal.exception.DataException;
15
import org.gvsig.fmap.dal.exception.InitializeException;
16
import org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType;
17
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.EWKB;
18
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.WKB;
19
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.WKT;
20
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
21
import org.gvsig.fmap.dal.feature.FeatureType;
22

    
23
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
24
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
25
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
26
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
27
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
28
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
29
import org.gvsig.fmap.dal.store.db.DBHelper;
30
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
31
import org.gvsig.fmap.dal.store.jdbc.JDBCLibrary;
32
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
33
import org.gvsig.fmap.dal.store.jdbc.JDBCResource;
34
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
35
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
36
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCCantFetchValueException;
37
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCDriverClassNotFoundException;
38
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
39
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
40
import org.gvsig.fmap.dal.store.jdbc2.JDBCStoreProvider;
41
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
42
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
43
import org.gvsig.fmap.dal.store.jdbc2.ResulSetControler;
44
import org.gvsig.fmap.dal.store.jdbc2.ResulSetControler.ResultSetEntry;
45
import org.gvsig.fmap.geom.Geometry;
46
import org.gvsig.fmap.geom.GeometryLocator;
47
import org.gvsig.fmap.geom.GeometryManager;
48
import org.gvsig.tools.dispose.impl.AbstractDisposable;
49
import org.gvsig.tools.exception.BaseException;
50
import org.gvsig.tools.exception.NotYetImplemented;
51
import org.slf4j.Logger;
52
import org.slf4j.LoggerFactory;
53

    
54
public class JDBCHelperBase extends AbstractDisposable implements ResourceConsumer, JDBCHelper {
55

    
56
    private static final boolean ALLOW_AUTOMATIC_VALUES = true;
57
    private static final String QUOTE_FOR_USE_IN_IDENTIFIERS = "\"";
58
    private static final String QUOTE_FOR_USE_IN_STRINGS = "'";
59

    
60
    private static final Logger logger = LoggerFactory.getLogger(JDBCHelperBase.class);
61

    
62
    private ResulSetControler resulSetControler = null;
63

    
64
    // Quien ha creado este helper.
65
    // Se le reenviaran las notificaciones del recurso asociado al helper.
66
    private ResourceConsumer helperClient = null;
67

    
68
    private GeometryManager geometryManager = null;
69

    
70
    private JDBCConnectionParameters connectionParameters;
71

    
72
    private JDBCStoreProvider store;    
73
    
74
    protected OperationsFactory operationsFactory = null;
75
    
76
    protected JDBCSRSs srss;
77
    
78
    public JDBCHelperBase(JDBCConnectionParameters connectionParameters) {
79
        this.connectionParameters = connectionParameters;
80
        
81
        // If a particular treatment is required to convert SRS to the 
82
        // BBDD format, overwrite JDBCSRSsBase and use it instead of JDBCSRSsDumb.
83
        this.srss = new JDBCSRSsDumb(this);
84
    }
85

    
86
    protected void initialize(
87
            ResourceConsumer helperClient,
88
            JDBCConnectionParameters connectionParameters,
89
            JDBCStoreProvider store
90
        ) {
91
        this.store = store;
92
        this.helperClient = helperClient;
93
        this.connectionParameters = connectionParameters;
94
        initializeResource(connectionParameters);        
95
    }
96
    
97
    protected String getResourceType() {
98
        return JDBCResource.NAME;
99
    }
100

    
101
    @Override
102
    public String getProviderName() {
103
        return JDBCLibrary.NAME;
104
    }
105
        
106
    @Override
107
    public GeometrySupportType getGeometrySupportType() {
108
        // El proveedor generico de JDBC guadara las geoemtrias como WKT
109
        return GeometrySupportType.WKT;
110
    }
111

    
112
    @Override
113
    public boolean hasSpatialFunctions() {
114
        // Por defecto el proveedor generico de JDBC asume que la BBDD no 
115
        // tiene soporte para funciones espaciales.
116
        return false;
117
    }
118

    
119
    @Override
120
    public boolean canWriteGeometry(int geometryType, int geometrySubtype) {
121
        // Como va a guardar las geometrias en WKT, puede escribirlas todas.
122
        return true;
123
    }
124

    
125
    @Override
126
    public JDBCSQLBuilderBase createSQLBuilder() {
127
        return new JDBCSQLBuilderBase();
128
    }
129

    
130
    @Override
131
    public String getQuoteForIdentifiers() {
132
        return QUOTE_FOR_USE_IN_IDENTIFIERS;
133
    }
134

    
135
    @Override
136
    public boolean allowAutomaticValues() {
137
        return ALLOW_AUTOMATIC_VALUES;
138
    }
139

    
140
    @Override
141
    public boolean supportOffsetInSelect() {
142
        // Asumimos que la BBDD soporta OFFSET
143
        return true;
144
    }
145
    
146
    @Override
147
    public String getQuoteForStrings() {
148
        return QUOTE_FOR_USE_IN_STRINGS;
149
    }
150
    
151
    @Override
152
    public OperationsFactory getOperations() {
153
        if (this.operationsFactory== null) {
154
            this.operationsFactory = new OperationsFactoryBase(this);
155
        }
156
        return operationsFactory;
157
    }
158
    
159
    protected void initializeResource(JDBCConnectionParameters params) {
160
//        Object[] resourceParams = new Object[]{
161
//            params.getUrl(),
162
//            params.getHost(),
163
//            params.getPort(),
164
//            params.getDBName(),
165
//            params.getUser(),
166
//            params.getPassword(),
167
//            params.getJDBCDriverClassName()
168
//        };
169
//
170
//        try {
171
//            ResourceManagerProviderServices manager
172
//                    = (ResourceManagerProviderServices) DALLocator.getResourceManager();
173
//            JDBCResource resource = (JDBCResource) manager.createAddResource(
174
//                    this.getResourceType(),
175
//                    resourceParams
176
//            );
177
//            this.resource = resource;
178
//            this.resource.addConsumer(this);
179
//        } catch (InitializeException ex) {
180
//            logger.debug("Can't initialize resource (" + ArrayUtils.toString(resourceParams) + ").", ex);
181
//            throw new RuntimeException("Can't initialize resource (" + ArrayUtils.toString(resourceParams) + ").", ex);
182
//        }
183

    
184
    }
185

    
186
    @Override
187
    public String getSourceId() {
188
        return this.store.getSourceId();
189
    }
190
    
191
    @Override
192
    public JDBCResource getResource() {
193
        return null;
194
//        return this.resource;
195
    }
196

    
197
    @Override
198
    public Connection getConnection() throws AccessResourceException {
199
        throw new NotYetImplemented();
200
    }
201

    
202
    @Override
203
    public Connection getConnectionWritable() throws AccessResourceException {
204
        return this.getConnection();
205
    }
206

    
207
    @Override
208
    public String getConnectionURL() {
209
        return null;
210
    }
211

    
212
    @Override
213
    public JDBCConnectionParameters getConnectionParameters() {
214
        return connectionParameters;
215
    }
216

    
217
    @Override
218
    public void closeConnection(Connection connection) {
219
        if( connection != null ) {
220
            logger.debug("Clossing connection "+connection.hashCode());
221
            try {
222
                connection.close();
223
            } catch(Exception ex) {
224
                logger.warn("Can't close connection.", ex);
225
            }
226
       }
227
    }
228
    
229
    @Override
230
    protected void doDispose() throws BaseException {
231
        JDBCUtils.closeQuietly(this);
232
    }
233

    
234
    @Override
235
    public void close() throws Exception {
236
//        this.resource.removeConsumer(this);
237
        JDBCUtils.closeQuietly(this.resulSetControler);
238
//        this.resource = null;
239
        this.resulSetControler = null;
240
    }
241

    
242
    @Override
243
    public boolean closeResourceRequested(ResourceProvider resource) {
244
        return this.helperClient.closeResourceRequested(resource);
245
    }
246

    
247
    @Override
248
    public void resourceChanged(ResourceProvider resource) {
249
        this.helperClient.resourceChanged(resource);
250
    }
251

    
252
    @Override
253
    public GeometryManager getGeometryManager() {
254
        if (this.geometryManager == null) {
255
            this.geometryManager = GeometryLocator.getGeometryManager();
256
        }
257
        return this.geometryManager;
258
    }
259

    
260
    @Override
261
    public ResulSetControler getResulSetControler() {
262
        if (this.resulSetControler == null) {
263
            this.resulSetControler = new ResulSetControlerBase(this);
264
        }
265
        return this.resulSetControler;
266
    }
267

    
268
    @Override
269
    public void fetchFeature(FeatureProvider feature, ResultSetEntry rs) throws DataException {
270
        fetchFeature(feature, rs.get(), rs.getColumns());
271
    }
272

    
273
    @Override
274
    public void fetchFeature(FeatureProvider feature, ResultSet rs, FeatureAttributeDescriptor[] columns) throws DataException {
275
        try {
276
            Object value;
277
            for (int index = 0; index < columns.length; index++) {
278
                FeatureAttributeDescriptor column = columns[index];
279
                switch (column.getType()) {
280
                    case DataTypes.GEOMETRY:
281
                        value = this.getGeometryFromColumn(rs, index + 1);
282
                        break;
283
                    default:
284
                        value = rs.getObject(index + 1);
285
                }
286
                feature.set(column.getIndex(), value);
287
            }
288
        } catch (Exception ex) {
289
            throw new JDBCCantFetchValueException(ex);
290
        }
291
    }
292

    
293
    @Override
294
    public Geometry getGeometryFromColumn(ResultSetEntry rs, int index) throws DataException {
295
        return getGeometryFromColumn(rs.get(), index);
296
    }
297

    
298
    @Override
299
    public Geometry getGeometryFromColumn(ResultSet rs, int index) throws DataException {
300
        try {
301
            Object value;
302
            switch (this.getGeometrySupportType()) {
303
                case NATIVE:
304
                case WKB:
305
                    value = rs.getBytes(index);
306
                    if (value == null) {
307
                        return null;
308
                    }
309
                    return this.getGeometryManager().createFrom((byte[]) value);
310

    
311
                case EWKB:
312
                    value = rs.getBytes(index);
313
                    if (value == null) {
314
                        return null;
315
                    }
316
                    return this.getGeometryManager().createFrom((byte[]) value);
317
                case WKT:
318
                default:
319
                    value = rs.getString(index);
320
                    if (value == null) {
321
                        return null;
322
                    }
323
                    return this.getGeometryManager().createFrom((String) value);
324

    
325
            }
326
        } catch (Exception ex) {
327
            throw new JDBCCantFetchValueException(ex);
328
        }
329
    }
330

    
331
    @Override
332
    public FeatureProvider createFeature(FeatureType featureType) throws DataException {
333
        return this.store.getStoreServices().createDefaultFeatureProvider(featureType);
334
    }
335
    
336
    @Override
337
    public boolean useSubquery() {
338
        if( this.store == null ) {
339
            return false;
340
        }
341
        return !StringUtils.isEmpty(this.store.getParameters().getSQL());
342
    }  
343

    
344
    @Override
345
    public int getSRSCode(IProjection crs) {
346
        String databaseCode = this.srss.getDatabaseCode(crs.getAbrev());
347
        return Integer.parseInt(databaseCode);
348
    }
349

    
350
    @Override
351
    public IProjection getProjectionFromSRSId(int srsid) {
352
        return getProjectionFromDatabaseCode(String.valueOf(srsid));
353
    }
354

    
355
    @Override
356
    public String getDatabaseCodeFromProyection(IProjection proj) {
357
        return this.srss.getDatabaseCode(proj.getAbrev());
358
    }
359
    
360
    @Override
361
    public IProjection getProjectionFromDatabaseCode(String databaseCode) {
362
        if( StringUtils.trimToEmpty(databaseCode).equals("0") ) {
363
            return null;
364
        }
365
        String abbrev = this.srss.getApplicationAbbrev(databaseCode);
366
        if( StringUtils.isEmpty(abbrev) ) {
367
            return null;
368
        }
369
        IProjection proj = CRSFactory.getCRS(abbrev);
370
        return proj;
371
    }
372
    
373
    @Override
374
    public JDBCStoreProvider createProvider(
375
            JDBCStoreParameters parameters, 
376
            DataStoreProviderServices providerServices
377
        ) throws InitializeException {
378
        
379
        JDBCStoreProviderBase store = new JDBCStoreProviderBase(
380
                parameters, 
381
                providerServices, 
382
                DBHelper.newMetadataContainer(JDBCLibrary.NAME),
383
                this
384
        );
385
        this.initialize(store, parameters, store);
386
        return store;
387
    }
388

    
389
    @Override
390
    public JDBCServerExplorer createServerExplorer(
391
            JDBCServerExplorerParameters parameters, 
392
            DataServerExplorerProviderServices providerServices
393
        ) throws InitializeException {
394
        
395
        JDBCServerExplorer explorer = new JDBCServerExplorerBase(
396
                parameters, 
397
                providerServices, 
398
                this
399
        );
400
        this.initialize(explorer, parameters, null);
401
        return explorer;
402
    }
403

    
404
    @Override
405
    public JDBCNewStoreParameters createNewStoreParameters() {
406
        return new JDBCNewStoreParameters();
407
    }
408

    
409
    @Override
410
    public JDBCStoreParameters createOpenStoreParameters() {
411
        return new JDBCStoreParameters();
412
    }
413

    
414
    @Override
415
    public JDBCServerExplorerParameters createServerExplorerParameters() {
416
        return new JDBCServerExplorerParameters();
417
    }
418

    
419
    @Override
420
    public String getSourceId(JDBCStoreParameters parameters) {
421
        return parameters.getHost() + ":" +
422
               parameters.getDBName() + ":" + 
423
               parameters.getSchema()+ ":" + 
424
               parameters.tableID();
425
    }
426
    
427
}