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

History | View | Annotate | Download (61 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 javax.json.JsonArray;
19
import javax.json.JsonObject;
20
import javax.json.JsonValue;
21
import org.apache.commons.io.FileUtils;
22
import org.apache.commons.io.IOUtils;
23
import org.apache.commons.lang3.StringUtils;
24
import org.gvsig.expressionevaluator.Expression;
25
import org.gvsig.expressionevaluator.ExpressionBuilder;
26
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
27
import org.gvsig.expressionevaluator.impl.DefaultDALExpressionBuilder;
28
import org.gvsig.expressionevaluator.impl.DefaultFeatureRuleExpression;
29
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
30
import org.gvsig.fmap.dal.BaseStoresRepository;
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.DataTransaction;
43
import org.gvsig.fmap.dal.DataTypes;
44
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
45
import org.gvsig.fmap.dal.DatabaseWorkspaceManager.DatabaseWorkspaceListener;
46
import org.gvsig.fmap.dal.NewDataStoreParameters;
47
import org.gvsig.fmap.dal.OpenErrorHandler;
48
import org.gvsig.fmap.dal.Register;
49
import org.gvsig.fmap.dal.StoresRepository;
50
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
51
import org.gvsig.fmap.dal.exception.DataException;
52
import org.gvsig.fmap.dal.exception.InitializeException;
53
import org.gvsig.fmap.dal.exception.OpenException;
54
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
55
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
56
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder;
57
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
58
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
59
import org.gvsig.fmap.dal.feature.DataProfile;
60
import org.gvsig.fmap.dal.feature.DataTypeDetector;
61
import org.gvsig.fmap.dal.feature.EditableFeature;
62
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
63
import org.gvsig.fmap.dal.feature.EditableFeatureType;
64
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
65
import org.gvsig.fmap.dal.feature.FeatureQuery;
66
import org.gvsig.fmap.dal.feature.FeatureRuleExpression;
67
import org.gvsig.fmap.dal.feature.FeatureSet;
68
import org.gvsig.fmap.dal.feature.FeatureStore;
69
import org.gvsig.fmap.dal.feature.FeatureType;
70
import org.gvsig.fmap.dal.feature.LabelsCacheForFieldValues;
71
import org.gvsig.fmap.dal.feature.exception.UnsupportedDataTypeException;
72
import org.gvsig.fmap.dal.feature.impl.DALFile;
73
import org.gvsig.fmap.dal.feature.impl.DataTypeDetectorImpl;
74
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureAttributeDescriptor;
75
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
76
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
77
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
78
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
79
import org.gvsig.fmap.dal.feature.impl.LabelsCacheForFieldValuesImpl;
80
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
81
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
82
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
83
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
84
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
85
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
86
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
87
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
88
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
89
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
90
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
91
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
92
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
93
import org.gvsig.fmap.dal.spi.AbstractDataParameters;
94
import org.gvsig.fmap.dal.spi.DALSPILocator;
95
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
96
import org.gvsig.fmap.dal.spi.DataServerExplorerPoolImpl;
97
import org.gvsig.fmap.dal.spi.DataStoreProvider;
98
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
99
import static org.gvsig.fmap.dal.spi.DataStoreProviderServices.PROVIDER_PARAMTER_NAME;
100
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
101
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
102
import org.gvsig.json.Json;
103
import org.gvsig.tools.ToolsLocator;
104
import org.gvsig.tools.dataTypes.DataType;
105
import org.gvsig.tools.dataTypes.DataTypesManager;
106
import org.gvsig.tools.dynobject.DynObject;
107
import org.gvsig.tools.dynobject.DynStruct;
108
import org.gvsig.tools.dynobject.DynStruct_v2;
109
import org.gvsig.tools.dynobject.Tags;
110
import org.gvsig.tools.evaluator.Evaluator;
111
import org.gvsig.tools.exception.BaseException;
112
import org.gvsig.tools.extensionpoint.ExtensionPoint;
113
import org.gvsig.tools.folders.FoldersManager;
114
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
115
import org.gvsig.tools.identitymanagement.UnauthorizedException;
116
import org.gvsig.tools.observer.Observer;
117
import org.gvsig.tools.resourcesstorage.BytesResource;
118
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
119
import org.gvsig.tools.script.Script;
120
import org.gvsig.tools.script.ScriptManager;
121
import org.gvsig.tools.service.spi.Services;
122
import org.gvsig.tools.swing.api.ToolsSwingLocator;
123
import org.gvsig.tools.task.SimpleTaskStatus;
124
import org.gvsig.tools.util.Factory;
125
import org.gvsig.tools.util.Invocable;
126
import org.gvsig.tools.util.PropertiesSupportHelper;
127
import org.slf4j.Logger;
128
import org.slf4j.LoggerFactory;
129

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

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

    
140
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
141
    
142
    public static final long DEFAULT_MAX_SIZE_FOR_SMALL_FEATURE_SELECTION = 2000000000;
143

    
144
    private class Registers {
145

    
146
        private final Register store;
147
        private final Register storeProvider;
148
        private final Register serverExplorer;
149
        private final Register featureIndexProvider;
150

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

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

    
174
    private final Registers registers;
175

    
176
    private final Map<Integer, String> defaultDataIndexProviders;
177

    
178
    private OpenErrorHandler openErrorHandler = null;
179

    
180
    private DataServerExplorerPool dataServerExplorerPool = null;
181

    
182
    private List<DataType> dataTypes = null;
183

    
184
    private ClassLoader resourcesLoader = null;
185

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
318
    }
319

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

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

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

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

    
348
    }
