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

History | View | Annotate | Download (58 KB)

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

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

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

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

    
129
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
130
    
131
    public static final long DEFAULT_MAX_SIZE_FOR_SMALL_FEATURE_SELECTION = 2000000000;
132

    
133
    private class Registers {
134

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

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

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

    
163
    private final Registers registers;
164

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

    
167
    private OpenErrorHandler openErrorHandler = null;
168

    
169
    private DataServerExplorerPool dataServerExplorerPool = null;
170

    
171
    private List<DataType> dataTypes = null;
172

    
173
    private ClassLoader resourcesLoader = null;
174

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

    
181
    private final Set<Observer>storeObservers = new HashSet<>();
182
    
183
    private long maxSizeForSmallFeatureSelection;
184

    
185
    private Factory largeMapFactory;
186
    private Factory largeSetFactory;
187
    
188
    public DefaultDataManager() {
189
        this.registers = new Registers();
190
        this.defaultDataIndexProviders = new HashMap<>();
191
        this.maxSizeForSmallFeatureSelection = DEFAULT_MAX_SIZE_FOR_SMALL_FEATURE_SELECTION;
192
        this.largeMapFactory = new Factory() {
193
            @Override
194
            public String getName() {
195
                return "HashMapFactory";
196
            }
197

    
198
            @Override
199
            public Object create(Object... parameters) {
200
                return new HashMap();
201
            }
202
        };
203
        this.largeSetFactory = new Factory() {
204
            @Override
205
            public String getName() {
206
                return "HashSetFactory";
207
            }
208

    
209
            @Override
210
            public Object create(Object... parameters) {
211
                return new HashSet();
212
            }
213
        };
214
    }
215

    
216
    @Override
217
    public Register getStoreRegister() {
218
        return this.registers.store;
219
    }
220

    
221
    @Override
222
    public Register getStoreProviderRegister() {
223
        return this.registers.storeProvider;
224
    }
225

    
226
    @Override
227
    public Register getServerExplorerRegister() {
228
        return this.registers.serverExplorer;
229
    }
230

    
231
    @Override
232
    public Register getFeatureIndexRegister() {
233
        return this.registers.featureIndexProvider;
234
    }
235

    
236
    private String getStoreName(DataStoreParameters parameters) {
237
        for (DataFactory factory : this.getStoreRegister()) {
238
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
239
            if (storeFactory.canUse(parameters)) {
240
                return storeFactory.getName();
241
            }
242
        }
243
        return null;
244
    }
245

    
246
    /**
247
     * @deprecated
248
     */
249
    @Override
250
    public void registerDefaultRasterStore(Class rasterStoreClass) {
251
        // Metodo usado por el raster nuevo para regstrar su factoria de store
252
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
253
    }
254

    
255
    
256
    private boolean oldRasterRegistered = false;
257
    /**
258
     * @deprecated
259
     */
260
    @Override
261
    public void registerStoreFactory(String name, Class storeFactoryClass) {
262
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
263
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
264
        this.oldRasterRegistered = true;
265
    }
266

    
267
    @Override
268
    public boolean isTheOldRasterRegistered() {
269
      return this.oldRasterRegistered;
270
    }
271
    
272
    /**
273
     * @param name
274
     * @param storeProviderClass
275
     * @param parametersClass
276
     * @deprecated use registerStoreProviderFactory
277
     */
278
    @Override
279
    public void registerStoreProvider(String name, Class storeProviderClass,
280
            Class parametersClass) {
281
        if (name == null || storeProviderClass == null || parametersClass == null) {
282
            throw new IllegalArgumentException("Any parameters can be null");
283
        }
284

    
285
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
286
            throw new IllegalArgumentException(parametersClass.getName()
287
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
288
        }
289

    
290
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
291
            // Envuelve al proveedor en una factoria por defecto.
292
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
293
                    name, "", storeProviderClass, parametersClass));
294
            return;
295
        }
296

    
297
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
298
            // Envuelve al proveedor en una factoria por defecto.
299
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
300
                    name, "", storeProviderClass, parametersClass));
301
            return;
302
        }
303

    
304
        throw new IllegalArgumentException("Not supported implemtation: name="
305
                + name + " provider class=" + storeProviderClass.getName());
