Statistics
| Revision:

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

History | View | Annotate | Download (12.7 KB)

1 29865 vsanjaime
/* 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 IVER T.I   {{Task}}
26
 */
27
28
/**
29
 *
30
 */
31
package org.gvsig.fmap.dal.store.oracle;
32
33 29932 vsanjaime
import java.awt.geom.Rectangle2D;
34 29865 vsanjaime
import java.sql.Connection;
35
import java.sql.ResultSet;
36
import java.sql.SQLException;
37
import java.sql.Statement;
38
import java.util.ArrayList;
39
import java.util.Iterator;
40
import java.util.List;
41
42
import org.gvsig.fmap.dal.DataStoreParameters;
43
import org.gvsig.fmap.dal.NewDataStoreParameters;
44
import org.gvsig.fmap.dal.exception.DataException;
45
import org.gvsig.fmap.dal.exception.InitializeException;
46
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
47
import org.gvsig.fmap.dal.exception.ReadException;
48
import org.gvsig.fmap.dal.exception.RemoveException;
49
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
50
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
51
import org.gvsig.fmap.dal.feature.FeatureType;
52
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
53
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
54
import org.gvsig.fmap.dal.store.jdbc.ConnectionAction;
55
import org.gvsig.fmap.dal.store.jdbc.JDBCHelper;
56
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
57
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
58
import org.gvsig.fmap.dal.store.jdbc.TransactionalAction;
59
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCExecuteSQLException;
60
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException;
61
import org.slf4j.Logger;
62
import org.slf4j.LoggerFactory;
63
64
/**
65 29932 vsanjaime
 * ORACLE SERVER EXPLORER
66
 *
67 29865 vsanjaime
 * @author vsanjaime
68
 *
69
 */
