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

History | View | Annotate | Download (62.2 KB)

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

    
3
import java.io.ByteArrayOutputStream;
4
import java.io.File;
5
import java.io.InputStream;
6
import java.net.URL;
7
import java.net.URLClassLoader;
8
import java.util.ArrayList;
9
import java.util.Collections;
10
import java.util.HashMap;
11
import java.util.HashSet;
12
import java.util.List;
13
import java.util.Locale;
14
import java.util.Map;
15
import java.util.Set;
16
import java.util.UUID;
17
import java.util.function.Predicate;
18
import java.util.logging.Level;
19
import javax.json.JsonArray;
20
import javax.json.JsonObject;
21
import javax.json.JsonValue;
22
import org.apache.commons.io.FileUtils;
23
import org.apache.commons.io.IOUtils;
24
import org.apache.commons.lang3.StringUtils;
25
import org.gvsig.expressionevaluator.Expression;
26
import org.gvsig.expressionevaluator.ExpressionBuilder;
27
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
28
import org.gvsig.expressionevaluator.impl.DefaultDALExpressionBuilder;
29
import org.gvsig.expressionevaluator.impl.DefaultFeatureRuleExpression;
30
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
31
import org.gvsig.fmap.dal.BaseStoresRepository;
32
import org.gvsig.fmap.dal.DataFactory;
33
import org.gvsig.fmap.dal.DataManager;
34
import org.gvsig.fmap.dal.DataServerExplorer;
35
import org.gvsig.fmap.dal.DataServerExplorerFactory;
36
import org.gvsig.fmap.dal.DataServerExplorerParameters;
37
import org.gvsig.fmap.dal.DataServerExplorerPool;
38
import org.gvsig.fmap.dal.DataStore;
39
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
40
import org.gvsig.fmap.dal.DataStoreNotification;
41
import org.gvsig.fmap.dal.DataStoreParameters;
42
import org.gvsig.fmap.dal.DataStoreProviderFactory;
43
import org.gvsig.fmap.dal.DataTransaction;
44
import org.gvsig.fmap.dal.DataTypes;
45
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
46
import org.gvsig.fmap.dal.DatabaseWorkspaceManager.DatabaseWorkspaceListener;
47
import org.gvsig.fmap.dal.NewDataStoreParameters;
48
import org.gvsig.fmap.dal.OpenErrorHandler;
49
import org.gvsig.fmap.dal.Register;
50
import org.gvsig.fmap.dal.StoresRepository;
51
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
52
import org.gvsig.fmap.dal.exception.DataException;
53
import org.gvsig.fmap.dal.exception.InitializeException;
54
import org.gvsig.fmap.dal.exception.OpenException;
55
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
56
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
57
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder;
58
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
59
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
60
import org.gvsig.fmap.dal.feature.DataProfile;
61
import org.gvsig.fmap.dal.feature.DataTypeDetector;
62
import org.gvsig.fmap.dal.feature.EditableFeature;
63
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
64
import org.gvsig.fmap.dal.feature.EditableFeatureType;
65
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
66
import org.gvsig.fmap.dal.feature.FeatureQuery;
67
import org.gvsig.fmap.dal.feature.FeatureRuleExpression;
68
import org.gvsig.fmap.dal.feature.FeatureSet;
69
import org.gvsig.fmap.dal.feature.FeatureStore;
70
import org.gvsig.fmap.dal.feature.FeatureType;
71
import org.gvsig.fmap.dal.feature.LabelsCacheForFieldValues;
72
import org.gvsig.fmap.dal.feature.exception.UnsupportedDataTypeException;
73
import org.gvsig.fmap.dal.feature.impl.DALFile;
74
import org.gvsig.fmap.dal.feature.impl.DataTypeDetectorImpl;
75
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureAttributeDescriptor;
76
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
77
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
78
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
79
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
80
import org.gvsig.fmap.dal.feature.impl.LabelsCacheForFieldValuesImpl;
81
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
82
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
83
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
84
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
85
import org.gvsig.fmap.dal.feature.spi.LocalTransaction;
86
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
87
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
88
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
89
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
90
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
91
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
92
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
93
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
94
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
95
import org.gvsig.fmap.dal.spi.AbstractDataParameters;
96
import org.gvsig.fmap.dal.spi.DALSPILocator;
97
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
98
import org.gvsig.fmap.dal.spi.DataServerExplorerPoolImpl;
99
import org.gvsig.fmap.dal.spi.DataStoreProvider;
100
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
101
import static org.gvsig.fmap.dal.spi.DataStoreProviderServices.PROVIDER_PARAMTER_NAME;
102
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
103
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
104
import org.gvsig.json.Json;
105
import org.gvsig.tools.ToolsLocator;
106
import org.gvsig.tools.dataTypes.DataType;
107
import org.gvsig.tools.dataTypes.DataTypesManager;
108
import org.gvsig.tools.dynobject.DynObject;
109
import org.gvsig.tools.dynobject.DynStruct;
110
import org.gvsig.tools.dynobject.DynStruct_v2;
111
import org.gvsig.tools.dynobject.Tags;
112
import org.gvsig.tools.evaluator.Evaluator;
113
import org.gvsig.tools.exception.BaseException;
114
import org.gvsig.tools.extensionpoint.ExtensionPoint;
115
import org.gvsig.tools.folders.FoldersManager;
116
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
117
import org.gvsig.tools.identitymanagement.UnauthorizedException;
118
import org.gvsig.tools.observer.Observer;
119
import org.gvsig.tools.resourcesstorage.BytesResource;
120
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
121
import org.gvsig.tools.script.Script;
122
import org.gvsig.tools.script.ScriptManager;
123
import org.gvsig.tools.service.spi.Services;
124
import org.gvsig.tools.swing.api.ToolsSwingLocator;
125
import org.gvsig.tools.task.SimpleTaskStatus;
126
import org.gvsig.tools.util.Factory;
127
import org.gvsig.tools.util.Invocable;
128
import org.gvsig.tools.util.PropertiesSupportHelper;
129
import org.slf4j.Logger;
130
import org.slf4j.LoggerFactory;
131

    
132
@SuppressWarnings("UseSpecificCatch")
133
public class DefaultDataManager
134
        implements DataManager, DataManagerProviderServices, Services {
135

    
136
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataManager.class);
137
    
138
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
139
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
140
        "DAL cache providers";
141

    
142
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
143
    
144
    public static final long DEFAULT_MAX_SIZE_FOR_SMALL_FEATURE_SELECTION = 2000000000;
