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

History | View | Annotate | Download (24.2 KB)

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

    
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.Collection;
6
import java.util.Collections;
7
import java.util.List;
8
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
9
import org.apache.commons.lang3.StringUtils;
10
import org.apache.commons.lang3.mutable.Mutable;
11
import org.apache.commons.lang3.mutable.MutableObject;
12
import org.gvsig.expressionevaluator.ExpressionBuilder;
13
import org.gvsig.expressionevaluator.ExpressionUtils;
14
import org.gvsig.expressionevaluator.spi.AbstractSymbolTable;
15
import org.gvsig.fmap.dal.DALLocator;
16
import org.gvsig.fmap.dal.DataManager;
17
import org.gvsig.fmap.dal.DataServerExplorer;
18
import org.gvsig.fmap.dal.DataServerExplorerParameters;
19
import org.gvsig.fmap.dal.DataStoreParameters;
20
import org.gvsig.fmap.dal.DataTypes;
21
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYID;
22
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYLABEL;
23
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_NAME;
24
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_VALUE;
25
import org.gvsig.fmap.dal.StoresRepository;
26
import org.gvsig.fmap.dal.feature.EditableFeature;
27
import org.gvsig.fmap.dal.feature.EditableFeatureType;
28
import org.gvsig.fmap.dal.feature.Feature;
29
import org.gvsig.fmap.dal.feature.FeatureStore;
30
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_NAME;
31
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_PARAMETERS;
32
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_NAME;
33
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_RESOURCE;
34
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION;
35
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION_NAME;
36
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY;
37
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY_NAME;
38
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES;
39
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
40
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
41
import org.gvsig.tools.dynobject.DynClass;
42
import org.gvsig.tools.dynobject.DynField;
43
import org.gvsig.tools.exception.BaseException;
44
import org.gvsig.tools.resourcesstorage.FilesResourcesStorage;
45
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
46
import org.gvsig.tools.util.FileTools;
47
import org.gvsig.tools.util.HasAFile;
48
import org.gvsig.tools.visitor.VisitCanceledException;
49
import org.gvsig.tools.visitor.Visitor;
50
import org.slf4j.Logger;
51
import org.slf4j.LoggerFactory;
52

    
53
/**
54
 *
55
 * @author jjdelcerro
56
 */
57
@SuppressWarnings("UseSpecificCatch")
58
public class DefaultDatabaseWorkspaceManager 
59
        extends AbstractSymbolTable
60
        implements DatabaseWorkspaceManager
61
    {
62
    
63
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDatabaseWorkspaceManager.class);
64

    
65
    private static final String CONFIG_NAME_BASEFOLDER = "BASEFOLDER";
66
    private static final String CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH = "ALTERNATIVE_RESOURCES_PATH";
67
    
68
    private static abstract class CachedValue<T> {
69

    
70
        protected T value = null;
71
        private long lastAccess = 0;
72
        private final int millis;
73

    
74
        protected CachedValue(int millis) {
75
            this.millis = millis;
76
        }
77
        
78
        protected abstract void reload();
79

    
80
        public boolean isExpired() {
81
            long now = System.currentTimeMillis();
82
            return now - lastAccess > millis;
83
        }
84

    
85
        public T get() {
86
            if (isExpired()) {
87
                reload();
88
            }
89
            lastAccess = System.currentTimeMillis();
90
            return value;
91
        }
92
        
93
        public void set(T value) {
94
            this.value = value;
95
            lastAccess = System.currentTimeMillis();
96
        }
97
    }
98

    
99
    private class BaseFolder extends CachedValue<File> {
100
        public BaseFolder() {
101
            super(3000);
102
        }
103

    
104
        @Override
105
        protected void reload() {
106
            String s = DefaultDatabaseWorkspaceManager.this.get(CONFIG_NAME_BASEFOLDER);
107
            if( StringUtils.isBlank(s) ) {
108
                this.value = null;
109
            } else {
110
                this.value = new File(s);
111
            }
112
        }
113

    
114
        @Override
115
        public void set(File value) {
116
            DefaultDatabaseWorkspaceManager.this.set(CONFIG_NAME_BASEFOLDER, value.toString());
117
            super.set(value);
118
        }
119
    }
