Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / impl / DefaultDatabaseWorkspaceManager.java @ 44346

History | View | Annotate | Download (16.6 KB)

1
package org.gvsig.fmap.dal.impl;
2

    
3
import java.io.File;
4
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.mutable.Mutable;
7
import org.apache.commons.lang3.mutable.MutableObject;
8
import org.gvsig.expressionevaluator.ExpressionBuilder;
9
import org.gvsig.expressionevaluator.ExpressionUtils;
10
import org.gvsig.fmap.dal.DALLocator;
11
import org.gvsig.fmap.dal.DataManager;
12
import org.gvsig.fmap.dal.DataServerExplorer;
13
import org.gvsig.fmap.dal.DataServerExplorerParameters;
14
import org.gvsig.fmap.dal.DataStoreParameters;
15
import org.gvsig.fmap.dal.DataTypes;
16
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYID;
17
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYLABEL;
18
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_NAME;
19
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_VALUE;
20
import org.gvsig.fmap.dal.StoresRepository;
21
import org.gvsig.fmap.dal.feature.EditableFeature;
22
import org.gvsig.fmap.dal.feature.EditableFeatureType;
23
import org.gvsig.fmap.dal.feature.Feature;
24
import org.gvsig.fmap.dal.feature.FeatureStore;
25
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_NAME;
26
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_PARAMETERS;
27
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_NAME;
28
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_RESOURCE;
29
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION;
30
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION_NAME;
31
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY;
32
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY_NAME;
33
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES;
34
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
35
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
36
import org.gvsig.tools.resourcesstorage.FilesResourcesStorage;
37
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
38
import org.slf4j.Logger;
39
import org.slf4j.LoggerFactory;
40

    
41
/**
42
 *
43
 * @author jjdelcerro
44
 */
45
@SuppressWarnings("UseSpecificCatch")
46
public class DefaultDatabaseWorkspaceManager 
47
        implements DatabaseWorkspaceManager 
48
    {
49
    
50
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDatabaseWorkspaceManager.class);
51
    
52
    private final DataServerExplorerParameters serverParameters;
53
    private Boolean existsConfiguration = null;
54
    private StoresRepository storesRepository;
55
    private Mutable<ResourcesStorage> alternativeResourcesStorage = null;
56
    
57
    
58
    public DefaultDatabaseWorkspaceManager(DataServerExplorerParameters serverParameters) {
59
        this.serverParameters = serverParameters;
60
    }
61
    
62
    @Override
63
    public String getId() {
64
        String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
65
        return id;
66
    }
67
    
68
    @Override
69
    public String getLabel() {
70
        String label = this.get(CONFIG_NAME_STORESREPOSITORYLABEL);
71
        return label;
72
    }
73
    
74
    @Override
75
    public boolean existsTable(int tableid) {
76
        switch(tableid) {
77
            case TABLE_RESOURCES:
78
                return this.existsTable(TABLE_RESOURCES_NAME);
79
            case TABLE_REPOSITORY:
80
                return this.existsTable(TABLE_REPOSITORY_NAME);
81
            case TABLE_CONFIGURATION:
82
                return this.existsTable(TABLE_CONFIGURATION_NAME);
83
            default:
84
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
85
        }
86
    }
87
    
88
    @Override
89
    public void createTable(int tableid) {
90
        switch(tableid) {
91
            case TABLE_RESOURCES:
92
                createTableResources();
93
                break;
94
            case TABLE_REPOSITORY:
95
                createTableRepository();
96
                break;
97
            case TABLE_CONFIGURATION:
98
                createTableConfiguration();
99
                break;
100
            default:
101
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
102
        }
103
    }
104
    
105
    @Override
106
    public void dropTable(int tableid) {
107
        switch(tableid) {
108
            case TABLE_RESOURCES:
109
                this.dropTable(TABLE_RESOURCES_NAME);
110
                break;
111
            case TABLE_REPOSITORY:
112
                this.dropTable(TABLE_REPOSITORY_NAME);
113
                break;
114
            case TABLE_CONFIGURATION:
115
                this.dropTable(TABLE_CONFIGURATION_NAME);
116
                break;
117
            default:
118
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
119
        }
120
    }
