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 / DefaultDataManager.java @ 45043

History | View | Annotate | Download (53.8 KB)

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

    
3
import java.io.File;
4
import java.io.InputStream;
5
import java.net.URL;
6
import java.net.URLClassLoader;
7
import java.util.ArrayList;
8
import java.util.Collections;
9
import java.util.HashMap;
10
import java.util.HashSet;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.Objects;
14
import java.util.Set;
15
import java.util.UUID;
16
import javax.json.JsonArray;
17
import javax.json.JsonObject;
18
import javax.json.JsonValue;
19
import org.apache.commons.io.IOUtils;
20
import org.apache.commons.lang3.StringUtils;
21
import org.gvsig.expressionevaluator.Expression;
22
import org.gvsig.expressionevaluator.ExpressionBuilder;
23
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
24
import org.gvsig.expressionevaluator.MutableSymbolTable;
25
import org.gvsig.expressionevaluator.impl.DefaultDALExpressionBuilder;
26
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
27
import org.gvsig.expressionevaluator.spi.JsonUtils;
28
import org.gvsig.fmap.dal.BaseStoresRepository;
29
import org.gvsig.fmap.dal.DALLocator;
30

    
31
import org.gvsig.fmap.dal.DataFactory;
32
import org.gvsig.fmap.dal.DataManager;
33
import org.gvsig.fmap.dal.DataServerExplorer;
34
import org.gvsig.fmap.dal.DataServerExplorerFactory;
35
import org.gvsig.fmap.dal.DataServerExplorerParameters;
36
import org.gvsig.fmap.dal.DataServerExplorerPool;
37
import org.gvsig.fmap.dal.DataStore;
38
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
39
import org.gvsig.fmap.dal.DataStoreNotification;
40
import org.gvsig.fmap.dal.DataStoreParameters;
41
import org.gvsig.fmap.dal.DataStoreProviderFactory;
42
import org.gvsig.fmap.dal.DataTypes;
43
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
44

    
45
import org.gvsig.fmap.dal.NewDataStoreParameters;
46
import org.gvsig.fmap.dal.OpenErrorHandler;
47
import org.gvsig.fmap.dal.Register;
48
import org.gvsig.fmap.dal.StoresRepository;
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.exception.InitializeException;
51
import org.gvsig.fmap.dal.exception.OpenException;
52
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
53
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
54
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
55
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder;
56
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
57
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
58
import org.gvsig.fmap.dal.feature.DataProfile;
59
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
60
import org.gvsig.fmap.dal.feature.EditableFeatureType;
61
import org.gvsig.fmap.dal.feature.Feature;
62
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
63
import org.gvsig.fmap.dal.feature.FeatureQuery;
64
import org.gvsig.fmap.dal.feature.FeatureStore;
65
import org.gvsig.fmap.dal.feature.FeatureType;
66
import org.gvsig.fmap.dal.feature.ForeingKey;
67
import static org.gvsig.fmap.dal.feature.ForeingKey.MAX_AVAILABLE_VALUES;
68
import org.gvsig.fmap.dal.feature.impl.DALFile;
69
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureAttributeDescriptor;
70
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
71
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
72
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
73
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
74
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
75
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
76
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
77
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
78
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
79
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
80
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
81
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
82
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
83
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
84
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
85
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
86
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
87
import org.gvsig.fmap.dal.spi.AbstractDataParameters;
88
import org.gvsig.fmap.dal.spi.DALSPILocator;
89
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
90
import org.gvsig.fmap.dal.spi.DataStoreProvider;
91
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
92
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
93
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
94
import org.gvsig.tools.ToolsLocator;
95
import org.gvsig.tools.dataTypes.DataType;
96
import org.gvsig.tools.dataTypes.DataTypesManager;
97
import org.gvsig.tools.dynobject.DynObject;
98
import org.gvsig.tools.dynobject.DynObjectValueItem;
99
import org.gvsig.tools.dynobject.DynStruct;
100
import org.gvsig.tools.dynobject.DynStruct_v2;
101
import org.gvsig.tools.dynobject.Tags;
102
import org.gvsig.tools.evaluator.Evaluator;
103
import org.gvsig.tools.exception.BaseException;
104
import org.gvsig.tools.extensionpoint.ExtensionPoint;
105
import org.gvsig.tools.folders.FoldersManager;
106
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
107
import org.gvsig.tools.identitymanagement.UnauthorizedException;
108
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
109
import org.gvsig.tools.script.Script;
110
import org.gvsig.tools.script.ScriptManager;
111
import org.gvsig.tools.service.spi.Services;
112
import org.slf4j.Logger;
113
import org.slf4j.LoggerFactory;
114
import org.gvsig.fmap.dal.DatabaseWorkspaceManager.DatabaseWorkspaceListener;
115
import org.gvsig.tools.observer.Observer;
116

    
117
@SuppressWarnings("UseSpecificCatch")
118
public class DefaultDataManager
119
        implements DataManager, DataManagerProviderServices, Services {
120

    
121
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataManager.class);
122
    
123
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
124
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
125
        "DAL cache providers";