120
    
121
    private final DataServerExplorerParameters serverParameters;
122
    private Boolean existsConfiguration = null;
123
    private StoresRepository storesRepository;
124
    private Mutable<File> alternativeResourcesFolder = null;
125
    private BaseFolder baseFolder = null;
126
    
127
    public DefaultDatabaseWorkspaceManager(DataServerExplorerParameters serverParameters) {
128
        this.serverParameters = serverParameters;
129
        this.baseFolder = new BaseFolder();
130
    }
131

    
132
    @Override
133
    public String toString() {
134
        return this.getLabel();
135
    }
136
    
137
    @Override
138
    public String getId() {
139
        String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
140
        return id;
141
    }
142
    
143
    @Override
144
    public String getLabel() {
145
        String label = this.get(CONFIG_NAME_STORESREPOSITORYLABEL);
146
        return label;
147
    }
148

    
149
    @Override
150
    public DatabaseWorkspaceManager getValue() {
151
        return this;
152
    }
153
    
154
    @Override
155
    public boolean existsTable(int tableid) {
156
        switch(tableid) {
157
            case TABLE_RESOURCES:
158
                return this.existsTable(TABLE_RESOURCES_NAME);
159
            case TABLE_REPOSITORY:
160
                return this.existsTable(TABLE_REPOSITORY_NAME);
161
            case TABLE_CONFIGURATION:
162
                return this.existsTable(TABLE_CONFIGURATION_NAME);
163
            default:
164
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
165
        }
166
    }
167
    
168
    @Override
169
    public void createTable(int tableid) {
170
        switch(tableid) {
171
            case TABLE_RESOURCES:
172
                createTableResources();
173
                break;
174
            case TABLE_REPOSITORY:
175
                createTableRepository();
176
                break;
177
            case TABLE_CONFIGURATION:
178
                createTableConfiguration();
179
                break;
180
            default:
181
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
182
        }
183
    }
184
    
185
    @Override
186
    public void dropTable(int tableid) {
187
        switch(tableid) {
188
            case TABLE_RESOURCES:
189
                this.dropTable(TABLE_RESOURCES_NAME);
190
                break;
191
            case TABLE_REPOSITORY:
192
                this.dropTable(TABLE_REPOSITORY_NAME);
193
                break;
194
            case TABLE_CONFIGURATION:
195
                this.dropTable(TABLE_CONFIGURATION_NAME);
196
                break;
197
            default:
198
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
199
        }
200
    }
201
    
202
    @Override
203
    public FeatureStore getTable(int tableid) {
204
        switch(tableid) {
205
            case TABLE_RESOURCES:
206
                return this.getTable(TABLE_RESOURCES_NAME);
207
            case TABLE_REPOSITORY:
208
                return this.getTable(TABLE_REPOSITORY_NAME);
209
            case TABLE_CONFIGURATION:
210
                return this.getTable(TABLE_CONFIGURATION_NAME);
211
            default:
212
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
213
        }
214
    }
215
    
216
    private boolean existsTable(String tableName) {
217
        try {
218
            DataManager dataManager = DALLocator.getDataManager();
219
            DataServerExplorer server = dataManager.openServerExplorer(
220
                    this.serverParameters.getProviderName(),
221
                    this.serverParameters
222
            );
223
            for (DataStoreParameters params : server.list()) {
224
                String theTableName = (String) params.getDynValue("Table");
225
                if( StringUtils.equals(theTableName, tableName) ) {
226
                    return true;
227
                }
228
            }
229
        } catch (Exception ex) {
230
            LOGGER.warn("Can't check if the table '"+tableName+"' exists.",ex);
231
        }
232
        return false;
233
    }