121
    
122
    @Override
123
    public FeatureStore getTable(int tableid) {
124
        switch(tableid) {
125
            case TABLE_RESOURCES:
126
                return this.getTable(TABLE_RESOURCES_NAME);
127
            case TABLE_REPOSITORY:
128
                return this.getTable(TABLE_REPOSITORY_NAME);
129
            case TABLE_CONFIGURATION:
130
                return this.getTable(TABLE_CONFIGURATION_NAME);
131
            default:
132
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
133
        }
134
    }
135
    
136
    private boolean existsTable(String tableName) {
137
        try {
138
            DataManager dataManager = DALLocator.getDataManager();
139
            DataServerExplorer server = dataManager.openServerExplorer(
140
                    this.serverParameters.getProviderName(),
141
                    this.serverParameters
142
            );
143
            for (DataStoreParameters params : server.list()) {
144
                String theTableName = (String) params.getDynValue("Table");
145
                if( StringUtils.equals(theTableName, tableName) ) {
146
                    return true;
147
                }
148
            }
149
        } catch (Exception ex) {
150
            LOGGER.warn("Can't check if the table '"+tableName+"' exists.",ex);
151
        }
152
        return false;
153
    }
154

    
155
    private FeatureStore getTable(String tableName) {
156
        try {
157
            DataManager dataManager = DALLocator.getDataManager();
158
            DataServerExplorer server = dataManager.openServerExplorer(
159
                    this.serverParameters.getProviderName(),
160
                    this.serverParameters
161
            );
162
            DataStoreParameters params = server.get(tableName);
163
            if( params!=null ) {
164
                FeatureStore store = (FeatureStore) dataManager.openStore(
165
                        params.getProviderName(), 
166
                        params
167
                );
168
                return store;
169
            }
170
        } catch (Exception ex) {
171
            LOGGER.warn("Can't open table '"+tableName+"'.",ex);
172
        }
173
        return null;
174
    }
175

    
176
    private void dropTable(String tableName) {
177
        try {
178
            DataManager dataManager = DALLocator.getDataManager();
179
            DataServerExplorer server = dataManager.openServerExplorer(
180
                    this.serverParameters.getProviderName(),
181
                    this.serverParameters
182
            );
183
            DataStoreParameters params = server.get(tableName);
184
            if( params!=null ) {
185
                server.remove(params);
186
            }
187
        } catch (Exception ex) {
188
            LOGGER.warn("Can't drop table '"+tableName+"'.",ex);
189
        }
190
    }
191
    
192
    private void createTableResources() {
193
        String tableName = TABLE_RESOURCES_NAME;
194
        try {
195
            DataManager dataManager = DALLocator.getDataManager();
196
            DataServerExplorer server = dataManager.openServerExplorer(
197
                    this.serverParameters.getProviderName(),
198
                    this.serverParameters
199
            );
200
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
201
            EditableFeatureType ft = params.getDefaultFeatureType();
202
            ft.add(FIELD_RESOURCES_NAME, DataTypes.STRING, 150)
203
                    .setAllowNull(false)
204
                    .setIsPrimaryKey(true);
205
            ft.add(FIELD_RESOURCES_RESOURCE, DataTypes.BYTEARRAY)
206
                    .setAllowNull(true);
207
            server.add(tableName, params, false);
208
        } catch (Exception ex) {
209
            LOGGER.warn("Can't create table '"+tableName+"'.",ex);
210
        }
211
    }
