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

History | View | Annotate | Download (12.6 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.dal.DataTypes;
10
import org.gvsig.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.exception.InitializeException;
12
import org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType;
13
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.EWKB;
14
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.WKB;
15
import static org.gvsig.fmap.dal.ExpressionBuilder.GeometrySupportType.WKT;
16
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.FeatureType;
18

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

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

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

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

    
58
    private ResulSetControler resulSetControler = null;
59

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

    
64
    private GeometryManager geometryManager = null;
65

    
66
    private JDBCConnectionParameters connectionParameters;
67

    
68
    private JDBCStoreProvider store;    
69
    
70
    protected OperationsFactory operationsFactory = null;
71
    
72
    public JDBCHelperBase(JDBCConnectionParameters connectionParameters) {
73
        this.connectionParameters = connectionParameters;
74
    }
75

    
76
    protected void initialize(
77
            ResourceConsumer helperClient,
78
            JDBCConnectionParameters connectionParameters,
79
            JDBCStoreProvider store
80
        ) {
81
        this.helperClient = helperClient;
82
        this.connectionParameters = connectionParameters;
83
        initializeResource(connectionParameters);        
84
    }
85
    
86
    protected String getResourceType() {
87
        return JDBCResource.NAME;
88
    }
89

    
90
    @Override
91
    public String getProviderName() {
92
        return JDBCLibrary.NAME;
93
    }
94
        
95
    @Override
96
    public GeometrySupportType getGeometrySupportType() {
97
        // El proveedor generico de JDBC guadara las geoemtrias como WKT
98
        return GeometrySupportType.WKT;
99
    }
100

    
101
    @Override
102
    public boolean hasSpatialFunctions() {
103
        // Por defecto el proveedor generico de JDBC asume que la BBDD no 
104
        // tiene soporte para funciones espaciales.
105
        return false;
106
    }
107

    
108
    @Override
109
    public boolean canWriteGeometry(int geometryType, int geometrySubtype) {
110
        // Como va a guardar las geometrias en WKT, puede escribirlas todas.
111
        return true;
112
    }
113

    
114
    @Override
115
    public JDBCSQLBuilderBase createSQLBuilder() {
116
        return new JDBCSQLBuilderBase();
117
    }
118

    
119
    @Override
120
    public String getQuoteForIdentifiers() {
121
        return QUOTE_FOR_USE_IN_IDENTIFIERS;
122
    }
123

    
124
    @Override
125
    public boolean allowAutomaticValues() {
126
        return ALLOW_AUTOMATIC_VALUES;
127
    }
128

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

    
173
    }
174

    
175
    @Override
176
    public String getSourceId() {
177
        return this.store.getSourceId();
178
    }
179
    
180
    @Override
181
    public JDBCResource getResource() {
182
        return null;
183
//        return this.resource;
184
    }
185

    
186
    @Override
187
    public Connection getConnection() throws AccessResourceException {
188
//        return this.resource.getJDBCConnection();
189
        return null;
190
    }
191

    
192
    @Override
193
    public String getConnectionURL() {
194
        return null;
195
    }
196

    
197
    public JDBCConnectionParameters getConnectionParameters() {
198
        return connectionParameters;
199
    }
200

    
201
    @Override
202
    public void closeConnection(Connection connection) {
203
//        this.getResource().closeConnection(connection);
204
        JDBCUtils.closeQuietly(connection);
205
       }
206
    
207
    @Override
208
    protected void doDispose() throws BaseException {
209
        JDBCUtils.closeQuietly(this);
210
    }
211

    
212
    @Override
213
    public void close() throws Exception {
214
//        this.resource.removeConsumer(this);
215
        JDBCUtils.closeQuietly(this.resulSetControler);
216
//        this.resource = null;
217
        this.resulSetControler = null;
218
    }
219

    
220
    @Override
221
    public boolean closeResourceRequested(ResourceProvider resource) {
222
        return this.helperClient.closeResourceRequested(resource);
223
    }
224

    
225
    @Override
226
    public void resourceChanged(ResourceProvider resource) {
227
        this.helperClient.resourceChanged(resource);
228
    }
229

    
230
    @Override
231
    public GeometryManager getGeometryManager() {
232
        if (this.geometryManager == null) {
233
            this.geometryManager = GeometryLocator.getGeometryManager();
234
        }
235
        return this.geometryManager;
236
    }
237

    
238
    @Override
239
    public ResulSetControler getResulSetControler() {
240
        if (this.resulSetControler == null) {
241
            this.resulSetControler = new ResulSetControlerBase(this);
242
        }
243
        return this.resulSetControler;
244
    }
245

    
246
    @Override
