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

History | View | Annotate | Download (57.9 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 List<DataProfile> dataProfiles;
176
    
177
    private final Map<String, DatabaseWorkspaceManager> databaseWorkspaces = new HashMap<>();
178
 
179
    private final Map<String,DatabaseWorkspaceListener> addDatabaseWorkspaceListeners = new HashMap<>();
180

    
181
    private final Set<Observer>storeObservers = new HashSet<>();
182
    
183
    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
    public void addObservers(DataStore store){
620
        for (Observer storeObserver : storeObservers) {
621
          if( storeObserver!=null) {
622
            store.addObserver(storeObserver);
623
          }
624
        }
625
    }
626

    
627
    @Override
628
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
629
        String storeName = this.getStoreName(parameters);
630
        if( StringUtils.isEmpty(storeName) ) {
631
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
632
            LOGGER.warn(msg);
633
            throw new IllegalArgumentException(msg);
634
        }
635

    
636
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
637
        if( storeFactory == null ) {
638
            String msg = "Can't locate store factory for '"+storeName+"'.";
639
            LOGGER.warn(msg);
640
            throw new IllegalArgumentException(msg);
641
        }
642
        DataStore store = (DataStore) storeFactory.create(parameters, this);
643
        storeFactory.setProvider(store, provider);
644
        for (Observer storeObserver : storeObservers) {
645
          if( storeObserver!=null) {
646
            store.addObserver(storeObserver);
647
          }
648
        }
649
        if( store instanceof FeatureStoreProviderServices ) {
650
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
651
        }
652
        return store;
653
    }
654
    
655
    @Override
656
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
657
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
658
        DataStore store = openStore(params.getDataStoreName(), params);
659
        return store;
660
    }
661

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

    
697
    @Override
698
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
699
        try {
700
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
701
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
702
            return (FeatureStore) store;
703
        } catch (Exception ex) {
704
            throw new InitializeException(ex);
705
        }
706
    }
707

    
708
    @Override
709
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
710
        if( providerName == null ) {
711
            String msg = "Provider name can't be null.";
712
            LOGGER.warn(msg);
713
            throw new IllegalArgumentException(msg);
714
        }
715
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
716
        return (DataStoreProviderFactory) providerFactory;
717
    }
718

    
719
    @Override
720
    public List<String> getStoreProviders() {
721
        return this.getStoreProviderRegister().getFactoryNames();
722
    }
723

    
724
    @Override
725
    public List<String> getStoreProviders(String explorerName) {
726
        if( explorerName == null ) {
727
            String msg = "Explorer name can't be null.";
728
            LOGGER.warn(msg);
729
            throw new IllegalArgumentException(msg);
730
        }
731
        try {
732
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
733
            List names = explorer.getDataStoreProviderNames();
734
            return names;
735
        } catch (Exception ex) {
736
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
737
        }
738
    }
739

    
740
    @Override
741
    public List<String> getExplorerProviders() {
742
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
743
        return names;
744
    }
745

    
746
    @Override
747
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
748

    
749
        String providerName = parameters.getDataStoreName();
750
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
751
        if (providerFactory == null) {
752
            throw new ProviderNotRegisteredException(providerName);
753
        }
754
        while (true) {
755
            try {
756
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
757
                        parameters, providerServices
758
                );
759
                return provider;
760
            } catch (Exception e) {
761
                if (openErrorHandler == null) {
762
                    throw new InitializeException(providerName, e);
763
                }
764
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
765
                if (!retry) {
766
                    throw new InitializeException(providerName, e);
767
                }
768
            }
769
        }
770
    }
771

    
772
    @Override
773
    public List<String> getFeatureIndexProviders() {
774
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
775
        return names;
776
    }
777

    
778
    @Override
779
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
780
        this.defaultDataIndexProviders.put(dataType, name);
781
    }
782

    
783
    @Override
784
    public String getDefaultFeatureIndexProviderName(int dataType) {
785
        return this.defaultDataIndexProviders.get(dataType);
786
    }