212

    
213
    private void createTableRepository() {
214
        String tableName = TABLE_REPOSITORY_NAME;
215
        try {
216
            DataManager dataManager = DALLocator.getDataManager();
217
            DataServerExplorer server = dataManager.openServerExplorer(
218
                    this.serverParameters.getProviderName(),
219
                    this.serverParameters
220
            );
221
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
222
            EditableFeatureType ft = params.getDefaultFeatureType();
223
            ft.add(FIELD_REPOSITORY_NAME, DataTypes.STRING, 150)
224
                    .setAllowNull(false)
225
                    .setIsPrimaryKey(true);
226
            ft.add(FIELD_REPOSITORY_PARAMETERS, DataTypes.BYTEARRAY)
227
                    .setAllowNull(true);
228
            server.add(tableName, params, false);
229
        } catch (Exception ex) {
230
            LOGGER.warn("Can't create table '"+tableName+"'.",ex);
231
        }
232
    }
233

    
234
    private void createTableConfiguration() {
235
        String tableName = TABLE_CONFIGURATION_NAME;
236
        try {
237
            DataManager dataManager = DALLocator.getDataManager();
238
            DataServerExplorer server = dataManager.openServerExplorer(
239
                    this.serverParameters.getProviderName(),
240
                    this.serverParameters
241
            );
242
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
243
            EditableFeatureType ft = params.getDefaultFeatureType();
244
            ft.add(FIELD_CONFIGURATION_NAME, DataTypes.STRING, 200)
245
                    .setAllowNull(false)
246
                    .setIsPrimaryKey(true);
247
            ft.add(FIELD_CONFIGURATION_VALUE, DataTypes.STRING, 200)
248
                    .setAllowNull(true);
249
            server.add(tableName, params, false);
250
        } catch (Exception ex) {
251
            LOGGER.warn("Can't create table '"+tableName+"'.",ex);
252
        }
253
    }
254
    
255
    private boolean existsConfiguration() {
256
        if( this.existsConfiguration==null ) {
257
            this.existsConfiguration = this.existsTable(TABLE_CONFIGURATION_NAME);
258
        }
259
        return this.existsConfiguration;
260
    }
261

    
262
    @Override
263
    public String get(String name) {
264
        try {
265
            if( !this.existsConfiguration() ) {
266
                return null;
267
            }
268
            FeatureStore store = this.getTable(TABLE_CONFIGURATION);
269
            if( store == null ) {
270
                return null;
271
            }
272
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
273
            String filter = builder.eq(
274
                    builder.column(FIELD_CONFIGURATION_NAME),
275
                    builder.constant(name)
276
            ).toString();
277
            Feature feature = store.findFirst(filter);
278
            if( feature == null ) {
279
                return null;
280
            }
281
            String value = feature.getString(FIELD_CONFIGURATION_VALUE);
282
            return value;
283
            
284
        } catch (Exception ex) {
285
            LOGGER.warn("Can't read configuration value '"+name+"'", ex);
286
            return null;
287
        }
288
    }
289

    
290
    @Override
291
    public boolean set(String name, String value) {
292
        try {
293
            if( !this.existsConfiguration() ) {
294
                return false;
295
            }
296
            FeatureStore store = this.getTable(TABLE_CONFIGURATION);
297
            if( store == null ) {
298
                return false;
299
            }
300
            store.edit();
301
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
302
            String filter = builder.eq(
303
                    builder.column(FIELD_CONFIGURATION_NAME),
304
                    builder.constant(name)
305
            ).toString();
306
            Feature feature = store.findFirst(filter);
307
            EditableFeature efeature;
308
            if (feature == null) {
309
                efeature = store.createNewFeature();
310
                efeature.set(FIELD_CONFIGURATION_NAME, name);
311
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
312
                store.insert(efeature);
313
            } else {
314
                efeature = feature.getEditable();
315
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
316
                store.update(efeature);
317
            }
318
            store.finishEditing();
319
            return true;
320
        } catch (Exception ex) {
321
            LOGGER.warn("Can't write configuration value '"+name+"'", ex);
322
            return false;
323
        }
324
    }
325

    
326
    @Override
