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

History | View | Annotate | Download (54.2 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.DefaultFeatureExpressionEvaluator;
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.fmap.dal.feature.FeatureSet;
116
import org.gvsig.tools.dispose.DisposeUtils;
117
import org.gvsig.tools.observer.Observer;
118
import org.gvsig.fmap.dal.feature.FeatureSet.DisposableFeatureSetIterable;
119

    
120
@SuppressWarnings("UseSpecificCatch")
121
public class DefaultDataManager
122
        implements DataManager, DataManagerProviderServices, Services {
123

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

    
130
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
131

    
132

    
133
    private class Registers {
134

    
135
        private final Register store;
136
        private final Register storeProvider;
137
        private final Register serverExplorer;
138
        private final Register featureIndexProvider;
139

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

    
158
            this.store.register(new FeatureStoreFactory());
159
        }
160
    }
161
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
162

    
163
    private final Registers registers;
164

    
165
    private final Map<Integer, String> defaultDataIndexProviders;
166

    
167
    private OpenErrorHandler openErrorHandler = null;
168

    
169
    private DataServerExplorerPool dataServerExplorerPool = null;
170

    
171
    private List<DataType> dataTypes = null;
172

    
173
    private ClassLoader resourcesLoader = null;
174

    
175
    private List<DataProfile> dataProfiles;
176
    
177
    private final Map<String, DatabaseWorkspaceManager> databaseWorkspaces = new HashMap<>();
178
 
179
    private final Map<String,DatabaseWorkspaceListener> addDatabaseWorkspaceListeners = new HashMap<>();
180

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

    
188
    @Override
189
    public Register getStoreRegister() {
190
        return this.registers.store;
191
    }
192

    
193
    @Override
194
    public Register getStoreProviderRegister() {
195
        return this.registers.storeProvider;
196
    }
197

    
198
    @Override
199
    public Register getServerExplorerRegister() {
200
        return this.registers.serverExplorer;
201
    }
202

    
203
    @Override
204
    public Register getFeatureIndexRegister() {
205
        return this.registers.featureIndexProvider;
206
    }
207

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

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

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

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

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

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

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

    
276
        throw new IllegalArgumentException("Not supported implemtation: name="
277
                + name + " provider class=" + storeProviderClass.getName());
278

    
279
    }
280

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

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

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

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

    
309
    }
310

    
311
    @Override
312
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
313
        this.getStoreRegister().register(factory);
314
    }
315

    
316
    @Override
317
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
318
        this.getStoreProviderRegister().register(factory);
319
    }
320

    
321
    @Override
322
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
323
        this.getServerExplorerRegister().register(factory);
324
    }
325

    
326
    @Override
327
    public DataStoreParameters createStoreParameters(byte[] data) {
328
        DataStoreParameters parameters = (DataStoreParameters) AbstractDataParameters.fromByteArray(data);
329
        return parameters;
330
    }
331

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

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

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

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

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

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

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

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

    
484
    }
485

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

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

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

    
528
        parameters.validate();
529

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

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

    
550
        DataStore store = (DataStore) storeFactory.create(parameters, this);
551
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
552

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

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

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

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

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

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

    
655
    @Override
656
    public List<String> getStoreProviders() {
657
        return this.getStoreProviderRegister().getFactoryNames();
658
    }
659

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

    
676
    @Override
677
    public List<String> getExplorerProviders() {
678
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
679
        return names;
680
    }
681

    
682
    @Override
683
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
684

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

    
708
    @Override
709
    public List<String> getFeatureIndexProviders() {
710
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
711
        return names;
712
    }
713

    
714
    @Override
715
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
716
        this.defaultDataIndexProviders.put(dataType, name);
717
    }
718

    
719
    @Override
720
    public String getDefaultFeatureIndexProviderName(int dataType) {
721
        return this.defaultDataIndexProviders.get(dataType);
722
    }
723

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

    
733
        if (name == null) {
734
            name = getDefaultFeatureIndexProviderName(attr.getType());
735
        }
736

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

    
746
        }
747
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
748

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

    
759
    }
760

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

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

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

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

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

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

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

    
841
    @Override
842
    @Deprecated
843
    public Evaluator createExpresion(Expression expression) throws InitializeException {
844
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
845
        return exp;        
846
    }
847

    
848

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

    
856
    @Override
857
    public Evaluator createFilter(Expression expression) throws InitializeException {
858
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
859
        return exp;        
860
    }
861

    
862
    @Override
863
    public FeaturePagingHelper createFeaturePagingHelper(
864
            FeatureStore featureStore, int pageSize) throws BaseException {
865
        return new FeaturePagingHelperImpl(featureStore, pageSize);
866
    }
867

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

    
875
    @Override
876
    public void setOpenErrorHandler(OpenErrorHandler handler) {
877
        openErrorHandler = handler;
878
    }
879

    
880
    @Override
881
    public OpenErrorHandler getOpenErrorHandler() {
882
        return this.openErrorHandler;
883
    }
884

    
885
    @Override
886
    public EditableFeatureType createFeatureType() {
887
        return new DefaultEditableFeatureType(null);
888
    }
889

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

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

    
916
    @Override
917
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
918
        this.dataServerExplorerPool = pool;
919
    }
920

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

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

    
951
    @Override
952
    public void setResourcesLoader(ClassLoader loader) {
953
        this.resourcesLoader = loader;
954
    }
955

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

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

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

    
996
    @Override
997
    public ExpressionBuilder createExpressionBuilder() {
998
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
999
    }
1000

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

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

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

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

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

    
1079
        try {
1080
            serverExplorer.add(providerName, params, overwrite);
1081
        } catch (DataException e) {
1082
            throw new CreateFileStoreException(e, providerName);
1083
        }
1084
    }
1085

    
1086
    @Override
1087
    public FeatureSymbolTable createFeatureSymbolTable() {
1088
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl();
1089
        return symbolTable;
1090
    }
1091

    
1092
    @Override
1093
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1094
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1095
        return emulator;
1096
    }
1097

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

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

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

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

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

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

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

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

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

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

    
1345
    @Override
1346
    public String createUniqueID() {
1347
        UUID x = UUID.randomUUID();
1348
        String s = x.toString();
1349
        return s;
1350
    }
1351

    
1352
    @Override
1353
    public EditableFeatureAttributeDescriptor createFeatureAttributeDescriptor() {
1354
        DefaultEditableFeatureAttributeDescriptor edi = new DefaultEditableFeatureAttributeDescriptor(null, false);
1355
        return edi;
1356
    }
1357

    
1358
  @Override
1359
  public DALExpressionBuilder createDALExpressionBuilder() {
1360
    return new DefaultDALExpressionBuilder();
1361
  }
1362

    
1363
  @Override
1364
  public void addStoreObserver(Observer observer) {
1365
    this.storeObservers.add(observer);
1366
  }
1367

    
1368
  @Override
1369
  public void removeStoreObserver(Observer observer) {
1370
    this.storeObservers.remove(observer);
1371
  }
1372

    
1373
    @Override
1374
    public String getServerExplorerFromStore(String name) {
1375
        Register r = this.getServerExplorerRegister();
1376
        for (DataFactory factory0 : r) {
1377
            DataServerExplorerFactory factory = (DataServerExplorerFactory) factory0;
1378
            if( factory.isStoreSupported(name) ) {
1379
                return factory.getName();
1380
            }
1381
        }
1382
        return null;
1383
    }
1384

    
1385
  
1386
}