126

    
127
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
128

    
129

    
130
    private class Registers {
131

    
132
        private final Register store;
133
        private final Register storeProvider;
134
        private final Register serverExplorer;
135
        private final Register featureIndexProvider;
136

    
137
        public Registers() {
138
            this.store = new RegisterImpl(
139
                    "Data.manager.stores.factory",
140
                    "DAL store factories"
141
            );
142
            this.storeProvider = new RegisterImpl(
143
                    "Data.manager.providers.factory",
144
                    "DAL store provider factories"
145
            );
146
            this.serverExplorer = new RegisterImpl(
147
                    "Data.manager.servereexplorer.factory",
148
                    "DAL server explorer factories"
149
            );
150
            this.featureIndexProvider = new RegisterImpl(
151
                    "Data.manager.feature.index.factory",
152
                    "DAL feature index factories"
153
            );
154

    
155
            this.store.register(new FeatureStoreFactory());
156
        }
157
    }
158
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
159

    
160
    private final Registers registers;
161

    
162
    private final Map<Integer, String> defaultDataIndexProviders;
163

    
164
    private OpenErrorHandler openErrorHandler = null;
165

    
166
    private DataServerExplorerPool dataServerExplorerPool = null;
167

    
168
    private List<DataType> dataTypes = null;
169

    
170
    private ClassLoader resourcesLoader = null;
171

    
172
    private List<DataProfile> dataProfiles;
173
    
174
    private final Map<String, DatabaseWorkspaceManager> databaseWorkspaces = new HashMap<>();
175
 
176
    private final Map<String,DatabaseWorkspaceListener> addDatabaseWorkspaceListeners = new HashMap<>();
177

    
178
    private final Set<Observer>storeObservers = new HashSet<>();
179
    
180
    public DefaultDataManager() {
181
        this.registers = new Registers();
182
        this.defaultDataIndexProviders = new HashMap<>();
183
    }
184

    
185
    @Override
186
    public Register getStoreRegister() {
187
        return this.registers.store;
188
    }
189

    
190
    @Override
191
    public Register getStoreProviderRegister() {
192
        return this.registers.storeProvider;
193
    }
194

    
195
    @Override
196
    public Register getServerExplorerRegister() {
197
        return this.registers.serverExplorer;
198
    }
199

    
200
    @Override
201
    public Register getFeatureIndexRegister() {
202
        return this.registers.featureIndexProvider;
203
    }
204

    
205
    private String getStoreName(DataStoreParameters parameters) {
206
        for (DataFactory factory : this.getStoreRegister()) {
207
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
208
            if (storeFactory.canUse(parameters)) {
209
                return storeFactory.getName();
210
            }
211
        }
212
        return null;
213
    }
214

    
215
    /**
216
     * @deprecated
217
     */
218
    @Override
219
    public void registerDefaultRasterStore(Class rasterStoreClass) {
220
        // Metodo usado por el raster nuevo para regstrar su factoria de store
221
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
222
    }
223

    
224
    
225
    private boolean oldRasterRegistered = false;
226
    /**
227
     * @deprecated
228
     */
229
    @Override
230
    public void registerStoreFactory(String name, Class storeFactoryClass) {
231
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
232
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
233
        this.oldRasterRegistered = true;
234
    }
235

    
236
    @Override
237
    public boolean isTheOldRasterRegistered() {
238
      return this.oldRasterRegistered;
239
    }
240
    
241
    /**
242
     * @param name
243
     * @param storeProviderClass
244
     * @param parametersClass
245
     * @deprecated use registerStoreProviderFactory
246
     */
247
    @Override
248
    public void registerStoreProvider(String name, Class storeProviderClass,
249
            Class parametersClass) {
250
        if (name == null || storeProviderClass == null || parametersClass == null) {
251
            throw new IllegalArgumentException("Any parameters can be null");
252
        }
253

    
254
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
255
            throw new IllegalArgumentException(parametersClass.getName()
256
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
257
        }
258

    
259
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
260
            // Envuelve al proveedor en una factoria por defecto.
261
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
262
                    name, "", storeProviderClass, parametersClass));
263
            return;
264
        }
265

    
266
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
267
            // Envuelve al proveedor en una factoria por defecto.
268
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
269
                    name, "", storeProviderClass, parametersClass));
270
            return;
271
        }
272

    
273
        throw new IllegalArgumentException("Not supported implemtation: name="
274
                + name + " provider class=" + storeProviderClass.getName());
275

    
276
    }
277

    
278
    @Override
279
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
280
        if (name == null || explorerClass == null || parametersClass == null) {
281
            // FIXME Exception
282
            throw new IllegalArgumentException("Any parameters can be null");
283
        }
284

    
285
        if (!DataServerExplorerParameters.class
286
                .isAssignableFrom(parametersClass)) {
287
            // FIXME Exception
288
            throw new IllegalArgumentException(
289
                    parametersClass.getName()
290
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
291
        }
292

    
293
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
294
            // FIXME Exception
295
            throw new IllegalArgumentException(explorerClass.getName()
296
                    + " must implement org.gvsig.fmap.dal.DataServerExplorer");
297
        }
298

    
299
        // Envuelve al proveedor en una factoria por defecto.
300
        this.registerServerExplorerFactory(
301
                new DataServerExplorerToDataExplorerFactoryWrapper(
302
                        name, "", explorerClass, parametersClass
303
                )
304
        );
305

    
306
    }
307

    
308
    @Override
309
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
310
        this.getStoreRegister().register(factory);
311
    }
312

    
313
    @Override
314
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
315
        this.getStoreProviderRegister().register(factory);
316
    }
317

    
318
    @Override
319
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
320
        this.getServerExplorerRegister().register(factory);
321
    }
322

    
323
    @Override