349

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

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

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

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

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

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

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

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

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

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

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

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

    
538
    }
539

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

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

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

    
575
    @Override
576
    public DataStore openStore(String providerName, DataStoreParameters parameters, boolean ignoreDALResource) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
577
        if (providerName == null) {
578
            String msg = "Provider name can't be null.";
579
            LOGGER.warn(msg);
580
            throw new IllegalArgumentException(msg);
581
        }
582
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
583
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
584
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
585
        }
586

    
587
        parameters.validate();
588

    
589
        String storeName = this.getStoreName(parameters);
590
        if( StringUtils.isEmpty(storeName) ) {
591
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
592
            LOGGER.warn(msg);
593
            throw new IllegalArgumentException(msg);
594
        }
595

    
596
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
597
        if( storeFactory == null ) {
598
            String msg = "Can't locate store factory for '"+storeName+"'.";
599
            LOGGER.warn(msg);
600
            throw new IllegalArgumentException(msg);
601
        }
602
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
603
        if( providerFactory == null ) {
604
            String msg = "Can't locate provider factory for '"+providerName+"'.";
605
            LOGGER.warn(msg);
606
            throw new IllegalArgumentException(msg);
607
        }
608

    
609
        DataStore store = (DataStore) storeFactory.create(parameters, this);
610
        if( store instanceof DefaultFeatureStore ) {
611
            ((DefaultFeatureStore)store).setIgnoreDALResource(ignoreDALResource);
612
        }
613
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
614

    
615
        if( provider == null ) {
616
            String msg = "Can't create provider for '"+providerName+"'.";
617
            LOGGER.trace(msg);
618
            throw new IllegalArgumentException(msg);
619
        }
620

    
621
        storeFactory.setProvider(store, provider);
622
  
623
        addObservers(store);
624
        if( store instanceof FeatureStoreProviderServices ) {
625
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
626
        }
627
        return store;
628
    }
629
    
630
    @Override
631
    public DataFactory getStoreFactory(DataStoreParameters parameters) {
632
        String storeName = this.getStoreName(parameters);
633
        if( StringUtils.isEmpty(storeName) ) {
634
            return null;
635
        }
636

    
637
        DataFactory storeFactory = this.getStoreRegister().getFactory(storeName);
638
        return storeFactory;
639
    }
640
    
641
    public void addObservers(DataStore store){
642
        for (Observer storeObserver : storeObservers) {
643
          if( storeObserver!=null) {
644
            store.addObserver(storeObserver);
645
          }
646
        }
647
    }
648

    
649
    @Override
650
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
651
        String storeName = this.getStoreName(parameters);
652
        if( StringUtils.isEmpty(storeName) ) {
653
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
654
            LOGGER.warn(msg);
655
            throw new IllegalArgumentException(msg);
656
        }
657

    
658
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
659
        if( storeFactory == null ) {
660
            String msg = "Can't locate store factory for '"+storeName+"'.";
661
            LOGGER.warn(msg);
662
            throw new IllegalArgumentException(msg);
663
        }
664
        DataStore store = (DataStore) storeFactory.create(parameters, this);
665
        storeFactory.setProvider(store, provider);
666
        for (Observer storeObserver : storeObservers) {
667
          if( storeObserver!=null) {
668
            store.addObserver(storeObserver);
669
          }
670
        }
671
        if( store instanceof FeatureStoreProviderServices ) {
672
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
673
        }
674
        return store;
675
    }
676
    
677
    @Override
678
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
679
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
680
        DataStore store = openStore(params.getDataStoreName(), params);
681
        return store;
682
    }
683

    
684
    @Override
685
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
686
        if( arguments.length == 1 ) { 
687
            // Desde jython entra por este metodo en lugar de los especificos
688
            // de DataStoreParameters o DynObject
689
            if( arguments[0] instanceof DataStoreParameters ) {
690
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
691
            } else if( arguments[0] instanceof DynObject ) {
692
                return this.openStore(providerName, (DynObject)(arguments[0]));
693
            }
694
        }
