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

History | View | Annotate | Download (19.8 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.ResourcesStorage;
74
import org.slf4j.Logger;
75
import org.slf4j.LoggerFactory;
76

    
77

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
213
        return params;
214
    }
215

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

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

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

    
258
    }
259

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

    
263
    }
264

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

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

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

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

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

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

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

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

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

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

    
404
    @Override
405
    public SQLBuilder createSQLBuilder() {
406
        JDBCSQLBuilderBase builder = this.getHelper().createSQLBuilder();
407
        return builder;
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(storeName);
419
                }
420
            } catch(Throwable th) {
421
                alternateResourcesStorage = null;
422
            }
423
            try { // TODO: Habria que ver de localizar los parametros sin tener que hacer un list.
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
    @Override
445
    public ResourcesStorage getResourcesStorage() {
446
        JDBCStoreParameters params;
447
        try {
448
            params = this.getOpenParameters();
449
            params.setTable(DatabaseWorkspaceManager.TABLE_RESOURCES_NAME);
450
            JDBCResourcesStorage theResourcesStorage = new JDBCResourcesStorage(
451
                    null,
452
                    params,
453
                    "$SERVVER$"
454
            );
455
            return theResourcesStorage;
456
        } catch (DataException ex) {
457
            return null;
458
        }
459
    }
460
 
461
    @Override
462
    public ResourcesStorage getResourcesStorage(DataStoreParameters parameters) {
463
        if( parameters == null ) {
464
            throw new IllegalArgumentException("null is a valid value for parameters.");
465
        }
466
        String tableName;
467
        if( parameters instanceof JDBCNewStoreParameters) {
468
            tableName = ((JDBCNewStoreParameters)parameters).getTable();
469
        } else if( parameters instanceof JDBCStoreParameters) {
470
            tableName = ((JDBCStoreParameters)parameters).getTable();
471
        } else {
472
            throw new IllegalArgumentException("Required a JDBCStoreParameters or JDBCNewStoreParameters parameters, received "+parameters.getClass().getName()+".");
473
        }
474
        return this.getResourcesStorage(parameters, tableName);
475
    }
476
    
477
    @Override
478
    public ResourcesStorage getResourcesStorage(DataStore dataStore) {
479
        return this.getResourcesStorage(
480
                (JDBCStoreParameters) dataStore.getParameters(), 
481
                dataStore.getName()
482
        );
483
    }
484

    
485
    @Override
486
    public boolean exists(DataStoreParameters parameters) throws DataException {
487
        JDBCStoreParameters params = (JDBCStoreParameters) parameters;
488
        JDBCSQLBuilderBase builder = this.getHelper().createSQLBuilder();
489
        SQLBuilder.TableNameBuilder searchTable = builder.createTableNameBuilder()
490
                .database(params.getDBName())
491
                .schema(params.getSchema())
492
                .name(params.getTable());
493
        SQLBuilder.TableNameBuilder table = builder.createTableNameBuilder();
494
                
495
        List<JDBCStoreParameters> l = this.list();
496
        for (JDBCStoreParameters current : l) {
497
            table.database(current.getDBName())
498
                .schema(current.getSchema())
499
                .name(current.getTable());
500
            if( table.equals(searchTable) ) {
501
                return true;
502
            }
503
        }
504
        return false;
505
    }
506

    
507
}