324
    public DataStoreParameters createStoreParameters(byte[] data) {
325
        DataStoreParameters parameters = (DataStoreParameters) AbstractDataParameters.fromByteArray(data);
326
        return parameters;
327
    }
328

    
329
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
330
      // Cuando desde python se llama a createStoreParameters con solo un argumento 
331
      // acaba entrando por aqui en lugar de por
332
      //   createStoreParameters(String providerName, Object... arguments)
333
      return this.createStoreParameters(providerName, (Object[]) null);
334
    }
335

    
336
    @Override
337
    public DataStoreParameters createStoreParameters(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException {
338
        if( providerName == null ) {
339
            String msg = "Provider name can't be null.";
340
            LOGGER.warn(msg);
341
            throw new IllegalArgumentException(msg);
342
        }
343
        if( arguments!=null && arguments.length>0 ) {
344
          if( arguments.length == 1 ) { 
345
              // Desde jython entra por este metodo en lugar de los especificos
346
              // de DataStoreParameters o DynObject
347
              if( arguments[0] instanceof DataStoreParameters ) {
348
                  return this.createStoreParameters(providerName, (DataStoreParameters)(arguments[0]));
349
              } else if( arguments[0] instanceof DynObject ) {
350
                  return this.createStoreParameters(providerName, (DynObject)(arguments[0]));
351
              }
352
          }
353
          if( (arguments.length % 2)!= 0 ) {
354
              throw new IllegalArgumentException("The number of arguments must be even.");
355
          }
356
        }
357
        if( providerName == null ) {
358
            String msg = "Provider name can't be null.";
359
            LOGGER.warn(msg);
360
            throw new IllegalArgumentException(msg);
361
        }
362
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
363
        if( providerFactory == null ) {
364
            String msg = "Can't locate provider factory for '"+providerName+"'.";
365
            LOGGER.warn(msg);
366
            throw new IllegalArgumentException(msg);
367
        }
368
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
369
        if( arguments!=null && arguments.length>0 ) {
370
          for( int i=0; i<arguments.length; i+=2 ) {
371
              String name = (String) arguments[i];
372
              if( name.endsWith("=") ) {
373
                  name = name.substring(0, name.length()-1);
374
              }
375
              Object value = arguments[i+1];
376
              parameters.setDynValue(name, value);
377
          }
378
        }
379
        return parameters;
380
    }
381

    
382
    @Override
383
    public NewDataStoreParameters createNewStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
384
        String explorerName = this.getServerExplorerFromStore(providerName);
385
        return createNewStoreParameters(explorerName, providerName);
386
    }
387

    
388
    @Override
389
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
390
        try {
391
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
392
            return explorer.getAddParameters(providerName);
393
        } catch (Exception ex) {
394
            throw new InitializeException(ex);
395
        }
396
    }
397

    
398
    @Override
399
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
400
        if( explorerName == null ) {
401
            String msg = "Explorer name can't be null.";
402
            LOGGER.warn(msg);
403
            throw new IllegalArgumentException(msg);
404
        }
405
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
406
        if( explorerFactory == null ) {
407
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
408
            LOGGER.warn(msg);
409
            throw new IllegalArgumentException(msg);
410
        }
411
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
412
        return params;
413
    }
414

    
415
    @Override
416
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
417
        try {
418
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
419
            if (autoOrderAttributeName != null) {
420
                parameters.setDynValue(
421
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
422
                        autoOrderAttributeName);
423
            }
424
            return parameters;
425
        } catch (Exception ex) {
426
            throw new InitializeException(ex);
427
        }
428
    }
429

    
430
    @Override
431
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
432
        if( explorerName == null ) {
433
            String msg = "Explorer name can't be null.";
434
            LOGGER.warn(msg);
435
            throw new IllegalArgumentException(msg);
436
        }
437
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
438
        if( explorerFactory == null ) {
439
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
440
            LOGGER.warn(msg);
441
            throw new IllegalArgumentException(msg);
442
        }
443
        if (parameters == null) {
444
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
445
        }
446
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
447
                parameters,
448
                new DefaultDataServerExplorerProviderServices()
449
        );
450
        return explorer;
451
    }
452

    
453
    @Override
454
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
455
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
456
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorer con solo 
457
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
458
            // llamar al que toca.
459
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
460
        }
461
        if( explorerName == null ) {
462
            String msg = "Explorer name can't be null.";
463
            LOGGER.warn(msg);
464
            throw new IllegalArgumentException(msg);
465
        }
466
        if( (arguments.length % 2)!= 0 ) {
467
            throw new ValidateDataParametersException();
468
        }
469
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
470
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
471
        for( int i=0; i<arguments.length; i+=2 ) {
472
            String name = (String) arguments[i];
473
            if( name.endsWith("=") ) {
474
                name = name.substring(0, name.length()-1);
475
            }
476
            Object value = arguments[i+1];
477
            parameters.setDynValue(name, value);
478
        }
479
        return this.openServerExplorer(explorerName, parameters);
480

    
481
    }
482

    
483
    /**
484
     * @param parameters
485
     * @return
486
     * @throws org.gvsig.fmap.dal.exception.InitializeException
487
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
488
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
489
     * @deprecated see openServerExplorer
490
     */
491
    @Override
492
    public DataServerExplorer createServerExplorer(
493
            DataServerExplorerParameters parameters) throws InitializeException,
494
            ProviderNotRegisteredException, ValidateDataParametersException {
495
        return openServerExplorer(parameters.getExplorerName(), parameters);
496
    }