145

    
146
    private class Registers {
147

    
148
        private final Register store;
149
        private final Register storeProvider;
150
        private final Register serverExplorer;
151
        private final Register featureIndexProvider;
152

    
153
        public Registers() {
154
            this.store = new RegisterImpl(
155
                    "Data.manager.stores.factory",
156
                    "DAL store factories"
157
            );
158
            this.storeProvider = new RegisterImpl(
159
                    "Data.manager.providers.factory",
160
                    "DAL store provider factories"
161
            );
162
            this.serverExplorer = new RegisterImpl(
163
                    "Data.manager.servereexplorer.factory",
164
                    "DAL server explorer factories"
165
            );
166
            this.featureIndexProvider = new RegisterImpl(
167
                    "Data.manager.feature.index.factory",
168
                    "DAL feature index factories"
169
            );
170

    
171
            this.store.register(new FeatureStoreFactory());
172
        }
173
    }
174
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
175

    
176
    private final Registers registers;
177

    
178
    private final Map<Integer, String> defaultDataIndexProviders;
179

    
180
    private OpenErrorHandler openErrorHandler = null;
181

    
182
    private DataServerExplorerPool dataServerExplorerPool = null;
183

    
184
    private List<DataType> dataTypes = null;
185

    
186
    private ClassLoader resourcesLoader = null;
187

    
188
    private Map<String,DataProfile> dataProfiles;
189
    
190
    private final Map<String, DatabaseWorkspaceManager> databaseWorkspaces = new HashMap<>();
191
 
192
    private final Map<String,DatabaseWorkspaceListener> addDatabaseWorkspaceListeners = new HashMap<>();
193

    
194
    private final Set<Observer>storeObservers = new HashSet<>();
195
    
196
    private long maxSizeForSmallFeatureSelection;
197

    
198
    private Factory largeMapFactory;
199
    private Factory largeSetFactory;
200
    
201
    public DefaultDataManager() {
202
        this.registers = new Registers();
203
        this.defaultDataIndexProviders = new HashMap<>();
204
        this.maxSizeForSmallFeatureSelection = DEFAULT_MAX_SIZE_FOR_SMALL_FEATURE_SELECTION;
205
        this.largeMapFactory = new Factory() {
206
            @Override
207
            public String getName() {
208
                return "HashMapFactory";
209
            }
210

    
211
            @Override
212
            public Object create(Object... parameters) {
213
                return new HashMap();
214
            }
215
        };
216
        this.largeSetFactory = new Factory() {
217
            @Override
218
            public String getName() {
219
                return "HashSetFactory";
220
            }
221

    
222
            @Override
223
            public Object create(Object... parameters) {
224
                return new HashSet();
225
            }
226
        };
227
    }
228

    
229
    @Override
230
    public Register getStoreRegister() {
231
        return this.registers.store;
232
    }
233

    
234
    @Override
235
    public Register getStoreProviderRegister() {
236
        return this.registers.storeProvider;
237
    }
238

    
239
    @Override
240
    public Register getServerExplorerRegister() {
241
        return this.registers.serverExplorer;
242
    }
243

    
244
    @Override
245
    public Register getFeatureIndexRegister() {
246
        return this.registers.featureIndexProvider;
247
    }
248

    
249
    private String getStoreName(DataStoreParameters parameters) {
250
        for (DataFactory factory : this.getStoreRegister()) {
251
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
252
            if (storeFactory.canUse(parameters)) {
253
                return storeFactory.getName();
254
            }
255
        }
256
        return null;
257
    }
258

    
259
    /**
260
     * @deprecated
261
     */
262
    @Override
263
    public void registerDefaultRasterStore(Class rasterStoreClass) {
264
        // Metodo usado por el raster nuevo para regstrar su factoria de store
265
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
266
    }
267

    
268
    
269
    private boolean oldRasterRegistered = false;
270
    /**
271
     * @deprecated
272
     */
273
    @Override
274
    public void registerStoreFactory(String name, Class storeFactoryClass) {
275
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
276
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
277
        this.oldRasterRegistered = true;
278
    }
279

    
280
    @Override
281
    public boolean isTheOldRasterRegistered() {
282
      return this.oldRasterRegistered;
283
    }
284
    
285
    /**
286
     * @param name
287
     * @param storeProviderClass
288
     * @param parametersClass
289
     * @deprecated use registerStoreProviderFactory
290
     */
291
    @Override
292
    public void registerStoreProvider(String name, Class storeProviderClass,
293
            Class parametersClass) {
294
        if (name == null || storeProviderClass == null || parametersClass == null) {
295
            throw new IllegalArgumentException("Any parameters can be null");
296
        }
297

    
298
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
299
            throw new IllegalArgumentException(parametersClass.getName()
300
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
301
        }
302

    
303
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
304
            // Envuelve al proveedor en una factoria por defecto.
305
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
306
                    name, "", storeProviderClass, parametersClass));
307
            return;
308
        }
309

    
310
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
311
            // Envuelve al proveedor en una factoria por defecto.
312
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
313
                    name, "", storeProviderClass, parametersClass));
314
            return;
315
        }
316

    
317
        throw new IllegalArgumentException("Not supported implemtation: name="
318
                + name + " provider class=" + storeProviderClass.getName());
319

    
320
    }
321

    
322
    @Override
323
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
324
        if (name == null || explorerClass == null || parametersClass == null) {
325
            // FIXME Exception
326
            throw new IllegalArgumentException("Any parameters can be null");
327
        }
328

    
329
        if (!DataServerExplorerParameters.class
330
                .isAssignableFrom(parametersClass)) {
331
            // FIXME Exception
332
            throw new IllegalArgumentException(
333
                    parametersClass.getName()
334
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
335
        }
336

    
337
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
338
            // FIXME Exception
339
            throw new IllegalArgumentException(explorerClass.getName()
340
                    + " must implement org.gvsig.fmap.dal.DataServerExplorer");
341
        }
342

    
343
        // Envuelve al proveedor en una factoria por defecto.
344
        this.registerServerExplorerFactory(
345
                new DataServerExplorerToDataExplorerFactoryWrapper(
346
                        name, "", explorerClass, parametersClass
347
                )
348
        );
349

    
350
    }
351

    
352
    @Override
353
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
354
        this.getStoreRegister().register(factory);
355
    }
356

    
357
    @Override
358
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
359
        this.getStoreProviderRegister().register(factory);
360
    }
361

    
362
    @Override
363
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
364
        this.getServerExplorerRegister().register(factory);
365
    }
366

    
367
    @Override
368
    public DataStoreParameters createStoreParameters(byte[] data) {
369
        DataStoreParameters parameters = (DataStoreParameters) AbstractDataParameters.fromByteArray(data);
370
        return parameters;
371
    }
372

    
373
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
374
      // Cuando desde python se llama a createStoreParameters con solo un argumento 
375
      // acaba entrando por aqui en lugar de por
