Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.oracle / src / org / gvsig / fmap / dal / store / oracle / OracleStoreProvider.java @ 30231

History | View | Annotate | Download (11.1 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2009 Prodevelop S.L. main development
26
 */
27

    
28
package org.gvsig.fmap.dal.store.oracle;
29

    
30
import java.util.ArrayList;
31
import java.util.List;
32
import java.util.regex.Matcher;
33
import java.util.regex.Pattern;
34

    
35
import oracle.sql.STRUCT;
36

    
37
import org.gvsig.fmap.dal.DALLocator;
38
import org.gvsig.fmap.dal.DataManager;
39
import org.gvsig.fmap.dal.DataServerExplorer;
40
import org.gvsig.fmap.dal.DataTypes;
41
import org.gvsig.fmap.dal.exception.DataException;
42
import org.gvsig.fmap.dal.exception.InitializeException;
43
import org.gvsig.fmap.dal.exception.ReadException;
44
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
45
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
46
import org.gvsig.fmap.dal.feature.FeatureQuery;
47
import org.gvsig.fmap.dal.feature.FeatureStore;
48
import org.gvsig.fmap.dal.feature.FeatureType;
49
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
50
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
51
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
52
import org.gvsig.fmap.dal.store.jdbc.JDBCHelper;
53
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreProviderWriter;
54
import org.gvsig.fmap.geom.Geometry;
55
import org.gvsig.tools.ToolsLocator;
56
import org.gvsig.tools.dynobject.DynClass;
57
import org.gvsig.tools.dynobject.DynObjectManager;
58
import org.slf4j.Logger;
59
import org.slf4j.LoggerFactory;
60

    
61
/**
62
 * Oracle Provider
63
 * 
64
 * @author vsanjaime
65
 * 
66
 */
67
public class OracleStoreProvider extends JDBCStoreProviderWriter {
68

    
69
        public final static Logger logger = LoggerFactory
70
                        .getLogger(OracleStoreProvider.class);
71

    
72
        public static String NAME = "OracleSpatial";
73
        public static String DESCRIPTION = "Oracle source";
74
        private static final String DYNCLASS_NAME = "OracleStore";
75
        private static DynClass DYNCLASS = null;
76

    
77
        protected static void registerDynClass() {
78
                DynObjectManager dynman = ToolsLocator.getDynObjectManager();
79
                DynClass dynClass;
80
                if (DYNCLASS == null) {
81
                        dynClass = dynman.add(DYNCLASS_NAME, DESCRIPTION);
82

    
83
                        dynClass.extend(dynman.get(FeatureStore.DYNCLASS_NAME));
84
                        DYNCLASS = dynClass;
85
                }
86
        }
87

    
88
        public OracleStoreProvider(OracleStoreParameters params,
89
                        DataStoreProviderServices storeServices) throws InitializeException {
90
                super(params, storeServices, ToolsLocator.getDynObjectManager()
91
                                .createDynObject(DYNCLASS));
92
        }
93

    
94
        private OracleStoreParameters getOracleStoreParameters() {
95
                return (OracleStoreParameters) this.getParameters();
96
        }
97

    
98
        protected JDBCHelper createHelper() throws InitializeException {
99
                return new OracleHelper(this, getOracleStoreParameters());
100
        }
101

    
102
        protected String fixFilter(String filter) {
103
                if (filter == null) {
104
                        return null;
105
                }
106

    
107
                // Transform SRS to code
108
                // GeomFromText\s*\(\s*'[^']*'\s*,\s*('[^']*')\s*\)
109
                Pattern pattern = Pattern
110
                                .compile("GeomFromText\\s*\\(\\s*'[^']*'\\s*,\\s*'([^']*)'\\s*\\)");
111
                Matcher matcher = pattern.matcher(filter);
112
                StringBuilder strb = new StringBuilder();
113
                int pos = 0;
114
                String srsCode;
115
                while (matcher.find(pos)) {
116
                        strb.append(filter.substring(pos, matcher.start(1)));
117
                        srsCode = matcher.group(1).trim();
118
                        if (srsCode.startsWith("'")) {
119
                                srsCode = srsCode.substring(1);
120
                        }
121
                        if (srsCode.endsWith("'")) {
122
                                srsCode = srsCode.substring(0, srsCode.length() - 1);
123
                        }
124
                        strb.append(helper.getProviderSRID(srsCode));
125
                        strb.append(filter.substring(matcher.end(1), matcher.end()));
126
                        pos = matcher.end();
127

    
128
                }
129
                strb.append(filter.substring(pos));
130

    
131
                return strb.toString();
132
        }
133

    
134
        public String getName() {
135
                return NAME;
136
        }
137

    
138
        public FeatureSetProvider createSet(FeatureQuery query,
139
                        FeatureType featureType) throws DataException {
140

    
141
                return new OracleSetProvider(this, query, featureType);
142
        }
143

    
144
        public DataServerExplorer getExplorer() throws ReadException {
145
                DataManager manager = DALLocator.getDataManager();
146
                OracleServerExplorerParameters exParams;
147
                OracleStoreParameters params = getOracleStoreParameters();
148
                try {
149
                        exParams = (OracleServerExplorerParameters) manager
150
                                        .createServerExplorerParameters(OracleServerExplorer.NAME);
151
                        exParams.setUrl(params.getUrl());
152
                        exParams.setHost(params.getHost());
153
                        exParams.setPort(params.getPort());
154
                        exParams.setDBName(params.getDBName());
155
                        exParams.setUser(params.getUser());
156
                        exParams.setPassword(params.getPassword());
157
                        exParams.setCatalog(params.getCatalog());
158
                        exParams.setSchema(params.getSchema());
159
                        exParams.setJDBCDriverClassName(params.getJDBCDriverClassName());
160
                        exParams.setUseSSL(params.getUseSSL());
161
                        exParams.setOraDriverType(params.getOraDriverType());
162

    
163
                        return manager.createServerExplorer(exParams);
164
                } catch (DataException e) {
165
                        throw new ReadException(this.getName(), e);
166
                } catch (ValidateDataParametersException e) {
167
                        throw new ReadException(this.getName(), e);
168
                }
169
        }
170

    
171
        public boolean allowAutomaticValues() {
172
                return true;
173
        }
174

    
175
        public boolean hasGeometrySupport() {
176
                return true;
177
        }
178

    
179
        protected OracleHelper getOraHelper() {
180
                return (OracleHelper) getHelper();
181
        }
182

    
183
        public boolean canWriteGeometry(int geometryType, int geometrySubtype)
184
                        throws DataException {
185
                FeatureType type = getFeatureStore().getDefaultFeatureType();
186
                FeatureAttributeDescriptor geomAttr = type.getAttributeDescriptor(type
187
                                .getDefaultGeometryAttributeName());
188
                if (geomAttr == null) {
189
                        return false;
190
                }
191
                if (geometrySubtype != geomAttr.getGeometrySubType()) {
192
                        return false;
193
                }
194
                switch (geomAttr.getGeometryType()) {
195
                case Geometry.TYPES.GEOMETRY:
196
                        return true;
197

    
198
                case Geometry.TYPES.MULTISURFACE:
199
                        return geometryType == Geometry.TYPES.MULTISURFACE;
200

    
201
                case Geometry.TYPES.MULTIPOINT:
202
                        return geometryType == Geometry.TYPES.MULTIPOINT;
203

    
204
                case Geometry.TYPES.MULTICURVE:
205
                        return geometryType == Geometry.TYPES.MULTICURVE;
206

    
207
                case Geometry.TYPES.MULTISOLID:
208
                        return geometryType == Geometry.TYPES.MULTISOLID;
209

    
210
                case Geometry.TYPES.SURFACE:
211
                        return geometryType == Geometry.TYPES.SURFACE;
212

    
213
                case Geometry.TYPES.POINT:
214
                        return geometryType == Geometry.TYPES.POINT;
215

    
216
                case Geometry.TYPES.CURVE:
217
                        return geometryType == Geometry.TYPES.CURVE;
218

    
219
                case Geometry.TYPES.SOLID:
220
                        return geometryType == Geometry.TYPES.SOLID;
221

    
222
                default:
223
                        return geometryType == geomAttr.getGeometryType();
224
                }
225

    
226
        }
227

    
228
        protected void addToListFeatureValues(FeatureProvider featureProvider,
229
                        FeatureAttributeDescriptor attrOfList,
230
                        FeatureAttributeDescriptor attr, List values) throws DataException {
231

    
232
                if (attr.getDataType() == DataTypes.GEOMETRY) {
233
                        Geometry geom = (Geometry) featureProvider.get(attr.getIndex());
234
                        STRUCT stru = OracleUtils.GeometryToSTRUCT(geom, c, srid, agu_b,
235
                                        hasSrid);
236
                        values.add(stru);
237
                } else {
238
                        super.addToListFeatureValues(featureProvider, attrOfList, attr,
239
                                        values);
240
                }
241
        }
242

    
243
        protected String getSqlStatementAddField(FeatureAttributeDescriptor attr,
244
                        List additionalStatement) throws DataException {
245

    
246
                if (attr.getDataType() == DataTypes.GEOMETRY) {
247
                        OracleStoreParameters params = getOracleStoreParameters();
248
                        additionalStatement.add(((OracleHelper) helper)
249
                                        .getSqlGeometryFieldAdd(attr, params.getTable(), params
250
                                                        .getSchema()));
251
                }
252

    
253
                return super.getSqlStatementAddField(attr, additionalStatement);
254

    
255
        }
256

    
257
        protected String getSqlStatementDropField(FeatureAttributeDescriptor attr,
258
                        List additionalStatement) {
259
                String result = super.getSqlStatementDropField(attr,
260
                                additionalStatement);
261
                if (attr.getDataType() == DataTypes.GEOMETRY) {
262
                        additionalStatement.add(getSqlGeometryFieldDrop(attr));
263
                }
264
                return result;
265
        }
266

    
267
        protected List<String> getSqlStatementAlterField(
268
                        FeatureAttributeDescriptor attrOrg,
269
                        FeatureAttributeDescriptor attrTrg, List additionalStatement)
270
                        throws DataException {
271

    
272
                List<String> actions = new ArrayList<String>();
273
                StringBuilder strb;
274
                OracleStoreParameters params = getOracleStoreParameters();
275

    
276
                // diferent column type
277
                if (attrOrg.getDataType() != attrTrg.getDataType()) {
278
                        strb = new StringBuilder();
279
                        strb.append("MODIFY (");
280
                        strb.append(helper.escapeFieldName(attrTrg.getName()));
281
                        strb.append(" ");
282
                        strb.append(helper.getSqlColumnTypeDescription(attrTrg));
283
                        strb.append(")");
284

    
285
                        if (attrOrg.getDataType() == DataTypes.GEOMETRY) {
286
                                additionalStatement.add(getSqlGeometryFieldDrop(attrOrg));
287
                        }
288
                        if (attrTrg.getDataType() == DataTypes.GEOMETRY) {
289
                                additionalStatement.addAll(((OracleHelper) helper)
290
                                                .getSqlGeometryFieldAdd(attrTrg, params.getTable(),
291
                                                                params.getSchema()));
292
                        }
293

    
294
                        actions.add(strb.toString());
295
                }
296

    
297
                if (attrOrg.allowNull() != attrTrg.allowNull()) {
298

    
299
                        strb = new StringBuilder();
300
                        strb.append("MODIFY (");
301
                        strb.append(helper.escapeFieldName(attrTrg.getName()));
302
                        strb.append(" ");
303
                        if (attrTrg.allowNull()) {
304
                                strb.append("SET ");
305
                        } else {
306
                                strb.append("DROP ");
307
                        }
308
                        strb.append("NOT NULL)");
309
                        actions.add(strb.toString());
310
                }
311

    
312
                if (attrOrg.getDefaultValue() != attrTrg.getDefaultValue()) {
313
                        if (attrTrg.getDefaultValue() == null) {
314

    
315
                                strb = new StringBuilder();
316
                                strb.append("MODIFY (");
317
                                strb.append(helper.escapeFieldName(attrTrg.getName()));
318
                                strb.append(" DROP DEFAULT)");
319
                                actions.add(strb.toString());
320
                        } else if (!attrTrg.getDefaultValue().equals(
321
                                        attrOrg.getDefaultValue())) {
322
                                // ALTER [ COLUMN ] column DROP DEFAULT
323

    
324
                                strb = new StringBuilder();
325
                                strb.append("MODIFY (");
326
                                strb.append(helper.escapeFieldName(attrTrg.getName()));
327
                                strb.append(" SET DEFAULT ");
328
                                strb.append(helper.dalValueToJDBC(attrTrg, attrTrg
329
                                                .getDefaultValue()));
330
                                strb.append(")");
331
                                actions.add(strb.toString());
332
                        }
333
                }
334

    
335
                if (attrOrg.getDataType() == attrTrg.getDataType()
336
                                && attrTrg.getDataType() == DataTypes.GEOMETRY) {
337
                        // TODO Checks SRS and GeomType/Subtype
338
                }
339

    
340
                return actions;
341
        }
342

    
343
        private Object getSqlGeometryFieldDrop(FeatureAttributeDescriptor attr) {
344
                StringBuilder strb = new StringBuilder();
345
                OracleStoreParameters params = getOracleStoreParameters();
346

    
347
                // DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME like 'XX' And
348
                // COLUMN_NAME like 'GEOMETRY';
349
                strb.append("DELETE FROM ");
350
                strb.append(OracleValues.USER_ORACLE_GEOMETADATA_VIEW);
351
                strb.append(" WHERE ");
352
                strb.append(OracleValues.USER_ORACLE_GEOMETADATA_VIEW_TABLE_NAME);
353
                strb.append(" like '");
354
                strb.append(params.getTable());
355
                strb.append("' AND ");
356
                strb.append(OracleValues.USER_ORACLE_GEOMETADATA_VIEW_COLUMN_NAME);
357
                strb.append(" like '");
358
                strb.append(attr.getName());
359
                strb.append("'");
360

    
361
                return strb.toString();
362
        }
363

    
364
}