695
        if( arguments.length == 2 &&  arguments[0] instanceof DataStoreParameters && arguments[1] instanceof Boolean) { 
696
            return this.openStore(providerName, (DataStoreParameters)(arguments[0]), (boolean)(arguments[1]));
697
        }
698
        if( (arguments.length % 2)!= 0 ) {
699
            throw new ValidateDataParametersException();
700
        }
701
        if( providerName == null ) {
702
            String msg = "Provider name can't be null.";
703
            LOGGER.warn(msg);
704
            throw new IllegalArgumentException(msg);
705
        }
706
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
707
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
708
        for( int i=0; i<arguments.length; i+=2 ) {
709
            String name = (String) arguments[i];
710
            if( name.endsWith("=") ) {
711
                name = name.substring(0, name.length()-1);
712
            }
713
            Object value = arguments[i+1];
714
            parameters.setDynValue(name, value);
715
        }
716
        return this.openStore(providerName, parameters);
717
    }
718

    
719
    @Override
720
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
721
        try {
722
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
723
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
724
            return (FeatureStore) store;
725
        } catch (Exception ex) {
726
            throw new InitializeException(ex);
727
        }
728
    }
729

    
730
    @Override
731
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
732
        if( providerName == null ) {
733
            String msg = "Provider name can't be null.";
734
            LOGGER.warn(msg);
735
            throw new IllegalArgumentException(msg);
736
        }
737
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
738
        return (DataStoreProviderFactory) providerFactory;
739
    }
740

    
741
    @Override
742
    public List<String> getStoreProviders() {
743
        return this.getStoreProviderRegister().getFactoryNames();
744
    }
745

    
746
    @Override
747
    public List<String> getStoreProviders(String explorerName) {
748
        if( explorerName == null ) {
749
            String msg = "Explorer name can't be null.";
750
            LOGGER.warn(msg);
751
            throw new IllegalArgumentException(msg);
752
        }
753
        try {
754
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
755
            List names = explorer.getDataStoreProviderNames();
756
            return names;
757
        } catch (Exception ex) {
758
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
759
        }
760
    }
761

    
762
    @Override
763
    public List<String> getExplorerProviders() {
764
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
765
        return names;
766
    }
767

    
768
    @Override
769
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
770

    
771
        String providerName = parameters.getDataStoreName();
772
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
773
        if (providerFactory == null) {
774
            throw new ProviderNotRegisteredException(providerName);
775
        }
776
        while (true) {
777
            try {
778
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
779
                        parameters, providerServices
780
                );
781
                return provider;
782
            } catch (Exception e) {
783
                if (openErrorHandler == null) {
784
                    throw new InitializeException(providerName, e);
785
                }
786
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
787
                if (!retry) {
788
                    throw new InitializeException(providerName, e);
789
                }
790
            }
791
        }
792
    }
793

    
794
    @Override
795
    public List<String> getFeatureIndexProviders() {
796
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
797
        return names;
798
    }
799

    
800
    @Override
801
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
802
        this.defaultDataIndexProviders.put(dataType, name);
803
    }
804

    
805
    @Override
806
    public String getDefaultFeatureIndexProviderName(int dataType) {
807
        return this.defaultDataIndexProviders.get(dataType);
808
    }
809

    
810
    @Override
811
    public FeatureIndexProviderServices createFeatureIndexProvider(
812
            String name,
813
            FeatureStore store,
814
            FeatureType type,
815
            String indexName,
816
            FeatureAttributeDescriptor attr
817
    ) throws InitializeException, ProviderNotRegisteredException {
818

    
819
        if (name == null) {
820
            name = getDefaultFeatureIndexProviderName(attr.getType());
821
        }
822

    
823
        if (name == null) {
824
            throw new InitializeException(
825
                    "There not any index provider registered.", null);
826
        }
827
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
828
        if (indexfactory == null) {
829
            throw new InitializeException(
830
                    "There not any index provider registered with name '" + name + "'.", null);
831

    
832
        }
833
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
834

    
835
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
836
                (FeatureStoreProviderServices) store,
837
                type,
838
                provider,
839
                attr.getName(),
840
                indexName
841
        );
842
        services.initialize();
843
        return services;
844

    
845
    }
846

    
847
    @Override
848
    public String getTemporaryDirectory() {
849
        FoldersManager manager = ToolsLocator.getFoldersManager();
850
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
851
        return folder.getAbsolutePath();
852
    }
853

    
854
    @Override
855
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
856
        if (!(struct instanceof DynStruct_v2)) {
857
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
858
        }
859
        Tags tags = ((DynStruct_v2) struct).getTags();
860
        return this.createStoreParameters(tags);
861
    }