376
      //   createStoreParameters(String providerName, Object... arguments)
377
      return this.createStoreParameters(providerName, (Object[]) null);
378
    }
379

    
380
    @Override
381
    public DataStoreParameters createStoreParameters(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException {
382
        if( providerName == null ) {
383
            String msg = "Provider name can't be null.";
384
            LOGGER.warn(msg);
385
            throw new IllegalArgumentException(msg);
386
        }
387
        if( arguments!=null && arguments.length>0 ) {
388
          if( arguments.length == 1 ) { 
389
              // Desde jython entra por este metodo en lugar de los especificos
390
              // de DataStoreParameters o DynObject
391
              if( arguments[0] instanceof DataStoreParameters ) {
392
                  return this.createStoreParameters(providerName, (DataStoreParameters)(arguments[0]));
393
              } else if( arguments[0] instanceof DynObject ) {
394
                  return this.createStoreParameters(providerName, (DynObject)(arguments[0]));
395
              }
396
          }
397
          if( (arguments.length % 2)!= 0 ) {
398
              throw new IllegalArgumentException("The number of arguments must be even.");
399
          }
400
        }
401
        if( providerName == null ) {
402
            String msg = "Provider name can't be null.";
403
            LOGGER.warn(msg);
404
            throw new IllegalArgumentException(msg);
405
        }
406
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
407
        if( providerFactory == null ) {
408
            String msg = "Can't locate provider factory for '"+providerName+"'.";
409
            LOGGER.warn(msg);
410
            throw new IllegalArgumentException(msg);
411
        }
412
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
413
        if( arguments!=null && arguments.length>0 ) {
414
          for( int i=0; i<arguments.length; i+=2 ) {
415
              String name = (String) arguments[i];
416
              if( name.endsWith("=") ) {
417
                  name = name.substring(0, name.length()-1);
418
              }
419
              Object value = arguments[i+1];
420
              parameters.setDynValue(name, value);
421
          }
422
        }
423
        return parameters;
424
    }
425

    
426
    @Override
427
    public NewDataStoreParameters createNewStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
428
        String explorerName = this.getServerExplorerFromStore(providerName);
429
        return createNewStoreParameters(explorerName, providerName);
430
    }
431

    
432
    @Override
433
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
434
        try {
435
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
436
            return explorer.getAddParameters(providerName);
437
        } catch (Exception ex) {
438
            throw new InitializeException(ex);
439
        }
440
    }
441

    
442
    @Override
443
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
444
        if( explorerName == null ) {
445
            String msg = "Explorer name can't be null.";
446
            LOGGER.warn(msg);
447
            throw new IllegalArgumentException(msg);
448
        }
449
        JsonObject parameters_json = null;
450
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
451
        if( explorerFactory == null ) {           
452
            parameters_json = Json.createObject(explorerName);
453
            if( parameters_json==null || 
454
                    !parameters_json.containsKey(PROVIDER_PARAMTER_NAME) ) {
455
                String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
456
                LOGGER.warn(msg);
457
                throw new IllegalArgumentException(msg);
458
            }
459
            explorerName = parameters_json.getString(PROVIDER_PARAMTER_NAME);
460
            explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
461
            if( explorerFactory == null ) {           
462
                String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
463
                LOGGER.warn(msg);
464
                throw new IllegalArgumentException(msg);
465
            }
466
        }
467
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
468
        if( parameters_json!=null ) {
469
            Json.addAll(params, parameters_json);
470
        }
471
        return params;
472
    }
473

    
474
    @Override
475
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
476
        try {
477
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
478
            if (autoOrderAttributeName != null) {
479
                parameters.setDynValue(
480
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
481
                        autoOrderAttributeName);
482
            }
483
            return parameters;
484
        } catch (Exception ex) {
485
            throw new InitializeException(ex);
486
        }
487
    }
488

    
489
    @Override
490
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
491
        if( explorerName == null ) {
492
            String msg = "Explorer name can't be null.";
493
            LOGGER.warn(msg);
494
            throw new IllegalArgumentException(msg);
495
        }
496
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
497
        if( explorerFactory == null ) {
498
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
499
            LOGGER.warn(msg);
500
            throw new IllegalArgumentException(msg);
501
        }
502
        if (parameters == null) {
503
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
504
        }
505
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
506
                parameters,
507
                new DefaultDataServerExplorerProviderServices()
508
        );
509
        return explorer;
510
    }
511

    
512
    @Override
513
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
514
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
515
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorer con solo 
516
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
517
            // llamar al que toca.
518
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
519
        }
520
        if( explorerName == null ) {
521
            String msg = "Explorer name can't be null.";
522
            LOGGER.warn(msg);
523
            throw new IllegalArgumentException(msg);
524
        }
525
        if( (arguments.length % 2)!= 0 ) {
526
            throw new ValidateDataParametersException();
527
        }
528
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
529
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
530
        for( int i=0; i<arguments.length; i+=2 ) {
531
            String name = (String) arguments[i];
532
            if( name.endsWith("=") ) {
533
                name = name.substring(0, name.length()-1);
534
            }
535
            Object value = arguments[i+1];
536
            parameters.setDynValue(name, value);
537
        }
538
        return this.openServerExplorer(explorerName, parameters);
539

    
540
    }
541

    
542
    /**
543
     * @param parameters
544
     * @return
545
     * @throws org.gvsig.fmap.dal.exception.InitializeException
546
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
547
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
548
     * @deprecated see openServerExplorer
549
     */
550
    @Override
551
    public DataServerExplorer createServerExplorer(
552
            DataServerExplorerParameters parameters) throws InitializeException,
553
            ProviderNotRegisteredException, ValidateDataParametersException {
554
        return openServerExplorer(parameters.getExplorerName(), parameters);
555
    }
556

    
557
    /**
558
     * @deprecated use openStore
559
     * @param parameters
560
     * @return
561
     * @throws InitializeException
562
     * @throws ProviderNotRegisteredException
563
     * @throws ValidateDataParametersException
564
     */
565
    @Override
566
    public DataStore createStore(DataStoreParameters parameters)
567
        throws InitializeException, ProviderNotRegisteredException,
568
        ValidateDataParametersException {
569
        return openStore(parameters.getDataStoreName(), parameters);
570
    }
571

    
572
    @Override
573
    public DataStore openStore(DataTransaction transaction, String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
574
        return this.openStore(transaction, providerName, parameters, false);
575
    }
576

    
577
    @Override
578
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
579
        return this.openStore((DataTransaction)null, providerName, parameters, false);
580
    }
581

    
582
    @Override
583
    public DataStore openStore(String providerName, DataStoreParameters parameters, boolean ignoreDALResource) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