234

    
235
    private FeatureStore getTable(String tableName) {
236
        try {
237
            DataManager dataManager = DALLocator.getDataManager();
238
            DataServerExplorer server = dataManager.openServerExplorer(
239
                    this.serverParameters.getProviderName(),
240
                    this.serverParameters
241
            );
242
            DataStoreParameters params = server.get(tableName);
243
            if( params!=null ) {
244
                FeatureStore store = (FeatureStore) dataManager.openStore(
245
                        params.getProviderName(), 
246
                        params
247
                );
248
                return store;
249
            }
250
        } catch (Exception ex) {
251
            LOGGER.warn("Can't open table '"+tableName+"'.",ex);
252
        }
253
        return null;
254
    }
255

    
256
    private void dropTable(String tableName) {
257
        try {
258
            DataManager dataManager = DALLocator.getDataManager();
259
            DataServerExplorer server = dataManager.openServerExplorer(
260
                    this.serverParameters.getProviderName(),
261
                    this.serverParameters
262
            );
263
            DataStoreParameters params = server.get(tableName);
264
            if( params!=null ) {
265
                server.remove(params);
266
            }
267
        } catch (Exception ex) {
268
            LOGGER.warn("Can't drop table '"+tableName+"'.",ex);
269
        }
270
    }
271
    
272
    private void createTableResources() {
273
        String tableName = TABLE_RESOURCES_NAME;
274
        try {
275
            DataManager dataManager = DALLocator.getDataManager();
276
            DataServerExplorer server = dataManager.openServerExplorer(
277
                    this.serverParameters.getProviderName(),
278
                    this.serverParameters
279
            );
280
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
281
            EditableFeatureType ft = params.getDefaultFeatureType();
282
            ft.add(FIELD_RESOURCES_NAME, DataTypes.STRING, 150)
283
                    .setAllowNull(false)
284
                    .setIsPrimaryKey(true);
285
            ft.add(FIELD_RESOURCES_RESOURCE, DataTypes.BYTEARRAY)
286
                    .setAllowNull(true);
287
            server.add(tableName, params, false);
288
        } catch (Exception ex) {
289
            LOGGER.warn("Can't create table '"+tableName+"'.",ex);
290
        }
291
    }
292

    
293
    private void createTableRepository() {
294
        String tableName = TABLE_REPOSITORY_NAME;
295
        try {
296
            DataManager dataManager = DALLocator.getDataManager();
297
            DataServerExplorer server = dataManager.openServerExplorer(
298
                    this.serverParameters.getProviderName(),
299
                    this.serverParameters
300
            );
301
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
302
            EditableFeatureType ft = params.getDefaultFeatureType();
303
            ft.add(FIELD_REPOSITORY_NAME, DataTypes.STRING, 150)
304
                    .setAllowNull(false)
305
                    .setIsPrimaryKey(true);
306
            ft.add(FIELD_REPOSITORY_PARAMETERS, DataTypes.BYTEARRAY)
307
                    .setAllowNull(true);
308
            server.add(tableName, params, false);
309
        } catch (Exception ex) {
310
            LOGGER.warn("Can't create table '"+tableName+"'.",ex);
311
        }
312
    }
313

    
314
    private void createTableConfiguration() {
315
        String tableName = TABLE_CONFIGURATION_NAME;
316
        try {
317
            DataManager dataManager = DALLocator.getDataManager();
318
            DataServerExplorer server = dataManager.openServerExplorer(
319
                    this.serverParameters.getProviderName(),
320
                    this.serverParameters
321
            );
322
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
323
            EditableFeatureType ft = params.getDefaultFeatureType();
324
            ft.add(FIELD_CONFIGURATION_NAME, DataTypes.STRING, 200)
325
                    .setAllowNull(false)
326
                    .setIsPrimaryKey(true);
327
            ft.add(FIELD_CONFIGURATION_VALUE, DataTypes.STRING, 200)
328
                    .setAllowNull(true);
329
            server.add(tableName, params, false);
330
        } catch (Exception ex) {
331
            LOGGER.warn("Can't create table '"+tableName+"'.",ex);
332
        }
333
    }