306

    
307
    }
308

    
309
    @Override
310
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
311
        if (name == null || explorerClass == null || parametersClass == null) {
312
            // FIXME Exception
313
            throw new IllegalArgumentException("Any parameters can be null");
314
        }
315

    
316
        if (!DataServerExplorerParameters.class
317
                .isAssignableFrom(parametersClass)) {
318
            // FIXME Exception
319
            throw new IllegalArgumentException(
320
                    parametersClass.getName()
321
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
322
        }
323

    
324
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
325
            // FIXME Exception
326
            throw new IllegalArgumentException(explorerClass.getName()
327
                    + " must implement org.gvsig.fmap.dal.DataServerExplorer");
328
        }
329

    
330
        // Envuelve al proveedor en una factoria por defecto.
331
        this.registerServerExplorerFactory(
332
                new DataServerExplorerToDataExplorerFactoryWrapper(
333
                        name, "", explorerClass, parametersClass
334
                )
335
        );
336

    
337
    }
338

    
339
    @Override
340
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
341
        this.getStoreRegister().register(factory);
342
    }
343

    
344
    @Override
345
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
346
        this.getStoreProviderRegister().register(factory);
347
    }
348

    
349
    @Override
350
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
351
        this.getServerExplorerRegister().register(factory);
352
    }
353

    
354
    @Override
355
    public DataStoreParameters createStoreParameters(byte[] data) {
356
        DataStoreParameters parameters = (DataStoreParameters) AbstractDataParameters.fromByteArray(data);
357
        return parameters;
358
    }
359

    
360
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
361
      // Cuando desde python se llama a createStoreParameters con solo un argumento 
362
      // acaba entrando por aqui en lugar de por
363
      //   createStoreParameters(String providerName, Object... arguments)
364
      return this.createStoreParameters(providerName, (Object[]) null);
365
    }
366

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

    
413
    @Override
414
    public NewDataStoreParameters createNewStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
415
        String explorerName = this.getServerExplorerFromStore(providerName);
416
        return createNewStoreParameters(explorerName, providerName);
417
    }
418

    
419
    @Override
420
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
421
        try {
422
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
423
            return explorer.getAddParameters(providerName);
424
        } catch (Exception ex) {
425
            throw new InitializeException(ex);
426
        }
427
    }
428

    
429
    @Override
430
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
431
        if( explorerName == null ) {
432
            String msg = "Explorer name can't be null.";
433
            LOGGER.warn(msg);
434
            throw new IllegalArgumentException(msg);
435
        }
436
        JsonObject parameters_json = null;
437
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
438
        if( explorerFactory == null ) {           
439
            parameters_json = Json.createObject(explorerName);
440
            if( parameters_json==null || 
441
                    !parameters_json.containsKey(PROVIDER_PARAMTER_NAME) ) {
442
                String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
443
                LOGGER.warn(msg);
444
                throw new IllegalArgumentException(msg);
445
            }
446
            explorerName = parameters_json.getString(PROVIDER_PARAMTER_NAME);
447
            explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
448
            if( explorerFactory == null ) {           
449
                String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
450
                LOGGER.warn(msg);
451
                throw new IllegalArgumentException(msg);
452
            }
453
        }
454
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
455
        if( parameters_json!=null ) {
456
            Json.addAll(params, parameters_json);
457
        }
458
        return params;
459
    }
460

    
461
    @Override
462
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
463
        try {
464
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
465
            if (autoOrderAttributeName != null) {
466
                parameters.setDynValue(
467
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
468
                        autoOrderAttributeName);
469
            }
470
            return parameters;
471
        } catch (Exception ex) {
472
            throw new InitializeException(ex);
473
        }
474
    }
475

    
476
    @Override
477
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
478
        if( explorerName == null ) {
479
            String msg = "Explorer name can't be null.";
480
            LOGGER.warn(msg);
481
            throw new IllegalArgumentException(msg);
482
        }
483
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
484
        if( explorerFactory == null ) {
485
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
486
            LOGGER.warn(msg);
487
            throw new IllegalArgumentException(msg);
488
        }
489
        if (parameters == null) {
490
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
491
        }
492
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
493
                parameters,