584
        return this.openStore((DataTransaction)null, providerName, parameters, ignoreDALResource);
585
    }
586
    
587
    @Override
588
    public DataStore openStore(DataTransaction transaction, String providerName, DataStoreParameters parameters, boolean ignoreDALResource) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
589
        if (providerName == null) {
590
            String msg = "Provider name can't be null.";
591
            LOGGER.warn(msg);
592
            throw new IllegalArgumentException(msg);
593
        }
594
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
595
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
596
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
597
        }
598

    
599
        parameters.validate();
600

    
601
        String storeName = this.getStoreName(parameters);
602
        if( StringUtils.isEmpty(storeName) ) {
603
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
604
            LOGGER.warn(msg);
605
            throw new IllegalArgumentException(msg);
606
        }
607

    
608
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
609
        if( storeFactory == null ) {
610
            String msg = "Can't locate store factory for '"+storeName+"'.";
611
            LOGGER.warn(msg);
612
            throw new IllegalArgumentException(msg);
613
        }
614
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
615
        if( providerFactory == null ) {
616
            String msg = "Can't locate provider factory for '"+providerName+"'.";
617
            LOGGER.warn(msg);
618
            throw new IllegalArgumentException(msg);
619
        }
620

    
621
        DataStore store = (DataStore) storeFactory.create(parameters, this);
622
        if( store instanceof DefaultFeatureStore ) {
623
            ((DefaultFeatureStore)store).setIgnoreDALResource(ignoreDALResource);
624
            try {
625
                DataTransaction.add(transaction, (FeatureStore) store, false);
626
            } catch (Exception ex) {
627
                throw new InitializeException(store.getFullName(), ex);
628
            }
629

    
630
        }
631
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
632

    
633
        if( provider == null ) {
634
            String msg = "Can't create provider for '"+providerName+"'.";
635
            LOGGER.trace(msg);
636
            throw new IllegalArgumentException(msg);
637
        }
638

    
639
        storeFactory.setProvider(store, provider);
640
  
641
        addObservers(store);
642
        if( store instanceof FeatureStoreProviderServices ) {
643
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
644
        }
645
        return store;
646
    }
647
    
648
    @Override
649
    public DataFactory getStoreFactory(DataStoreParameters parameters) {
650
        String storeName = this.getStoreName(parameters);
651
        if( StringUtils.isEmpty(storeName) ) {
652
            return null;
653
        }
654

    
655
        DataFactory storeFactory = this.getStoreRegister().getFactory(storeName);
656
        return storeFactory;
657
    }
658
    
659
    public void addObservers(DataStore store){
660
        for (Observer storeObserver : storeObservers) {
661
          if( storeObserver!=null) {
662
            store.addObserver(storeObserver);
663
          }
664
        }
665
    }
666

    
667
    @Override
668
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
669
        String storeName = this.getStoreName(parameters);
670
        if( StringUtils.isEmpty(storeName) ) {
671
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
672
            LOGGER.warn(msg);
673
            throw new IllegalArgumentException(msg);
674
        }
675

    
676
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
677
        if( storeFactory == null ) {
678
            String msg = "Can't locate store factory for '"+storeName+"'.";
679
            LOGGER.warn(msg);
680
            throw new IllegalArgumentException(msg);
681
        }
682
        DataStore store = (DataStore) storeFactory.create(parameters, this);
683
        storeFactory.setProvider(store, provider);
684
        for (Observer storeObserver : storeObservers) {
685
          if( storeObserver!=null) {
686
            store.addObserver(storeObserver);
687
          }
688
        }
689
        if( store instanceof FeatureStoreProviderServices ) {
690
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
691
        }
692
        return store;
693
    }
694
    
695
    @Override
696
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
697
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
698
        DataStore store = openStore(params.getDataStoreName(), params);
699
        return store;
700
    }
701

    
702
    @Override
703
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
704
        if( arguments.length == 1 ) { 
705
            // Desde jython entra por este metodo en lugar de los especificos
706
            // de DataStoreParameters o DynObject
707
            if( arguments[0] instanceof DataStoreParameters ) {
708
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
709
            } else if( arguments[0] instanceof DynObject ) {
710
                return this.openStore(providerName, (DynObject)(arguments[0]));
711
            }
712
        }
713
        if( arguments.length == 2 &&  arguments[0] instanceof DataStoreParameters && arguments[1] instanceof Boolean) { 
714
            return this.openStore(providerName, (DataStoreParameters)(arguments[0]), (boolean)(arguments[1]));
715
        }
716
        if( (arguments.length % 2)!= 0 ) {
717
            throw new ValidateDataParametersException();
718
        }
719
        if( providerName == null ) {
720
            String msg = "Provider name can't be null.";
721
            LOGGER.warn(msg);
722
            throw new IllegalArgumentException(msg);
723
        }
724
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
725
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
726
        for( int i=0; i<arguments.length; i+=2 ) {
727
            String name = (String) arguments[i];
728
            if( name.endsWith("=") ) {
729
                name = name.substring(0, name.length()-1);
730
            }
731
            Object value = arguments[i+1];
732
            parameters.setDynValue(name, value);
733
        }
734
        return this.openStore(providerName, parameters);
735
    }
736

    
737
    @Override
738
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
739
        try {
740
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
741
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
742
            return (FeatureStore) store;
743
        } catch (Exception ex) {
744
            throw new InitializeException(ex);
745
        }
746
    }
747

    
748
    @Override
749
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
750
        if( providerName == null ) {
751
            String msg = "Provider name can't be null.";
752
            LOGGER.warn(msg);
753
            throw new IllegalArgumentException(msg);
754
        }
755
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
756
        return (DataStoreProviderFactory) providerFactory;
757
    }
758

    
759
    @Override
760
    public List<String> getStoreProviders() {
761
        return this.getStoreProviderRegister().getFactoryNames();
762
    }
763

    
764
    @Override
765
    public List<String> getStoreProviders(String explorerName) {
766
        if( explorerName == null ) {
767
            String msg = "Explorer name can't be null.";
768
            LOGGER.warn(msg);
769
            throw new IllegalArgumentException(msg);
770
        }
771
        try {
772
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
773
            List names = explorer.getDataStoreProviderNames();
774
            return names;
775
        } catch (Exception ex) {
776
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
777
        }
778
    }
779

    
780
    @Override
781
    public List<String> getExplorerProviders() {
782
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
783
        return names;
784
    }
785

    
786
    @Override
787
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
788

    
789
        String providerName = parameters.getDataStoreName();
790
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
791
        if (providerFactory == null) {
792
            throw new ProviderNotRegisteredException(providerName);
793
        }