334
    
335
    private boolean existsConfiguration() {
336
        if( this.existsConfiguration==null ) {
337
            this.existsConfiguration = this.existsTable(TABLE_CONFIGURATION_NAME);
338
        }
339
        return this.existsConfiguration;
340
    }
341

    
342
    @Override
343
    public String get(String name) {
344
        try {
345
            if( !this.existsConfiguration() ) {
346
                return null;
347
            }
348
            FeatureStore store = this.getTable(TABLE_CONFIGURATION);
349
            if( store == null ) {
350
                return null;
351
            }
352
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
353
            String filter = builder.eq(
354
                    builder.column(FIELD_CONFIGURATION_NAME),
355
                    builder.constant(name)
356
            ).toString();
357
            Feature feature = store.findFirst(filter);
358
            if( feature == null ) {
359
                return null;
360
            }
361
            String value = feature.getString(FIELD_CONFIGURATION_VALUE);
362
            value = ExpressionUtils.evaluateDynamicText(this, value);
363
            return value;
364
            
365
        } catch (Exception ex) {
366
            LOGGER.warn("Can't read configuration value '"+name+"'", ex);
367
            return null;
368
        }
369
    }
370

    
371
    @Override
372
    public boolean set(String name, String value) {
373
        try {
374
            if( !this.existsConfiguration() ) {
375
                return false;
376
            }
377
            FeatureStore store = this.getTable(TABLE_CONFIGURATION);
378
            if( store == null ) {
379
                return false;
380
            }
381
            store.edit();
382
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
383
            String filter = builder.eq(
384
                    builder.column(FIELD_CONFIGURATION_NAME),
385
                    builder.constant(name)
386
            ).toString();
387
            Feature feature = store.findFirst(filter);
388
            EditableFeature efeature;
389
            if (feature == null) {
390
                efeature = store.createNewFeature();
391
                efeature.set(FIELD_CONFIGURATION_NAME, name);
392
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
393
                store.insert(efeature);
394
            } else {
395
                efeature = feature.getEditable();
396
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
397
                store.update(efeature);
398
            }
399
            store.finishEditing();
400
            return true;
401
        } catch (Exception ex) {
402
            LOGGER.warn("Can't write configuration value '"+name+"'", ex);
403
            return false;
404
        }
405
    }
406

    
407
    @Override
408
    public StoresRepository getStoresRepository() {
409
        if( this.storesRepository==null ) {
410
            String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
411
            String label = this.get(CONFIG_NAME_STORESREPOSITORYLABEL);
412
            this.storesRepository = new DatabaseWorkspaceStoresRepository(
413
                    id,
414
                    label,
415
                    this
416
            );
417
        }
418
        return this.storesRepository;
419
    }
420
    
421
    public boolean contains(DataStoreParameters parameters) {
422
        boolean c = this.getStoresRepository().contains(parameters);
423
        return c;
424
    }
425

    
426
    @Override
427
    public boolean canAnonymousUserWriteInTheTables() {
428
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
429
    }
430

    
431
    @Override
432
    public File getBaseFolder() {
433
        return this.baseFolder.get();
434
    }
435
    
436
    @Override
437
    public void setBaseFolder(File baseFolder) {
438
        this.baseFolder.set(baseFolder);
439
    }
