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 @ 43358

History | View | Annotate | Download (13.5 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 org.apache.commons.lang3.StringUtils;
8
import org.cresques.cts.IProjection;
9
import org.gvsig.fmap.crs.CRSFactory;
10
import org.gvsig.fmap.dal.DataTypes;
11
import org.gvsig.fmap.dal.exception.DataException;
12
import org.gvsig.fmap.dal.exception.InitializeException;
13
import org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType;
14
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.EWKB;
15
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.WKB;
16
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.WKT;
17
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
18
import org.gvsig.fmap.dal.feature.FeatureType;
19

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

    
49
public class JDBCHelperBase extends AbstractDisposable implements ResourceConsumer, JDBCHelper {
50

    
51
    private static final boolean ALLOW_AUTOMATIC_VALUES = true;
52
    private static final String QUOTE_FOR_USE_IN_IDENTIFIERS = "\"";
53
    private static final String QUOTE_FOR_USE_IN_STRINGS = "'";
54

    
55
    private static final Logger logger = LoggerFactory.getLogger(JDBCHelperBase.class);
56
    
57
//    protected JDBCResource resource = null;
58

    
59
    private ResulSetControler resulSetControler = null;
60

    
61
    // Quien ha creado este helper.
62
    // Se le reenviaran las notificaciones del recurso asociado al helper.
63
    private ResourceConsumer helperClient = null;
64

    
65
    private GeometryManager geometryManager = null;
66

    
67
    private JDBCConnectionParameters connectionParameters;
68

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

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

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

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

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

    
122
    @Override
123
    public JDBCSQLBuilderBase createSQLBuilder() {
124
        return new JDBCSQLBuilderBase();
125
    }
126

    
127
    @Override
128
    public String getQuoteForIdentifiers() {
129
        return QUOTE_FOR_USE_IN_IDENTIFIERS;
130
    }
131

    
132
    @Override
133
    public boolean allowAutomaticValues() {
134
        return ALLOW_AUTOMATIC_VALUES;
135
    }
136

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

    
181
    }
182

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

    
194
    @Override
195
    public Connection getConnection() throws AccessResourceException {
196
//        return this.resource.getJDBCConnection();
197
        return null;
198
    }
199

    
200
    @Override
201
    public String getConnectionURL() {
202
        return null;
203
    }
204

    
205
    @Override
206
    public JDBCConnectionParameters getConnectionParameters() {
207
        return connectionParameters;
208
    }
209

    
210
    @Override
211
    public void closeConnection(Connection connection) {
212
//        this.getResource().closeConnection(connection);
213
        JDBCUtils.closeQuietly(connection);
214
       }
215
    
216
    @Override
217
    protected void doDispose() throws BaseException {
218
        JDBCUtils.closeQuietly(this);
219
    }
220

    
221
    @Override
222
    public void close() throws Exception {
223
//        this.resource.removeConsumer(this);
224
        JDBCUtils.closeQuietly(this.resulSetControler);
225
//        this.resource = null;
226
        this.resulSetControler = null;
227
    }
228

    
229
    @Override
230
    public boolean closeResourceRequested(ResourceProvider resource) {
231
        return this.helperClient.closeResourceRequested(resource);
232
    }
233

    
234
    @Override
235
    public void resourceChanged(ResourceProvider resource) {
236
        this.helperClient.resourceChanged(resource);
237
    }
238

    
239
    @Override
240
    public GeometryManager getGeometryManager() {
241
        if (this.geometryManager == null) {
242
            this.geometryManager = GeometryLocator.getGeometryManager();
243
        }
244
        return this.geometryManager;
245
    }
246

    
247
    @Override
248
    public ResulSetControler getResulSetControler() {
249
        if (this.resulSetControler == null) {
250
            this.resulSetControler = new ResulSetControlerBase(this);
251
        }
252
        return this.resulSetControler;
253
    }
254

    
255
    @Override
256
    public void fetchFeature(FeatureProvider feature, ResultSetEntry rs) throws DataException {
257
        fetchFeature(feature, rs.get(), rs.getColumns());
258
    }
259

    
260
    @Override
261
    public void fetchFeature(FeatureProvider feature, ResultSet rs, FeatureAttributeDescriptor[] columns) throws DataException {
262
        try {
263
            Object value;
264
            for (int index = 0; index < columns.length; index++) {
265
                FeatureAttributeDescriptor column = columns[index];
266
                switch (column.getType()) {
267
                    case DataTypes.GEOMETRY:
268
                        value = this.getGeometryFromColumn(rs, index + 1);
269
                        break;
270
                    default:
271
                        value = rs.getObject(index + 1);
272
                }
273
                feature.set(column.getIndex(), value);
274
            }
275
        } catch (Exception ex) {
276
            throw new JDBCCantFetchValueException(ex);
277
        }
278
    }
279

    
280
    @Override
281
    public Geometry getGeometryFromColumn(ResultSetEntry rs, int index) throws DataException {
282
        return getGeometryFromColumn(rs.get(), index);
283
    }
284

    
285
    @Override
286
    public Geometry getGeometryFromColumn(ResultSet rs, int index) throws DataException {
287
        try {
288
            Object value;
289
            switch (this.getGeometrySupportType()) {
290
                case NATIVE:
291
                case WKB:
292
                    value = rs.getBytes(index);
293
                    if (value == null) {
294
                        return null;
295
                    }
296
                    return this.getGeometryManager().createFrom((byte[]) value);
297

    
298
                case EWKB:
299
                    value = rs.getBytes(index);
300
                    if (value == null) {
301
                        return null;
302
                    }
303
                    return this.getGeometryManager().createFrom((byte[]) value);
304
                case WKT:
305
                default:
306
                    value = rs.getString(index);
307
                    if (value == null) {
308
                        return null;
309
                    }
310
                    return this.getGeometryManager().createFrom((String) value);
311

    
312
            }
313
        } catch (Exception ex) {
314
            throw new JDBCCantFetchValueException(ex);
315
        }
316
    }
317

    
318
    @Override
319
    public FeatureProvider createFeature(FeatureType featureType) throws DataException {
320
        return this.store.getStoreServices().createDefaultFeatureProvider(featureType);
321
    }
322
    
323
    @Override
324
    public boolean useSubquery() {
325
        if( this.store == null ) {
326
            return false;
327
        }
328
        return !StringUtils.isEmpty(this.store.getParameters().getSQL());
329
    }  
330

    
331
    @Override
332
    public int getSRSCode(IProjection crs) {
333
        String databaseCode = this.srss.getDatabaseCode(crs.getAbrev());
334
        return Integer.parseInt(databaseCode);
335
    }
336

    
337
    @Override
338
    public IProjection getProjectionFromSRSId(int srsid) {
339
        return getProjectionFromDatabaseCode(String.valueOf(srsid));
340
    }
341

    
342
    @Override
343
    public String getDatabaseCodeFromProyection(IProjection proj) {
344
        String[] s = proj.getAbrev().split(":");
345
        return this.srss.getDatabaseCode(proj.getAbrev());
346
    }
347
    
348
    @Override
349
    public IProjection getProjectionFromDatabaseCode(String databaseCode) {
350
        String abbrev = this.srss.getApplicationAbbrev(databaseCode);
351
        if( StringUtils.isEmpty(abbrev) ) {
352
            return null;
353
        }
354
        IProjection proj = CRSFactory.getCRS(abbrev);
355
        return proj;
356
    }
357
    
358
    @Override
359
    public JDBCStoreProvider createProvider(
360
            JDBCStoreParameters parameters, 
361
            DataStoreProviderServices providerServices
362
        ) throws InitializeException {
363
        
364
        JDBCStoreProviderBase store = new JDBCStoreProviderBase(
365
                parameters, 
366
                providerServices, 
367
                DBHelper.newMetadataContainer(JDBCLibrary.NAME),
368
                this
369
        );
370
        this.initialize(store, parameters, store);
371
        return store;
372
    }
373

    
374
    @Override
375
    public JDBCServerExplorer createServerExplorer(
376
            JDBCServerExplorerParameters parameters, 
377
            DataServerExplorerProviderServices providerServices
378
        ) throws InitializeException {
379
        
380
        JDBCServerExplorer explorer = new JDBCServerExplorerBase(
381
                parameters, 
382
                providerServices, 
383
                this
384
        );
385
        this.initialize(explorer, parameters, null);
386
        return explorer;
387
    }
388

    
389
    @Override
390
    public JDBCNewStoreParameters createNewStoreParameters() {
391
        return new JDBCNewStoreParameters();
392
    }
393

    
394
    @Override
395
    public JDBCStoreParameters createOpenStoreParameters() {
396
        return new JDBCStoreParameters();
397
    }
398

    
399
    @Override
400
    public JDBCServerExplorerParameters createServerExplorerParameters() {
401
        return new JDBCServerExplorerParameters();
402
    }
403

    
404
    @Override
405
    public String getSourceId(JDBCStoreParameters parameters) {
406
        return parameters.getHost() + ":" +
407
               parameters.getDBName() + ":" + 
408
               parameters.getSchema()+ ":" + 
409
               parameters.tableID();
410
    }
411
    
412
}