794
        while (true) {
795
            try {
796
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
797
                        parameters, providerServices
798
                );
799
                return provider;
800
            } catch (Exception e) {
801
                if (openErrorHandler == null) {
802
                    throw new InitializeException(providerName, e);
803
                }
804
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
805
                if (!retry) {
806
                    throw new InitializeException(providerName, e);
807
                }
808
            }
809
        }
810
    }
811

    
812
    @Override
813
    public List<String> getFeatureIndexProviders() {
814
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
815
        return names;
816
    }
817

    
818
    @Override
819
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
820
        this.defaultDataIndexProviders.put(dataType, name);
821
    }
822

    
823
    @Override
824
    public String getDefaultFeatureIndexProviderName(int dataType) {
825
        return this.defaultDataIndexProviders.get(dataType);
826
    }
827

    
828
    @Override
829
    public FeatureIndexProviderServices createFeatureIndexProvider(
830
            String name,
831
            FeatureStore store,
832
            FeatureType type,
833
            String indexName,
834
            FeatureAttributeDescriptor attr
835
    ) throws InitializeException, ProviderNotRegisteredException {
836

    
837
        if (name == null) {
838
            name = getDefaultFeatureIndexProviderName(attr.getType());
839
        }
840

    
841
        if (name == null) {
842
            throw new InitializeException(
843
                    "There not any index provider registered.", null);
844
        }
845
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
846
        if (indexfactory == null) {
847
            throw new InitializeException(
848
                    "There not any index provider registered with name '" + name + "'.", null);
849

    
850
        }
851
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
852

    
853
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
854
                (FeatureStoreProviderServices) store,
855
                type,
856
                provider,
857
                attr.getName(),
858
                indexName
859
        );
860
        services.initialize();
861
        return services;
862

    
863
    }
864

    
865
    @Override
866
    public String getTemporaryDirectory() {
867
        FoldersManager manager = ToolsLocator.getFoldersManager();
868
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
869
        return folder.getAbsolutePath();
870
    }
871

    
872
    @Override
873
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
874
        if (!(struct instanceof DynStruct_v2)) {
875
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
876
        }
877
        Tags tags = ((DynStruct_v2) struct).getTags();
878
        return this.createStoreParameters(tags);
879
    }
880

    
881
    @Override
882
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
883
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
884
        if (providerName == null) {
885
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
886
        }
887
        int prefixlen = TAG_DAL_OPENSTORE.length();
888
        DataStoreParameters parameters = this.createStoreParameters(providerName);
889
        for (String key : tags) {
890
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
891
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
892
            }
893
        }
894
        return parameters;
895
    }
896

    
897
    @Override
898
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
899
        DataStoreParameters paramters = this.createStoreParameters(struct);
900
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
901
        return store;
902
    }
903

    
904
    @Override
905
    public void newStore(String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
906
        String explorerName = this.getServerExplorerFromStore(providerName);
907
        newStore(explorerName, providerName, parameters, overwrite);
908
    }
909
    
910
    @Override
911
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
912
        if( explorerName == null ) {
913
            String msg = "Explorer name can't be null.";
914
            LOGGER.warn(msg);
915
            throw new IllegalArgumentException(msg);
916
        }
917
        if( providerName == null ) {
918
            String msg = "Provider name can't be null.";
919
            LOGGER.warn(msg);
920
            throw new IllegalArgumentException(msg);
921
        }
922

    
923
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
924
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
925
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
926
        }
927
        parameters.validate();
928
        try {
929
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
930
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
931
            server.add(providerName, parameters, overwrite);
932
        } catch (Exception e) {
933
            throw new InitializeException(e);
934
        }
935
    }
936

    
937
    @Override
938
    @Deprecated
939
    public Evaluator createExpresion(String expression) throws InitializeException {
940
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
941
        exp.setPhrase(expression);
942
        return this.createExpresion(exp);
943
    }
944

    
945
    @Override
946
    @Deprecated
947
    public Evaluator createExpresion(Expression expression) throws InitializeException {
948
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
949
        return exp;        
950
    }
951

    
952

    
953
    @Override
954
    public Evaluator createFilter(String expression) throws InitializeException {
955
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
956
        exp.setPhrase(expression);
957
        return this.createFilter(exp);
958
    }
959

    
960
    @Override
961
    public Evaluator createFilter(Expression expression) throws InitializeException {
962
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
963
        return exp;        
964
    }
965

    
966
    @Override
967
    public FeaturePagingHelper createFeaturePagingHelper(
968
            FeatureStore featureStore, int pageSize) throws BaseException {
969
        return new FeaturePagingHelperImpl(featureStore, pageSize);
970
    }
971

    
972
    @Override
973
    public FeaturePagingHelper createFeaturePagingHelper(
974
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
975
            throws BaseException {
976
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
977
    }
978

    
979
    @Override
980
    public void setOpenErrorHandler(OpenErrorHandler handler) {
981
        openErrorHandler = handler;
982
    }
983

    
984
    @Override
985
    public OpenErrorHandler getOpenErrorHandler() {
986
        return this.openErrorHandler;
987
    }
988

    
989
    @Override
990
    public EditableFeatureType createFeatureType() {
991
        return new DefaultEditableFeatureType(null);
992
    }
993

    
994
    @Override
995
    public EditableFeatureType createFeatureType(JsonObject json) {
996
        EditableFeatureType featureType = this.createFeatureType();
997
        featureType.fromJson(json);
998
        return featureType;
999
    }
1000

    
1001
    @Override
1002
    public DataServerExplorerPool getDataServerExplorerPool() {
1003
        if (this.dataServerExplorerPool == null) {
1004
            this.dataServerExplorerPool = new DataServerExplorerPoolImpl();
1005
        }
1006
        return this.dataServerExplorerPool;
1007
    }
1008

    
1009
    @Override
1010
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
1011
        this.dataServerExplorerPool = pool;
1012
    }
1013

    
1014
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
1015
        if (params instanceof DataStoreParameters) {
1016
            return (DataStoreParameters) params;
1017
        }
1018
        String providerName;
1019
        try {
1020
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
1021
        } catch (Exception ex) {
1022
            providerName = provider;
1023
        }
1024
        DataStoreParameters parameters = this.createStoreParameters(providerName);
1025
        ToolsLocator.getDynObjectManager().copy(params, parameters);
1026
        return parameters;
1027
    }
1028

    
1029
    @Override
1030
    public List<DataType> getDataTypes() {
1031
        if (dataTypes == null) {
1032
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
1033
            dataTypes = new ArrayList<>();
1034
            dataTypes.add(manager.get(DataTypes.STRING));
1035
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
1036
            dataTypes.add(manager.get(DataTypes.INT));
1037
            dataTypes.add(manager.get(DataTypes.DOUBLE));
1038
            dataTypes.add(manager.get(DataTypes.DATE));
1039
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
1040
        }
1041
        return dataTypes;
1042
    }