497

    
498
    /**
499
     * @deprecated use openStore
500
     * @param parameters
501
     * @return
502
     * @throws InitializeException
503
     * @throws ProviderNotRegisteredException
504
     * @throws ValidateDataParametersException
505
     */
506
    @Override
507
    public DataStore createStore(DataStoreParameters parameters)
508
        throws InitializeException, ProviderNotRegisteredException,
509
        ValidateDataParametersException {
510
        return openStore(parameters.getDataStoreName(), parameters);
511
    }
512

    
513
    @Override
514
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
515
        if( providerName == null ) {
516
            String msg = "Provider name can't be null.";
517
            LOGGER.warn(msg);
518
            throw new IllegalArgumentException(msg);
519
        }
520
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
521
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
522
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
523
        }
524

    
525
        parameters.validate();
526

    
527
        String storeName = this.getStoreName(parameters);
528
        if( StringUtils.isEmpty(storeName) ) {
529
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
530
            LOGGER.warn(msg);
531
            throw new IllegalArgumentException(msg);
532
        }
533

    
534
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
535
        if( storeFactory == null ) {
536
            String msg = "Can't locate store factory for '"+storeName+"'.";
537
            LOGGER.warn(msg);
538
            throw new IllegalArgumentException(msg);
539
        }
540
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
541
        if( providerFactory == null ) {
542
            String msg = "Can't locate provider factory for '"+providerName+"'.";
543
            LOGGER.warn(msg);
544
            throw new IllegalArgumentException(msg);
545
        }
546

    
547
        DataStore store = (DataStore) storeFactory.create(parameters, this);
548
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
549

    
550
        storeFactory.setProvider(store, provider);
551
        
552
        for (Observer storeObserver : storeObservers) {
553
          if( storeObserver!=null) {
554
            store.addObserver(storeObserver);
555
          }
556
        }
557
        if( store instanceof FeatureStoreProviderServices ) {
558
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
559
        }
560
        return store;
561
    }
562

    
563
    @Override
564
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
565
        String storeName = this.getStoreName(parameters);
566
        if( StringUtils.isEmpty(storeName) ) {
567
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
568
            LOGGER.warn(msg);
569
            throw new IllegalArgumentException(msg);
570
        }
571

    
572
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
573
        if( storeFactory == null ) {
574
            String msg = "Can't locate store factory for '"+storeName+"'.";
575
            LOGGER.warn(msg);
576
            throw new IllegalArgumentException(msg);
577
        }
578
        DataStore store = (DataStore) storeFactory.create(parameters, this);
579
        storeFactory.setProvider(store, provider);
580
        for (Observer storeObserver : storeObservers) {
581
          if( storeObserver!=null) {
582
            store.addObserver(storeObserver);
583
          }
584
        }
585
        if( store instanceof FeatureStoreProviderServices ) {
586
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
587
        }
588
        return store;
589
    }
590
    
591
    @Override
592
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
593
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
594
        DataStore store = openStore(params.getDataStoreName(), params);
595
        return store;
596
    }
597

    
598
    @Override
599
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
600
        if( arguments.length == 1 ) { 
601
            // Desde jython entra por este metodo en lugar de los especificos
602
            // de DataStoreParameters o DynObject
603
            if( arguments[0] instanceof DataStoreParameters ) {
604
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
605
            } else if( arguments[0] instanceof DynObject ) {
606
                return this.openStore(providerName, (DynObject)(arguments[0]));
607
            }
608
        }
609
        if( (arguments.length % 2)!= 0 ) {
610
            throw new ValidateDataParametersException();
611
        }
612
        if( providerName == null ) {
613
            String msg = "Provider name can't be null.";
614
            LOGGER.warn(msg);
615
            throw new IllegalArgumentException(msg);
616
        }
617
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
618
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
619
        for( int i=0; i<arguments.length; i+=2 ) {
620
            String name = (String) arguments[i];
621
            if( name.endsWith("=") ) {
622
                name = name.substring(0, name.length()-1);
623
            }
624
            Object value = arguments[i+1];
625
            parameters.setDynValue(name, value);
626
        }
627
        return this.openStore(providerName, parameters);
628
    }
629

    
630
    @Override
631
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
632
        try {
633
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
634
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
635
            return (FeatureStore) store;
636
        } catch (Exception ex) {
637
            throw new InitializeException(ex);
638
        }
639
    }
640

    
641
    @Override
642
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
643
        if( providerName == null ) {
644
            String msg = "Provider name can't be null.";
645
            LOGGER.warn(msg);
646
            throw new IllegalArgumentException(msg);
647
        }
648
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
649
        return (DataStoreProviderFactory) providerFactory;
650
    }
651

    
652
    @Override
653
    public List<String> getStoreProviders() {
654
        return this.getStoreProviderRegister().getFactoryNames();
655
    }
656

    
657
    @Override
658
    public List<String> getStoreProviders(String explorerName) {
659
        if( explorerName == null ) {
660
            String msg = "Explorer name can't be null.";
661
            LOGGER.warn(msg);
662
            throw new IllegalArgumentException(msg);
663
        }
664
        try {
665
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
666
            List names = explorer.getDataStoreProviderNames();
667
            return names;
668
        } catch (Exception ex) {
669
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
670
        }
671
    }
672

    
673
    @Override
674
    public List<String> getExplorerProviders() {
675
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
676
        return names;
677
    }
678

    
679
    @Override
