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

History | View | Annotate | Download (23.7 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.SymbolTable;
15
import org.gvsig.expressionevaluator.spi.AbstractSymbolTable;
16
import org.gvsig.fmap.dal.DALLocator;
17
import org.gvsig.fmap.dal.DataManager;
18
import org.gvsig.fmap.dal.DataServerExplorer;
19
import org.gvsig.fmap.dal.DataServerExplorerParameters;
20
import org.gvsig.fmap.dal.DataStoreParameters;
21
import org.gvsig.fmap.dal.DataTypes;
22
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYID;
23
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYLABEL;
24
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_NAME;
25
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_VALUE;
26
import org.gvsig.fmap.dal.StoresRepository;
27
import org.gvsig.fmap.dal.feature.EditableFeature;
28
import org.gvsig.fmap.dal.feature.EditableFeatureType;
29
import org.gvsig.fmap.dal.feature.Feature;
30
import org.gvsig.fmap.dal.feature.FeatureStore;
31
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_NAME;
32
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_PARAMETERS;
33
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_NAME;
34
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_RESOURCE;
35
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION;
36
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION_NAME;
37
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY;
38
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY_NAME;
39
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES;
40
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
41
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
42
import org.gvsig.tools.dynobject.DynClass;
43
import org.gvsig.tools.dynobject.DynField;
44
import org.gvsig.tools.exception.BaseException;
45
import org.gvsig.tools.resourcesstorage.FilesResourcesStorage;
46
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
47
import org.gvsig.tools.util.FileTools;
48
import org.gvsig.tools.util.HasAFile;
49
import org.gvsig.tools.visitor.VisitCanceledException;
50
import org.gvsig.tools.visitor.Visitor;
51
import org.slf4j.Logger;
52
import org.slf4j.LoggerFactory;
53

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
655
    
656
}