494
                new DefaultDataServerExplorerProviderServices()
495
        );
496
        return explorer;
497
    }
498

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

    
527
    }
528

    
529
    /**
530
     * @param parameters
531
     * @return
532
     * @throws org.gvsig.fmap.dal.exception.InitializeException
533
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
534
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
535
     * @deprecated see openServerExplorer
536
     */
537
    @Override
538
    public DataServerExplorer createServerExplorer(
539
            DataServerExplorerParameters parameters) throws InitializeException,
540
            ProviderNotRegisteredException, ValidateDataParametersException {
541
        return openServerExplorer(parameters.getExplorerName(), parameters);
542
    }
543

    
544
    /**
545
     * @deprecated use openStore
546
     * @param parameters
547
     * @return
548
     * @throws InitializeException
549
     * @throws ProviderNotRegisteredException
550
     * @throws ValidateDataParametersException
551
     */
552
    @Override
553
    public DataStore createStore(DataStoreParameters parameters)
554
        throws InitializeException, ProviderNotRegisteredException,
555
        ValidateDataParametersException {
556
        return openStore(parameters.getDataStoreName(), parameters);
557
    }
558

    
559
    @Override
560
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
561
        return this.openStore(providerName, parameters, false);
562
    }
563

    
564
    @Override
565
    public DataStore openStore(String providerName, DataStoreParameters parameters, boolean ignoreDALResource) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
566
        if (providerName == null) {
567
            String msg = "Provider name can't be null.";
568
            LOGGER.warn(msg);
569
            throw new IllegalArgumentException(msg);
570
        }
571
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
572
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
573
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
574
        }
575

    
576
        parameters.validate();
577

    
578
        String storeName = this.getStoreName(parameters);
579
        if( StringUtils.isEmpty(storeName) ) {
580
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
581
            LOGGER.warn(msg);
582
            throw new IllegalArgumentException(msg);
583
        }
584

    
585
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
586
        if( storeFactory == null ) {
587
            String msg = "Can't locate store factory for '"+storeName+"'.";
588
            LOGGER.warn(msg);
589
            throw new IllegalArgumentException(msg);
590
        }
591
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
592
        if( providerFactory == null ) {
593
            String msg = "Can't locate provider factory for '"+providerName+"'.";
594
            LOGGER.warn(msg);
595
            throw new IllegalArgumentException(msg);
596
        }
597

    
598
        DataStore store = (DataStore) storeFactory.create(parameters, this);
599
        if( store instanceof DefaultFeatureStore ) {
600
            ((DefaultFeatureStore)store).setIgnoreDALResource(ignoreDALResource);
601
        }
602
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
603

    
604
        if( provider == null ) {
605
            String msg = "Can't create provider for '"+providerName+"'.";
606
            LOGGER.trace(msg);
607
            throw new IllegalArgumentException(msg);
608
        }
609

    
610
        storeFactory.setProvider(store, provider);
611
  
612
        addObservers(store);
613
        if( store instanceof FeatureStoreProviderServices ) {
614
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
615
        }
616
        return store;
617
    }
618
    
619
    @Override
620
    public DataFactory getStoreFactory(DataStoreParameters parameters) {
621
        String storeName = this.getStoreName(parameters);
622
        if( StringUtils.isEmpty(storeName) ) {
623
            return null;
624
        }
625

    
626
        DataFactory storeFactory = this.getStoreRegister().getFactory(storeName);
627
        return storeFactory;
628
    }
629
    
630
    public void addObservers(DataStore store){
631
        for (Observer storeObserver : storeObservers) {
632
          if( storeObserver!=null) {
633
            store.addObserver(storeObserver);
634
          }
635
        }
636
    }
637

    
638
    @Override
639
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
640
        String storeName = this.getStoreName(parameters);
641
        if( StringUtils.isEmpty(storeName) ) {
642
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
643
            LOGGER.warn(msg);
644
            throw new IllegalArgumentException(msg);
645
        }
646

    
647
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
648
        if( storeFactory == null ) {
649
            String msg = "Can't locate store factory for '"+storeName+"'.";
650
            LOGGER.warn(msg);
651
            throw new IllegalArgumentException(msg);
652
        }
