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

History | View | Annotate | Download (32.8 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 java.util.Map;
9
import java.util.Objects;
10
import org.apache.commons.collections4.map.LRUMap;
11
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.expressionevaluator.ExpressionBuilder;
13
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
14
import org.gvsig.expressionevaluator.ExpressionUtils;
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 org.gvsig.fmap.dal.DatabaseWorkspaceManager;
23
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYID;
24
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.CONFIG_NAME_STORESREPOSITORYLABEL;
25
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_NAME;
26
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_VALUE;
27
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_FLAGS;
28
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_NAME;
29
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_REPOSITORY_PARAMETERS;
30
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_NAME;
31
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_RESOURCE;
32
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION;
33
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION_NAME;
34
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY;
35
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_REPOSITORY_NAME;
36
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES;
37
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
38
import org.gvsig.fmap.dal.StoresRepository;
39
import org.gvsig.fmap.dal.feature.EditableFeature;
40
import org.gvsig.fmap.dal.feature.EditableFeatureType;
41
import org.gvsig.fmap.dal.feature.Feature;
42
import org.gvsig.fmap.dal.feature.FeatureStore;
43
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
44
import org.gvsig.tools.dispose.DisposeUtils;
45
import org.gvsig.tools.dynobject.DynClass;
46
import org.gvsig.tools.dynobject.DynField;
47
import org.gvsig.tools.resourcesstorage.FilesResourcesStorage;
48
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
49
import org.gvsig.tools.util.CachedValue;
50
import org.gvsig.tools.util.FileTools;
51
import org.gvsig.tools.util.HasAFile;
52
import org.slf4j.Logger;
53
import org.slf4j.LoggerFactory;
54

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

    
67
    private static final String CONFIG_NAME_BASEFOLDER = "BASEFOLDER";
68
    private static final String CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH = "ALTERNATIVE_RESOURCES_PATH";
69
    
70
    private class CachedConfigValue extends CachedValue<String> {
71

    
72
        private final String name;
73
      
74
        public CachedConfigValue(String name, String value) {
75
          this.setValue(value);
76
          this.name = name;
77
        }
78
      
79
        public CachedConfigValue(String name, String value, long expireTime) {
80
          this.name = name;
81
          this.setValue(value);
82
          this.setExpireTime(expireTime);
83
        }
84
      
85
        @Override
86
        protected void reload() {
87
//            LOGGER.info("reload CachedConfigValue "+name);
88
            String s = DefaultDatabaseWorkspaceManager.this.getConfigValue(name);
89
            if( StringUtils.isBlank(s) ) {
90
                this.setValue(null);
91
            } else {
92
                this.setValue(s);
93
            }
94
        }
95

    
96
        @Override
97
        public String toString() {
98
            return this.name+" = "+this.getValue();
99
        }
100
        
101
        
102
    }
103
    
104
    private final DataServerExplorerParameters serverParameters;
105
    private Boolean existsConfiguration = null;
106
    private StoresRepository storesRepository;
107
    private CachedConfigValue alternativeResourcesFolder = null;
108
    private CachedValue<File> baseFolder;
109
    private Map<String,CachedConfigValue> cachedConfigValues;
110
    
111
    public DefaultDatabaseWorkspaceManager(DataServerExplorerParameters serverParameters) {
112
        this.serverParameters = serverParameters;
113
        this.baseFolder = new CachedValue() {
114
          @Override
115
          protected void reload() {
116
            String s = DefaultDatabaseWorkspaceManager.this.getConfigValue(CONFIG_NAME_BASEFOLDER);
117
            if( StringUtils.isBlank(s) ) {
118
                this.setValue(null);
119
            } else {
120
                s = ExpressionUtils.evaluateDynamicText(DefaultDatabaseWorkspaceManager.this, s);
121
                this.setValue(new File(s));
122
            }
123
          }
124
          
125
        };
126
        this.baseFolder.setExpireTime(20000); // 20seg
127
        this.alternativeResourcesFolder = new CachedConfigValue(CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH, null, 30000);
128
//        this.alternativeResourcesFolder = new CachedValue() {
129
//          @Override
130
//          protected void reload() {
131
//            String s = DefaultDatabaseWorkspaceManager.this.getConfigValue(CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH);
132
//            if( StringUtils.isBlank(s) ) {
133
//                this.setValue(null);
134
//            } else {
135
//                this.setValue(new File(s));
136
//            }
137
//          }
138
//          
139
//        };
140
//        this.alternativeResourcesFolder.setExpireTime(30000); // 20seg
141
        
142
        this.cachedConfigValues = new LRUMap<>(20, 20);
143
        ExpressionEvaluatorLocator.getExpressionEvaluatorManager().populateSymbolTable(this);
144
        
145
    }
146

    
147
    @Override
148
    public String toString() {
149
        return this.getLabel();
150
    }
151
    
152
    @Override
153
    public String getId() {
154
        String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
155
        return id;
156
    }
157
    
158
    @Override
159
    public String getLabel() {
160
        String label = this.get(CONFIG_NAME_STORESREPOSITORYLABEL);
161
        return label;
162
    }
163

    
164
    @Override
165
    public DatabaseWorkspaceManager getValue() {
166
        return this;
167
    }
168
    
169
    @Override
170
    public boolean existsTable(int tableid) {
171
        switch(tableid) {
172
            case TABLE_RESOURCES:
173
                return this.existsTable(TABLE_RESOURCES_NAME);
174
            case TABLE_REPOSITORY:
175
                return this.existsTable(TABLE_REPOSITORY_NAME);
176
            case TABLE_CONFIGURATION:
177
                return this.existsTable(TABLE_CONFIGURATION_NAME);
178
            default:
179
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
180
        }
181
    }
182
    
183
    @Override
184
    public void createTable(int tableid) {
185
        switch(tableid) {
186
            case TABLE_RESOURCES:
187
                createTableResources();
188
                break;
189
            case TABLE_REPOSITORY:
190
                createTableRepository();
191
                break;
192
            case TABLE_CONFIGURATION:
193
                createTableConfiguration();
194
                break;
195
            default:
196
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
197
        }
198
    }
199
    
200
    @Override
201
    public void dropTable(int tableid) {
202
        switch(tableid) {
203
            case TABLE_RESOURCES:
204
                this.dropTable(TABLE_RESOURCES_NAME);
205
                break;
206
            case TABLE_REPOSITORY:
207
                this.dropTable(TABLE_REPOSITORY_NAME);
208
                break;
209
            case TABLE_CONFIGURATION:
210
                this.dropTable(TABLE_CONFIGURATION_NAME);
211
                break;
212
            default:
213
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
214
        }
215
    }
216
    
217
    @Override
218
    public FeatureStore getTable(int tableid) {
219
        switch(tableid) {
220
            case TABLE_RESOURCES:
221
                return this.getTable(TABLE_RESOURCES_NAME);
222
            case TABLE_REPOSITORY:
223
                return this.getTable(TABLE_REPOSITORY_NAME);
224
            case TABLE_CONFIGURATION:
225
                return this.getTable(TABLE_CONFIGURATION_NAME);
226
            default:
227
                throw new IllegalArgumentException("Invalid table identitier "+tableid);
228
        }
229
    }
230
    
231
    @Override
232
    public DataServerExplorer getServerExplorer() {
233
        try {
234
            DataManager dataManager = DALLocator.getDataManager();
235
            DataServerExplorer server = dataManager.openServerExplorer(
236
                    this.serverParameters.getProviderName(),
237
                    this.serverParameters
238
            );
239
            return server;
240
        } catch (Exception ex) {
241
            throw new RuntimeException("Can't get server explorer for workspace '"+Objects.toString(this.serverParameters)+"'", ex);
242
        }
243
    }
244

    
245
    @Override
246
    public DataServerExplorerParameters getServerExplorerParameters() {
247
        return this.serverParameters;
248
    }
249
    
250
    
251
    
252
    private boolean existsTable(String tableName) {
253
        DataServerExplorer server = null;
254
        try {
255
            server = this.getServerExplorer();
256
            List<DataStoreParameters> list = server.list();
257
            if(list == null){
258
                return false;
259
            }
260
            for (DataStoreParameters params : server.list()) {
261
                String theTableName = (String) params.getDynValue("Table");
262
                if( StringUtils.equals(theTableName, tableName) ) {
263
                    return true;
264
                }
265
            }
266
        } catch (Exception ex) {
267
            LOGGER.warn("Can't check if the table '"+tableName+"' exists.",ex);
268
        } finally {
269
            DisposeUtils.disposeQuietly(server);
270
        }
271
        return false;
272
    }
273

    
274
    private FeatureStore getTable(String tableName) {
275
        DataServerExplorer server = null;
276
        try {
277
            DataManager dataManager = DALLocator.getDataManager();
278
            server = this.getServerExplorer();
279
            DataStoreParameters params = server.get(tableName);
280
            if( params!=null ) {
281
                FeatureStore store = (FeatureStore) dataManager.openStore(
282
                        params.getProviderName(), 
283
                        params,
284
                        true
285
                );
286
                return store;
287
            }
288
        } catch (Exception ex) {
289
            LOGGER.warn("Can't open table '"+tableName+"'.",ex);
290
        } finally {
291
            DisposeUtils.disposeQuietly(server);
292
        }
293
        return null;
294
    }
295

    
296
    private void dropTable(String tableName) {
297
        DataServerExplorer server = null;
298
        try {
299
            server = this.getServerExplorer();
300
            DataStoreParameters params = server.get(tableName);
301
            if( params!=null ) {
302
                server.remove(params);
303
            }
304
        } catch (Exception ex) {
305
            LOGGER.warn("Can't drop table '"+tableName+"'.",ex);
306
        } finally {
307
            DisposeUtils.disposeQuietly(server);
308
        }
309
    }
310
    
311
    @Override
312
    public void createTableResources(String tableName) throws RuntimeException {
313
        // H2Spatial crea esta table a mano. 
314
        // Si tocamos algo aqu? hay que modificar 
315
        // la creacion de esta tabla en el helper de H2
316

    
317
        DataServerExplorer server = null;
318
        try {
319
            server = this.getServerExplorer();
320
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
321
            EditableFeatureType ft = params.getDefaultFeatureType();
322
            ft.add(FIELD_RESOURCES_NAME, DataTypes.STRING, 150)
323
                    .setAllowNull(false)
324
                    .setIsPrimaryKey(true);
325
            ft.add(FIELD_RESOURCES_RESOURCE, DataTypes.BYTEARRAY)
326
                    .setAllowNull(true);
327
            server.add(tableName, params, false);
328
        } catch (Exception ex) {
329
            LOGGER.debug("Can't create resources table '"+tableName+"'.",ex);
330
            throw new RuntimeException("Can't create resources table '"+tableName+"'.", ex);
331
        } finally {
332
            DisposeUtils.disposeQuietly(server);
333
        }
334
    }
335

    
336
    private void createTableResources() {    
337
        createTableResources(TABLE_RESOURCES_NAME);
338
    }
339
    
340
    @Override
341
    public void createTableRepository(String tableName) throws RuntimeException {
342
        DataServerExplorer server = null;
343
        try {
344
            server = this.getServerExplorer();
345
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
346
            EditableFeatureType ft = params.getDefaultFeatureType();
347
            ft.add(FIELD_REPOSITORY_NAME, DataTypes.STRING, 150)
348
                    .setAllowNull(false)
349
                    .setIsPrimaryKey(true);
350
            ft.add(FIELD_REPOSITORY_PARAMETERS, DataTypes.BYTEARRAY)
351
                    .setAllowNull(true);
352
            ft.add(FIELD_REPOSITORY_FLAGS, DataTypes.INT)
353
                    .setAllowNull(false)
354
                    .setDefaultValue(0);
355
            server.add(tableName, params, false);
356
        } catch (Exception ex) {
357
            LOGGER.debug("Can't create repository table '"+tableName+"'.",ex);
358
            throw new RuntimeException("Can't create repository table '"+tableName+"'.", ex);
359
        } finally {
360
            DisposeUtils.disposeQuietly(server);
361
        }
362
    }
363

    
364
    private void createTableRepository() {
365
        createTableRepository(TABLE_REPOSITORY_NAME);
366
    }
367
    
368
    private void createTableConfiguration() {
369
        // H2Spatial crea esta table a mano. 
370
        // Si tocamos algo aqu? hay que modificar 
371
        // la creacion de esta tabla en el helper de H2
372
        String tableName = TABLE_CONFIGURATION_NAME;
373
        DataServerExplorer server = null;
374
        FeatureStore store = null;
375
        try {
376
            server = this.getServerExplorer();
377
            NewFeatureStoreParameters params = (NewFeatureStoreParameters) server.getAddParameters(tableName);
378
            EditableFeatureType ft = params.getDefaultFeatureType();
379
            ft.add(FIELD_CONFIGURATION_NAME, DataTypes.STRING, 200)
380
                    .setAllowNull(false)
381
                    .setIsPrimaryKey(true);
382
            ft.add(FIELD_CONFIGURATION_VALUE, DataTypes.STRING, 10240)
383
                    .setAllowNull(true);
384
            server.add(tableName, params, false);
385
            
386
            DataStoreParameters openParams = server.get(TABLE_CONFIGURATION_NAME);
387
            store = (FeatureStore) DALLocator.getDataManager().openStore(
388
                    openParams.getProviderName(), openParams
389
            );
390
            store.edit();
391
            EditableFeature efeature = store.createNewFeature();
392
            efeature.set(FIELD_CONFIGURATION_NAME, CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH);
393
            efeature.set(FIELD_CONFIGURATION_VALUE, null);
394
            store.insert(efeature);
395
            store.finishEditing();                    
396
                    
397
            this.existsConfiguration = null;
398
        } catch (Exception ex) {
399
            LOGGER.warn("Can't create table '"+tableName+"'.",ex);
400
            FeatureStore.cancelEditingQuietly(store);
401
        } finally {
402
            DisposeUtils.disposeQuietly(server);
403
            DisposeUtils.disposeQuietly(store);
404
        }
405
    }
406
    
407
    private boolean existsConfiguration() {
408
        if( this.existsConfiguration==null ) {
409
            this.existsConfiguration = this.existsTable(TABLE_CONFIGURATION_NAME);
410
        }
411
        return this.existsConfiguration;
412
    }
413

    
414
    @Override
415
    public String get(String name) {
416
        try {
417
            if( !this.existsConfiguration() ) {
418
                return null;
419
            }
420
            if( StringUtils.equalsIgnoreCase(name, CONFIG_NAME_BASEFOLDER) ) {
421
              return Objects.toString(this.baseFolder.get(), null);
422
            }
423
            if( StringUtils.equalsIgnoreCase(name, CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH) ) {
424
              return Objects.toString(this.alternativeResourcesFolder.get(), null);
425
            }
426
            CachedConfigValue cachedValue = this.cachedConfigValues.get(name);
427
            if( cachedValue != null ) {
428
              return cachedValue.get();
429
            }
430
            String value = this.getConfigValue(name);
431
            this.cachedConfigValues.put(name, new CachedConfigValue(name, value, 15000));
432
            value = ExpressionUtils.evaluateDynamicText(this, value);
433
            return value;
434
        } catch (Exception ex) {
435
            LOGGER.warn("Can't read configuration value '"+name+"'", ex);
436
            return null;
437
        }
438
    }
439
    
440
    private String getConfigValue(String name) {
441
        FeatureStore store = null;
442
        try {
443
            if( !this.existsConfiguration() ) {
444
                return null;
445
            }
446
            store = this.getTable(TABLE_CONFIGURATION);
447
            if( store == null ) {
448
                return null;
449
            }
450
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
451
            String filter = builder.eq(
452
                    builder.column(FIELD_CONFIGURATION_NAME),
453
                    builder.constant(name)
454
            ).toString();
455
            Feature feature = store.findFirst(filter);
456
            if( feature == null ) {
457
                return null;
458
            }
459
            String value = feature.getString(FIELD_CONFIGURATION_VALUE);
460
//            value = ExpressionUtils.evaluateDynamicText(this, value);
461
            return value;
462
            
463
        } catch (Exception ex) {
464
            LOGGER.warn("Can't read configuration value '"+name+"'", ex);
465
            return null;
466
        } finally {
467
            DisposeUtils.disposeQuietly(store);
468
        }
469
    }
470

    
471
    @Override
472
    public boolean set(String name, String value) {
473
        FeatureStore store = null;
474
        try {
475
            if( !this.existsConfiguration() ) {
476
                return false;
477
            }
478
            store = this.getTable(TABLE_CONFIGURATION);
479
            if( store == null ) {
480
                return false;
481
            }
482
            store.edit();
483
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
484
            String filter = builder.eq(
485
                    builder.column(FIELD_CONFIGURATION_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_CONFIGURATION_NAME, name);
493
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
494
                store.insert(efeature);
495
            } else {
496
                efeature = feature.getEditable();
497
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
498
                store.update(efeature);
499
            }
500
            store.finishEditing();
501
            if( StringUtils.equalsIgnoreCase(name, CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH)) {
502
                this.alternativeResourcesFolder.expired();
503
            } else if( this.cachedConfigValues.containsKey(name) ) {
504
                value = ExpressionUtils.evaluateDynamicText(this, value);
505
                this.cachedConfigValues.get(name).set(value);
506
            }
507
            return true;
508
        } catch (Exception ex) {
509
            LOGGER.warn("Can't write configuration value '"+name+"'", ex);
510
            return false;
511
        } finally {
512
            DisposeUtils.disposeQuietly(store);
513
        }
514
    }
515

    
516
    @Override
517
    public StoresRepository getStoresRepository() {
518
        if( this.storesRepository==null ) {
519
            String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
520
            String label = this.get(CONFIG_NAME_STORESREPOSITORYLABEL);
521
            this.storesRepository = new DatabaseWorkspaceStoresRepository(
522
                    id,
523
                    label,
524
                    this
525
            );
526
        }
527
        return this.storesRepository;
528
    }
529
    
530
    public boolean contains(DataStoreParameters parameters) {
531
        boolean c = this.getStoresRepository().contains(parameters);
532
        return c;
533
    }
534

    
535
    @Override
536
    public boolean canAnonymousUserWriteInTheTables() {
537
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
538
    }
539

    
540
    @Override
541
    public File getBaseFolder() {
542
        return this.baseFolder.get();
543
    }
544
    
545
    @Override
546
    public void setBaseFolder(File baseFolder) {
547
        this.baseFolder.set(baseFolder);
548
        this.set(CONFIG_NAME_BASEFOLDER, baseFolder.toString());
549
    }
550

    
551
    public File getWorkspaceFile() {
552
        if( this.serverParameters instanceof HasAFile ) {
553
            return ((HasAFile)this.serverParameters).getFile();
554
        }
555
        return null;
556
    }
557
    
558
    private DataStoreParameters replaceInFilesToUseBaseFolder(DataStoreParameters parameters) {
559
        DynClass dynClass = parameters.getDynClass();
560
        if( dynClass == null ) {
561
            return parameters;
562
        }
563
        File theBaseFolder = this.getBaseFolder();
564
        File wsfile = getWorkspaceFile();
565
        if( theBaseFolder==null && wsfile==null ) {
566
            return parameters;
567
        }
568
        DataStoreParameters replaced = parameters;
569
        for (DynField dynField : dynClass.getDynFields()) {
570
            switch(dynField.getType()) {
571
                case DataTypes.FILE:
572
                case DataTypes.FOLDER:
573
                    File f = (File) parameters.getDynValue(dynField.getName());
574
                    File newf = null;
575
                    if( f!=null ) {
576
                        if( wsfile!=null ) {
577
                            if( wsfile.equals(f) ) {
578
                                ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
579
                                newf = ExpressionUtils.createDynamicFile(
580
                                    builder.ifnull(
581
                                        builder.variable("WORKSPACEFILE"), 
582
                                        builder.constant(f.toString()), 
583
                                        builder.variable("WORKSPACEFILE")
584
                                    )
585
                                );
586
                            }
587
                        }
588
                        if( newf==null ) {
589
                            File frel = FileTools.relativizeFile(theBaseFolder, f);
590
                            if( frel!=f ) {
591
                                ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
592
                                newf = ExpressionUtils.createDynamicFile(
593
                                    builder.concat(
594
                                            builder.variable(CONFIG_NAME_BASEFOLDER), 
595
                                            builder.constant("/"), 
596
                                            builder.variable(frel.getPath())
597
                                    )
598
                                );
599
                            }
600
                        }
601
                        if( newf!=null ) {
602
                            if( replaced == parameters ) {
603
                                replaced = (DataStoreParameters) replaced.getCopy();
604
                            }
605
                            replaced.setDynValue(dynField.getName(), newf);
606
                        }
607
                    }
608
                    break;
609
            }
610
        }
611
        return replaced;
612
    }
613
    
614
    @Override
615
    public boolean writeStoresRepositoryEntry(String name, DataStoreParameters parameters) {
616
        FeatureStore store = null;
617
        try {
618
            parameters = this.replaceInFilesToUseBaseFolder(parameters);
619
            byte[] data = parameters.toByteArray();
620
            if( data == null ) {
621
                throw new RuntimeException("Can't convert parameters to byte array.");
622
            }
623
            store = this.getTable(TABLE_REPOSITORY);
624
            store.edit();
625
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
626
            String filter = builder.eq(
627
                    builder.column(FIELD_REPOSITORY_NAME),
628
                    builder.constant(name)
629
            ).toString();
630
            Feature feature = store.findFirst(filter);
631
            EditableFeature efeature;
632
            if (feature == null) {
633
                efeature = store.createNewFeature();
634
                efeature.set(FIELD_REPOSITORY_NAME, name);
635
                efeature.set(FIELD_REPOSITORY_PARAMETERS, data);
636
                // algun set sobre los flags?
637
                efeature.set(FIELD_REPOSITORY_FLAGS, 0);
638
                store.insert(efeature);
639
            } else {
640
                efeature = feature.getEditable();
641
                efeature.set(FIELD_REPOSITORY_PARAMETERS, data);
642
                store.update(efeature);
643
            }
644
            store.finishEditing();
645
            this.storesRepository = null;
646
            return true;
647
            
648
        } catch (Exception ex) {
649
            LOGGER.warn("Can't save entry '"+name+"' in repository information", ex);
650
            return false;
651
        } finally {
652
            DisposeUtils.disposeQuietly(store);
653
        }
654
    }
655

    
656
    @Override
657
    public boolean isValid() {
658
      try {
659
        String id = this.get(CONFIG_NAME_STORESREPOSITORYID);
660
        if( StringUtils.isBlank(id) ) {
661
            return false;
662
        }
663
        return true;
664
      } catch(Exception ex) {
665
        return false;
666
      }
667
    }
668

    
669
    @Override
670
    public boolean isValidStoresRepository() {
671
        if( !this.isValid() ) {
672
            return false;
673
        }
674
        if( !this.existsTable(TABLE_REPOSITORY_NAME) ) {
675
            return false;
676
        }
677
        return true;
678
        
679
    }
680
    
681
    @Override
682
    public ResourcesStorage getAlternativeResourcesStorage(String tableName) {
683
//        LOGGER.info("getAlternativeResourcesStorage from cache: "+!this.alternativeResourcesFolder.isExpired());
684
        String s = this.alternativeResourcesFolder.get();
685
//        LOGGER.info("alternativeResourcesStorage: "+s);
686
        if( StringUtils.isBlank(s) ) {
687
            return null;
688
        }
689
        
690
        s = ExpressionUtils.evaluateDynamicText(this, s);
691

    
692
        File folder = new File(s);
693
        
694
        if( folder==null ) {
695
            return null;
696
        }
697
        String resourcesRoot = folder.getAbsolutePath().replace("\\","/") + "/" + tableName;
698
        ResourcesStorage resources = new FilesResourcesStorage(resourcesRoot);
699
        return resources;
700
    }
701
    
702
    @Override
703
    public boolean hasAlternativeResourcesStorage() {
704
        String path = this.get(CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH);
705
        return StringUtils.isNotBlank(path);
706
    }
707

    
708
    @Override
709
    public void setAlternativeResourcesStorage(String resourcesPath) {
710
//        this.fix();
711
      this.set(CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH, resourcesPath);
712
//      this.alternativeResourcesFolder.expired();
713
    }
714

    
715
    @Override
716
    public void drop() {
717
        if( !this.existsTable(TABLE_RESOURCES) ) {
718
            this.dropTable(TABLE_RESOURCES);
719
        }
720
        if( !this.existsTable(TABLE_CONFIGURATION) ) {
721
            this.dropTable(TABLE_CONFIGURATION);
722
        }
723
        if( !this.existsTable(TABLE_REPOSITORY) ) {
724
            this.dropTable(TABLE_REPOSITORY);
725
        }
726
    }
727
    
728
   
729
    @Override
730
    public void create(String id, String description) {
731
        if( !this.existsTable(TABLE_RESOURCES) ) {
732
            this.createTable(TABLE_RESOURCES);
733
        }
734
        if( !this.existsTable(TABLE_CONFIGURATION) ) {
735
            this.createTable(TABLE_CONFIGURATION);
736
        }
737
        if( !this.existsTable(TABLE_REPOSITORY) ) {
738
            this.createTable(TABLE_REPOSITORY);
739
        }
740
        this.set(CONFIG_NAME_STORESREPOSITORYID,id);
741
        this.set(CONFIG_NAME_STORESREPOSITORYLABEL,description);
742
        this.set(CONFIG_CAN_ANONYMOUS_USER_WRITE_IN_THE_TABLES,"true");
743
        this.set(CONFIG_NAME_ALTERNATIVE_RESOURCES_PATH,"");
744
        File theBaseFolder = this.getBaseFolder();
745
        if( this.serverParameters instanceof HasAFile && theBaseFolder==null ) {
746
            File f = ((HasAFile)this.serverParameters).getFile();
747
            if( f != null ) {
748
                theBaseFolder = f.getParentFile();
749
                this.setBaseFolder(theBaseFolder);
750
            } else {
751
                this.set(CONFIG_NAME_BASEFOLDER,"");
752
            }
753
        } else {
754
            this.set(CONFIG_NAME_BASEFOLDER,"");
755
        }
756
    }
757

    
758
    @Override
759
    public boolean exists(String name) {
760
        FeatureStore store = null;
761
        try {
762
            if( StringUtils.equalsIgnoreCase(name, "WORKSPACEFILE") ) {
763
                File wsfile = getWorkspaceFile();
764
                if( wsfile!=null ) {
765
                    return true;
766
                }
767
            }
768
            if (this.existsConfiguration()) {
769
              if( StringUtils.equalsIgnoreCase(name, CONFIG_NAME_BASEFOLDER) ) {
770
                return true;
771
              }
772
              if( this.cachedConfigValues.containsKey(name) ) {
773
                return true;
774
              }
775
              store = this.getTable(TABLE_CONFIGURATION);
776
              if (store != null) {
777
                  ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
778
                  String filter = builder.eq(
779
                          builder.column(FIELD_CONFIGURATION_NAME),
780
                          builder.constant(name)
781
                  ).toString();
782
                  Feature feature = store.findFirst(filter);
783
                  if (feature != null) {
784
                      String value = feature.getString(FIELD_CONFIGURATION_VALUE);
785
                      value = ExpressionUtils.evaluateDynamicText(this, value);
786
                      this.cachedConfigValues.put(name, new CachedConfigValue(name, value, 15000));
787
                      return true;
788
                  }
789
                }
790
            }
791
            return super.exists(name);
792
        } catch (Exception ex) {
793
            LOGGER.warn("Can't read configuration value '" + name + "'", ex);
794
            return false;
795
        } finally {
796
            DisposeUtils.disposeQuietly(store);
797
        }
798
    }
799

    
800
    @Override
801
    public Object value(String name) {
802
        if( StringUtils.equalsIgnoreCase(name, "WORKSPACEFILE") ) {
803
            File wsfile = getWorkspaceFile();
804
            if( wsfile!=null ) {
805
                return wsfile.toString();
806
            }
807
        }
808
        String v = this.get(name);
809
        if( v!=null ) {
810
            return v;
811
        }
812
        return super.value(name);
813
    }
814

    
815
    @Override
816
    public Collection<String> localvariables() {
817
        FeatureStore store = null;
818
        try {
819
            final List<String> theVars = new ArrayList<>();
820
            if (this.existsConfiguration()) {
821
                store = this.getTable(TABLE_CONFIGURATION);
822
                if (store != null) {
823
                    store.accept((Object obj) -> {
824
                      Feature feature = (Feature) obj;
825
                      theVars.add(feature.getString(FIELD_CONFIGURATION_NAME));
826
                    });
827
                }
828
            }
829
            return theVars;
830
        } catch (Exception ex) {
831
            LOGGER.warn("Can't read configuration variables", ex);
832
            return Collections.EMPTY_LIST;
833
        } finally {
834
            DisposeUtils.disposeQuietly(store);
835
        }
836
    }
837

    
838
    @Override
839
    public ResourcesStorage getResourcesStorage() {
840
        DataServerExplorer server = null;
841
        try {
842
            server = this.getServerExplorer();
843
            ResourcesStorage resourcesStorage = server.getResourcesStorage();
844
            return resourcesStorage;
845
        } catch (Exception ex) {
846
            LOGGER.warn("Can't get resorces storage.",ex);
847
            return null;
848
        } finally {
849
            DisposeUtils.disposeQuietly(server);
850
        }
851
    }
852
    
853
    public void fix() {
854
      if( !(this.serverParameters instanceof HasAFile) ) {
855
        return;
856
      }
857
      HasAFile f = (HasAFile) this.serverParameters;
858
      if( f.getFile()==null ) {
859
        return;
860
      }
861
      if( !this.isValid() ) {
862
        return;
863
      }
864
      this.set(CONFIG_NAME_BASEFOLDER, f.getFile().getParent());
865
    }
866

    
867
    @Override
868
    public void connect() {
869
      DataManager manager = DALLocator.getDataManager();
870
      this.fix();
871
      manager.addDatabaseWorkspace(this);
872
    }
873
    
874
    @Override
875
    public void disconnect() {
876
      DataManager manager = DALLocator.getDataManager();
877
      manager.removeDatabaseWorkspace(this);
878
    }
879

    
880
    @Override
881
    public boolean isConnected() {
882
      DataManager manager = DALLocator.getDataManager();
883
      DatabaseWorkspaceManager ws = manager.getDatabaseWorkspace(this.getId());
884
      if(ws == null){
885
          return false;
886
      }
887
      if(ws.getServerExplorerParameters().isTheSameServerExplorer(this.getServerExplorerParameters())){
888
          return true;
889
      }
890
      return false;
891
    }
892
    
893
    @Override
894
    public String getLabelOrId() {
895
        String label = this.getLabel();
896
        if(StringUtils.isBlank(label)){
897
            label = this.getId();
898
        }
899
        return label;
900
    }
901
    
902
}