1043

    
1044
    @Override
1045
    public void setResourcesLoader(ClassLoader loader) {
1046
        this.resourcesLoader = loader;
1047
    }
1048

    
1049
    @Override
1050
    public void setResourcesLoader(File folder) {
1051
        if (folder == null) {
1052
            this.resourcesLoader = null;
1053
            return;
1054
        }
1055
        try {
1056
            URL[] urls = new URL[]{folder.toURI().toURL()};
1057
            this.resourcesLoader = new URLClassLoader(urls);
1058
        } catch (Exception ex) {
1059
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
1060
        }
1061
    }
1062

    
1063
    @Override
1064
    public URL getResource(Object reourceLoader, String name) {
1065
        URL x;
1066
        if (this.resourcesLoader != null) {
1067
            x = this.resourcesLoader.getResource(name);
1068
            if (x != null) {
1069
                return x;
1070
            }
1071
        }
1072
        x = reourceLoader.getClass().getResource(name);
1073
        return x;
1074
    }
1075

    
1076
    @Override
1077
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
1078
        InputStream x;
1079
        if (this.resourcesLoader != null) {
1080
            x = this.resourcesLoader.getResourceAsStream(name);
1081
            if (x != null) {
1082
                return x;
1083
            }
1084
        }
1085
        x = reourceLoader.getClass().getResourceAsStream(name);
1086
        return x;
1087
    }
1088

    
1089
    @Override
1090
    public ExpressionBuilder createExpressionBuilder() {
1091
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
1092
    }
1093

    
1094
    public void registerFeatureCacheProvider(
1095
        FeatureCacheProviderFactory providerFactory) {
1096
        ToolsLocator.getExtensionPointManager()
1097
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
1098
            .append(providerFactory.getName(), "", providerFactory);
1099
    }
1100

    
1101
    public FeatureCacheProvider createFeatureCacheProvider(String name,
1102
        DynObject parameters) throws DataException {
1103
        if (name == null) {
1104
            throw new InitializeException(
1105
                "It is necessary to provide a cache name", null);
1106
        }
1107
        if (parameters == null) {
1108
            throw new InitializeException(
1109
                "It is necessary to provide parameters to create the explorer",
1110
                null);
1111
        }
1112
        FeatureCacheProviderFactory featureCacheProviderFactory;
1113
        try {
1114
            featureCacheProviderFactory =
1115
                (FeatureCacheProviderFactory) ToolsLocator
1116
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1117
                    .create(name);
1118
            if (featureCacheProviderFactory == null) {
1119
                throw new ProviderNotRegisteredException(name);
1120
            }
1121
            return featureCacheProviderFactory.createCacheProvider(parameters);
1122
        } catch (Exception e) {
1123
            throw new InitializeException(e);
1124
        }
1125
    }
1126

    
1127
    @Override
1128
    public List getFeatureCacheProviders() {
1129
        ExtensionPoint extensionPoint =
1130
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
1131
        if (extensionPoint != null) {
1132
            return ToolsLocator.getExtensionPointManager()
1133
                .get(DATA_MANAGER_CACHE).getNames();
1134
        } else {
1135
            return new ArrayList();
1136
        }
1137
    }
1138

    
1139
    @Override
1140
    public DynObject createCacheParameters(String name)
1141
        throws InitializeException, ProviderNotRegisteredException {
1142
        if (name == null) {
1143
            throw new InitializeException(
1144
                "It is necessary to provide a cache name", null);
1145
        }
1146
        FeatureCacheProviderFactory featureCacheProviderFactory;
1147
        try {
1148
            featureCacheProviderFactory =
1149
                (FeatureCacheProviderFactory) ToolsLocator
1150
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1151
                    .create(name);
1152
            if (featureCacheProviderFactory == null) {
1153
                throw new ProviderNotRegisteredException(name);
1154
            }
1155
            return featureCacheProviderFactory.createParameters();
1156
        } catch (Exception e) {
1157
            throw new InitializeException(e);
1158
        }
1159
    }
1160

    
1161
    @Override
1162
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
1163
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
1164
        DataServerExplorerParameters eparams = null;
1165
        DataServerExplorer serverExplorer;
1166
        try {
1167
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
1168
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
1169
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
1170
        }
1171

    
1172
        try {
1173
            serverExplorer.add(providerName, params, overwrite);
1174
        } catch (DataException e) {
1175
            throw new CreateFileStoreException(e, providerName);
1176
        }
1177
    }
1178

    
1179
    @Override
1180
    public FeatureSymbolTable createFeatureSymbolTable() {
1181
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl();
1182
        return symbolTable;
1183
    }
1184

    
1185
    @Override
1186
    public FeatureSymbolTable createFeatureSymbolTable(String name) {
1187
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl(name);
1188
        return symbolTable;
1189
    }
1190

    
1191
    @Override
1192
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1193
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1194
        return emulator;
1195
    }
1196

    
1197
    @Override
1198
    public void registerDataProfile(DataProfile profile) {
1199
        if( profile==null ) {
1200
            return;
1201
        }
1202
        if( this.dataProfiles==null ) {
1203
            this.dataProfiles = new HashMap<>();
1204
        }
1205
        this.dataProfiles.put(profile.getID().toLowerCase(), profile);
1206
    }
1207

    
1208
    @Override
1209
    public List<DataProfile> getDataProfiles() {
1210
        if( this.dataProfiles==null ) {
1211
            return null;
1212
        }
1213
        return Collections.unmodifiableList(new ArrayList<>(this.dataProfiles.values()));
1214
    }
1215

    
1216
    @Override
1217
    public DataProfile getDataProfile(String name) {
1218
        if( StringUtils.isBlank(name) ) {
1219
            return null;
1220
        }
1221
        if(this.dataProfiles == null){
1222
            return null;
1223
        }
1224
        return this.dataProfiles.get(name.toLowerCase());
1225
    }
1226

    
1227
    private StoresRepository storesRepository;
1228
    
1229
    @Override
1230
    public StoresRepository getStoresRepository() {
1231
        if( this.storesRepository==null ) {
1232
            this.storesRepository = new BaseStoresRepository("DAL");
1233
        }
1234
        return this.storesRepository;
1235
    }
1236
    
1237
    @Override
1238
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1239
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1240
        return workspace;
1241
    }
1242

    
1243
    @Override
1244
    public void removeDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1245
        this.databaseWorkspaces.remove(databaseWorkspace.getId(),databaseWorkspace);
1246
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1247
        this.getStoresRepository().removeRepository(repo.getID());