653
        DataStore store = (DataStore) storeFactory.create(parameters, this);
654
        storeFactory.setProvider(store, provider);
655
        for (Observer storeObserver : storeObservers) {
656
          if( storeObserver!=null) {
657
            store.addObserver(storeObserver);
658
          }
659
        }
660
        if( store instanceof FeatureStoreProviderServices ) {
661
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
662
        }
663
        return store;
664
    }
665
    
666
    @Override
667
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
668
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
669
        DataStore store = openStore(params.getDataStoreName(), params);
670
        return store;
671
    }
672

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

    
708
    @Override
709
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
710
        try {
711
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
712
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
713
            return (FeatureStore) store;
714
        } catch (Exception ex) {
715
            throw new InitializeException(ex);
716
        }
717
    }
718

    
719
    @Override
720
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
721
        if( providerName == null ) {
722
            String msg = "Provider name can't be null.";
723
            LOGGER.warn(msg);
724
            throw new IllegalArgumentException(msg);
725
        }
726
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
727
        return (DataStoreProviderFactory) providerFactory;
728
    }
729

    
730
    @Override
731
    public List<String> getStoreProviders() {
732
        return this.getStoreProviderRegister().getFactoryNames();
733
    }
734

    
735
    @Override
736
    public List<String> getStoreProviders(String explorerName) {
737
        if( explorerName == null ) {
738
            String msg = "Explorer name can't be null.";
739
            LOGGER.warn(msg);
740
            throw new IllegalArgumentException(msg);
741
        }
742
        try {
743
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
744
            List names = explorer.getDataStoreProviderNames();
745
            return names;
746
        } catch (Exception ex) {
747
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
748
        }
749
    }
750

    
751
    @Override
752
    public List<String> getExplorerProviders() {
753
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
754
        return names;
755
    }
756

    
757
    @Override
758
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
759

    
760
        String providerName = parameters.getDataStoreName();
761
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
762
        if (providerFactory == null) {
763
            throw new ProviderNotRegisteredException(providerName);
764
        }
765
        while (true) {
766
            try {
767
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
768
                        parameters, providerServices
769
                );
770
                return provider;
771
            } catch (Exception e) {
772
                if (openErrorHandler == null) {
773
                    throw new InitializeException(providerName, e);
774
                }
775
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
776
                if (!retry) {
777
                    throw new InitializeException(providerName, e);
778
                }
779
            }
780
        }
781
    }
782

    
783
    @Override
784
    public List<String> getFeatureIndexProviders() {
785
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
786
        return names;
787
    }
788

    
789
    @Override
790
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
791
        this.defaultDataIndexProviders.put(dataType, name);
792
    }
793

    
794
    @Override
795
    public String getDefaultFeatureIndexProviderName(int dataType) {
796
        return this.defaultDataIndexProviders.get(dataType);
797
    }
798

    
799
    @Override
800
    public FeatureIndexProviderServices createFeatureIndexProvider(
801
            String name,
802
            FeatureStore store,
803
            FeatureType type,
804
            String indexName,
805
            FeatureAttributeDescriptor attr
806
    ) throws InitializeException, ProviderNotRegisteredException {
807

    
808
        if (name == null) {
809
            name = getDefaultFeatureIndexProviderName(attr.getType());
810
        }
811

    
812
        if (name == null) {
813
            throw new InitializeException(
814
                    "There not any index provider registered.", null);
815
        }
816
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
817
        if (indexfactory == null) {
818
            throw new InitializeException(
819
                    "There not any index provider registered with name '" + name + "'.", null);
820

    
821
        }
822
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
823

    
824
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
825
                (FeatureStoreProviderServices) store,
826
                type,
827
                provider,
828
                attr.getName(),
829
                indexName
830
        );
831
        services.initialize();
832
        return services;
833

    
834
    }
835

    
836
    @Override
837
    public String getTemporaryDirectory() {
838
        FoldersManager manager = ToolsLocator.getFoldersManager();
839
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
840
        return folder.getAbsolutePath();
841
    }
842

    
843
    @Override
844
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
845
        if (!(struct instanceof DynStruct_v2)) {
846
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
847
        }
848
        Tags tags = ((DynStruct_v2) struct).getTags();
849
        return this.createStoreParameters(tags);