440

    
441
    private DataStoreParameters replaceInFilesToUseBaseFolder(DataStoreParameters parameters) {
442
        DynClass dynClass = parameters.getDynClass();
443
        if( dynClass == null ) {
444
            return parameters;
445
        }
446
        File theBaseFolder = this.getBaseFolder();
447
        if( theBaseFolder==null ) {
448
            return parameters;
449
        }
450
        DataStoreParameters replaced = parameters;
451
        for (DynField dynField : dynClass.getDynFields()) {
452
            switch(dynField.getType()) {
453
                case DataTypes.FILE:
454
                case DataTypes.FOLDER:
455
                    File f = (File) parameters.getDynValue(dynField.getName());
456
                    if( f!=null ) {
457
                        File f2 = FileTools.relativizeFile(theBaseFolder, f);
458
                        if( f2!=f ) {
459
                            f = new File("<%="+CONFIG_NAME_BASEFOLDER+"%>/"+f2.getPath());
460
                            if( replaced == parameters ) {
461
                                replaced = (DataStoreParameters) replaced.getCopy();
462
                            }
463
                            replaced.setDynValue(dynField.getName(), f);
464
                        }
465
                    }
466
                    break;
467
            }
468
        }
469
        return replaced;
470
    }
471
    
472
    @Override
473
    public boolean writeStoresRepositoryEntry(String name, DataStoreParameters parameters) {
474
        try {
475
            parameters = this.replaceInFilesToUseBaseFolder(parameters);
476
            byte[] data = parameters.toByteArray();
477
            if( data == null ) {
478
                throw new RuntimeException("Can't convert parameters to byte array.");
479
            }
480
            FeatureStore store = this.getTable(TABLE_REPOSITORY);
481
            store.edit();
482
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
483
            String filter = builder.eq(
484
                    builder.column(FIELD_REPOSITORY_NAME),
485
                    builder.constant(name)
486
            ).toString();
487
            Feature feature = store.findFirst(filter);
488
            EditableFeature efeature;
489
            if (feature == null) {
490
                efeature = store.createNewFeature();
491
                efeature.set(FIELD_REPOSITORY_NAME, name);
492
                efeature.set(FIELD_REPOSITORY_PARAMETERS, data);
493
                store.insert(efeature);
494
            } else {
495
                efeature = feature.getEditable();
496
                efeature.set(FIELD_REPOSITORY_PARAMETERS, data);
497
                store.update(efeature);
498
            }
499
            store.finishEditing();
500
            return true;
501
            
502
        } catch (Exception ex) {
503
            LOGGER.warn("Can't save entry '"+name+"' in repository information", ex);
504
            return false;
505
        }
506
    }
507

    
508
    @Override
509
    public boolean isValid() {
510
        String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
511
        if( StringUtils.isBlank(id) ) {
512
            return false;
513
        }
514
        return true;
515
    }
516

    
517
    @Override
518
    public boolean isValidStoresRepository() {
519
        if( !this.isValid() ) {
520
            return false;
521
        }
522
        if( !this.existsTable(TABLE_REPOSITORY_NAME) ) {
523
            return false;
524
        }
525
        return true;
526
        
527
    }
528
    
529
    @Override
530
    public ResourcesStorage getAlternativeResourcesStorage(String tableName) {
531
        if( this.alternativeResourcesFolder==null ) {
532
            this.alternativeResourcesFolder = new MutableObject<>(null);
533
            String resourcesPath = this.get(CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH);
534
            if( !StringUtils.isBlank(resourcesPath) ) {
535
                try {
536
                    resourcesPath = (String) ExpressionUtils.evaluate(resourcesPath);
537
                } catch(Throwable th) {
538
                    // Do nothing
539
                }
540
                File f = new File(resourcesPath);
541
                if( f.exists() ) {
542
                    this.alternativeResourcesFolder.setValue(f);
543
                }
544
            }
545
        }
546
        File folder = this.alternativeResourcesFolder.getValue();
547
        if( folder==null ) {
548
            return null;
549
        }
550
        String resourcesRoot = folder.getAbsolutePath().replace("\\","/") + "/" + tableName;
551
        ResourcesStorage resources = new FilesResourcesStorage(resourcesRoot);
552
        return resources;
553
    }
554

    
555
    @Override
556
    public void drop() {
557
        if( !this.existsTable(TABLE_RESOURCES) ) {
558
            this.dropTable(TABLE_RESOURCES);
559
        }
560
        if( !this.existsTable(TABLE_CONFIGURATION) ) {
561
            this.dropTable(TABLE_CONFIGURATION);
562
        }
563
        if( !this.existsTable(TABLE_REPOSITORY) ) {
564
            this.dropTable(TABLE_REPOSITORY);
565
        }
566
    }