862

    
863
    @Override
864
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
865
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
866
        if (providerName == null) {
867
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
868
        }
869
        int prefixlen = TAG_DAL_OPENSTORE.length();
870
        DataStoreParameters parameters = this.createStoreParameters(providerName);
871
        for (String key : tags) {
872
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
873
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
874
            }
875
        }
876
        return parameters;
877
    }
878

    
879
    @Override
880
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
881
        DataStoreParameters paramters = this.createStoreParameters(struct);
882
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
883
        return store;
884
    }
885

    
886
    @Override
887
    public void newStore(String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
888
        String explorerName = this.getServerExplorerFromStore(providerName);
889
        newStore(explorerName, providerName, parameters, overwrite);
890
    }
891
    
892
    @Override
893
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
894
        if( explorerName == null ) {
895
            String msg = "Explorer name can't be null.";
896
            LOGGER.warn(msg);
897
            throw new IllegalArgumentException(msg);
898
        }
899
        if( providerName == null ) {
900
            String msg = "Provider name can't be null.";
901
            LOGGER.warn(msg);
902
            throw new IllegalArgumentException(msg);
903
        }
904

    
905
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
906
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
907
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
908
        }
909
        parameters.validate();
910
        try {
911
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
912
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
913
            server.add(providerName, parameters, overwrite);
914
        } catch (Exception e) {
915
            throw new InitializeException(e);
916
        }
917
    }
918

    
919
    @Override
920
    @Deprecated
921
    public Evaluator createExpresion(String expression) throws InitializeException {
922
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
923
        exp.setPhrase(expression);
924
        return this.createExpresion(exp);
925
    }
926

    
927
    @Override
928
    @Deprecated
929
    public Evaluator createExpresion(Expression expression) throws InitializeException {
930
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
931
        return exp;        
932
    }
933

    
934

    
935
    @Override
936
    public Evaluator createFilter(String expression) throws InitializeException {
937
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
938
        exp.setPhrase(expression);
939
        return this.createFilter(exp);
940
    }
941

    
942
    @Override
943
    public Evaluator createFilter(Expression expression) throws InitializeException {
944
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
945
        return exp;        
946
    }
947

    
948
    @Override
949
    public FeaturePagingHelper createFeaturePagingHelper(
950
            FeatureStore featureStore, int pageSize) throws BaseException {
951
        return new FeaturePagingHelperImpl(featureStore, pageSize);
952
    }
953

    
954
    @Override
955
    public FeaturePagingHelper createFeaturePagingHelper(
956
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
957
            throws BaseException {
958
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
959
    }
960

    
961
    @Override
962
    public void setOpenErrorHandler(OpenErrorHandler handler) {
963
        openErrorHandler = handler;
964
    }
965

    
966
    @Override
967
    public OpenErrorHandler getOpenErrorHandler() {
968
        return this.openErrorHandler;
969
    }
970

    
971
    @Override
972
    public EditableFeatureType createFeatureType() {
973
        return new DefaultEditableFeatureType(null);
974
    }
975

    
976
    @Override
977
    public EditableFeatureType createFeatureType(JsonObject json) {
978
        EditableFeatureType featureType = this.createFeatureType();
979
        featureType.fromJson(json);
980
        return featureType;
981
    }
982

    
983
    @Override
984
    public DataServerExplorerPool getDataServerExplorerPool() {
985
        if (this.dataServerExplorerPool == null) {
986
            this.dataServerExplorerPool = new DataServerExplorerPoolImpl();
987
        }
988
        return this.dataServerExplorerPool;
989
    }
990

    
991
    @Override
992
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
993
        this.dataServerExplorerPool = pool;
994
    }
995

    
996
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
997
        if (params instanceof DataStoreParameters) {
998
            return (DataStoreParameters) params;
999
        }
1000
        String providerName;
1001
        try {
1002
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
1003
        } catch (Exception ex) {
1004
            providerName = provider;
1005
        }
1006
        DataStoreParameters parameters = this.createStoreParameters(providerName);
1007
        ToolsLocator.getDynObjectManager().copy(params, parameters);
1008
        return parameters;
1009
    }
1010

    
1011
    @Override
1012
    public List<DataType> getDataTypes() {
1013
        if (dataTypes == null) {
1014
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
1015
            dataTypes = new ArrayList<>();
1016
            dataTypes.add(manager.get(DataTypes.STRING));
1017
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
1018
            dataTypes.add(manager.get(DataTypes.INT));
1019
            dataTypes.add(manager.get(DataTypes.DOUBLE));
1020
            dataTypes.add(manager.get(DataTypes.DATE));
1021
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
1022
        }
1023
        return dataTypes;
1024
    }
1025

    
1026
    @Override