850
    }
851

    
852
    @Override
853
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
854
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
855
        if (providerName == null) {
856
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
857
        }
858
        int prefixlen = TAG_DAL_OPENSTORE.length();
859
        DataStoreParameters parameters = this.createStoreParameters(providerName);
860
        for (String key : tags) {
861
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
862
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
863
            }
864
        }
865
        return parameters;
866
    }
867

    
868
    @Override
869
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
870
        DataStoreParameters paramters = this.createStoreParameters(struct);
871
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
872
        return store;
873
    }
874

    
875
    @Override
876
    public void newStore(String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
877
        String explorerName = this.getServerExplorerFromStore(providerName);
878
        newStore(explorerName, providerName, parameters, overwrite);
879
    }
880
    
881
    @Override
882
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
883
        if( explorerName == null ) {
884
            String msg = "Explorer name can't be null.";
885
            LOGGER.warn(msg);
886
            throw new IllegalArgumentException(msg);
887
        }
888
        if( providerName == null ) {
889
            String msg = "Provider name can't be null.";
890
            LOGGER.warn(msg);
891
            throw new IllegalArgumentException(msg);
892
        }
893

    
894
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
895
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
896
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
897
        }
898
        parameters.validate();
899
        try {
900
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
901
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
902
            server.add(providerName, parameters, overwrite);
903
        } catch (Exception e) {
904
            throw new InitializeException(e);
905
        }
906
    }
907

    
908
    @Override
909
    @Deprecated
910
    public Evaluator createExpresion(String expression) throws InitializeException {
911
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
912
        exp.setPhrase(expression);
913
        return this.createExpresion(exp);
914
    }
915

    
916
    @Override
917
    @Deprecated
918
    public Evaluator createExpresion(Expression expression) throws InitializeException {
919
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
920
        return exp;        
921
    }
922

    
923

    
924
    @Override
925
    public Evaluator createFilter(String expression) throws InitializeException {
926
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
927
        exp.setPhrase(expression);
928
        return this.createFilter(exp);
929
    }
930

    
931
    @Override
932
    public Evaluator createFilter(Expression expression) throws InitializeException {
933
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
934
        return exp;        
935
    }
936

    
937
    @Override
938
    public FeaturePagingHelper createFeaturePagingHelper(
939
            FeatureStore featureStore, int pageSize) throws BaseException {
940
        return new FeaturePagingHelperImpl(featureStore, pageSize);
941
    }
942

    
943
    @Override
944
    public FeaturePagingHelper createFeaturePagingHelper(
945
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
946
            throws BaseException {
947
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
948
    }
949

    
950
    @Override
951
    public void setOpenErrorHandler(OpenErrorHandler handler) {
952
        openErrorHandler = handler;
953
    }
954

    
955
    @Override
956
    public OpenErrorHandler getOpenErrorHandler() {
957
        return this.openErrorHandler;
958
    }
959

    
960
    @Override
961
    public EditableFeatureType createFeatureType() {
962
        return new DefaultEditableFeatureType(null);
963
    }
964

    
965
    @Override
966
    public EditableFeatureType createFeatureType(JsonObject json) {
967
        EditableFeatureType featureType = this.createFeatureType();
968
        featureType.fromJson(json);
969
        return featureType;
970
    }
971

    
972
    @Override
973
    public DataServerExplorerPool getDataServerExplorerPool() {
974
        if (this.dataServerExplorerPool == null) {
975
            this.dataServerExplorerPool = new DataServerExplorerPoolImpl();
976
        }
977
        return this.dataServerExplorerPool;
978
    }
979

    
980
    @Override
981
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
982
        this.dataServerExplorerPool = pool;
983
    }
984

    
985
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
986
        if (params instanceof DataStoreParameters) {
987
            return (DataStoreParameters) params;
988
        }
989
        String providerName;
990
        try {
991
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
992
        } catch (Exception ex) {
993
            providerName = provider;
994
        }
995
        DataStoreParameters parameters = this.createStoreParameters(providerName);
996
        ToolsLocator.getDynObjectManager().copy(params, parameters);
997
        return parameters;
998
    }
999

    
1000
    @Override