70
public class OracleServerExplorer extends JDBCServerExplorer {
71 29932 vsanjaime
72 29865 vsanjaime
        final static private Logger logger = LoggerFactory
73
                        .getLogger(OracleServerExplorer.class);
74
75 29932 vsanjaime
        public static final String NAME = "OracleServerExplorer";
76 29865 vsanjaime
77
        /**
78
         * Constructor
79
         *
80
         * @param parameters
81
         * @param services
82
         * @throws InitializeException
83
         */
84 29932 vsanjaime
        public OracleServerExplorer(OracleServerExplorerParameters parameters,
85 29865 vsanjaime
                        DataServerExplorerProviderServices services)
86
                        throws InitializeException {
87
                super(parameters, services);
88
        }
89
90
        /**
91
         * get explorer name
92
         */
93
        public String getName() {
94
                return NAME;
95
        }
96
97
        /**
98
         * can add
99
         */
100
        public boolean canAdd() {
101
                return true;
102
        }
103
104
        /**
105
         * remove
106
         */
107
        public void remove(DataStoreParameters dsp) throws RemoveException {
108
109 29932 vsanjaime
                final OracleStoreParameters oraParams = (OracleStoreParameters) dsp;
110 29865 vsanjaime
111
                TransactionalAction action = new TransactionalAction() {
112
                        public boolean continueTransactionAllowed() {
113
                                return false;
114
                        }
115
116
                        public Object action(Connection conn) throws DataException {
117
118
                                Statement st;
119
                                try {
120
                                        st = conn.createStatement();
121
                                } catch (SQLException e) {
122
                                        throw new JDBCSQLException(e);
123
                                }
124 29932 vsanjaime
                                // SQL REMOVE TABLE
125
                                String sqlDropTable = "DROP TABLE " + oraParams.tableID()
126
                                                + " CASCADE CONSTRAINTS";
127 29865 vsanjaime
128 29932 vsanjaime
                                // SQL DELETE METADATA
129
                                String tname = oraParams.tableID();
130
                                String sqlDeleteMetadata = "";
131
                                int ind = tname.lastIndexOf(".");
132
                                if (ind != -1) {
133
                                        String schema = tname.substring(0, ind);
134
                                        tname = tname.substring(ind + 1, tname.length());
135
                                        sqlDeleteMetadata = "DELETE FROM "
136
                                                        + OracleValues.USER_ORACLE_GEOMETADATA_VIEW
137
                                                        + " WHERE TABLE_NAME = '" + tname + "'";
138 29865 vsanjaime
139
                                } else {
140 29932 vsanjaime
                                        sqlDeleteMetadata = "DELETE FROM "
141
                                                        + OracleValues.USER_ORACLE_GEOMETADATA_VIEW
142
                                                        + " WHERE TABLE_NAME = '" + tname + "'";
143 29865 vsanjaime
                                }
144
145
                                try {
146 29932 vsanjaime
                                        // DROP TABLE
147 29865 vsanjaime
                                        try {
148 29932 vsanjaime
                                                st.execute(sqlDropTable);
149 29865 vsanjaime
                                        } catch (SQLException e) {
150 29932 vsanjaime
                                                throw new JDBCExecuteSQLException(sqlDropTable, e);
151 29865 vsanjaime
                                        }
152 29932 vsanjaime
                                        // DELETE METADATA
153 29865 vsanjaime
                                        try {
154 29932 vsanjaime
                                                st.execute(sqlDeleteMetadata);
155 29865 vsanjaime
                                        } catch (SQLException e) {
156 29932 vsanjaime
                                                throw new JDBCExecuteSQLException(sqlDeleteMetadata, e);
157 29865 vsanjaime
                                        }
158
159
                                } finally {
160
                                        try {
161
                                                st.close();
162
                                        } catch (SQLException e) {
163
                                        }
164
                                        ;
165
                                }
166
                                return null;
167
                        }
168
                };
169
                try {
170
                        this.helper.doConnectionAction(action);
171
                } catch (Exception e) {
172
                        throw new RemoveException(this.getName(), e);
173
                }
174
        }
175
176
        /**
177
         * get parameters
178
         */
179
        public NewDataStoreParameters getAddParameters() throws DataException {
180
                OracleServerExplorerParameters parameters = getOracleSpatialParameters();
181
                OracleNewStoreParameters params = new OracleNewStoreParameters();
182
                params.setHost(parameters.getHost());
183
                params.setPort(parameters.getPort());
184
                params.setDBName(parameters.getDBName());
185
                params.setUser(parameters.getUser());
186
                params.setPassword(parameters.getPassword());
187
                params.setCatalog(parameters.getCatalog());
188
                params.setSchema(parameters.getSchema());
189
                params.setJDBCDriverClassName(parameters.getJDBCDriverClassName());
190
                params.setUrl(parameters.getUrl());
191
                params.setUseSSL(parameters.getUseSSL());
192 29932 vsanjaime
                params.setOraDriverType(parameters.getOraDriverType());
193 29865 vsanjaime
194
                params.setDefaultFeatureType(this.getServerExplorerProviderServices()
195
                                .createNewFeatureType());
196
197
                return params;
198
        }
199
200
        /**
201
         * Geometry support
202
         */
203
        public boolean hasGeometrySupport() {
204
                return true;
205
        }
206
207
        /**
208 29932 vsanjaime
         * Get list of table availables in Oracle schema registered in geometry
209
         * metadata view
210 29865 vsanjaime
         */
211 29932 vsanjaime
        public List<JDBCStoreParameters> list(final int mode,
212
                        final boolean showInformationDBTables) throws DataException {
213 29865 vsanjaime
214
                final JDBCStoreParameters orgParams = createStoreParams();
215
216
                ConnectionAction action = new ConnectionAction() {
217
218
                        public Object action(Connection conn) throws DataException {
219
                                ResultSet rs = null;
220
                                Statement st = null;
221
222 29932 vsanjaime
                                List<String> sqls = getSQLForList(mode, showInformationDBTables);
223
224 29865 vsanjaime
                                try {
225 29932 vsanjaime
                                        JDBCStoreParameters params = null;
226 29865 vsanjaime
227 29932 vsanjaime
                                        List<JDBCStoreParameters> paramList = new ArrayList<JDBCStoreParameters>();
228 29865 vsanjaime
229
                                        conn = helper.getConnection();
230
                                        st = conn.createStatement();
231
                                        String sql;
232 29932 vsanjaime
                                        Iterator<String> sqlIter = sqls.iterator();
233 29865 vsanjaime
                                        while (sqlIter.hasNext()) {
234 29932 vsanjaime
                                                sql = sqlIter.next();
235 29865 vsanjaime
                                                rs = st.executeQuery(sql);
236
                                                while (rs.next()) {
237
                                                        params = (JDBCStoreParameters) orgParams.getCopy();
238
                                                        params.setTable(rs.getString(1));
239
                                                        paramList.add(params);
240
                                                }
241
                                        }
242
243
                                        return paramList;
244
                                } catch (SQLException e) {
245
                                        throw new JDBCSQLException(e);
246
                                } finally {
247
                                        try {
248
                                                rs.close();
249
                                        } catch (Exception e) {
250
                                        }
251
                                        ;
252
                                        try {
253
                                                st.close();
254
                                        } catch (Exception e) {
255
                                        }
256
                                        ;
257
                                }
258
                        }
259
260
                };
261
262
                try {
263
                        return (List) helper.doConnectionAction(action);
264
                } catch (Exception e) {
265
                        throw new ReadException(this.getName(), e);
266
                }
267
        }
268
269 29932 vsanjaime
        /**
270
         * create new table
271
         *
272
         * @params ndsp
273
         * @params overwrite
274
         * @return
275
         */
276 29865 vsanjaime
        public boolean add(NewDataStoreParameters ndsp, boolean overwrite)
277
                        throws DataException {
278
279
                if (!(ndsp instanceof NewFeatureStoreParameters)) {
280
                        throw new IllegalArgumentException();
281
                }
282 29932 vsanjaime
                this.checkIsMine(ndsp);
283 29865 vsanjaime
284
                NewFeatureStoreParameters nfdsp = (NewFeatureStoreParameters) ndsp;
285
286 29932 vsanjaime
                // SQL CREATE NEW TABLE
287
                StringBuilder sqlnewtable = new StringBuilder();
288 29865 vsanjaime
289
                if (!nfdsp.isValid()) {
290
                        throw new InitializeException(this.getName(), new Exception(
291
                                        "Parameters not valid"));
292
                }
293
                try {
294
                        nfdsp.validate();
295
                } catch (ValidateDataParametersException e1) {
296
                        throw new InitializeException(this.getName(), e1);
297
                }
298
299
                FeatureType fType = nfdsp.getDefaultFeatureType();
300
301 29932 vsanjaime
                sqlnewtable.append("CREATE TABLE " + ((JDBCStoreParameters) ndsp).tableID()
302 29865 vsanjaime
                                + "(");
303
                Iterator<FeatureAttributeDescriptor> attrs = fType.iterator();
304
                String sqlAttr;
305
                List<String> sqlAttrs = new ArrayList<String>();
306
307
                while (attrs.hasNext()) {
308
                        sqlAttr = helper
309
                                        .getSqlFieldDescription((FeatureAttributeDescriptor) attrs
310
                                                        .next());
311
                        if (sqlAttr != null) {
312
                                sqlAttrs.add(sqlAttr);
313
                        }
314
                }
315
316 29932 vsanjaime
                helper.stringJoin(sqlAttrs, ", ", sqlnewtable);
317 29865 vsanjaime
318
                String pk = "CONSTRAINT "
319 29932 vsanjaime
                                + OracleUtils.getDerivedName(
320
                                                ((JDBCStoreParameters) ndsp).tableID(), "PK")
321 29865 vsanjaime
                                + " PRIMARY KEY (\""
322 29932 vsanjaime
                                + OracleValues.DEFAULT_ID_FIELD_CASE_SENSITIVE + "\") ENABLE";
323 29865 vsanjaime
324 29932 vsanjaime
                sqlnewtable.append(", ");
325
                sqlnewtable.append(pk);
326 29865 vsanjaime
327 29932 vsanjaime
                sqlnewtable.append("); ");
328
                final String sqlCreateNew = sqlnewtable.toString();
329
330
                // SQL CREATE SPATIAL INDEX
331
                final String sqlindex = "CREATE INDEX "
332
                        + OracleUtils.getDerivedName(((JDBCStoreParameters) ndsp).tableID(), "SX") + " ON "
333
                        + ((JDBCStoreParameters) ndsp).tableID() + " (\"" + OracleValues.DEFAULT_GEO_FIELD
334
                        + "\") INDEXTYPE IS \"MDSYS\".\"SPATIAL_INDEX\" ";
335 29865 vsanjaime
336 29932 vsanjaime
                // SQL CREATE TABLE METADATA
337
                Rectangle2D bbox = new Rectangle2D.Double(0,0,1,1);
338
                final String sqlmeta = ((OracleHelper) helper)
339
                                .getSqlUpdateMetadata((OracleStoreParameters)ndsp, null, bbox, 2, true);
340 29865 vsanjaime
341
                TransactionalAction action = new TransactionalAction() {
342
343
                        public boolean continueTransactionAllowed() {
344
                                return false;
345
                        }
346
347
                        public Object action(Connection conn) throws DataException {
348
                                Statement st = null;
349
350
                                try {
351
                                        st = conn.createStatement();
352
                                } catch (SQLException e1) {
353
                                        throw new JDBCSQLException(e1);
354
                                }
355 29932 vsanjaime
                                String sqlnew = null;
356
                                String sqlspatialindex = null;
357
                                String sqlmetadata = null;
358 29865 vsanjaime
359 29932 vsanjaime
                                // new table
360 29865 vsanjaime
                                try {
361 29932 vsanjaime
                                        sqlnew = sqlCreateNew;
362
                                        st.execute(sqlnew);
363 29865 vsanjaime
364
                                } catch (SQLException e) {
365 29932 vsanjaime
                                        throw new JDBCExecuteSQLException(sqlnew, e);
366
                                }
367
                                //new spatial index
368
                                try {
369
                                        sqlspatialindex = sqlindex;
370
                                        st.execute(sqlspatialindex);
371
372
                                } catch (SQLException e) {
373
                                        throw new JDBCExecuteSQLException(sqlspatialindex, e);
374
                                }
375
                                //new metadata
376
                                try {
377
                                        sqlmetadata = sqlmeta;
378
                                        st.execute(sqlmetadata);
379
380
                                } catch (SQLException e) {
381
                                        throw new JDBCExecuteSQLException(sqlspatialindex, e);
382 29865 vsanjaime
                                } finally {
383
                                        try {
384
                                                st.close();
385
                                        } catch (SQLException e) {
386
                                                logger.error("Exception clossing statement", e);
387
                                        }
388
                                        ;
389
                                }
390
391
                                return Boolean.TRUE;
392
                        }
393
394
                };
395
396
                Boolean result = Boolean.FALSE;
397
398
                try {
399
                        result = (Boolean) helper.doConnectionAction(action);
400
                } catch (Exception e) {
401
                        throw new RuntimeException(e);
402
                }
403
404
                return result.booleanValue();
405
        }
406
407
        /**
408
         * create helper
409
         */
410
        protected JDBCHelper createHelper() throws InitializeException {
411
                return new OracleHelper(this, getOracleSpatialParameters());
412
        }
413
414
        /**
415 29932 vsanjaime
         * Get store name
416
         *
417
         * @return
418 29865 vsanjaime
         */
419
        protected String getStoreName() {
420
                return OracleStoreProvider.NAME;
421
        }
422
423
        /**
424 29932 vsanjaime
         * get Oracle helper
425 29865 vsanjaime
         *
426
         * @return
427
         */
428 29932 vsanjaime
        protected OracleHelper getOracleHelper() {
429 29865 vsanjaime
                return (OracleHelper) getHelper();
430
        }
431
432
        /**
433 29932 vsanjaime
         * Get list sql sentences for list available tables
434
         *
435
         * @param mode
436
         * @param showInformationDBtables
437
         * @return
438 29865 vsanjaime
         */
439
        protected List<String> getSQLForList(int mode,
440
                        boolean showInformationDBTables) {
441
                List<String> list = new ArrayList<String>(1);
442
                list.add("SELECT TABLE_NAME FROM USER_SDO_GEOM_METADATA");
443
444
                return list;
445
446
        }
447
448
        /**
449 29932 vsanjaime
         * check oracle data store parameters, validate SSL and type driver (THIN or
450
         * OCI)
451
         *
452
         * @param dsp
453 29865 vsanjaime
         */
454
        protected void checkIsMine(DataStoreParameters dsp) {
455
                if (!(dsp instanceof OracleStoreParameters)) {
456
                        throw new IllegalArgumentException(
457
                                        "not instance of OracleSpatialStoreParameters");
458
                }
459
                super.checkIsMine(dsp);
460
461
                OracleStoreParameters orap = (OracleStoreParameters) dsp;
462
                if (orap.getUseSSL().booleanValue() != getOracleSpatialParameters()
463
                                .getUseSSL()) {
464 29932 vsanjaime
                        throw new IllegalArgumentException("worng explorer: SSL");
465 29865 vsanjaime
                }
466 29932 vsanjaime
                if (orap.getOraDriverType().compareToIgnoreCase(
467
                                getOracleSpatialParameters().getOraDriverType()) != 0) {
468
                        throw new IllegalArgumentException(
469
                                        "worng explorer: Oracle type driver: THIN or OCI");
470
                }
471 29865 vsanjaime
        }
472
473
        /**
474
         * Create store parameters
475
         */
476
        protected JDBCStoreParameters createStoreParams()
477
                        throws InitializeException, ProviderNotRegisteredException {
478 29932 vsanjaime
                OracleStoreParameters params = (OracleStoreParameters) super
479 29865 vsanjaime
                                .createStoreParams();
480 29932 vsanjaime
                // add SSL and type driver (THIN or OCI)
481
                params.setUseSSL(getOracleSpatialParameters().getUseSSL());
482
                params
483
                                .setOraDriverType(getOracleSpatialParameters()
484
                                                .getOraDriverType());
485 29865 vsanjaime
486 29932 vsanjaime
                return params;
487 29865 vsanjaime
        }
488
489
        /**
490 29932 vsanjaime
         * Get Oracle server explorer parameters
491 29865 vsanjaime
         *
492
         * @return
493
         */
494
        private OracleServerExplorerParameters getOracleSpatialParameters() {
495
                return (OracleServerExplorerParameters) getParameters();
496
        }
497
498
}