1027
    public void setResourcesLoader(ClassLoader loader) {
1028
        this.resourcesLoader = loader;
1029
    }
1030

    
1031
    @Override
1032
    public void setResourcesLoader(File folder) {
1033
        if (folder == null) {
1034
            this.resourcesLoader = null;
1035
            return;
1036
        }
1037
        try {
1038
            URL[] urls = new URL[]{folder.toURI().toURL()};
1039
            this.resourcesLoader = new URLClassLoader(urls);
1040
        } catch (Exception ex) {
1041
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
1042
        }
1043
    }
1044

    
1045
    @Override
1046
    public URL getResource(Object reourceLoader, String name) {
1047
        URL x;
1048
        if (this.resourcesLoader != null) {
1049
            x = this.resourcesLoader.getResource(name);
1050
            if (x != null) {
1051
                return x;
1052
            }
1053
        }
1054
        x = reourceLoader.getClass().getResource(name);
1055
        return x;
1056
    }
1057

    
1058
    @Override
1059
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
1060
        InputStream x;
1061
        if (this.resourcesLoader != null) {
1062
            x = this.resourcesLoader.getResourceAsStream(name);
1063
            if (x != null) {
1064
                return x;
1065
            }
1066
        }
1067
        x = reourceLoader.getClass().getResourceAsStream(name);
1068
        return x;
1069
    }
1070

    
1071
    @Override
1072
    public ExpressionBuilder createExpressionBuilder() {
1073
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
1074
    }
1075

    
1076
    public void registerFeatureCacheProvider(
1077
        FeatureCacheProviderFactory providerFactory) {
1078
        ToolsLocator.getExtensionPointManager()
1079
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
1080
            .append(providerFactory.getName(), "", providerFactory);
1081
    }
1082

    
1083
    public FeatureCacheProvider createFeatureCacheProvider(String name,
1084
        DynObject parameters) throws DataException {
1085
        if (name == null) {
1086
            throw new InitializeException(
1087
                "It is necessary to provide a cache name", null);
1088
        }
1089
        if (parameters == null) {
1090
            throw new InitializeException(
1091
                "It is necessary to provide parameters to create the explorer",
1092
                null);
1093
        }
1094
        FeatureCacheProviderFactory featureCacheProviderFactory;
1095
        try {
1096
            featureCacheProviderFactory =
1097
                (FeatureCacheProviderFactory) ToolsLocator
1098
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1099
                    .create(name);
1100
            if (featureCacheProviderFactory == null) {
1101
                throw new ProviderNotRegisteredException(name);
1102
            }
1103
            return featureCacheProviderFactory.createCacheProvider(parameters);
1104
        } catch (Exception e) {
1105
            throw new InitializeException(e);
1106
        }
1107
    }
1108

    
1109
    @Override
1110
    public List getFeatureCacheProviders() {
1111
        ExtensionPoint extensionPoint =
1112
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
1113
        if (extensionPoint != null) {
1114
            return ToolsLocator.getExtensionPointManager()
1115
                .get(DATA_MANAGER_CACHE).getNames();
1116
        } else {
1117
            return new ArrayList();
1118
        }
1119
    }
1120

    
1121
    @Override
1122
    public DynObject createCacheParameters(String name)
1123
        throws InitializeException, ProviderNotRegisteredException {
1124
        if (name == null) {
1125
            throw new InitializeException(
1126
                "It is necessary to provide a cache name", null);
1127
        }
1128
        FeatureCacheProviderFactory featureCacheProviderFactory;
1129
        try {
1130
            featureCacheProviderFactory =
1131
                (FeatureCacheProviderFactory) ToolsLocator
1132
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1133
                    .create(name);
1134
            if (featureCacheProviderFactory == null) {
1135
                throw new ProviderNotRegisteredException(name);
1136
            }
1137
            return featureCacheProviderFactory.createParameters();
1138
        } catch (Exception e) {
1139
            throw new InitializeException(e);
1140
        }
1141
    }
1142

    
1143
    @Override
1144
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
1145
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
1146
        DataServerExplorerParameters eparams = null;
1147
        DataServerExplorer serverExplorer;
1148
        try {
1149
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
1150
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
1151
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
1152
        }
1153

    
1154
        try {
1155
            serverExplorer.add(providerName, params, overwrite);
1156
        } catch (DataException e) {
1157
            throw new CreateFileStoreException(e, providerName);
1158
        }
1159
    }
1160

    
1161
    @Override
1162
    public FeatureSymbolTable createFeatureSymbolTable() {
1163
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl();
1164
        return symbolTable;
1165
    }
1166

    
1167
    @Override
1168
    public FeatureSymbolTable createFeatureSymbolTable(String name) {
1169
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl(name);
1170
        return symbolTable;
1171
    }
1172

    
1173
    @Override
1174
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1175
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1176
        return emulator;