1001
    public List<DataType> getDataTypes() {
1002
        if (dataTypes == null) {
1003
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
1004
            dataTypes = new ArrayList<>();
1005
            dataTypes.add(manager.get(DataTypes.STRING));
1006
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
1007
            dataTypes.add(manager.get(DataTypes.INT));
1008
            dataTypes.add(manager.get(DataTypes.DOUBLE));
1009
            dataTypes.add(manager.get(DataTypes.DATE));
1010
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
1011
        }
1012
        return dataTypes;
1013
    }
1014

    
1015
    @Override
1016
    public void setResourcesLoader(ClassLoader loader) {
1017
        this.resourcesLoader = loader;
1018
    }
1019

    
1020
    @Override
1021
    public void setResourcesLoader(File folder) {
1022
        if (folder == null) {
1023
            this.resourcesLoader = null;
1024
            return;
1025
        }
1026
        try {
1027
            URL[] urls = new URL[]{folder.toURI().toURL()};
1028
            this.resourcesLoader = new URLClassLoader(urls);
1029
        } catch (Exception ex) {
1030
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
1031
        }
1032
    }
1033

    
1034
    @Override
1035
    public URL getResource(Object reourceLoader, String name) {
1036
        URL x;
1037
        if (this.resourcesLoader != null) {
1038
            x = this.resourcesLoader.getResource(name);
1039
            if (x != null) {
1040
                return x;
1041
            }
1042
        }
1043
        x = reourceLoader.getClass().getResource(name);
1044
        return x;
1045
    }
1046

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

    
1060
    @Override
1061
    public ExpressionBuilder createExpressionBuilder() {
1062
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
1063
    }
1064

    
1065
    public void registerFeatureCacheProvider(
1066
        FeatureCacheProviderFactory providerFactory) {
1067
        ToolsLocator.getExtensionPointManager()
1068
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
1069
            .append(providerFactory.getName(), "", providerFactory);
1070
    }
1071

    
1072
    public FeatureCacheProvider createFeatureCacheProvider(String name,
1073
        DynObject parameters) throws DataException {
1074
        if (name == null) {
1075
            throw new InitializeException(
1076
                "It is necessary to provide a cache name", null);
1077
        }
1078
        if (parameters == null) {
1079
            throw new InitializeException(
1080
                "It is necessary to provide parameters to create the explorer",
1081
                null);
1082
        }
1083
        FeatureCacheProviderFactory featureCacheProviderFactory;
1084
        try {
1085
            featureCacheProviderFactory =
1086
                (FeatureCacheProviderFactory) ToolsLocator
1087
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1088
                    .create(name);
1089
            if (featureCacheProviderFactory == null) {
1090
                throw new ProviderNotRegisteredException(name);
1091
            }
1092
            return featureCacheProviderFactory.createCacheProvider(parameters);
1093
        } catch (Exception e) {
1094
            throw new InitializeException(e);
1095
        }
1096
    }
1097

    
1098
    @Override
1099
    public List getFeatureCacheProviders() {
1100
        ExtensionPoint extensionPoint =
1101
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
1102
        if (extensionPoint != null) {
1103
            return ToolsLocator.getExtensionPointManager()
1104
                .get(DATA_MANAGER_CACHE).getNames();
1105
        } else {
1106
            return new ArrayList();
1107
        }
1108
    }
1109

    
1110
    @Override
1111
    public DynObject createCacheParameters(String name)
1112
        throws InitializeException, ProviderNotRegisteredException {
1113
        if (name == null) {
1114
            throw new InitializeException(
1115
                "It is necessary to provide a cache name", null);
1116
        }
1117
        FeatureCacheProviderFactory featureCacheProviderFactory;
1118
        try {
1119
            featureCacheProviderFactory =
1120
                (FeatureCacheProviderFactory) ToolsLocator
1121
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1122
                    .create(name);
1123
            if (featureCacheProviderFactory == null) {
1124
                throw new ProviderNotRegisteredException(name);
1125
            }
1126
            return featureCacheProviderFactory.createParameters();
1127
        } catch (Exception e) {
1128
            throw new InitializeException(e);
1129
        }
1130
    }
1131

    
1132
    @Override
1133
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
1134
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
1135
        DataServerExplorerParameters eparams = null;