1248
        for (DatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1249
            if( listener!=null ) {
1250
                try {
1251
                    listener.onRemoveDatabaseWorkspace(databaseWorkspace);
1252
                } catch(Throwable th) {
1253
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1254
                }
1255
            }
1256
        }
1257
        try {
1258
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1259
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1260
            Script script = scriptManager.loadScript(resources, "OnDisconnectToWorkspace.script");
1261
            if( script != null ) {
1262
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1263
            }
1264
        } catch(Throwable th) {
1265
            LOGGER.warn("Problems executing 'OnDisconnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1266
        }
1267
    }
1268
    
1269
    @Override
1270
    public void addDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1271
        this.databaseWorkspaces.put(databaseWorkspace.getId(),databaseWorkspace);
1272
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1273
        this.getStoresRepository().addRepository(repo);
1274

    
1275
        for (DatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1276
            if( listener!=null ) {
1277
                try {
1278
                    listener.onAddDatabaseWorkspace(databaseWorkspace);
1279
                } catch(Throwable th) {
1280
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1281
                }
1282
            }
1283
        }
1284
        LocalTransaction trans = new LocalTransaction(this,null);
1285
        try {
1286
            trans.begin();
1287
            trans.add(databaseWorkspace);
1288
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1289
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1290
            Script script = scriptManager.loadScript(resources, "OnConnectToWorkspace.script");
1291
            if( script != null ) {
1292
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1293
            }
1294
            trans.commit();
1295
        } catch(Throwable th) {
1296
            LOGGER.warn("Problems executing 'OnConnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1297
            trans.abortQuietly();
1298
        } finally {
1299
            trans.closeQuietly();
1300
        }
1301
    }
1302
    
1303
    @Override
1304
    public void addDatabaseWorkspaceListener(DatabaseWorkspaceListener listener) {
1305
        this.addDatabaseWorkspaceListeners.put(listener.getName(), listener);
1306
    }
1307

    
1308
    @Override
1309
    public DatabaseWorkspaceManager getDatabaseWorkspace(String name) {
1310
        if( StringUtils.isBlank(name) ) {
1311
          return null;
1312
        }
1313
        return this.databaseWorkspaces.get(name);
1314
    }
1315
    
1316
    @Override
1317
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataStoreParameters params) {
1318
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1319
            if( databaseWorkspace.getStoresRepository().contains(params) ) {
1320
                return databaseWorkspace;
1321
            }
1322
        }
1323
        return null;
1324
    }
1325
    
1326
    @Override
1327
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataServerExplorerParameters params) {
1328
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1329
            DataServerExplorerParameters p = databaseWorkspace.getServerExplorerParameters();
1330
            if(p.isTheSameServerExplorer(params)){
1331
                return databaseWorkspace;
1332
            }
1333
        }
1334
        return null;
1335
    }
1336
    
1337
    @Override
1338
    public void writeDALResource(ResourcesStorage resources, DataStore store) {
1339
        ResourcesStorage.Resource resource = null;
1340
        try {
1341
            if( resources == null || resources.isReadOnly() ) {
1342
                return;
1343
            }
1344
            resource = resources.getResource("dal");
1345
            if( resource == null || resource.isReadOnly() ) {
1346
                return;
1347
            }
1348
            DALFile dalFile = DALFile.getDALFile();
1349
            dalFile.setStore((DefaultFeatureStore) store);
1350
            if( !dalFile.isEmpty() ) {
1351
                dalFile.write(resource);
1352
            }
1353
        } catch (Throwable ex) {
1354
            LOGGER.warn("Can't save DAL resource", ex);
1355
        } finally {
1356
            IOUtils.closeQuietly(resource);
1357
        }
1358
    
1359
        
1360
    }
1361

    
1362
    @Override
1363
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
1364
        ResourcesStorage.Resource resource = null;
1365
        try {
1366
            if( resources == null || resources.isReadOnly() ) {
1367
                return;
1368
            }
1369
            resource = resources.getResource("dal");
1370
            if( resource == null || resource.isReadOnly() ) {
1371
                return;
1372
            }
1373
            DALFile dalFile = DALFile.getDALFile();
1374
            dalFile.setFeatureType(featureType);
1375
            if( !dalFile.isEmpty() ) {
1376
                dalFile.write(resource);
1377
            }
1378
        } catch (Throwable ex) {
1379
            LOGGER.warn("Can't save DAL resource", ex);
1380
        } finally {
1381
            IOUtils.closeQuietly(resource);
1382
        }
1383
    }
1384

    
1385
    @Override
1386
    public void clearAvailableValuesCache() {
1387
      //TODO
1388
    }
1389
     
1390
    @Override
1391
    public String createUniqueID() {
1392
        UUID x = UUID.randomUUID();
1393
        String s = x.toString();
1394
        return s;
1395
    }
1396

    
1397
    @Override
1398
    public EditableFeatureAttributeDescriptor createFeatureAttributeDescriptor(String name, int type) {
1399
        return createEditableFeatureAttributeDescriptor(null, name,type, false);
1400
    }
1401
    
1402
    public static DefaultEditableFeatureAttributeDescriptor createEditableFeatureAttributeDescriptor(FeatureType ftype, String name, int type) {
1403
        return createEditableFeatureAttributeDescriptor(ftype, name,type, false);
1404
    }
1405
    
1406
    public static DefaultEditableFeatureAttributeDescriptor createEditableFeatureAttributeDescriptor(FeatureType ftype, String name, int type, boolean strongChanges) {
1407
        switch (type) {
1408
            case DataTypes.DOUBLE:
1409
            case DataTypes.FLOAT:
1410
            case DataTypes.DECIMAL:
1411
            case DataTypes.BOOLEAN:
1412
            case DataTypes.BYTE:
1413
            case DataTypes.BYTEARRAY:
1414
            case DataTypes.CHAR:
1415
            case DataTypes.DATE:
1416
            case DataTypes.GEOMETRY:
1417
            case DataTypes.INT:
1418
            case DataTypes.LONG:
1419
            case DataTypes.OBJECT:
1420
            case DataTypes.LIST: // Solo para campos calculados ???
1421
            case DataTypes.STRING:
1422
            case DataTypes.TIME:
1423
            case DataTypes.TIMESTAMP:
1424
            case DataTypes.URI:
1425
            case DataTypes.URL:
1426
            case DataTypes.FILE:
1427
                break;
1428

    
1429
            default:
1430
                throw new UnsupportedDataTypeException(name, type);
1431
        }
1432
        DefaultEditableFeatureAttributeDescriptor edi = new DefaultEditableFeatureAttributeDescriptor(ftype, strongChanges);
1433
        edi.setName(name);
1434
        edi.setDataType(type);
1435
        if (edi.getDataType().supportSize()) {
1436
            edi.setSize(edi.getDataType().getDefaultSize());
1437
        }   
1438
        return edi;
1439
    }