787

    
788
    @Override
789
    public FeatureIndexProviderServices createFeatureIndexProvider(
790
            String name,
791
            FeatureStore store,
792
            FeatureType type,
793
            String indexName,
794
            FeatureAttributeDescriptor attr
795
    ) throws InitializeException, ProviderNotRegisteredException {
796

    
797
        if (name == null) {
798
            name = getDefaultFeatureIndexProviderName(attr.getType());
799
        }
800

    
801
        if (name == null) {
802
            throw new InitializeException(
803
                    "There not any index provider registered.", null);
804
        }
805
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
806
        if (indexfactory == null) {
807
            throw new InitializeException(
808
                    "There not any index provider registered with name '" + name + "'.", null);
809

    
810
        }
811
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
812

    
813
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
814
                (FeatureStoreProviderServices) store,
815
                type,
816
                provider,
817
                attr.getName(),
818
                indexName
819
        );
820
        services.initialize();
821
        return services;
822

    
823
    }
824

    
825
    @Override
826
    public String getTemporaryDirectory() {
827
        FoldersManager manager = ToolsLocator.getFoldersManager();
828
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
829
        return folder.getAbsolutePath();
830
    }
831

    
832
    @Override
833
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
834
        if (!(struct instanceof DynStruct_v2)) {
835
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
836
        }
837
        Tags tags = ((DynStruct_v2) struct).getTags();
838
        return this.createStoreParameters(tags);
839
    }
840

    
841
    @Override
842
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
843
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
844
        if (providerName == null) {
845
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
846
        }
847
        int prefixlen = TAG_DAL_OPENSTORE.length();
848
        DataStoreParameters parameters = this.createStoreParameters(providerName);
849
        for (String key : tags) {
850
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
851
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
852
            }
853
        }
854
        return parameters;
855
    }
856

    
857
    @Override
858
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
859
        DataStoreParameters paramters = this.createStoreParameters(struct);
860
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
861
        return store;
862
    }
863

    
864
    @Override
865
    public void newStore(String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
866
        String explorerName = this.getServerExplorerFromStore(providerName);
867
        newStore(explorerName, providerName, parameters, overwrite);
868
    }
869
    
870
    @Override
871
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
872
        if( explorerName == null ) {
873
            String msg = "Explorer name can't be null.";
874
            LOGGER.warn(msg);
875
            throw new IllegalArgumentException(msg);
876
        }
877
        if( providerName == null ) {
878
            String msg = "Provider name can't be null.";
879
            LOGGER.warn(msg);
880
            throw new IllegalArgumentException(msg);
881
        }
882

    
883
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
884
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
885
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
886
        }
887
        parameters.validate();
888
        try {
889
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
890
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
891
            server.add(providerName, parameters, overwrite);
892
        } catch (Exception e) {
893
            throw new InitializeException(e);
894
        }
895
    }
896

    
897
    @Override
898
    @Deprecated
899
    public Evaluator createExpresion(String expression) throws InitializeException {
900
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
901
        exp.setPhrase(expression);
902
        return this.createExpresion(exp);
903
    }
904

    
905
    @Override
906
    @Deprecated
907
    public Evaluator createExpresion(Expression expression) throws InitializeException {
908
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
909
        return exp;        
910
    }
911

    
912

    
913
    @Override
914
    public Evaluator createFilter(String expression) throws InitializeException {
915
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
916
        exp.setPhrase(expression);
917
        return this.createFilter(exp);
918
    }
919

    
920
    @Override
921
    public Evaluator createFilter(Expression expression) throws InitializeException {
922
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
923
        return exp;        
924
    }
925

    
926
    @Override
927
    public FeaturePagingHelper createFeaturePagingHelper(
928
            FeatureStore featureStore, int pageSize) throws BaseException {
929
        return new FeaturePagingHelperImpl(featureStore, pageSize);
930
    }
931

    
932
    @Override