1136
        DataServerExplorer serverExplorer;
1137
        try {
1138
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
1139
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
1140
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
1141
        }
1142

    
1143
        try {
1144
            serverExplorer.add(providerName, params, overwrite);
1145
        } catch (DataException e) {
1146
            throw new CreateFileStoreException(e, providerName);
1147
        }
1148
    }
1149

    
1150
    @Override
1151
    public FeatureSymbolTable createFeatureSymbolTable() {
1152
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl();
1153
        return symbolTable;
1154
    }
1155

    
1156
    @Override
1157
    public FeatureSymbolTable createFeatureSymbolTable(String name) {
1158
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl(name);
1159
        return symbolTable;
1160
    }
1161

    
1162
    @Override
1163
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1164
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1165
        return emulator;
1166
    }
1167

    
1168
    @Override
1169
    public void registerDataProfile(DataProfile profile) {
1170
        if( profile==null ) {
1171
            return;
1172
        }
1173
        if( this.dataProfiles==null ) {
1174
            this.dataProfiles = new HashMap<>();
1175
        }
1176
        this.dataProfiles.put(profile.getID().toLowerCase(), profile);
1177
    }
1178

    
1179
    @Override
1180
    public List<DataProfile> getDataProfiles() {
1181
        if( this.dataProfiles==null ) {
1182
            return null;
1183
        }
1184
        return Collections.unmodifiableList(new ArrayList<>(this.dataProfiles.values()));
1185
    }
1186

    
1187
    @Override
1188
    public DataProfile getDataProfile(String name) {
1189
        if( StringUtils.isBlank(name) ) {
1190
            return null;
1191
        }
1192
        if(this.dataProfiles == null){
1193
            return null;
1194
        }
1195
        return this.dataProfiles.get(name.toLowerCase());
1196
    }
1197

    
1198
    private StoresRepository storesRepository;
1199
    
1200
    @Override
1201
    public StoresRepository getStoresRepository() {
1202
        if( this.storesRepository==null ) {
1203
            this.storesRepository = new BaseStoresRepository("DAL");
1204
        }
1205
        return this.storesRepository;
1206
    }
1207
    
1208
    @Override
1209
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1210
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1211
        return workspace;
1212
    }
1213

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

    
1246
        for (DatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1247
            if( listener!=null ) {
1248
                try {
1249
                    listener.onAddDatabaseWorkspace(databaseWorkspace);
1250
                } catch(Throwable th) {
1251
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1252
                }
1253
            }
1254
        }
1255
        try {
1256
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1257
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1258
            Script script = scriptManager.loadScript(resources, "OnConnectToWorkspace.script");
1259
            if( script != null ) {
1260
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1261
            }
1262
        } catch(Throwable th) {
1263
            LOGGER.warn("Problems executing 'OnConnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1264
        }
1265
    }
1266
    
1267
    @Override
1268
    public void addDatabaseWorkspaceListener(DatabaseWorkspaceListener listener) {
1269
        this.addDatabaseWorkspaceListeners.put(listener.getName(), listener);
1270
    }
1271

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

    
1326
    @Override
1327
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
1328
        ResourcesStorage.Resource resource = null;
1329
        try {
1330
            if( resources == null || resources.isReadOnly() ) {
1331
                return;
1332
            }
1333
            resource = resources.getResource("dal");
1334
            if( resource == null || resource.isReadOnly() ) {
1335
                return;
1336
            }
1337
            DALFile dalFile = DALFile.getDALFile();
1338
            dalFile.setFeatureType(featureType);
1339
            if( !dalFile.isEmpty() ) {
1340
                dalFile.write(resource);
1341
            }
1342
        } catch (Throwable ex) {
1343
            LOGGER.warn("Can't save DAL resource", ex);
1344
        } finally {
1345
            IOUtils.closeQuietly(resource);
1346
        }
1347
    }
1348

    
1349
    @Override
1350
    public void clearAvailableValuesCache() {
1351
      //TODO
1352
    }
1353
     
1354
    @Override
1355
    public String createUniqueID() {
1356
        UUID x = UUID.randomUUID();
1357
        String s = x.toString();
1358
        return s;
1359
    }
1360

    
1361
    @Override