1177
    }
1178

    
1179
    @Override
1180
    public void registerDataProfile(DataProfile profile) {
1181
        if( profile==null ) {
1182
            return;
1183
        }
1184
        if( this.dataProfiles==null ) {
1185
            this.dataProfiles = new HashMap<>();
1186
        }
1187
        this.dataProfiles.put(profile.getID().toLowerCase(), profile);
1188
    }
1189

    
1190
    @Override
1191
    public List<DataProfile> getDataProfiles() {
1192
        if( this.dataProfiles==null ) {
1193
            return null;
1194
        }
1195
        return Collections.unmodifiableList(new ArrayList<>(this.dataProfiles.values()));
1196
    }
1197

    
1198
    @Override
1199
    public DataProfile getDataProfile(String name) {
1200
        if( StringUtils.isBlank(name) ) {
1201
            return null;
1202
        }
1203
        if(this.dataProfiles == null){
1204
            return null;
1205
        }
1206
        return this.dataProfiles.get(name.toLowerCase());
1207
    }
1208

    
1209
    private StoresRepository storesRepository;
1210
    
1211
    @Override
1212
    public StoresRepository getStoresRepository() {
1213
        if( this.storesRepository==null ) {
1214
            this.storesRepository = new BaseStoresRepository("DAL");
1215
        }
1216
        return this.storesRepository;
1217
    }
1218
    
1219
    @Override
1220
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1221
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1222
        return workspace;
1223
    }
1224

    
1225
    @Override
1226
    public void removeDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1227
        this.databaseWorkspaces.remove(databaseWorkspace.getId(),databaseWorkspace);
1228
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1229
        this.getStoresRepository().removeRepository(repo.getID());
1230
        for (DatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1231
            if( listener!=null ) {
1232
                try {
1233
                    listener.onRemoveDatabaseWorkspace(databaseWorkspace);
1234
                } catch(Throwable th) {
1235
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1236
                }
1237
            }
1238
        }
1239
        try {
1240
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1241
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1242
            Script script = scriptManager.loadScript(resources, "OnDisconnectToWorkspace.script");
1243
            if( script != null ) {
1244
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1245
            }
1246
        } catch(Throwable th) {
1247
            LOGGER.warn("Problems executing 'OnDisconnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1248
        }
1249
    }
1250
    
1251
    @Override
1252
    public void addDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1253
        this.databaseWorkspaces.put(databaseWorkspace.getId(),databaseWorkspace);
1254
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1255
        this.getStoresRepository().addRepository(repo);
1256

    
1257
        for (DatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1258
            if( listener!=null ) {
1259
                try {
1260
                    listener.onAddDatabaseWorkspace(databaseWorkspace);
1261
                } catch(Throwable th) {
1262
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1263
                }
1264
            }
1265
        }
1266
        try {
1267
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1268
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1269
            Script script = scriptManager.loadScript(resources, "OnConnectToWorkspace.script");
1270
            if( script != null ) {
1271
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1272
            }
1273
        } catch(Throwable th) {
1274
            LOGGER.warn("Problems executing 'OnConnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1275
        }
1276
    }
1277
    
1278
    @Override
1279
    public void addDatabaseWorkspaceListener(DatabaseWorkspaceListener listener) {
1280
        this.addDatabaseWorkspaceListeners.put(listener.getName(), listener);
1281
    }
1282

    
1283
    @Override
1284
    public DatabaseWorkspaceManager getDatabaseWorkspace(String name) {
1285
        if( StringUtils.isBlank(name) ) {
1286
          return null;
1287
        }
1288
        return this.databaseWorkspaces.get(name);
1289
    }
1290
    
1291
    @Override
1292
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataStoreParameters params) {
1293
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1294
            if( databaseWorkspace.getStoresRepository().contains(params) ) {
1295
                return databaseWorkspace;
1296
            }
1297
        }
1298
        return null;
1299
    }
1300
    
1301
    @Override
1302
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataServerExplorerParameters params) {
1303
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1304
            DataServerExplorerParameters p = databaseWorkspace.getServerExplorerParameters();
1305
            if(p.isTheSameServerExplorer(params)){
1306
                return databaseWorkspace;
1307
            }
1308
        }
1309
        return null;
1310
    }
1311
    
1312
    @Override
1313
    public void writeDALResource(ResourcesStorage resources, DataStore store) {
1314
        ResourcesStorage.Resource resource = null;
1315
        try {
1316
            if( resources == null || resources.isReadOnly() ) {
1317
                return;
1318
            }
1319
            resource = resources.getResource("dal");
1320
            if( resource == null || resource.isReadOnly() ) {
1321
                return;
1322
            }
1323
            DALFile dalFile = DALFile.getDALFile();
1324
            dalFile.setStore((DefaultFeatureStore) store);
1325
            if( !dalFile.isEmpty() ) {
1326
                dalFile.write(resource);
1327
            }
1328
        } catch (Throwable ex) {
1329
            LOGGER.warn("Can't save DAL resource", ex);
1330
        } finally {
1331
            IOUtils.closeQuietly(resource);
1332
        }
1333
    
1334
        
1335
    }