327
    public StoresRepository getStoresRepository() {
328
        if( this.storesRepository==null ) {
329
            String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
330
            String label = this.get(CONFIG_NAME_STORESREPOSITORYLABEL);
331
            this.storesRepository = new DatabaseWorkspaceStoresRepository(
332
                    id,
333
                    label,
334
                    this.serverParameters
335
            );
336
        }
337
        return this.storesRepository;
338
    }
339
    
340
    public boolean contains(DataStoreParameters parameters) {
341
        boolean c = this.getStoresRepository().contains(parameters);
342
        return c;
343
    }
344

    
345
    @Override
346
    public boolean canAnonymousUserWriteInTheTables() {
347
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
348
    }
349

    
350
    @Override
351
    public boolean writeStoresRepositoryEntry(String name, DataStoreParameters parameters) {
352
        try {
353
            byte[] data = parameters.toByteArray();
354
            if( data == null ) {
355
                throw new RuntimeException("Can't convert parameters to byte array.");
356
            }
357
            FeatureStore store = this.getTable(TABLE_REPOSITORY);
358
            store.edit();
359
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
360
            String filter = builder.eq(
361
                    builder.column(FIELD_REPOSITORY_NAME),
362
                    builder.constant(name)
363
            ).toString();
364
            Feature feature = store.findFirst(filter);
365
            EditableFeature efeature;
366
            if (feature == null) {
367
                efeature = store.createNewFeature();
368
                efeature.set(FIELD_REPOSITORY_NAME, name);
369
                efeature.set(FIELD_REPOSITORY_PARAMETERS, data);
370
                store.insert(efeature);
371
            } else {
372
                efeature = feature.getEditable();
373
                efeature.set(FIELD_REPOSITORY_PARAMETERS, data);
374
                store.update(efeature);
375
            }
376
            store.finishEditing();
377
            return true;
378
            
379
        } catch (Exception ex) {
380
            LOGGER.warn("Can't save entry '"+name+"' in repository information", ex);
381
            return false;
382
        }
383
    }
384

    
385
    @Override
386
    public boolean isValidStoresRepository() {
387
        String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
388
        if( StringUtils.isBlank(id) ) {
389
            return false;
390
        }
391
        if( !this.existsTable(TABLE_REPOSITORY_NAME) ) {
392
            return false;
393
        }
394
        return true;
395
        
396
    }
397
    
398
    @Override
399
    public ResourcesStorage getAlternativeResourcesStorage() {
400
        if( this.alternativeResourcesStorage==null ) {
401
            this.alternativeResourcesStorage = new MutableObject<>(null);
402
            String resourcesPath = this.get("ALTERNATIVE_RESOURCES_PATH");
403
            if( !StringUtils.isBlank(resourcesPath) ) {
404
                try {
405
                    resourcesPath = (String) ExpressionUtils.evaluate(resourcesPath);
406
                } catch(Throwable th) {
407
                    // Do nothing
408
                }
409
                File f = new File(resourcesPath);
410
                if( f.exists() ) {
411
                    ResourcesStorage resources = new FilesResourcesStorage(resourcesPath);
412
                    this.alternativeResourcesStorage.setValue(resources);
413
                }
414
            }
415
        }
416
        return this.alternativeResourcesStorage.getValue();
417
    }
418
    
419
    public void create(String id, String description) {
420
        if( !this.existsTable(TABLE_RESOURCES) ) {
421
            this.createTable(TABLE_RESOURCES);
422
        }
423
        if( !this.existsTable(TABLE_CONFIGURATION) ) {
424
            this.createTable(TABLE_CONFIGURATION);
425
        }
426
        if( !this.existsTable(TABLE_REPOSITORY) ) {
427
            this.createTable(TABLE_REPOSITORY);
428
        }
429
        this.set(CONFIG_NAME_STORESREPOSITORYID,id);
430
        this.set(CONFIG_NAME_STORESREPOSITORYLABEL,description);
431
        this.set(CONFIG_CAN_ANONYMOUS_USER_WRITE_IN_THE_TABLES,"true");
432
        this.set("ALTERNATIVE_RESOURCES_PATH","");
433
    }
434
}