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

History | View | Annotate | Download (16 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.DataStore;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
39
import org.gvsig.fmap.dal.NewDataStoreParameters;
40
import org.gvsig.fmap.dal.exception.CloseException;
41
import org.gvsig.fmap.dal.exception.DataException;
42
import org.gvsig.fmap.dal.exception.InitializeException;
43
import org.gvsig.fmap.dal.exception.OpenException;
44
import org.gvsig.fmap.dal.exception.RemoveException;
45
import org.gvsig.fmap.dal.feature.EditableFeatureType;
46
import org.gvsig.fmap.dal.feature.FeatureType;
47
import org.gvsig.fmap.dal.SQLBuilder;
48
import org.gvsig.fmap.dal.SQLBuilder.Privilege;
49
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
50
import org.gvsig.fmap.dal.serverexplorer.db.spi.AbstractDBServerExplorer;
51
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
52
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
53
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
54
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
55
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
56
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
57
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
58
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCExecuteSQLException;
59
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
60
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
61
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CanCreateTablesOperation;
62
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CreateTableOperation;
63
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
64
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ListTablesOperation;
65
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.DropTableOperation;
66
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ExecuteOperation;
67
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.UpdateTableStatisticsOperation;
68
import org.gvsig.tools.exception.BaseException;
69
import org.gvsig.tools.resourcesstorage.EmptyResourcesStorage;
70
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
71
import org.slf4j.Logger;
72
import org.slf4j.LoggerFactory;
73

    
74

    
75
@SuppressWarnings("UseSpecificCatch")
76
public class JDBCServerExplorerBase extends AbstractDBServerExplorer implements JDBCServerExplorer {
77

    
78
    private static final Logger LOG = LoggerFactory.getLogger(JDBCServerExplorerBase.class);
79

    
80
    protected JDBCHelper helper = null;
81
    
82
    private Boolean canAdd;
83

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

    
93
    @Override
94
    public String getProviderName() {
95
        return this.getHelper().getProviderName();
96
    }
97

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

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

    
118
    @Override
119
    public void resourceChanged(ResourceProvider resource) {
120
        // Nothing to do
121
    }
122

    
123
    protected JDBCHelper getHelper() {
124
        return helper;
125
    }
126
    
127
    protected OperationsFactory getOperations() {
128
        return this.getHelper().getOperations();
129
    }
130

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

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

    
151
    @Override
152
    public void remove(DataStoreParameters theParams) throws RemoveException {
153

    
154
        JDBCStoreParameters params = (JDBCStoreParameters) theParams;
155
        DropTableOperation removeTable = this.getOperations().createDropTable(
156
                this.getOperations().createTableReference(params)
157
        );
158
        removeTable.perform();
159
    }
160

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

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

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

    
207
        params.setDefaultFeatureType(this.getServerExplorerProviderServices()
208
                .createNewFeatureType());
209

    
210
        return params;
211
    }
212

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

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

    
252
    @Override
253
    public void open() throws OpenException {
254

    
255
    }
256

    
257
    @Override
258
    public void close() throws CloseException {
259

    
260
    }
261

    
262
    @Override
263
    protected void doDispose() throws BaseException {
264
        helper.dispose();
265
        helper = null;
266
    }
267

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

    
277
    @Override
278
    public FeatureType getFeatureType(DataStoreParameters theParams)
279
            throws DataException {
280
        
281
        JDBCStoreParameters params = (JDBCStoreParameters)theParams;
282
        
283
        checkIsMine(params);
284

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

    
304
    @Override
305
    public boolean add(String providerName, NewDataStoreParameters theParams, boolean overwrite)
306
            throws DataException {
307

    
308
        List<Pair<String, Privilege>> userAndPrivileges = new ArrayList<>();
309
        JDBCNewStoreParameters params = (JDBCNewStoreParameters)theParams;
310
        if( !StringUtils.isEmpty(params.getAllRole()) ) {
311
            userAndPrivileges.add( 
312
                    new ImmutablePair<>(params.getAllRole(), Privilege.ALL )
313
            );
314
        }
315
        if( !StringUtils.isEmpty(params.getDeleteRole()) ) {
316
            userAndPrivileges.add( 
317
                    new ImmutablePair<>(params.getDeleteRole(), Privilege.DELETE )
318
            );
319
        }
320
        if( !StringUtils.isEmpty(params.getInsertRole()) ) {
321
            userAndPrivileges.add( 
322
                    new ImmutablePair<>(params.getInsertRole(), Privilege.INSERT )
323
            );
324
        }
325
        if( !StringUtils.isEmpty(params.getReferenceRole()) ) {
326
            userAndPrivileges.add( 
327
                    new ImmutablePair<>(params.getReferenceRole(), Privilege.REFERENCE )
328
            );
329
        }
330
        if( !StringUtils.isEmpty(params.getSelectRole()) ) {
331
            userAndPrivileges.add( 
332
                    new ImmutablePair<>(params.getSelectRole(), Privilege.SELECT )
333
            );
334
        }
335
        if( !StringUtils.isEmpty(params.getTriggerRole()) ) {
336
            userAndPrivileges.add( 
337
                    new ImmutablePair<>(params.getTriggerRole(), Privilege.TRIGGER )
338
            );
339
        }
340
        if( !StringUtils.isEmpty(params.getTruncateRole()) ) {
341
            userAndPrivileges.add( 
342
                    new ImmutablePair<>(params.getTruncateRole(), Privilege.TRUNCATE )
343
            );
344
        }
345
        if( !StringUtils.isEmpty(params.getUpdateRole()) ) {
346
            userAndPrivileges.add( 
347
                    new ImmutablePair<>(params.getUpdateRole(), Privilege.UPDATE )
348
            );
349
        }
350
        List<String> additionalSQLs =  new ArrayList<>();
351
        if( !StringUtils.isEmpty(params.getPostCreatingStatement()) ) {
352
            additionalSQLs.add(params.getPostCreatingStatement());
353
        }
354
        CreateTableOperation createTable = this.getOperations().createTable(
355
                this.getOperations().createTableReference(params),
356
                params.getDefaultFeatureType(),
357
                userAndPrivileges, 
358
                additionalSQLs
359
        );
360
        return (boolean) createTable.perform();
361
    }
362

    
363
    @Override
364
    public List getDataStoreProviderNames() {
365
        List x = new ArrayList(1);
366
        x.add(this.getProviderName());
367
        return x;
368
    }
369

    
370
    @Override
371
    public void updateTableStatistics(String database, String schema, String table) throws JDBCExecuteSQLException {
372
        UpdateTableStatisticsOperation updateStatistics = this.getOperations().createUpdateTableStatistics(
373
                this.getOperations().createTableReference(database, schema, table, null)
374
        );
375
        updateStatistics.perform();
376
    }
377

    
378
    @Override
379
    public void execute(String sql) {
380
        ExecuteOperation execute = this.getOperations().createExecute(sql);
381
        execute.perform();
382
    }
383

    
384
    @Override
385
    public JDBCStoreParameters get(String name) throws DataException {
386
        JDBCStoreParameters params = this.getOpenParameters();
387
        params.setTable(name);
388
        return params;
389
    }
390

    
391
    @Override
392
    public SQLBuilder createSQLBuilder() {
393
        return this.getHelper().createSQLBuilder();
394
    }
395

    
396
    @Override
397
    public ResourcesStorage getResourcesStorage(DataStore dataStore) {
398
        if( this.resourcesStorage==null ) {
399
            try {
400
                List<JDBCStoreParameters> tables = this.list();
401
                for (JDBCStoreParameters params : tables) {
402
                    String theTableName = params.getTable();
403
                    if (StringUtils.equals(theTableName, TABLE_RESOURCES_NAME)) {
404
                        this.resourcesStorage = new JDBCResourcesStorage(
405
                                params,
406
                                dataStore.getName()
407
                        );
408
                        return this.resourcesStorage;
409
                    }
410
                }
411
                this.resourcesStorage = new EmptyResourcesStorage();
412
            } catch (Throwable ex) {
413
                LOG.warn("Can't retrieve reources storage from table '" + TABLE_RESOURCES_NAME + "' in '"+this.getParameters().getUrl()+"'.", ex);
414
            }
415
        }
416
        return this.resourcesStorage;
417
    }
418
}