680
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
681

    
682
        String providerName = parameters.getDataStoreName();
683
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
684
        if (providerFactory == null) {
685
            throw new ProviderNotRegisteredException(providerName);
686
        }
687
        while (true) {
688
            try {
689
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
690
                        parameters, providerServices
691
                );
692
                return provider;
693
            } catch (Exception e) {
694
                if (openErrorHandler == null) {
695
                    throw new InitializeException(providerName, e);
696
                }
697
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
698
                if (!retry) {
699
                    throw new InitializeException(providerName, e);
700
                }
701
            }
702
        }
703
    }
704

    
705
    @Override
706
    public List<String> getFeatureIndexProviders() {
707
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
708
        return names;
709
    }
710

    
711
    @Override
712
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
713
        this.defaultDataIndexProviders.put(dataType, name);
714
    }
715

    
716
    @Override
717
    public String getDefaultFeatureIndexProviderName(int dataType) {
718
        return this.defaultDataIndexProviders.get(dataType);
719
    }
720

    
721
    @Override
722
    public FeatureIndexProviderServices createFeatureIndexProvider(
723
            String name,
724
            FeatureStore store,
725
            FeatureType type,
726
            String indexName,
727
            FeatureAttributeDescriptor attr
728
    ) throws InitializeException, ProviderNotRegisteredException {
729

    
730
        if (name == null) {
731
            name = getDefaultFeatureIndexProviderName(attr.getType());
732
        }
733

    
734
        if (name == null) {
735
            throw new InitializeException(
736
                    "There not any index provider registered.", null);
737
        }
738
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
739
        if (indexfactory == null) {
740
            throw new InitializeException(
741
                    "There not any index provider registered with name '" + name + "'.", null);
742

    
743
        }
744
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
745

    
746
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
747
                (FeatureStoreProviderServices) store,
748
                type,
749
                provider,
750
                attr.getName(),
751
                indexName
752
        );
753
        services.initialize();
754
        return services;
755

    
756
    }
757

    
758
    @Override
759
    public String getTemporaryDirectory() {
760
        FoldersManager manager = ToolsLocator.getFoldersManager();
761
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
762
        return folder.getAbsolutePath();
763
    }
764

    
765
    @Override
766
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
767
        if (!(struct instanceof DynStruct_v2)) {
768
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
769
        }
770
        Tags tags = ((DynStruct_v2) struct).getTags();
771
        return this.createStoreParameters(tags);
772
    }
773

    
774
    @Override
775
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
776
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
777
        if (providerName == null) {
778
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
779
        }
780
        int prefixlen = TAG_DAL_OPENSTORE.length();
781
        DataStoreParameters parameters = this.createStoreParameters(providerName);
782
        for (String key : tags) {
783
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
784
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
785
            }
786
        }
787
        return parameters;
788
    }
789

    
790
    @Override
791
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
792
        DataStoreParameters paramters = this.createStoreParameters(struct);
793
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
794
        return store;
795
    }
796

    
797
    @Override
798
    public void newStore(String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
799
        String explorerName = this.getServerExplorerFromStore(providerName);
800
        newStore(explorerName, providerName, parameters, overwrite);
801
    }
802
    
803
    @Override
804
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
805
        if( explorerName == null ) {
806
            String msg = "Explorer name can't be null.";
807
            LOGGER.warn(msg);
808
            throw new IllegalArgumentException(msg);
809
        }
810
        if( providerName == null ) {
811
            String msg = "Provider name can't be null.";
812
            LOGGER.warn(msg);
813
            throw new IllegalArgumentException(msg);
814
        }
815

    
816
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
817
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
818
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
819
        }
820
        parameters.validate();
821
        try {
822
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
823
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
824
            server.add(providerName, parameters, overwrite);
825
        } catch (Exception e) {
826
            throw new InitializeException(e);
827
        }
828
    }
829

    
830
    @Override
831
    @Deprecated
832
    public Evaluator createExpresion(String expression) throws InitializeException {
833
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
834
        exp.setPhrase(expression);
835
        return this.createExpresion(exp);
836
    }
837

    
838
    @Override
839
    @Deprecated
840
    public Evaluator createExpresion(Expression expression) throws InitializeException {
841
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
842
        return exp;        
843
    }
844

    
845

    
846
    @Override
847
    public Evaluator createFilter(String expression) throws InitializeException {
848
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
849
        exp.setPhrase(expression);
850
        return this.createFilter(exp);
851
    }
852

    
853
    @Override
854
    public Evaluator createFilter(Expression expression) throws InitializeException {
855
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
856
        return exp;        
857
    }
858

    
859
    @Override
860
    public FeaturePagingHelper createFeaturePagingHelper(
861
            FeatureStore featureStore, int pageSize) throws BaseException {
862
        return new FeaturePagingHelperImpl(featureStore, pageSize);
863
    }
864

    
865
    @Override