1336

    
1337
    @Override
1338
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
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.setFeatureType(featureType);
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
    @Override
1361
    public void clearAvailableValuesCache() {
1362
      //TODO
1363
    }
1364
     
1365
    @Override
1366
    public String createUniqueID() {
1367
        UUID x = UUID.randomUUID();
1368
        String s = x.toString();
1369
        return s;
1370
    }
1371

    
1372
    @Override
1373
    public EditableFeatureAttributeDescriptor createFeatureAttributeDescriptor(String name, int type) {
1374
        return createEditableFeatureAttributeDescriptor(null, name,type, false);
1375
    }
1376
    
1377
    public static DefaultEditableFeatureAttributeDescriptor createEditableFeatureAttributeDescriptor(FeatureType ftype, String name, int type) {
1378
        return createEditableFeatureAttributeDescriptor(ftype, name,type, false);
1379
    }
1380
    
1381
    public static DefaultEditableFeatureAttributeDescriptor createEditableFeatureAttributeDescriptor(FeatureType ftype, String name, int type, boolean strongChanges) {
1382
        switch (type) {
1383
            case DataTypes.DOUBLE:
1384
            case DataTypes.FLOAT:
1385
            case DataTypes.DECIMAL:
1386
            case DataTypes.BOOLEAN:
1387
            case DataTypes.BYTE:
1388
            case DataTypes.BYTEARRAY:
1389
            case DataTypes.CHAR:
1390
            case DataTypes.DATE:
1391
            case DataTypes.GEOMETRY:
1392
            case DataTypes.INT:
1393
            case DataTypes.LONG:
1394
            case DataTypes.OBJECT:
1395
            case DataTypes.LIST: // Solo para campos calculados ???
1396
            case DataTypes.STRING:
1397
            case DataTypes.TIME:
1398
            case DataTypes.TIMESTAMP:
1399
            case DataTypes.URI:
1400
            case DataTypes.URL:
1401
            case DataTypes.FILE:
1402
                break;
1403

    
1404
            default:
1405
                throw new UnsupportedDataTypeException(name, type);
1406
        }
1407
        DefaultEditableFeatureAttributeDescriptor edi = new DefaultEditableFeatureAttributeDescriptor(ftype, strongChanges);
1408
        edi.setName(name);
1409
        edi.setDataType(type);
1410
        if (edi.getDataType().supportSize()) {
1411
            edi.setSize(edi.getDataType().getDefaultSize());
1412
        }   
1413
        return edi;
1414
    }
1415

    
1416
  @Override
1417
  public DALExpressionBuilder createDALExpressionBuilder() {
1418
    return new DefaultDALExpressionBuilder();
1419
  }
1420

    
1421
  @Override
1422
  public void addStoreObserver(Observer observer) {
1423
    this.storeObservers.add(observer);
1424
  }
1425

    
1426
  @Override
1427
  public void removeStoreObserver(Observer observer) {
1428
    this.storeObservers.remove(observer);
1429
  }
1430

    
1431
    @Override
1432
    public String getServerExplorerFromStore(String name) {
1433
        Register r = this.getServerExplorerRegister();
1434
        for (DataFactory factory0 : r) {
1435
            DataServerExplorerFactory factory = (DataServerExplorerFactory) factory0;
1436
            if( factory.isStoreSupported(name) ) {
1437
                return factory.getName();
1438
            }
1439
        }
1440
        return null;
1441
    }
1442
    
1443
    @Override
1444
    public void setMaxSizeForSmallFeatureSelection(long size){
1445
        this.maxSizeForSmallFeatureSelection = size;
1446
    }
1447

    
1448
    @Override
1449
    public long getMaxSizeForSmallFeatureSelection() {
1450
        return this.maxSizeForSmallFeatureSelection;
1451
    }
1452

    
1453
    @Override
1454
    public void registerLargeMap(Factory factory) {
1455
        this.largeMapFactory = factory;
1456
    }
1457
    
1458
    @Override
1459
    public void registerLargeSet(Factory factory) {
1460
        this.largeSetFactory = factory;
1461
    }
1462
    
1463
    @Override
1464
    public Map createLargeMap() {
1465
        return (Map) this.largeMapFactory.create();
1466
    }
1467

    
1468
    @Override
1469
    public Set createLargeSet() {
1470
        return (Set) this.largeSetFactory.create();
1471
    }