933
    public FeaturePagingHelper createFeaturePagingHelper(
934
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
935
            throws BaseException {
936
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
937
    }
938

    
939
    @Override
940
    public void setOpenErrorHandler(OpenErrorHandler handler) {
941
        openErrorHandler = handler;
942
    }
943

    
944
    @Override
945
    public OpenErrorHandler getOpenErrorHandler() {
946
        return this.openErrorHandler;
947
    }
948

    
949
    @Override
950
    public EditableFeatureType createFeatureType() {
951
        return new DefaultEditableFeatureType(null);
952
    }
953

    
954
    @Override
955
    public EditableFeatureType createFeatureType(JsonObject json) {
956
        EditableFeatureType featureType = this.createFeatureType();
957
        featureType.fromJson(json);
958
        return featureType;
959
    }
960

    
961
    @Override
962
    public DataServerExplorerPool getDataServerExplorerPool() {
963
        if (this.dataServerExplorerPool == null) {
964
            this.dataServerExplorerPool = new DataServerExplorerPoolImpl();
965
        }
966
        return this.dataServerExplorerPool;
967
    }
968

    
969
    @Override
970
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
971
        this.dataServerExplorerPool = pool;
972
    }
973

    
974
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
975
        if (params instanceof DataStoreParameters) {
976
            return (DataStoreParameters) params;
977
        }
978
        String providerName;
979
        try {
980
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
981
        } catch (Exception ex) {
982
            providerName = provider;
983
        }
984
        DataStoreParameters parameters = this.createStoreParameters(providerName);
985
        ToolsLocator.getDynObjectManager().copy(params, parameters);
986
        return parameters;
987
    }
988

    
989
    @Override
990
    public List<DataType> getDataTypes() {
991
        if (dataTypes == null) {
992
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
993
            dataTypes = new ArrayList<>();
994
            dataTypes.add(manager.get(DataTypes.STRING));
995
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
996
            dataTypes.add(manager.get(DataTypes.INT));
997
            dataTypes.add(manager.get(DataTypes.DOUBLE));
998
            dataTypes.add(manager.get(DataTypes.DATE));
999
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
1000
        }
1001
        return dataTypes;
1002
    }
1003

    
1004
    @Override
1005
    public void setResourcesLoader(ClassLoader loader) {
1006
        this.resourcesLoader = loader;
1007
    }
1008

    
1009
    @Override
1010
    public void setResourcesLoader(File folder) {
1011
        if (folder == null) {
1012
            this.resourcesLoader = null;
1013
            return;
1014
        }
1015
        try {
1016
            URL[] urls = new URL[]{folder.toURI().toURL()};
1017
            this.resourcesLoader = new URLClassLoader(urls);
1018
        } catch (Exception ex) {
1019
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
1020
        }
1021
    }
1022

    
1023
    @Override
1024
    public URL getResource(Object reourceLoader, String name) {
1025
        URL x;
1026
        if (this.resourcesLoader != null) {
1027
            x = this.resourcesLoader.getResource(name);
1028
            if (x != null) {
1029
                return x;
1030
            }
1031
        }
1032
        x = reourceLoader.getClass().getResource(name);
1033
        return x;
1034
    }
1035

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

    
1049
    @Override
1050
    public ExpressionBuilder createExpressionBuilder() {
1051
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
1052
    }
1053

    
1054
    public void registerFeatureCacheProvider(
1055
        FeatureCacheProviderFactory providerFactory) {
1056
        ToolsLocator.getExtensionPointManager()
1057
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
1058
            .append(providerFactory.getName(), "", providerFactory);
1059
    }