866
    public FeaturePagingHelper createFeaturePagingHelper(
867
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
868
            throws BaseException {
869
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
870
    }
871

    
872
    @Override
873
    public void setOpenErrorHandler(OpenErrorHandler handler) {
874
        openErrorHandler = handler;
875
    }
876

    
877
    @Override
878
    public OpenErrorHandler getOpenErrorHandler() {
879
        return this.openErrorHandler;
880
    }
881

    
882
    @Override
883
    public EditableFeatureType createFeatureType() {
884
        return new DefaultEditableFeatureType(null);
885
    }
886

    
887
    @Override
888
    public EditableFeatureType createFeatureType(JsonObject json) {
889
        EditableFeatureType featureType = this.createFeatureType();
890
        featureType.setLabel((String) JsonUtils.getitem(json, "name"));
891
        JsonArray columns = json.getJsonArray("columns");
892
        for (JsonValue item : columns ) {
893
            JsonObject jsonattr = (JsonObject) item;
894
            EditableFeatureAttributeDescriptor attr = featureType.add(
895
                    jsonattr.getString("name"), 
896
                    jsonattr.getString("type")
897
            );
898
            for (String name : jsonattr.keySet()) {
899
                attr.set(name, JsonUtils.getitem(jsonattr, name));
900
            }
901
        }
902
        return featureType;
903
    }
904

    
905
    @Override
906
    public DataServerExplorerPool getDataServerExplorerPool() {
907
        if (this.dataServerExplorerPool == null) {
908
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
909
        }
910
        return this.dataServerExplorerPool;
911
    }
912

    
913
    @Override
914
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
915
        this.dataServerExplorerPool = pool;
916
    }
917

    
918
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
919
        if (params instanceof DataStoreParameters) {
920
            return (DataStoreParameters) params;
921
        }
922
        String providerName;
923
        try {
924
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
925
        } catch (Exception ex) {
926
            providerName = provider;
927
        }
928
        DataStoreParameters parameters = this.createStoreParameters(providerName);
929
        ToolsLocator.getDynObjectManager().copy(params, parameters);
930
        return parameters;
931
    }
932

    
933
    @Override
934
    public List<DataType> getDataTypes() {
935
        if (dataTypes == null) {
936
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
937
            dataTypes = new ArrayList<>();
938
            dataTypes.add(manager.get(DataTypes.STRING));
939
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
940
            dataTypes.add(manager.get(DataTypes.INT));
941
            dataTypes.add(manager.get(DataTypes.DOUBLE));
942
            dataTypes.add(manager.get(DataTypes.DATE));
943
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
944
        }
945
        return dataTypes;
946
    }
947

    
948
    @Override
949
    public void setResourcesLoader(ClassLoader loader) {
950
        this.resourcesLoader = loader;
951
    }
952

    
953
    @Override
954
    public void setResourcesLoader(File folder) {
955
        if (folder == null) {
956
            this.resourcesLoader = null;
957
            return;
958
        }
959
        try {
960
            URL[] urls = new URL[]{folder.toURI().toURL()};
961
            this.resourcesLoader = new URLClassLoader(urls);
962
        } catch (Exception ex) {
963
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
964
        }
965
    }
966

    
967
    @Override
968
    public URL getResource(Object reourceLoader, String name) {
969
        URL x;
970
        if (this.resourcesLoader != null) {
971
            x = this.resourcesLoader.getResource(name);
972
            if (x != null) {
973
                return x;
974
            }
975
        }
976
        x = reourceLoader.getClass().getResource(name);
977
        return x;
978
    }
979

    
980
    @Override
981
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
982
        InputStream x;
983
        if (this.resourcesLoader != null) {
984
            x = this.resourcesLoader.getResourceAsStream(name);
985
            if (x != null) {
986
                return x;
987
            }
988
        }
989
        x = reourceLoader.getClass().getResourceAsStream(name);
990
        return x;
991
    }
992

    
993
    @Override
994
    public ExpressionBuilder createExpressionBuilder() {
995
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
996
    }
997

    
998
    public void registerFeatureCacheProvider(
999
        FeatureCacheProviderFactory providerFactory) {
1000
        ToolsLocator.getExtensionPointManager()
1001
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
1002
            .append(providerFactory.getName(), "", providerFactory);
1003
    }
1004

    
1005
    public FeatureCacheProvider createFeatureCacheProvider(String name,
1006
        DynObject parameters) throws DataException {
1007
        if (name == null) {
1008
            throw new InitializeException(
1009
                "It is necessary to provide a cache name", null);
1010
        }
1011
        if (parameters == null) {
1012
            throw new InitializeException(
1013
                "It is necessary to provide parameters to create the explorer",
1014
                null);
1015
        }
1016
        FeatureCacheProviderFactory featureCacheProviderFactory;
1017
        try {
1018
            featureCacheProviderFactory =
1019
                (FeatureCacheProviderFactory) ToolsLocator
1020
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1021
                    .create(name);
1022
            if (featureCacheProviderFactory == null) {
1023
                throw new ProviderNotRegisteredException(name);
1024
            }
1025
            return featureCacheProviderFactory.createCacheProvider(parameters);
1026
        } catch (Exception e) {
1027
            throw new InitializeException(e);
1028
        }
1029
    }
1030

    
1031
    @Override
1032
    public List getFeatureCacheProviders() {
1033
        ExtensionPoint extensionPoint =
1034
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
1035
        if (extensionPoint != null) {
1036
            return ToolsLocator.getExtensionPointManager()
1037
                .get(DATA_MANAGER_CACHE).getNames();
1038
        } else {
1039
            return new ArrayList();
1040
        }
1041
    }
1042

    
1043
    @Override
1044
    public DynObject createCacheParameters(String name)