1362
    public EditableFeatureAttributeDescriptor createFeatureAttributeDescriptor(String name, int type) {
1363
        return createEditableFeatureAttributeDescriptor(null, name,type, false);
1364
    }
1365
    
1366
    public static DefaultEditableFeatureAttributeDescriptor createEditableFeatureAttributeDescriptor(FeatureType ftype, String name, int type) {
1367
        return createEditableFeatureAttributeDescriptor(ftype, name,type, false);
1368
    }
1369
    
1370
    public static DefaultEditableFeatureAttributeDescriptor createEditableFeatureAttributeDescriptor(FeatureType ftype, String name, int type, boolean strongChanges) {
1371
        switch (type) {
1372
            case DataTypes.DOUBLE:
1373
            case DataTypes.FLOAT:
1374
            case DataTypes.DECIMAL:
1375
            case DataTypes.BOOLEAN:
1376
            case DataTypes.BYTE:
1377
            case DataTypes.BYTEARRAY:
1378
            case DataTypes.CHAR:
1379
            case DataTypes.DATE:
1380
            case DataTypes.GEOMETRY:
1381
            case DataTypes.INT:
1382
            case DataTypes.LONG:
1383
            case DataTypes.OBJECT:
1384
            case DataTypes.LIST: // Solo para campos calculados ???
1385
            case DataTypes.STRING:
1386
            case DataTypes.TIME:
1387
            case DataTypes.TIMESTAMP:
1388
            case DataTypes.URI:
1389
            case DataTypes.URL:
1390
            case DataTypes.FILE:
1391
                break;
1392

    
1393
            default:
1394
                throw new UnsupportedDataTypeException(name, type);
1395
        }
1396
        DefaultEditableFeatureAttributeDescriptor edi = new DefaultEditableFeatureAttributeDescriptor(ftype, strongChanges);
1397
        edi.setName(name);
1398
        edi.setDataType(type);
1399
        if (edi.getDataType().supportSize()) {
1400
            edi.setSize(edi.getDataType().getDefaultSize());
1401
        }   
1402
        return edi;
1403
    }
1404

    
1405
  @Override
1406
  public DALExpressionBuilder createDALExpressionBuilder() {
1407
    return new DefaultDALExpressionBuilder();
1408
  }
1409

    
1410
  @Override
1411
  public void addStoreObserver(Observer observer) {
1412
    this.storeObservers.add(observer);
1413
  }
1414

    
1415
  @Override
1416
  public void removeStoreObserver(Observer observer) {
1417
    this.storeObservers.remove(observer);
1418
  }
1419

    
1420
    @Override
1421
    public String getServerExplorerFromStore(String name) {
1422
        Register r = this.getServerExplorerRegister();
1423
        for (DataFactory factory0 : r) {
1424
            DataServerExplorerFactory factory = (DataServerExplorerFactory) factory0;
1425
            if( factory.isStoreSupported(name) ) {
1426
                return factory.getName();
1427
            }
1428
        }
1429
        return null;
1430
    }
1431
    
1432
    @Override
1433
    public void setMaxSizeForSmallFeatureSelection(long size){
1434
        this.maxSizeForSmallFeatureSelection = size;
1435
    }
1436

    
1437
    @Override
1438
    public long getMaxSizeForSmallFeatureSelection() {
1439
        return this.maxSizeForSmallFeatureSelection;
1440
    }
1441

    
1442
    @Override
1443
    public void registerLargeMap(Factory factory) {
1444
        this.largeMapFactory = factory;
1445
    }
1446
    
1447
    @Override
1448
    public void registerLargeSet(Factory factory) {
1449
        this.largeSetFactory = factory;
1450
    }
1451
    
1452
    @Override
1453
    public Map createLargeMap() {
1454
        return (Map) this.largeMapFactory.create();
1455
    }
1456

    
1457
    @Override
1458
    public Set createLargeSet() {
1459
        return (Set) this.largeSetFactory.create();
1460
    }
1461

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

    
1499
    @Override
1500
    public FeatureRuleExpression createFeatureRuleExpression() {
1501
        FeatureRuleExpression rule = new DefaultFeatureRuleExpression();
1502
        return rule;
1503
}
1504
    
1505
}