1060

    
1061
    public FeatureCacheProvider createFeatureCacheProvider(String name,
1062
        DynObject parameters) throws DataException {
1063
        if (name == null) {
1064
            throw new InitializeException(
1065
                "It is necessary to provide a cache name", null);
1066
        }
1067
        if (parameters == null) {
1068
            throw new InitializeException(
1069
                "It is necessary to provide parameters to create the explorer",
1070
                null);
1071
        }
1072
        FeatureCacheProviderFactory featureCacheProviderFactory;
1073
        try {
1074
            featureCacheProviderFactory =
1075
                (FeatureCacheProviderFactory) ToolsLocator
1076
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1077
                    .create(name);
1078
            if (featureCacheProviderFactory == null) {
1079
                throw new ProviderNotRegisteredException(name);
1080
            }
1081
            return featureCacheProviderFactory.createCacheProvider(parameters);
1082
        } catch (Exception e) {
1083
            throw new InitializeException(e);
1084
        }
1085
    }
1086

    
1087
    @Override
1088
    public List getFeatureCacheProviders() {
1089
        ExtensionPoint extensionPoint =
1090
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
1091
        if (extensionPoint != null) {
1092
            return ToolsLocator.getExtensionPointManager()
1093
                .get(DATA_MANAGER_CACHE).getNames();
1094
        } else {
1095
            return new ArrayList();
1096
        }
1097
    }
1098

    
1099
    @Override
1100
    public DynObject createCacheParameters(String name)
1101
        throws InitializeException, ProviderNotRegisteredException {
1102
        if (name == null) {
1103
            throw new InitializeException(
1104
                "It is necessary to provide a cache name", null);
1105
        }
1106
        FeatureCacheProviderFactory featureCacheProviderFactory;
1107
        try {
1108
            featureCacheProviderFactory =
1109
                (FeatureCacheProviderFactory) ToolsLocator
1110
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
1111
                    .create(name);
1112
            if (featureCacheProviderFactory == null) {
1113
                throw new ProviderNotRegisteredException(name);
1114
            }
1115
            return featureCacheProviderFactory.createParameters();
1116
        } catch (Exception e) {
1117
            throw new InitializeException(e);
1118
        }
1119
    }
1120

    
1121
    @Override
1122
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
1123
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
1124
        DataServerExplorerParameters eparams = null;
1125
        DataServerExplorer serverExplorer;
1126
        try {
1127
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
1128
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
1129
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
1130
        }
1131

    
1132
        try {
1133
            serverExplorer.add(providerName, params, overwrite);
1134
        } catch (DataException e) {
1135
            throw new CreateFileStoreException(e, providerName);
1136
        }
1137
    }
1138

    
1139
    @Override
1140
    public FeatureSymbolTable createFeatureSymbolTable() {
1141
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl();
1142
        return symbolTable;
1143
    }
1144

    
1145
    @Override
1146
    public FeatureSymbolTable createFeatureSymbolTable(String name) {
1147
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl(name);
1148
        return symbolTable;
1149
    }
1150

    
1151
    @Override
1152
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1153
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1154
        return emulator;
1155
    }
1156

    
1157
    @Override
1158
    public void registerDataProfile(DataProfile profile) {
1159
        if( profile==null ) {
1160
            return;
1161
        }
1162
        if( this.dataProfiles==null ) {
1163
            this.dataProfiles = new ArrayList<>();
1164
            this.dataProfiles.add(profile);
1165
            return;
1166
        }
1167
        for (DataProfile theProfile : this.dataProfiles) {
1168
            if( theProfile.getID().equalsIgnoreCase(profile.getID()) ) {
1169
                return;
1170
            }
1171
        }
1172
        this.dataProfiles.add(profile);
1173
    }
1174

    
1175
    @Override
1176
    public List<DataProfile> getDataProfiles() {
1177
        if( this.dataProfiles==null ) {
1178
            return null;
1179
        }
1180
        return Collections.unmodifiableList(this.dataProfiles);
1181
    }
1182

    
1183
    @Override
1184
    public DataProfile getDataProfile(String name) {
1185
        if( StringUtils.isBlank(name) ) {
1186
            return null;
1187
        }
1188
        for (DataProfile theProfile : this.dataProfiles) {
1189
            if( name.equalsIgnoreCase(theProfile.getName()) ) {
1190
                return theProfile;
1191
            }
1192
        }
1193
        return null;
1194
    }
1195

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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