1045
        throws InitializeException, ProviderNotRegisteredException {
1046
        if (name == null) {
1047
            throw new InitializeException(
1048
                "It is necessary to provide a cache name", null);
1049
        }
1050
        FeatureCacheProviderFactory featureCacheProviderFactory;
1051
        try {
1052
            featureCacheProviderFactory =
1053
                (FeatureCacheProviderFactory) ToolsLocator
1054
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1055
                    .create(name);
1056
            if (featureCacheProviderFactory == null) {
1057
                throw new ProviderNotRegisteredException(name);
1058
            }
1059
            return featureCacheProviderFactory.createParameters();
1060
        } catch (Exception e) {
1061
            throw new InitializeException(e);
1062
        }
1063
    }
1064

    
1065
    @Override
1066
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
1067
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
1068
        DataServerExplorerParameters eparams = null;
1069
        DataServerExplorer serverExplorer;
1070
        try {
1071
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
1072
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
1073
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
1074
        }
1075

    
1076
        try {
1077
            serverExplorer.add(providerName, params, overwrite);
1078
        } catch (DataException e) {
1079
            throw new CreateFileStoreException(e, providerName);
1080
        }
1081
    }
1082

    
1083
    @Override
1084
    public FeatureSymbolTable createFeatureSymbolTable() {
1085
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl();
1086
        return symbolTable;
1087
    }
1088

    
1089
    @Override
1090
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1091
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1092
        return emulator;
1093
    }
1094

    
1095
    @Override
1096
    public void registerDataProfile(DataProfile profile) {
1097
        if( profile==null ) {
1098
            return;
1099
        }
1100
        if( this.dataProfiles==null ) {
1101
            this.dataProfiles = new ArrayList<>();
1102
            this.dataProfiles.add(profile);
1103
            return;
1104
        }
1105
        for (DataProfile theProfile : this.dataProfiles) {
1106
            if( theProfile.getID().equalsIgnoreCase(profile.getID()) ) {
1107
                return;
1108
            }
1109
        }
1110
        this.dataProfiles.add(profile);
1111
    }
1112

    
1113
    @Override
1114
    public List<DataProfile> getDataProfiles() {
1115
        if( this.dataProfiles==null ) {
1116
            return null;
1117
        }
1118
        return Collections.unmodifiableList(this.dataProfiles);
1119
    }
1120

    
1121
    @Override
1122
    public DataProfile getDataProfile(String name) {
1123
        if( StringUtils.isBlank(name) ) {
1124
            return null;
1125
        }
1126
        for (DataProfile theProfile : this.dataProfiles) {
1127
            if( name.equalsIgnoreCase(theProfile.getName()) ) {
1128
                return theProfile;
1129
            }
1130
        }
1131
        return null;
1132
    }
1133

    
1134
    private StoresRepository storesRepository;
1135
    
1136
    @Override
1137
    public StoresRepository getStoresRepository() {
1138
        if( this.storesRepository==null ) {
1139
            this.storesRepository = new BaseStoresRepository("DAL");
1140
        }
1141
        return this.storesRepository;
1142
    }
1143
    
1144
    @Override
1145
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1146
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1147
        return workspace;
1148
    }
1149

    
1150
    @Override
1151
    public void removeDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1152
        this.databaseWorkspaces.remove(databaseWorkspace.getId(),databaseWorkspace);
1153
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1154
        this.getStoresRepository().removeRepository(repo.getID());
1155
        for (DatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1156
            if( listener!=null ) {
1157
                try {
1158
                    listener.onRemoveDatabaseWorkspace(databaseWorkspace);
1159
                } catch(Throwable th) {
1160
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1161
                }
1162
            }
1163
        }
1164
        try {
1165
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1166
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1167
            Script script = scriptManager.loadScript(resources, "OnDisconnectToWorkspace.script");
1168
            if( script != null ) {
1169
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1170
            }
1171
        } catch(Throwable th) {
1172
            LOGGER.warn("Problems executing 'OnDisconnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1173
        }
1174
    }
1175
    
1176
    @Override
1177
    public void addDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1178
        this.databaseWorkspaces.put(databaseWorkspace.getId(),databaseWorkspace);
1179
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1180
        this.getStoresRepository().addRepository(repo);
1181

    
1182
        for (DatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1183
            if( listener!=null ) {
1184
                try {
1185
                    listener.onAddDatabaseWorkspace(databaseWorkspace);
1186
                } catch(Throwable th) {
1187
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1188
                }
1189
            }
1190
        }
1191
        try {
1192
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1193
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1194
            Script script = scriptManager.loadScript(resources, "OnConnectToWorkspace.script");
1195
            if( script != null ) {
1196
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1197
            }
1198
        } catch(Throwable th) {
1199
            LOGGER.warn("Problems executing 'OnConnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1200
        }
1201
    }
1202
    
1203
    @Override
1204
    public void addDatabaseWorkspaceListener(DatabaseWorkspaceListener listener) {
1205
        this.addDatabaseWorkspaceListeners.put(listener.getName(), listener);
1206
    }
1207

    
1208
    @Override
1209
    public DatabaseWorkspaceManager getDatabaseWorkspace(String name) {
1210
        if( StringUtils.isBlank(name) ) {
1211
          return null;
1212
        }
1213
        return this.databaseWorkspaces.get(name);
1214
    }
1215
    
1216
    @Override
1217
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataStoreParameters params) {
1218
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1219
            if( databaseWorkspace.getStoresRepository().contains(params) ) {
1220
                return databaseWorkspace;
1221
            }
1222
        }
1223
        return null;
1224
    }
1225
    
1226
    @Override