1440

    
1441
  @Override
1442
  public DALExpressionBuilder createDALExpressionBuilder() {
1443
    return new DefaultDALExpressionBuilder();
1444
  }
1445

    
1446
  @Override
1447
  public void addStoreObserver(Observer observer) {
1448
    this.storeObservers.add(observer);
1449
  }
1450

    
1451
  @Override
1452
  public void removeStoreObserver(Observer observer) {
1453
    this.storeObservers.remove(observer);
1454
  }
1455

    
1456
    @Override
1457
    public String getServerExplorerFromStore(String name) {
1458
        Register r = this.getServerExplorerRegister();
1459
        for (DataFactory factory0 : r) {
1460
            DataServerExplorerFactory factory = (DataServerExplorerFactory) factory0;
1461
            if( factory.isStoreSupported(name) ) {
1462
                return factory.getName();
1463
            }
1464
        }
1465
        return null;
1466
    }
1467
    
1468
    @Override
1469
    public void setMaxSizeForSmallFeatureSelection(long size){
1470
        this.maxSizeForSmallFeatureSelection = size;
1471
    }
1472

    
1473
    @Override
1474
    public long getMaxSizeForSmallFeatureSelection() {
1475
        return this.maxSizeForSmallFeatureSelection;
1476
    }
1477

    
1478
    @Override
1479
    public void registerLargeMap(Factory factory) {
1480
        this.largeMapFactory = factory;
1481
    }
1482
    
1483
    @Override
1484
    public void registerLargeSet(Factory factory) {
1485
        this.largeSetFactory = factory;
1486
    }
1487
    
1488
    @Override
1489
    public Map createLargeMap() {
1490
        return (Map) this.largeMapFactory.create();
1491
    }
1492

    
1493
    @Override
1494
    public Set createLargeSet() {
1495
        return (Set) this.largeSetFactory.create();
1496
    }
1497

    
1498
    @Override
1499
    public DataTransaction createTransaction() {
1500
        DefaultTransaction transaction = new DefaultTransaction();
1501
        return transaction;
1502
    }
1503
    
1504
    @Override
1505
    public void putFeaturesInClipboard(FeatureSet set)  {
1506
        if( set==null ) {
1507
            return;
1508
        }
1509
        String s = set.toJson().toString();
1510
        ToolsSwingLocator.getToolsSwingManager().putInClipboard(s);
1511
    }
1512
    
1513
    @Override
1514
    public List<EditableFeature> getFeaturesFromClipboard(FeatureStore store, Predicate<FeatureAttributeDescriptor> attrFilter) throws DataException {
1515
        if( store==null ) {
1516
            return Collections.EMPTY_LIST;
1517
        }
1518
        String clipboard = ToolsSwingLocator.getToolsSwingManager().getFromClipboard();
1519
        if( StringUtils.isBlank(clipboard) ) {
1520
            return Collections.EMPTY_LIST;
1521
        }
1522
        JsonArray array = Json.createArray(clipboard);
1523
        if (array == null) {
1524
            return Collections.EMPTY_LIST;
1525
        }
1526
        List<EditableFeature> features = new ArrayList<>();
1527
        for (JsonValue jsonValue : array) {
1528
            EditableFeature f = store.createNewFeature();
1529
            f.copyFrom((JsonObject) jsonValue, attrFilter);
1530
            features.add(f);
1531
        }
1532
        return features;
1533
    }
1534

    
1535
    @Override
1536
    public FeatureRuleExpression createFeatureRuleExpression() {
1537
        FeatureRuleExpression rule = new DefaultFeatureRuleExpression();
1538
        return rule;
1539
    }
1540

    
1541
    @Override
1542
    public File getCacheResourcesFolder() {
1543
        FoldersManager fm = ToolsLocator.getFoldersManager();
1544
        File f = fm.getTemporaryFile("resources-storage");
1545
        return f;
1546
    }
1547
    
1548
    @Override
1549
    public void clearAllCachedResources() {
1550
        try {
1551
            File f = this.getCacheResourcesFolder();
1552
            FileUtils.deleteDirectory(f);
1553
        } catch (Exception ex) {
1554
            LOGGER.warn("Can't remove local cache for of resources.", ex);
1555
        }
1556
    }
1557
    
1558
    @Override
1559
    public LabelsCacheForFieldValues createLabelsCacheForFieldValues(Invocable labelFormulaProvider, SimpleTaskStatus status) {
1560
        LabelsCacheForFieldValuesImpl x = new LabelsCacheForFieldValuesImpl(labelFormulaProvider, status);
1561
        return x;
1562
    }
1563
    
1564
    public List<FeatureType> getFeatureTypesFromDAL(byte[] daldata) {
1565
        try {
1566
            BytesResource res = ResourcesStorage.createBytesResource(daldata);
1567
            DALFile dalfile = DALFile.getDALFile(res);
1568
            return dalfile.getFeatureTypes();
1569
        } catch (DataException ex) {
1570
            return null;
1571
        }
1572
    }
1573
    
1574
    @Override
1575
    public byte[] getDALBytesFromFeatureType(FeatureType ftype) {
1576
        try {
1577
            DALFile dalfile = DALFile.getDALFile();
1578
            dalfile.setFeatureType(ftype);
1579
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
1580
            dalfile.write(bos);
1581
            IOUtils.closeQuietly(bos);
1582
            return bos.toByteArray();
1583
        } catch (DataException ex) {
1584
            return null;
1585
        }
1586
    }
1587

    
1588
    private PropertiesSupportHelper propertiesSupportHelper;
1589
    
1590
    @Override
1591
    public Object getProperty(String name) {
1592
        if( this.propertiesSupportHelper == null ) {
1593
            return null;
1594
        }
1595
        return this.propertiesSupportHelper.getProperty(name);
1596
    }
1597

    
1598
    @Override
1599
    public void setProperty(String name, Object value) {
1600
        if( this.propertiesSupportHelper == null ) {
1601
            this.propertiesSupportHelper = new PropertiesSupportHelper();
1602
        }
1603
        this.propertiesSupportHelper.setProperty(name,value);
1604
    }
1605

    
1606
    @Override
1607
    public Map<String, Object> getProperties() {
1608
        if( this.propertiesSupportHelper == null ) {
1609
            return Collections.EMPTY_MAP;
1610
        }
1611
        return this.propertiesSupportHelper.getProperties();
1612
    }
1613

    
1614
    public DataTypeDetector createDataTypeDetector(Locale locale) {
1615
        DataTypeDetector x = new DataTypeDetectorImpl(locale);
1616
        return x;
1617
    }
1618
}