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 / JDBCServerExplorerBase.java @ 44346

History | View | Annotate | Download (19.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.store.jdbc2.spi;
24

    
25
import java.io.File;
26
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
27
import java.util.ArrayList;
28
import java.util.Arrays;
29
import java.util.List;
30
import org.apache.commons.lang3.BooleanUtils;
31
import org.apache.commons.lang3.ObjectUtils;
32
import org.apache.commons.lang3.StringUtils;
33
import org.apache.commons.lang3.tuple.ImmutablePair;
34
import org.apache.commons.lang3.tuple.Pair;
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataManager;
37
import org.gvsig.fmap.dal.DataStore;
38
import org.gvsig.fmap.dal.DataStoreParameters;
39
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
40
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
41
import org.gvsig.fmap.dal.NewDataStoreParameters;
42
import org.gvsig.fmap.dal.exception.CloseException;
43
import org.gvsig.fmap.dal.exception.DataException;
44
import org.gvsig.fmap.dal.exception.InitializeException;
45
import org.gvsig.fmap.dal.exception.OpenException;
46
import org.gvsig.fmap.dal.exception.RemoveException;
47
import org.gvsig.fmap.dal.feature.EditableFeatureType;
48
import org.gvsig.fmap.dal.feature.FeatureType;
49
import org.gvsig.fmap.dal.SQLBuilder;
50
import org.gvsig.fmap.dal.SQLBuilder.Privilege;
51
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
52
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
53
import org.gvsig.fmap.dal.serverexplorer.db.spi.AbstractDBServerExplorer;
54
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
55
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
56
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
57
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
58
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
59
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
60
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
61
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCExecuteSQLException;
62
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
63
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
64
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CanCreateTablesOperation;
65
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CreateTableOperation;
66
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
67
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ListTablesOperation;
68
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.DropTableOperation;
69
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ExecuteOperation;
70
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.UpdateTableStatisticsOperation;
71
import org.gvsig.tools.exception.BaseException;
72
import org.gvsig.tools.resourcesstorage.EmptyResourcesStorage;
73
import org.gvsig.tools.resourcesstorage.FilesResourcesStorage;
74
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
75
import org.slf4j.Logger;
76
import org.slf4j.LoggerFactory;
77

    
78

    
79
@SuppressWarnings("UseSpecificCatch")
80
public class JDBCServerExplorerBase extends AbstractDBServerExplorer implements JDBCServerExplorer {
81

    
82
    private static final Logger LOG = LoggerFactory.getLogger(JDBCServerExplorerBase.class);
83

    
84
    protected JDBCHelper helper = null;
85
    
86
    private Boolean canAdd;
87

    
88
    public JDBCServerExplorerBase(
89
            JDBCServerExplorerParameters parameters,
90
            DataServerExplorerProviderServices services,
91
            JDBCHelper helper
92
        ) throws InitializeException {
93
        super(parameters, services);
94
        this.helper = helper;
95
    }
96

    
97
    @Override
98
    public String getProviderName() {
99
        return this.getHelper().getProviderName();
100
    }
101

    
102
    @Override
103
    public String getStoreName() {
104
        return this.getHelper().getProviderName();
105
    }
106

    
107
    protected DataManagerProviderServices getManager() {
108
        return (DataManagerProviderServices) DALLocator.getDataManager();
109
    }
110
        
111
    @Override
112
    public JDBCServerExplorerParameters getParameters() {
113
        return (JDBCServerExplorerParameters) super.getParameters();
114
    }
115
    
116
    @Override
117
    public boolean closeResourceRequested(ResourceProvider resource) {
118
        this.getHelper().getResulSetControler().pack();
119
        return true;
120
    }
121

    
122
    @Override
123
    public void resourceChanged(ResourceProvider resource) {
124
        // Nothing to do
125
    }
126

    
127
    protected JDBCHelper getHelper() {
128
        return helper;
129
    }
130
    
131
    protected OperationsFactory getOperations() {
132
        return this.getHelper().getOperations();
133
    }
134

    
135
    @Override
136
    public DataStore open(DataStoreParameters params) throws DataException {
137
        checkIsMine(params);
138
        DataStore store = super.open(params);
139
        return store;
140
    }
141

    
142
    @Override
143
    public List list(int mode) throws DataException {
144
        boolean informationTables = BooleanUtils.isTrue(
145
                this.getParameters().getShowInformationDBTables()
146
        );
147
        JDBCStoreParameters baseParams = this.getOpenParameters();
148
        ListTablesOperation listTables = this.getOperations().createListTables(
149
                mode, baseParams, informationTables
150
        );
151
        List<JDBCStoreParameters> tables = (List<JDBCStoreParameters>) listTables.perform();
152
        return tables;
153
    }
154

    
155
    @Override
156
    public void remove(DataStoreParameters theParams) throws RemoveException {
157

    
158
        JDBCStoreParameters params = (JDBCStoreParameters) theParams;
159
        DropTableOperation removeTable = this.getOperations().createDropTable(
160
                this.getOperations().createTableReference(params)
161
        );
162
        removeTable.perform();
163
    }
164

    
165
    @Override
166
    public JDBCStoreParameters getOpenParameters() throws DataException {
167
        JDBCServerExplorerParameters parameters = getParameters();
168
        JDBCStoreParameters params = this.helper.createOpenStoreParameters();
169
        params.setHost(parameters.getHost());
170
        params.setPort(parameters.getPort());
171
        params.setDBName(parameters.getDBName());
172
        params.setUser(parameters.getUser());
173
        params.setPassword(parameters.getPassword());
174
        params.setCatalog(parameters.getCatalog());
175
        params.setSchema(parameters.getSchema());
176
        params.setJDBCDriverClassName(parameters.getJDBCDriverClassName());
177
        params.setUrl(parameters.getUrl());
178
        if( parameters instanceof FilesystemStoreParameters ) {
179
            File f = ((FilesystemStoreParameters) parameters).getFile();
180
            ((FilesystemStoreParameters) params).setFile(f);
181
        }
182
        return params;
183
    }
184

    
185
    @Override
186
    public NewDataStoreParameters getAddParameters(String storeName)
187
            throws DataException {
188
        JDBCNewStoreParameters params = this.getAddParameters();
189
        params.setTable(storeName);
190
        return params;
191
    }
192

    
193
    @Override
194
    public JDBCNewStoreParameters getAddParameters() throws DataException {
195
        JDBCServerExplorerParameters parameters = getParameters();
196
        JDBCNewStoreParameters params = this.helper.createNewStoreParameters();
197
        params.setHost(parameters.getHost());
198
        params.setPort(parameters.getPort());
199
        params.setDBName(parameters.getDBName());
200
        params.setUser(parameters.getUser());
201
        params.setPassword(parameters.getPassword());
202
        params.setCatalog(parameters.getCatalog());
203
        params.setSchema(parameters.getSchema());
204
        params.setJDBCDriverClassName(parameters.getJDBCDriverClassName());
205
        params.setUrl(parameters.getUrl());
206
        if( parameters instanceof FilesystemStoreParameters ) {
207
            File f = ((FilesystemStoreParameters) parameters).getFile();
208
            ((FilesystemStoreParameters) params).setFile(f);
209
        }
210

    
211
        params.setDefaultFeatureType(this.getServerExplorerProviderServices()
212
                .createNewFeatureType());
213

    
214
        return params;
215
    }
216

    
217
    protected void checkIsMine(DataStoreParameters dsp) {
218
        if (!(dsp instanceof JDBCConnectionParameters)) {
219
            throw new IllegalArgumentException(
220
                    "not instance of FilesystemStoreParameters");
221
        }
222
        JDBCServerExplorerParameters parameters = getParameters();
223

    
224
        JDBCConnectionParameters pgp = (JDBCConnectionParameters) dsp;
225
        if( !StringUtils.equals(pgp.getHost(), parameters.getHost()) ) {
226
            throw new IllegalArgumentException("wrong explorer: Host (mine: "
227
                    + parameters.getHost() + " other:" + pgp.getHost() + ")");
228
        }
229
        if( !ObjectUtils.equals(pgp.getPort(), parameters.getPort()) ) {
230
            throw new IllegalArgumentException("wrong explorer: Port (mine: "
231
                    + parameters.getPort() + " other:" + pgp.getPort() + ")");
232
        }
233
        if( !StringUtils.equals(pgp.getDBName(), parameters.getDBName()) ) {
234
            throw new IllegalArgumentException("wrong explorer: DBName (mine: "
235
                    + parameters.getDBName() + " other:" + pgp.getDBName()
236
                    + ")");
237
        }
238
        if( ! StringUtils.isEmpty(parameters.getCatalog()) ) {
239
            if( !StringUtils.equals(pgp.getCatalog(), parameters.getCatalog()) ) {
240
                throw new IllegalArgumentException(
241
                        "wrong explorer: Catalog (mine: "
242
                        + parameters.getCatalog() + " other:"
243
                        + pgp.getCatalog() + ")");
244
            }
245
        }
246
        if( ! StringUtils.isEmpty(parameters.getSchema()) ) {
247
            if( !StringUtils.equals(pgp.getSchema(), parameters.getSchema()) ) {
248
                throw new IllegalArgumentException(
249
                        "wrong explorer: Schema (mine: "
250
                        + parameters.getSchema() + " other:"
251
                        + pgp.getSchema() + ")");
252
            }
253
        }
254
    }
255

    
256
    @Override
257
    public void open() throws OpenException {
258

    
259
    }
260

    
261
    @Override
262
    public void close() throws CloseException {
263

    
264
    }
265

    
266
    @Override
267
    protected void doDispose() throws BaseException {
268
        helper.dispose();
269
        helper = null;
270
    }
271

    
272
    @Override
273
    public boolean canAdd() {
274
        if (this.canAdd == null) {
275
            CanCreateTablesOperation canAdd_ = this.getOperations().createCanCreateTables();
276
            this.canAdd = (Boolean) canAdd_.perform();
277
        }
278
        return this.canAdd;
279
    }
280

    
281
    @Override
282
    public FeatureType getFeatureType(DataStoreParameters theParams)
283
            throws DataException {
284
        
285
        JDBCStoreParameters params = (JDBCStoreParameters)theParams;
286
        
287
        checkIsMine(params);
288

    
289
        EditableFeatureType fetureType = 
290
                this.getServerExplorerProviderServices().createNewFeatureType();
291
        
292
        List<String> primaryKeys = null;
293
        if( params.getPkFields() != null ) {
294
            primaryKeys = Arrays.asList(params.getPkFields());
295
        }
296
        
297
        FetchFeatureTypeOperation fetch = this.getOperations().createFetchFeatureType(
298
                fetureType, 
299
                this.getOperations().createTableReference(params),
300
                primaryKeys,
301
                params.getDefaultGeometryField(),
302
                params.getCRS()
303
        );
304
        fetch.perform();
305
        return fetureType;
306
    }
307

    
308
    @Override
309
    public boolean add(String providerName, NewDataStoreParameters theParams, boolean overwrite)
310
            throws DataException {
311

    
312
        List<Pair<String, Privilege>> userAndPrivileges = new ArrayList<>();
313
        JDBCNewStoreParameters params = (JDBCNewStoreParameters)theParams;
314
        if( !StringUtils.isEmpty(params.getAllRole()) ) {
315
            userAndPrivileges.add( 
316
                    new ImmutablePair<>(params.getAllRole(), Privilege.ALL )
317
            );
318
        }
319
        if( !StringUtils.isEmpty(params.getDeleteRole()) ) {
320
            userAndPrivileges.add( 
321
                    new ImmutablePair<>(params.getDeleteRole(), Privilege.DELETE )
322
            );
323
        }
324
        if( !StringUtils.isEmpty(params.getInsertRole()) ) {
325
            userAndPrivileges.add( 
326
                    new ImmutablePair<>(params.getInsertRole(), Privilege.INSERT )
327
            );
328
        }
329
        if( !StringUtils.isEmpty(params.getReferenceRole()) ) {
330
            userAndPrivileges.add( 
331
                    new ImmutablePair<>(params.getReferenceRole(), Privilege.REFERENCE )
332
            );
333
        }
334
        if( !StringUtils.isEmpty(params.getSelectRole()) ) {
335
            userAndPrivileges.add( 
336
                    new ImmutablePair<>(params.getSelectRole(), Privilege.SELECT )
337
            );
338
        }
339
        if( !StringUtils.isEmpty(params.getTriggerRole()) ) {
340
            userAndPrivileges.add( 
341
                    new ImmutablePair<>(params.getTriggerRole(), Privilege.TRIGGER )
342
            );
343
        }
344
        if( !StringUtils.isEmpty(params.getTruncateRole()) ) {
345
            userAndPrivileges.add( 
346
                    new ImmutablePair<>(params.getTruncateRole(), Privilege.TRUNCATE )
347
            );
348
        }
349
        if( !StringUtils.isEmpty(params.getUpdateRole()) ) {
350
            userAndPrivileges.add( 
351
                    new ImmutablePair<>(params.getUpdateRole(), Privilege.UPDATE )
352
            );
353
        }
354
        List<String> additionalSQLs =  new ArrayList<>();
355
        if( !StringUtils.isEmpty(params.getPostCreatingStatement()) ) {
356
            additionalSQLs.add(params.getPostCreatingStatement());
357
        }
358
        CreateTableOperation createTable = this.getOperations().createTable(
359
                this.getOperations().createTableReference(params),
360
                params.getDefaultFeatureType(),
361
                userAndPrivileges, 
362
                additionalSQLs
363
        );
364
        boolean isOk = (boolean) createTable.perform();
365
        if( !isOk ) {
366
            return false;
367
        }
368
        
369
        if( theParams instanceof NewFeatureStoreParameters ) {
370
            DataManager dataManager = DALLocator.getDataManager();
371
            ResourcesStorage resources = this.getResourcesStorage(theParams);
372
            dataManager.writeDALResource(resources, ((NewFeatureStoreParameters) theParams).getDefaultFeatureType());
373
        }
374
        return true;
375
    }
376

    
377
    @Override
378
    public List getDataStoreProviderNames() {
379
        List x = new ArrayList(1);
380
        x.add(this.getProviderName());
381
        return x;
382
    }
383

    
384
    @Override
385
    public void updateTableStatistics(String database, String schema, String table) throws JDBCExecuteSQLException {
386
        UpdateTableStatisticsOperation updateStatistics = this.getOperations().createUpdateTableStatistics(
387
                this.getOperations().createTableReference(database, schema, table, null)
388
        );
389
        updateStatistics.perform();
390
    }
391

    
392
    @Override
393
    public void execute(String sql) {
394
        ExecuteOperation execute = this.getOperations().createExecute(sql);
395
        execute.perform();
396
    }
397

    
398
    @Override
399
    public JDBCStoreParameters get(String name) throws DataException {
400
        JDBCStoreParameters params = this.getOpenParameters();
401
        params.setTable(name);
402
        return params;
403
    }
404

    
405
    @Override
406
    public SQLBuilder createSQLBuilder() {
407
        return this.getHelper().createSQLBuilder();
408
    }
409

    
410
    private ResourcesStorage getResourcesStorage(DataStoreParameters parameters, String storeName) {
411
        
412
        if( !DatabaseWorkspaceManager.isInternalTable(storeName) ) {
413
            ResourcesStorage alternateResourcesStorage = null;
414
            try {
415
                DataManager dataManager = DALLocator.getDataManager();
416
                DatabaseWorkspaceManager workspace = dataManager.getDatabaseWorkspace(parameters);
417
                if( workspace != null ) {
418
                    alternateResourcesStorage = workspace.getAlternativeResourcesStorage();
419
                }
420
            } catch(Throwable th) {
421
                alternateResourcesStorage = null;
422
            }
423
            try {
424
                List<JDBCStoreParameters> tables = this.list();
425
                for (JDBCStoreParameters params : tables) {
426
                    String theTableName = params.getTable();
427
                    if (StringUtils.equals(theTableName, TABLE_RESOURCES_NAME)) {
428
                        JDBCResourcesStorage theResourcesStorage = new JDBCResourcesStorage(
429
                                alternateResourcesStorage,
430
                                params,
431
                                storeName
432
                        );
433
                        return theResourcesStorage;
434
                    }
435
                }
436
            } catch (Throwable ex) {
437
                LOG.warn("Can't retrieve reources storage from table '" + TABLE_RESOURCES_NAME + "' in '"+this.getParameters().getUrl()+"'.", ex);
438
            }
439
        }
440
        EmptyResourcesStorage theResourcesStorage = new EmptyResourcesStorage();
441
        return theResourcesStorage;            
442
    }
443
    
444
    
445
    @Override
446
    public ResourcesStorage getResourcesStorage(DataStoreParameters parameters) {
447
        if( parameters == null ) {
448
            throw new IllegalArgumentException("null is a valid value for parameters.");
449
        }
450
        String tableName;
451
        if( parameters instanceof JDBCNewStoreParameters) {
452
            tableName = ((JDBCNewStoreParameters)parameters).getTable();
453
        } else if( parameters instanceof JDBCStoreParameters) {
454
            tableName = ((JDBCStoreParameters)parameters).getTable();
455
        } else {
456
            throw new IllegalArgumentException("Required a JDBCStoreParameters or JDBCNewStoreParameters parameters, received "+parameters.getClass().getName()+".");
457
        }
458
        return this.getResourcesStorage(parameters, tableName);
459
    }
460
    
461
    @Override
462
    public ResourcesStorage getResourcesStorage(DataStore dataStore) {
463
        return this.getResourcesStorage(
464
                (JDBCStoreParameters) dataStore.getParameters(), 
465
                dataStore.getName()
466
        );
467
    }
468

    
469
    @Override
470
    public boolean exists(DataStoreParameters parameters) throws DataException {
471
        JDBCStoreParameters params = (JDBCStoreParameters) parameters;
472
        JDBCSQLBuilderBase builder = this.getHelper().createSQLBuilder();
473
        SQLBuilder.TableNameBuilder searchTable = builder.createTableNameBuilder()
474
                .database(params.getDBName())
475
                .schema(params.getSchema())
476
                .name(params.getTable());
477
        SQLBuilder.TableNameBuilder table = builder.createTableNameBuilder();
478
                
479
        List<JDBCStoreParameters> l = this.list();
480
        for (JDBCStoreParameters current : l) {
481
            table.database(current.getDBName())
482
                .schema(current.getSchema())
483
                .name(current.getTable());
484
            if( table.equals(searchTable) ) {
485
                return true;
486
            }
487
        }
488
        return false;
489
    }
490

    
491
}