1227
    public void writeDALResource(ResourcesStorage resources, DataStore store) {
1228
        ResourcesStorage.Resource resource = null;
1229
        try {
1230
            if( resources == null || resources.isReadOnly() ) {
1231
                return;
1232
            }
1233
            resource = resources.getResource("dal");
1234
            if( resource == null || resource.isReadOnly() ) {
1235
                return;
1236
            }
1237
            DALFile dalFile = DALFile.getDALFile();
1238
            dalFile.setStore((DefaultFeatureStore) store);
1239
            if( !dalFile.isEmpty() ) {
1240
                dalFile.write(resource);
1241
            }
1242
        } catch (Throwable ex) {
1243
            LOGGER.warn("Can't save DAL resource", ex);
1244
        } finally {
1245
            IOUtils.closeQuietly(resource);
1246
        }
1247
    
1248
        
1249
    }
1250

    
1251
    @Override
1252
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
1253
        ResourcesStorage.Resource resource = null;
1254
        try {
1255
            if( resources == null || resources.isReadOnly() ) {
1256
                return;
1257
            }
1258
            resource = resources.getResource("dal");
1259
            if( resource == null || resource.isReadOnly() ) {
1260
                return;
1261
            }
1262
            DALFile dalFile = DALFile.getDALFile();
1263
            dalFile.setFeatureType(featureType);
1264
            if( !dalFile.isEmpty() ) {
1265
                dalFile.write(resource);
1266
            }
1267
        } catch (Throwable ex) {
1268
            LOGGER.warn("Can't save DAL resource", ex);
1269
        } finally {
1270
            IOUtils.closeQuietly(resource);
1271
        }
1272
    }
1273

    
1274
    private Map<String,DynObjectValueItem[]> availableValues = null;
1275
    
1276
    @Override
1277
    public void clearAvailableValuesCache() {
1278
      this.availableValues = null;
1279
    }
1280
    
1281
    @Override
1282
    public DynObjectValueItem[] getAvailableValues(FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1283
        String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName();
1284
        if( this.availableValues==null ) {
1285
            this.availableValues = new HashMap<>();
1286
        }
1287
        DynObjectValueItem[] values = this.availableValues.get(keyName);
1288
        if( values != null ) {
1289
            return values;
1290
        }
1291
        if( !descriptor.isForeingKey() ) {
1292
            return null;
1293
        }
1294
        ForeingKey foreingKey = descriptor.getForeingKey();
1295
        try {
1296
            StoresRepository theStoresRepository;
1297
            FeatureStore store = descriptor.getStore();
1298
            if (store == null) {
1299
                theStoresRepository = DALLocator.getDataManager().getStoresRepository();
1300

    
1301
            } else {
1302
                theStoresRepository = store.getStoresRepository();
1303
            }
1304
            FeatureStore foreingStore = (FeatureStore) theStoresRepository.getStore(
1305
                foreingKey.getTableName()
1306
            );
1307
            Expression labelExpression = foreingKey.getLabelExpression(null);
1308
            String codeName = foreingKey.getCodeName();
1309
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable();
1310
            MutableSymbolTable symbolTable = featureSymbolTable.createParent();
1311
        
1312
            int count = (int) foreingStore.getFeatureCount();
1313
            values = new DynObjectValueItem[Math.min(count, MAX_AVAILABLE_VALUES)];
1314
            int n = 0;
1315
            for (Feature feature : foreingStore.getFeatureSet()) {
1316
                Object code = feature.get(codeName);
1317
                Object value;
1318
                if (labelExpression == null) {
1319
                    value = code;
1320
                } else {
1321
                    featureSymbolTable.setFeature(feature);
1322
                    value = labelExpression.execute(symbolTable);
1323
                }
1324
                values[n++] = new DynObjectValueItem(code, Objects.toString(value, Objects.toString(code, "##ERROR##")));
1325
                if( n>=MAX_AVAILABLE_VALUES ) {
1326
                    break;
1327
                }
1328
            }
1329
            this.availableValues.put(keyName, values);
1330
            return values;
1331
        } catch (Exception ex) {
1332
            LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex);
1333
        }
1334
        return null;
1335
    }
1336

    
1337
    @Override
1338
    public String createUniqueID() {
1339
        UUID x = UUID.randomUUID();
1340
        String s = x.toString();
1341
        return s;
1342
    }
1343

    
1344
    @Override
1345
    public EditableFeatureAttributeDescriptor createFeatureAttributeDescriptor() {
1346
        DefaultEditableFeatureAttributeDescriptor edi = new DefaultEditableFeatureAttributeDescriptor(null, false);
1347
        return edi;
1348
    }
1349

    
1350
  @Override
1351
  public DALExpressionBuilder createDALExpressionBuilder() {
1352
    return new DefaultDALExpressionBuilder();
1353
  }
1354

    
1355
  @Override
1356
  public void addStoreObserver(Observer observer) {
1357
    this.storeObservers.add(observer);
1358
  }
1359

    
1360
  @Override
1361
  public void removeStoreObserver(Observer observer) {
1362
    this.storeObservers.remove(observer);
1363
  }
1364

    
1365
    @Override
1366
    public String getServerExplorerFromStore(String name) {
1367
        Register r = this.getServerExplorerRegister();
1368
        for (DataFactory factory0 : r) {
1369
            DataServerExplorerFactory factory = (DataServerExplorerFactory) factory0;
1370
            if( factory.isStoreSupported(name) ) {
1371
                return factory.getName();
1372
            }
1373
        }
1374
        return null;
1375
    }
1376

    
1377
  
1378
}