567
    
568
   
569
    @Override
570
    public void create(String id, String description) {
571
        if( !this.existsTable(TABLE_RESOURCES) ) {
572
            this.createTable(TABLE_RESOURCES);
573
        }
574
        if( !this.existsTable(TABLE_CONFIGURATION) ) {
575
            this.createTable(TABLE_CONFIGURATION);
576
        }
577
        if( !this.existsTable(TABLE_REPOSITORY) ) {
578
            this.createTable(TABLE_REPOSITORY);
579
        }
580
        this.set(CONFIG_NAME_STORESREPOSITORYID,id);
581
        this.set(CONFIG_NAME_STORESREPOSITORYLABEL,description);
582
        this.set(CONFIG_CAN_ANONYMOUS_USER_WRITE_IN_THE_TABLES,"true");
583
        this.set(CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH,"");
584
        File theBaseFolder = this.getBaseFolder();
585
        if( this.serverParameters instanceof HasAFile && theBaseFolder==null ) {
586
            File f = ((HasAFile)this.serverParameters).getFile();
587
            if( f != null ) {
588
                theBaseFolder = f.getParentFile();
589
                this.setBaseFolder(theBaseFolder);
590
            } else {
591
                this.set(CONFIG_NAME_BASEFOLDER,"");
592
            }
593
        } else {
594
            this.set(CONFIG_NAME_BASEFOLDER,"");
595
        }
596
    }
597

    
598
    @Override
599
    public boolean exists(String name) {
600
        try {
601
            if (this.existsConfiguration()) {
602
                FeatureStore store = this.getTable(TABLE_CONFIGURATION);
603
                if (store != null) {
604
                    ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
605
                    String filter = builder.eq(
606
                            builder.column(FIELD_CONFIGURATION_NAME),
607
                            builder.constant(name)
608
                    ).toString();
609
                    Feature feature = store.findFirst(filter);
610
                    if (feature != null) {
611
                        return true;
612
                    }
613
                }
614
            }
615
            return super.exists(name);
616
        } catch (Exception ex) {
617
            LOGGER.warn("Can't read configuration value '" + name + "'", ex);
618
            return false;
619
        }
620
    }
621

    
622
    @Override
623
    public Object value(String name) {
624
        String v = this.get(name);
625
        if( v!=null ) {
626
            return v;
627
        }
628
        return super.value(name);
629
    }
630

    
631
    @Override
632
    public Collection<String> localvariables() {
633
        try {
634
            final List<String> theVars = new ArrayList<>();
635
            if (this.existsConfiguration()) {
636
                FeatureStore store = this.getTable(TABLE_CONFIGURATION);
637
                if (store != null) {
638
                    store.accept(new Visitor() {
639
                        @Override
640
                        public void visit(Object obj) throws VisitCanceledException, BaseException {
641
                            Feature feature = (Feature) obj;
642
                            theVars.add(feature.getString(FIELD_CONFIGURATION_NAME));
643
                        }
644
                    });
645
                }
646
            }
647
            return theVars;
648
        } catch (Exception ex) {
649
            LOGGER.warn("Can't read configuration variables", ex);
650
            return Collections.EMPTY_LIST;
651
        }
652
    }
653

    
654
    @Override
655
    public ResourcesStorage getResourcesStorage() {
656
        try {
657
            DataManager dataManager = DALLocator.getDataManager();
658
            DataServerExplorer server = dataManager.openServerExplorer(
659
                    this.serverParameters.getProviderName(),
660
                    this.serverParameters
661
            );
662
            ResourcesStorage resourcesStorage = server.getResourcesStorage();
663
            return resourcesStorage;
664
        } catch (Exception ex) {
665
            LOGGER.warn("Can't get resorces storage.",ex);
666
            return null;
667
        }
668
    }
669

    
670
    
671
}