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

History | View | Annotate | Download (59.4 KB)

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

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

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

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

    
139
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
140
    
141
    public static final long DEFAULT_MAX_SIZE_FOR_SMALL_FEATURE_SELECTION = 2000000000;
142
    
143
    private class Registers {
144

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

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

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

    
173
    private final Registers registers;
174

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

    
177
    private OpenErrorHandler openErrorHandler = null;
178

    
179
    private DataServerExplorerPool dataServerExplorerPool = null;
180

    
181
    private List<DataType> dataTypes = null;
182

    
183
    private ClassLoader resourcesLoader = null;
184

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
317
    }
318

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

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

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

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

    
347
    }
348

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

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

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

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

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

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

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

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

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

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

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

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

    
537
    }
538

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

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

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

    
581
        parameters.validate();
582

    
583
        String storeName = this.getStoreName(parameters);
584
        if( StringUtils.isEmpty(storeName) ) {
585
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
586
            LOGGER.warn(msg);
587
            throw new IllegalArgumentException(msg);
588
        }
589

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

    
603
        DataStore store = (DataStore) storeFactory.create(parameters, this);
604
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
605

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

    
612
        storeFactory.setProvider(store, provider);
613
  
614
        addObservers(store);
615
        if( store instanceof FeatureStoreProviderServices ) {
616
          ((FeatureStoreProviderServices) store).notifyChange(DataStoreNotification.AFTER_OPEN);
617
        }
618
        return store;
619
    }
620
    
621
    public void addObservers(DataStore store){
622
        for (Observer storeObserver : storeObservers) {
623
          if( storeObserver!=null) {
624
            store.addObserver(storeObserver);
625
          }
626
        }
627
    }
628

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
822
    }
823

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

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

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

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

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

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

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

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

    
911

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1312
    @Override
1313
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
1314
        ResourcesStorage.Resource resource = null;
1315
        try {
1316
            if( resources == null || resources.isReadOnly() ) {
1317
                return;
1318
            }
1319
            resource = resources.getResource("dal");
1320
            if( resource == null || resource.isReadOnly() ) {
1321
                return;
1322
            }
1323
            DALFile dalFile = DALFile.getDALFile();
1324
            dalFile.setFeatureType(featureType);
1325
            if( !dalFile.isEmpty() ) {
1326
                dalFile.write(resource);
1327
            }
1328
        } catch (Throwable ex) {
1329
            LOGGER.warn("Can't save DAL resource", ex);
1330
        } finally {
1331
            IOUtils.closeQuietly(resource);
1332
        }
1333
    }
1334

    
1335
    private Map<String,DynObjectValueItem[]> availableValues = null;
1336
    
1337
    @Override
1338
    public void clearAvailableValuesCache() {
1339
      this.availableValues = null;
1340
    }
1341
    
1342
    @Override
1343
    public DynObjectValueItem[] getAvailableValues(DynObject contextValues, FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1344
        String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName();
1345
        if( this.availableValues==null ) {
1346
            this.availableValues = new HashMap<>();
1347
        }
1348
        DynObjectValueItem[] values = this.availableValues.get(keyName);
1349
        if( values != null ) {
1350
            return values;
1351
        }
1352
        if( !descriptor.isForeingKey() ) {
1353
            return null;
1354
        }
1355
        ForeingKey foreingKey = descriptor.getForeingKey();
1356
        FeatureStore foreingStore = null;
1357
        DisposableFeatureSetIterable  set = null;
1358
        try {
1359
            StoresRepository theStoresRepository;
1360
            FeatureStore store = descriptor.getStore();
1361
            if (store == null) {
1362
                theStoresRepository = DALLocator.getDataManager().getStoresRepository();
1363

    
1364
            } else {
1365
                theStoresRepository = store.getStoresRepository();
1366
            }
1367
            foreingStore = (FeatureStore) theStoresRepository.getStore(
1368
                foreingKey.getTableName()
1369
            );
1370
            Expression labelExpression = foreingKey.getLabelExpression(null);
1371
            String codeName = foreingKey.getCodeName();
1372
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable("feature");
1373
            MutableSymbolTable symbolTable = featureSymbolTable.createParent();
1374
        
1375
            Expression filter = descriptor.getAvailableValuesFilter();
1376
            if( filter != null ) {
1377
                MutableSymbolTable filterFeatureSymbolTable = ExpressionUtils.createSymbolTable(
1378
                        "filter", contextValues
1379
                );
1380
                featureSymbolTable.addSymbolTable(filterFeatureSymbolTable);
1381
            }
1382

    
1383
            List<DynObjectValueItem> values_list = new ArrayList<>();
1384
            int n = 0;
1385
            for (Feature feature : set = foreingStore.getFeatureSet().iterable()) {
1386
                Object value = feature.get(codeName);
1387
                Object label;
1388
                if (labelExpression == null) {
1389
                    label = value;
1390
                } else {
1391
                    featureSymbolTable.setFeature(feature);
1392
                    label = labelExpression.execute(symbolTable);
1393
                }
1394

    
1395
                if( filter != null ) {
1396
                    symbolTable.setVar("$value", value);
1397
                    symbolTable.setVar("$label", label);
1398
                    featureSymbolTable.setFeature(feature);
1399
                    Object include = filter.execute(featureSymbolTable);
1400
                    if( DataTypeUtils.isFalse(include, false) ) {
1401
                        continue;
1402
                    }
1403
                }
1404
  
1405
                values_list.add(new DynObjectValueItem(value, Objects.toString(label, Objects.toString(value, "##ERROR##"))));
1406
                if( n>=MAX_AVAILABLE_VALUES ) {
1407
                    break;
1408
                }
1409
            }
1410
            values = values_list.toArray(new DynObjectValueItem[values_list.size()]);
1411
            if( filter==null ) {
1412
                this.availableValues.put(keyName, values);
1413
            }
1414
            return values;
1415
        } catch (Exception ex) {
1416
            LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex);
1417
        } finally {
1418
            DisposeUtils.disposeQuietly(set);
1419
            DisposeUtils.disposeQuietly(foreingStore);
1420
        }
1421
        return null;
1422
    }
1423

    
1424
    @Override
1425
    public String createUniqueID() {
1426
        UUID x = UUID.randomUUID();
1427
        String s = x.toString();
1428
        return s;
1429
    }
1430

    
1431
    @Override
1432
    public EditableFeatureAttributeDescriptor createFeatureAttributeDescriptor() {
1433
        DefaultEditableFeatureAttributeDescriptor edi = new DefaultEditableFeatureAttributeDescriptor(null, false);
1434
        return edi;
1435
    }
1436

    
1437
  @Override
1438
  public DALExpressionBuilder createDALExpressionBuilder() {
1439
    return new DefaultDALExpressionBuilder();
1440
  }
1441

    
1442
  @Override
1443
  public void addStoreObserver(Observer observer) {
1444
    this.storeObservers.add(observer);
1445
  }
1446

    
1447
  @Override
1448
  public void removeStoreObserver(Observer observer) {
1449
    this.storeObservers.remove(observer);
1450
  }
1451

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

    
1469
    @Override
1470
    public long getMaxSizeForSmallFeatureSelection() {
1471
        return this.maxSizeForSmallFeatureSelection;
1472
    }
1473

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

    
1489
    @Override
1490
    public Set createLargeSet() {
1491
        return (Set) this.largeSetFactory.create();
1492
    }
1493

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

    
1531
    @Override
1532
    public FeatureRuleExpression createFeatureRuleExpression() {
1533
        FeatureRuleExpression rule = new DefaultFeatureRuleExpression();
1534
        return rule;
1535
    }
1536
    
1537
}