1472

    
1473
    @Override
1474
    public DataTransaction createTransaction() {
1475
        DefaultTransaction transaction = new DefaultTransaction();
1476
        return transaction;
1477
    }
1478
    
1479
    @Override
1480
    public void putFeaturesInClipboard(FeatureSet set)  {
1481
        if( set==null ) {
1482
            return;
1483
        }
1484
        String s = set.toJson().toString();
1485
        ToolsSwingLocator.getToolsSwingManager().putInClipboard(s);
1486
    }
1487
    
1488
    @Override
1489
    public List<EditableFeature> getFeaturesFromClipboard(FeatureStore store, Predicate<FeatureAttributeDescriptor> attrFilter) throws DataException {
1490
        if( store==null ) {
1491
            return Collections.EMPTY_LIST;
1492
        }
1493
        String clipboard = ToolsSwingLocator.getToolsSwingManager().getFromClipboard();
1494
        if( StringUtils.isBlank(clipboard) ) {
1495
            return Collections.EMPTY_LIST;
1496
        }
1497
        JsonArray array = Json.createArray(clipboard);
1498
        if (array == null) {
1499
            return Collections.EMPTY_LIST;
1500
        }
1501
        List<EditableFeature> features = new ArrayList<>();
1502
        for (JsonValue jsonValue : array) {
1503
            EditableFeature f = store.createNewFeature();
1504
            f.copyFrom((JsonObject) jsonValue, attrFilter);
1505
            features.add(f);
1506
        }
1507
        return features;
1508
    }
1509

    
1510
    @Override
1511
    public FeatureRuleExpression createFeatureRuleExpression() {
1512
        FeatureRuleExpression rule = new DefaultFeatureRuleExpression();
1513
        return rule;
1514
    }
1515

    
1516
    @Override
1517
    public File getCacheResourcesFolder() {
1518
        FoldersManager fm = ToolsLocator.getFoldersManager();
1519
        File f = fm.getTemporaryFile("resources-storage");
1520
        return f;
1521
    }
1522
    
1523
    @Override
1524
    public void clearAllCachedResources() {
1525
        try {
1526
            File f = this.getCacheResourcesFolder();
1527
            FileUtils.deleteDirectory(f);
1528
        } catch (Exception ex) {
1529
            LOGGER.warn("Can't remove local cache for of resources.", ex);
1530
        }
1531
    }
1532
    
1533
    @Override
1534
    public LabelsCacheForFieldValues createLabelsCacheForFieldValues(Invocable labelFormulaProvider, SimpleTaskStatus status) {
1535
        LabelsCacheForFieldValuesImpl x = new LabelsCacheForFieldValuesImpl(labelFormulaProvider, status);
1536
        return x;
1537
    }
1538
    
1539
    public List<FeatureType> getFeatureTypesFromDAL(byte[] daldata) {
1540
        try {
1541
            BytesResource res = ResourcesStorage.createBytesResource(daldata);
1542
            DALFile dalfile = DALFile.getDALFile(res);
1543
            return dalfile.getFeatureTypes();
1544
        } catch (DataException ex) {
1545
            return null;
1546
        }
1547
    }
1548
    
1549
    @Override
1550
    public byte[] getDALBytesFromFeatureType(FeatureType ftype) {
1551
        try {
1552
            DALFile dalfile = DALFile.getDALFile();
1553
            dalfile.setFeatureType(ftype);
1554
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
1555
            dalfile.write(bos);
1556
            IOUtils.closeQuietly(bos);
1557
            return bos.toByteArray();
1558
        } catch (DataException ex) {
1559
            return null;
1560
        }
1561
    }
1562

    
1563
    private PropertiesSupportHelper propertiesSupportHelper;
1564
    
1565
    @Override
1566
    public Object getProperty(String name) {
1567
        if( this.propertiesSupportHelper == null ) {
1568
            return null;
1569
        }
1570
        return this.propertiesSupportHelper.getProperty(name);
1571
    }
1572

    
1573
    @Override
1574
    public void setProperty(String name, Object value) {
1575
        if( this.propertiesSupportHelper == null ) {
1576
            this.propertiesSupportHelper = new PropertiesSupportHelper();
1577
        }
1578
        this.propertiesSupportHelper.setProperty(name,value);
1579
    }
1580

    
1581
    @Override
1582
    public Map<String, Object> getProperties() {
1583
        if( this.propertiesSupportHelper == null ) {
1584
            return Collections.EMPTY_MAP;
1585
        }
1586
        return this.propertiesSupportHelper.getProperties();
1587
    }
1588

    
1589
    public DataTypeDetector createDataTypeDetector(Locale locale) {
1590
        DataTypeDetector x = new DataTypeDetectorImpl(locale);
1591
        return x;
1592
    }
1593
}