247
    public void fetchFeature(FeatureProvider feature, ResultSetEntry rs) throws DataException {
248
        fetchFeature(feature, rs.get());
249
    }
250

    
251
    @Override
252
    public void fetchFeature(FeatureProvider feature, ResultSet rs) throws DataException {
253
        try {
254
            int index;
255
            Object value;
256
            for (FeatureAttributeDescriptor attr : feature.getType()) {
257
                index = attr.getIndex();
258
                switch (attr.getType()) {
259
                    case DataTypes.GEOMETRY:
260
                        value = this.getGeometryFromColumn(rs, index + 1);
261
                        break;
262
                    default:
263
                        value = rs.getObject(index + 1);
264
                }
265
                feature.set(index, value);
266
            }
267
        } catch (Exception ex) {
268
            throw new JDBCCantFetchValueException(ex);
269
        }
270
    }
271

    
272
    @Override
273
    public Geometry getGeometryFromColumn(ResultSetEntry rs, int index) throws DataException {
274
        return getGeometryFromColumn(rs.get(), index);
275
    }
276

    
277
    @Override
278
    public Geometry getGeometryFromColumn(ResultSet rs, int index) throws DataException {
279
        try {
280
            Object value;
281
            switch (this.getGeometrySupportType()) {
282
                case WKB:
283
                    value = rs.getBytes(index);
284
                    if (value == null) {
285
                        return null;
286
                    }
287
                    return this.getGeometryManager().createFrom((byte[]) value);
288

    
289
                case EWKB:
290
                    value = rs.getBytes(index);
291
                    if (value == null) {
292
                        return null;
293
                    }
294
                    return this.getGeometryManager().createFrom((byte[]) value);
295
                case WKT:
296
                default:
297
                    value = rs.getString(index);
298
                    if (value == null) {
299
                        return null;
300
                    }
301
                    return this.getGeometryManager().createFrom((String) value);
302

    
303
            }
304
        } catch (Exception ex) {
305
            throw new JDBCCantFetchValueException(ex);
306
        }
307
    }
308

    
309
    @Override
310
    public FeatureProvider createFeature(FeatureType featureType) throws DataException {
311
        return this.store.getStoreServices().createDefaultFeatureProvider(featureType);
312
    }
313
    
314
    @Override
315
    public boolean useSubquery() {
316
        if( this.store == null ) {
317
            return false;
318
        }
319
        return !StringUtils.isEmpty(this.store.getParameters().getSQL());
320
    }  
321

    
322
    @Override
323
    public int getSRSCode(IProjection crs) {
324
        // Dumb implementation
325
        String abrev = crs.getAbrev();
326
        if( StringUtils.isEmpty(abrev) ) {
327
            return -1;
328
        }
329
        String[] ss = abrev.split(":");
330
        if( ss.length < 2 ) {
331
            return -1;
332
        } 
333
        int id = Integer.parseInt(ss[1]);
334
        return id;
335
    }
336
    
337
    @Override
338
    public JDBCStoreProvider createProvider(
339
            JDBCStoreParameters parameters, 
340
            DataStoreProviderServices providerServices
341
        ) throws InitializeException {
342
        
343
        JDBCStoreProviderBase store = new JDBCStoreProviderBase(
344
                parameters, 
345
                providerServices, 
346
                DBHelper.newMetadataContainer(JDBCLibrary.NAME),
347
                this
348
        );
349
        this.initialize(store, parameters, store);
350
        return store;
351
    }
352

    
353
    @Override
354
    public JDBCServerExplorer createServerExplorer(
355
            JDBCServerExplorerParameters parameters, 
356
            DataServerExplorerProviderServices providerServices
357
        ) throws InitializeException {
358
        
359
        JDBCServerExplorer explorer = new JDBCServerExplorerBase(
360
                parameters, 
361
                providerServices, 
362
                this
363
        );
364
        this.initialize(explorer, parameters, null);
365
        return explorer;
366
    }
367

    
368
    @Override
369
    public JDBCNewStoreParameters createNewStoreParameters() {
370
        return new JDBCNewStoreParameters();
371
    }
372

    
373
    @Override
374
    public JDBCStoreParameters createOpenStoreParameters() {
375
        return new JDBCStoreParameters();
376
    }
377

    
378
    public JDBCServerExplorerParameters createServerExplorerParameters() {
379
        return new JDBCServerExplorerParameters();
380
    }
381

    
382
    @Override
383
    public String getSourceId(JDBCStoreParameters parameters) {
384
        return parameters.getHost() + ":" +
385
               parameters.getDBName() + ":" + 
386
               parameters.getSchema()+ ":" + 
387
               parameters.tableID();
388
    }
389
    
390
}