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

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

    
79

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
215
        return params;
216
    }
217

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

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

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

    
260
    }
261

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

    
265
    }
266

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

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

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

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

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

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

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

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

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

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

    
406
    @Override
407
    public SQLBuilder createSQLBuilder() {
408
        JDBCSQLBuilderBase x = this.getHelper().createSQLBuilder();
409
        return x;
410
    }
411

    
412
    private ResourcesStorage getResourcesStorage(DataStoreParameters parameters, String storeName) {
413
        
414
        if( !DatabaseWorkspaceManager.isInternalTable(storeName) ) {
415
            ResourcesStorage alternateResourcesStorage = null;
416
            try {
417
                DataManager dataManager = DALLocator.getDataManager();
418
                DatabaseWorkspaceManager workspace = dataManager.getDatabaseWorkspace(parameters);
419
                if( workspace != null ) {
420
                    alternateResourcesStorage = workspace.getAlternativeResourcesStorage(storeName);
421
                }
422
            } catch(Throwable th) {
423
                alternateResourcesStorage = null;
424
            }
425
            try { // TODO: Habria que ver de localizar los parametros sin tener que hacer un list.
426
                List<JDBCStoreParameters> tables = this.list();
427
                for (JDBCStoreParameters params : tables) {
428
                    String theTableName = params.getTable();
429
                    if (StringUtils.equals(theTableName, TABLE_RESOURCES_NAME)) {
430
                        JDBCResourcesStorage theResourcesStorage = new JDBCResourcesStorage(
431
                                alternateResourcesStorage,
432
                                params,
433
                                storeName
434
                        );
435
                        return theResourcesStorage;
436
                    }
437
                }
438
            } catch (Throwable ex) {
439
                LOG.warn("Can't retrieve reources storage from table '" + TABLE_RESOURCES_NAME + "' in '"+this.getParameters().getUrl()+"'.", ex);
440
            }
441
        }
442
        EmptyResourcesStorage theResourcesStorage = new EmptyResourcesStorage();
443
        return theResourcesStorage;            
444
    }
445
    
446
    public ResourcesStorage getResourcesStorage() {
447
        JDBCStoreParameters params;
448
        try {
449
            params = this.getOpenParameters();
450
            params.setTable(DatabaseWorkspaceManager.TABLE_RESOURCES_NAME);
451
            JDBCResourcesStorage theResourcesStorage = new JDBCResourcesStorage(
452
                    null,
453
                    params,
454
                    "$SERVVER$"
455
            );
456
            return theResourcesStorage;
457
        } catch (DataException ex) {
458
            return null;
459
        }
460
    }
461
 
462
    @Override
463
    public ResourcesStorage getResourcesStorage(DataStoreParameters parameters) {
464
        if( parameters == null ) {
465
            throw new IllegalArgumentException("null is a valid value for parameters.");
466
        }
467
        String tableName;
468
        if( parameters instanceof JDBCNewStoreParameters) {
469
            tableName = ((JDBCNewStoreParameters)parameters).getTable();
470
        } else if( parameters instanceof JDBCStoreParameters) {
471
            tableName = ((JDBCStoreParameters)parameters).getTable();
472
        } else {
473
            throw new IllegalArgumentException("Required a JDBCStoreParameters or JDBCNewStoreParameters parameters, received "+parameters.getClass().getName()+".");
474
        }
475
        return this.getResourcesStorage(parameters, tableName);
476
    }
477
    
478
    @Override
479
    public ResourcesStorage getResourcesStorage(DataStore dataStore) {
480
        return this.getResourcesStorage(
481
                (JDBCStoreParameters) dataStore.getParameters(), 
482
                dataStore.getName()
483
        );
484
    }
485

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

    
508
}