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

History | View | Annotate | Download (45.7 KB)

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

    
3
import java.io.ByteArrayInputStream;
4
import java.io.File;
5
import java.io.InputStream;
6
import java.net.URL;
7
import java.net.URLClassLoader;
8
import java.util.ArrayList;
9
import java.util.Collections;
10
import java.util.HashMap;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.Objects;
14
import java.util.UUID;
15
import org.apache.commons.io.IOUtils;
16
import org.apache.commons.lang3.StringUtils;
17
import org.gvsig.expressionevaluator.Expression;
18
import org.gvsig.expressionevaluator.ExpressionBuilder;
19
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
20
import org.gvsig.expressionevaluator.MutableSymbolTable;
21
import org.gvsig.fmap.dal.BaseStoresRepository;
22
import org.gvsig.fmap.dal.DALLocator;
23

    
24
import org.gvsig.fmap.dal.DataFactory;
25
import org.gvsig.fmap.dal.DataManager;
26
import org.gvsig.fmap.dal.DataParameters;
27
import org.gvsig.fmap.dal.DataServerExplorer;
28
import org.gvsig.fmap.dal.DataServerExplorerFactory;
29
import org.gvsig.fmap.dal.DataServerExplorerParameters;
30
import org.gvsig.fmap.dal.DataServerExplorerPool;
31
import org.gvsig.fmap.dal.DataStore;
32
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
33
import org.gvsig.fmap.dal.DataStoreParameters;
34
import org.gvsig.fmap.dal.DataStoreProviderFactory;
35
import org.gvsig.fmap.dal.DataTypes;
36
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
37

    
38
import org.gvsig.fmap.dal.NewDataStoreParameters;
39
import org.gvsig.fmap.dal.OpenErrorHandler;
40
import org.gvsig.fmap.dal.Register;
41
import org.gvsig.fmap.dal.StoresRepository;
42
import org.gvsig.fmap.dal.exception.DataException;
43
import org.gvsig.fmap.dal.exception.InitializeException;
44
import org.gvsig.fmap.dal.exception.OpenException;
45
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
46
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
47
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
48
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
49
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
50
import org.gvsig.fmap.dal.feature.DataProfile;
51
import org.gvsig.fmap.dal.feature.EditableFeatureType;
52
import org.gvsig.fmap.dal.feature.Feature;
53
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
54
import org.gvsig.fmap.dal.feature.FeatureQuery;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.dal.feature.ForeingKey;
58
import static org.gvsig.fmap.dal.feature.ForeingKey.MAX_AVAILABLE_VALUES;
59
import org.gvsig.fmap.dal.feature.impl.DALFile;
60
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
61
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
62
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
63
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
64
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
65
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
66
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
67
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
68
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
69
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
70
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
71
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
72
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
73
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
74
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureSymbolTable;
75
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
76
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
77
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
78
import org.gvsig.fmap.dal.spi.DALSPILocator;
79
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
80
import org.gvsig.fmap.dal.spi.DataStoreProvider;
81
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
82
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
83
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
84
import org.gvsig.tools.ToolsLocator;
85
import org.gvsig.tools.dataTypes.DataType;
86
import org.gvsig.tools.dataTypes.DataTypesManager;
87
import org.gvsig.tools.dynobject.DynObject;
88
import org.gvsig.tools.dynobject.DynObjectValueItem;
89
import org.gvsig.tools.dynobject.DynStruct;
90
import org.gvsig.tools.dynobject.DynStruct_v2;
91
import org.gvsig.tools.dynobject.Tags;
92
import org.gvsig.tools.evaluator.Evaluator;
93
import org.gvsig.tools.exception.BaseException;
94
import org.gvsig.tools.extensionpoint.ExtensionPoint;
95
import org.gvsig.tools.folders.FoldersManager;
96
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
97
import org.gvsig.tools.identitymanagement.UnauthorizedException;
98
import org.gvsig.tools.persistence.PersistenceManager;
99
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
100
import org.gvsig.tools.service.spi.Services;
101
import org.slf4j.Logger;
102
import org.slf4j.LoggerFactory;
103

    
104
@SuppressWarnings("UseSpecificCatch")
105
public class DefaultDataManager
106
        implements DataManager, DataManagerProviderServices, Services {
107

    
108
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataManager.class);
109
    
110
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
111
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
112
        "DAL cache providers";
113

    
114
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
115

    
116

    
117
    private class Registers {
118

    
119
        private final Register store;
120
        private final Register storeProvider;
121
        private final Register serverExplorer;
122
        private final Register featureIndexProvider;
123

    
124
        public Registers() {
125
            this.store = new RegisterImpl(
126
                    "Data.manager.stores.factory",
127
                    "DAL store factories"
128
            );
129
            this.storeProvider = new RegisterImpl(
130
                    "Data.manager.providers.factory",
131
                    "DAL store provider factories"
132
            );
133
            this.serverExplorer = new RegisterImpl(
134
                    "Data.manager.servereexplorer.factory",
135
                    "DAL server explorer factories"
136
            );
137
            this.featureIndexProvider = new RegisterImpl(
138
                    "Data.manager.feature.index.factory",
139
                    "DAL feature index factories"
140
            );
141

    
142
            this.store.register(new FeatureStoreFactory());
143
        }
144
    }
145
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
146

    
147
    private final Registers registers;
148

    
149
    private final Map<Integer, String> defaultDataIndexProviders;
150

    
151
    private OpenErrorHandler openErrorHandler = null;
152

    
153
    private DataServerExplorerPool dataServerExplorerPool = null;
154

    
155
    private List<DataType> dataTypes = null;
156

    
157
    private ClassLoader resourcesLoader = null;
158

    
159
    private List<DataProfile> dataProfiles;
160
    
161
    private final Map<String, DatabaseWorkspaceManager> databaseWorkspaces = new HashMap<>();
162
    
163
    public DefaultDataManager() {
164
        this.registers = new Registers();
165
        this.defaultDataIndexProviders = new HashMap<>();
166
    }
167

    
168
    @Override
169
    public Register getStoreRegister() {
170
        return this.registers.store;
171
    }
172

    
173
    @Override
174
    public Register getStoreProviderRegister() {
175
        return this.registers.storeProvider;
176
    }
177

    
178
    @Override
179
    public Register getServerExplorerRegister() {
180
        return this.registers.serverExplorer;
181
    }
182

    
183
    @Override
184
    public Register getFeatureIndexRegister() {
185
        return this.registers.featureIndexProvider;
186
    }
187

    
188
    private String getStoreName(DataStoreParameters parameters) {
189
        for (DataFactory factory : this.getStoreRegister()) {
190
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
191
            if (storeFactory.canUse(parameters)) {
192
                return storeFactory.getName();
193
            }
194
        }
195
        return null;
196
    }
197

    
198
    /**
199
     * @deprecated
200
     */
201
    @Override
202
    public void registerDefaultRasterStore(Class rasterStoreClass) {
203
        // Metodo usado por el raster nuevo para regstrar su factoria de store
204
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
205
    }
206

    
207
    /**
208
     * @deprecated
209
     */
210
    @Override
211
    public void registerStoreFactory(String name, Class storeFactoryClass) {
212
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
213
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
214
    }
215

    
216
    /**
217
     * @param name
218
     * @param storeProviderClass
219
     * @param parametersClass
220
     * @deprecated use registerStoreProviderFactory
221
     */
222
    @Override
223
    public void registerStoreProvider(String name, Class storeProviderClass,
224
            Class parametersClass) {
225
        if (name == null || storeProviderClass == null || parametersClass == null) {
226
            throw new IllegalArgumentException("Any parameters can be null");
227
        }
228

    
229
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
230
            throw new IllegalArgumentException(parametersClass.getName()
231
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
232
        }
233

    
234
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
235
            // Envuelve al proveedor en una factoria por defecto.
236
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
237
                    name, "", storeProviderClass, parametersClass));
238
            return;
239
        }
240

    
241
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
242
            // Envuelve al proveedor en una factoria por defecto.
243
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
244
                    name, "", storeProviderClass, parametersClass));
245
            return;
246
        }
247

    
248
        throw new IllegalArgumentException("Not supported implemtation: name="
249
                + name + " provider class=" + storeProviderClass.getName());
250

    
251
    }
252

    
253
    @Override
254
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
255
        if (name == null || explorerClass == null || parametersClass == null) {
256
            // FIXME Exception
257
            throw new IllegalArgumentException("Any parameters can be null");
258
        }
259

    
260
        if (!DataServerExplorerParameters.class
261
                .isAssignableFrom(parametersClass)) {
262
            // FIXME Exception
263
            throw new IllegalArgumentException(
264
                    parametersClass.getName()
265
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
266
        }
267

    
268
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
269
            // FIXME Exception
270
            throw new IllegalArgumentException(explorerClass.getName()
271
                    + " must implement org.gvsig.fmap.dal.DataServerExplorer");
272
        }
273

    
274
        // Envuelve al proveedor en una factoria por defecto.
275
        this.registerServerExplorerFactory(
276
                new DataServerExplorerToDataExplorerFactoryWrapper(
277
                        name, "", explorerClass, parametersClass
278
                )
279
        );
280

    
281
    }
282

    
283
    @Override
284
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
285
        this.getStoreRegister().register(factory);
286
    }
287

    
288
    @Override
289
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
290
        this.getStoreProviderRegister().register(factory);
291
    }
292

    
293
    @Override
294
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
295
        this.getServerExplorerRegister().register(factory);
296
    }
297

    
298
    @Override
299
    public DataStoreParameters createStoreParameters(byte[] data) {
300
        try {
301
            PersistenceManager persistenceManager = ToolsLocator.getPersistenceManager();
302
            ByteArrayInputStream stream = new ByteArrayInputStream(data);
303
            DataStoreParameters parameters = (DataStoreParameters) persistenceManager.getObject(stream);
304
            return parameters;
305
        } catch (Exception ex) {
306
            LOGGER.warn("Can't get parameters from byte[].",ex);
307
            return null;
308
        }
309
    }
310

    
311
    @Override
312
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
313
        if( providerName == null ) {
314
            String msg = "Provider name can't be null.";
315
            LOGGER.warn(msg);
316
            throw new IllegalArgumentException(msg);
317
        }
318
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
319
        if( providerFactory == null ) {
320
            String msg = "Can't locate provider factory for '"+providerName+"'.";
321
            LOGGER.warn(msg);
322
            throw new IllegalArgumentException(msg);
323
        }
324
        return (DataStoreParameters) providerFactory.createParameters();
325
    }
326

    
327
    @Override
328
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
329
        try {
330
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
331
            return explorer.getAddParameters(providerName);
332
        } catch (Exception ex) {
333
            throw new InitializeException(ex);
334
        }
335
    }
336

    
337
    @Override
338
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
339
        if( explorerName == null ) {
340
            String msg = "Explorer name can't be null.";
341
            LOGGER.warn(msg);
342
            throw new IllegalArgumentException(msg);
343
        }
344
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
345
        if( explorerFactory == null ) {
346
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
347
            LOGGER.warn(msg);
348
            throw new IllegalArgumentException(msg);
349
        }
350
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
351
        return params;
352
    }
353

    
354
    @Override
355
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
356
        try {
357
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
358
            if (autoOrderAttributeName != null) {
359
                parameters.setDynValue(
360
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
361
                        autoOrderAttributeName);
362
            }
363
            return parameters;
364
        } catch (Exception ex) {
365
            throw new InitializeException(ex);
366
        }
367
    }
368

    
369
    @Override
370
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
371
        if( explorerName == null ) {
372
            String msg = "Explorer name can't be null.";
373
            LOGGER.warn(msg);
374
            throw new IllegalArgumentException(msg);
375
        }
376
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
377
        if( explorerFactory == null ) {
378
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
379
            LOGGER.warn(msg);
380
            throw new IllegalArgumentException(msg);
381
        }
382
        if (parameters == null) {
383
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
384
        }
385
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
386
                parameters,
387
                new DefaultDataServerExplorerProviderServices()
388
        );
389
        return explorer;
390
    }
391

    
392
    @Override
393
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
394
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
395
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorercon solo 
396
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
397
            // llamar al que toca.
398
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
399
        }
400
        if( explorerName == null ) {
401
            String msg = "Explorer name can't be null.";
402
            LOGGER.warn(msg);
403
            throw new IllegalArgumentException(msg);
404
        }
405
        if( (arguments.length % 2)!= 0 ) {
406
            throw new ValidateDataParametersException();
407
        }
408
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
409
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
410
        for( int i=0; i<arguments.length; i+=2 ) {
411
            String name = (String) arguments[i];
412
            Object value = arguments[i+1];
413
            parameters.setDynValue(name, value);
414
        }
415
        return this.openServerExplorer(explorerName, parameters);
416

    
417
    }
418

    
419
    /**
420
     * @param parameters
421
     * @return
422
     * @throws org.gvsig.fmap.dal.exception.InitializeException
423
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
424
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
425
     * @deprecated see openServerExplorer
426
     */
427
    @Override
428
    public DataServerExplorer createServerExplorer(
429
            DataServerExplorerParameters parameters) throws InitializeException,
430
            ProviderNotRegisteredException, ValidateDataParametersException {
431
        return openServerExplorer(parameters.getExplorerName(), parameters);
432
    }
433

    
434
    /**
435
     * @deprecated use openStore
436
     * @param parameters
437
     * @return
438
     * @throws InitializeException
439
     * @throws ProviderNotRegisteredException
440
     * @throws ValidateDataParametersException
441
     */
442
    @Override
443
    public DataStore createStore(DataStoreParameters parameters)
444
        throws InitializeException, ProviderNotRegisteredException,
445
        ValidateDataParametersException {
446
        return openStore(parameters.getDataStoreName(), parameters);
447
    }
448

    
449
    @Override
450
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
451
        if( providerName == null ) {
452
            String msg = "Provider name can't be null.";
453
            LOGGER.warn(msg);
454
            throw new IllegalArgumentException(msg);
455
        }
456
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
457
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
458
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
459
        }
460

    
461
        parameters.validate();
462

    
463
        String storeName = this.getStoreName(parameters);
464
        if( StringUtils.isEmpty(storeName) ) {
465
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
466
            LOGGER.warn(msg);
467
            throw new IllegalArgumentException(msg);
468
        }
469

    
470
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
471
        if( storeFactory == null ) {
472
            String msg = "Can't locate store factory for '"+storeName+"'.";
473
            LOGGER.warn(msg);
474
            throw new IllegalArgumentException(msg);
475
        }
476
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
477
        if( providerFactory == null ) {
478
            String msg = "Can't locate provider factory for '"+providerName+"'.";
479
            LOGGER.warn(msg);
480
            throw new IllegalArgumentException(msg);
481
        }
482

    
483
        DataStore store = (DataStore) storeFactory.create(parameters, this);
484
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
485

    
486
        storeFactory.setProvider(store, provider);
487
        return store;
488
    }
489

    
490
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
491
        String storeName = this.getStoreName(parameters);
492
        if( StringUtils.isEmpty(storeName) ) {
493
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
494
            LOGGER.warn(msg);
495
            throw new IllegalArgumentException(msg);
496
        }
497

    
498
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
499
        if( storeFactory == null ) {
500
            String msg = "Can't locate store factory for '"+storeName+"'.";
501
            LOGGER.warn(msg);
502
            throw new IllegalArgumentException(msg);
503
        }
504
        DataStore store = (DataStore) storeFactory.create(parameters, this);
505
        storeFactory.setProvider(store, provider);
506
        return store;
507
    }
508
    
509
    @Override
510
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
511
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
512
        DataStore store = openStore(params.getDataStoreName(), params);
513
        return store;
514
    }
515

    
516
    @Override
517
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
518
        if( arguments.length == 1 ) { 
519
            // Desde jython entra por este metodo en lugar de los especificos
520
            // de DataStoreParameters o DynObject
521
            if( arguments[0] instanceof DataStoreParameters ) {
522
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
523
            } else if( arguments[0] instanceof DynObject ) {
524
                return this.openStore(providerName, (DynObject)(arguments[0]));
525
            }
526
        }
527
        if( (arguments.length % 2)!= 0 ) {
528
            throw new ValidateDataParametersException();
529
        }
530
        if( providerName == null ) {
531
            String msg = "Provider name can't be null.";
532
            LOGGER.warn(msg);
533
            throw new IllegalArgumentException(msg);
534
        }
535
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
536
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
537
        for( int i=0; i<arguments.length; i+=2 ) {
538
            String name = (String) arguments[i];
539
            Object value = arguments[i+1];
540
            parameters.setDynValue(name, value);
541
        }
542
        return this.openStore(providerName, parameters);
543
    }
544

    
545
    @Override
546
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
547
        try {
548
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
549
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
550
            return (FeatureStore) store;
551
        } catch (Exception ex) {
552
            throw new InitializeException(ex);
553
        }
554
    }
555

    
556
    @Override
557
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
558
        if( providerName == null ) {
559
            String msg = "Provider name can't be null.";
560
            LOGGER.warn(msg);
561
            throw new IllegalArgumentException(msg);
562
        }
563
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
564
        return (DataStoreProviderFactory) providerFactory;
565
    }
566

    
567
    @Override
568
    public List<String> getStoreProviders() {
569
        return this.getStoreProviderRegister().getFactoryNames();
570
    }
571

    
572
    @Override
573
    public List<String> getStoreProviders(String explorerName) {
574
        if( explorerName == null ) {
575
            String msg = "Explorer name can't be null.";
576
            LOGGER.warn(msg);
577
            throw new IllegalArgumentException(msg);
578
        }
579
        try {
580
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
581
            List names = explorer.getDataStoreProviderNames();
582
            return names;
583
        } catch (Exception ex) {
584
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
585
        }
586
    }
587

    
588
    @Override
589
    public List<String> getExplorerProviders() {
590
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
591
        return names;
592
    }
593

    
594
    @Override
595
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
596

    
597
        String providerName = parameters.getDataStoreName();
598
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
599
        if (providerFactory == null) {
600
            throw new ProviderNotRegisteredException(providerName);
601
        }
602
        while (true) {
603
            try {
604
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
605
                        parameters, providerServices
606
                );
607
                return provider;
608
            } catch (Exception e) {
609
                if (openErrorHandler == null) {
610
                    throw new InitializeException(providerName, e);
611
                }
612
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
613
                if (!retry) {
614
                    throw new InitializeException(providerName, e);
615
                }
616
            }
617
        }
618
    }
619

    
620
    @Override
621
    public List<String> getFeatureIndexProviders() {
622
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
623
        return names;
624
    }
625

    
626
    @Override
627
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
628
        this.defaultDataIndexProviders.put(dataType, name);
629
    }
630

    
631
    @Override
632
    public String getDefaultFeatureIndexProviderName(int dataType) {
633
        return this.defaultDataIndexProviders.get(dataType);
634
    }
635

    
636
    @Override
637
    public FeatureIndexProviderServices createFeatureIndexProvider(
638
            String name,
639
            FeatureStore store,
640
            FeatureType type,
641
            String indexName,
642
            FeatureAttributeDescriptor attr
643
    ) throws InitializeException, ProviderNotRegisteredException {
644

    
645
        if (name == null) {
646
            name = getDefaultFeatureIndexProviderName(attr.getType());
647
        }
648

    
649
        if (name == null) {
650
            throw new InitializeException(
651
                    "There not any index provider registered.", null);
652
        }
653
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
654
        if (indexfactory == null) {
655
            throw new InitializeException(
656
                    "There not any index provider registered with name '" + name + "'.", null);
657

    
658
        }
659
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
660

    
661
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
662
                (FeatureStoreProviderServices) store,
663
                type,
664
                provider,
665
                attr.getName(),
666
                indexName
667
        );
668
        services.initialize();
669
        return services;
670

    
671
    }
672

    
673
    @Override
674
    public String getTemporaryDirectory() {
675
        FoldersManager manager = ToolsLocator.getFoldersManager();
676
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
677
        return folder.getAbsolutePath();
678
    }
679

    
680
    @Override
681
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
682
        if (!(struct instanceof DynStruct_v2)) {
683
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
684
        }
685
        Tags tags = ((DynStruct_v2) struct).getTags();
686
        return this.createStoreParameters(tags);
687
    }
688

    
689
    @Override
690
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
691
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
692
        if (providerName == null) {
693
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
694
        }
695
        int prefixlen = TAG_DAL_OPENSTORE.length();
696
        DataStoreParameters parameters = this.createStoreParameters(providerName);
697
        for (String key : tags) {
698
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
699
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
700
            }
701
        }
702
        return parameters;
703
    }
704

    
705
    @Override
706
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
707
        DataStoreParameters paramters = this.createStoreParameters(struct);
708
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
709
        return store;
710
    }
711

    
712
    @Override
713
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
714
        if( explorerName == null ) {
715
            String msg = "Explorer name can't be null.";
716
            LOGGER.warn(msg);
717
            throw new IllegalArgumentException(msg);
718
        }
719
        if( providerName == null ) {
720
            String msg = "Provider name can't be null.";
721
            LOGGER.warn(msg);
722
            throw new IllegalArgumentException(msg);
723
        }
724

    
725
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
726
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
727
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
728
        }
729
        parameters.validate();
730
        try {
731
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
732
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
733
            server.add(providerName, parameters, overwrite);
734
        } catch (Exception e) {
735
            throw new InitializeException(e);
736
        }
737
    }
738

    
739
    @Override
740
    @Deprecated
741
    public Evaluator createExpresion(String expression) throws InitializeException {
742
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
743
        exp.setPhrase(expression);
744
        return this.createExpresion(exp);
745
    }
746

    
747
    @Override
748
    @Deprecated
749
    public Evaluator createExpresion(Expression expression) throws InitializeException {
750
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
751
        return exp;        
752
    }
753

    
754

    
755
    @Override
756
    public Evaluator createFilter(String expression) throws InitializeException {
757
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
758
        exp.setPhrase(expression);
759
        return this.createFilter(exp);
760
    }
761

    
762
    @Override
763
    public Evaluator createFilter(Expression expression) throws InitializeException {
764
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
765
        return exp;        
766
    }
767

    
768
    @Override
769
    public FeaturePagingHelper createFeaturePagingHelper(
770
            FeatureStore featureStore, int pageSize) throws BaseException {
771
        return new FeaturePagingHelperImpl(featureStore, pageSize);
772
    }
773

    
774
    @Override
775
    public FeaturePagingHelper createFeaturePagingHelper(
776
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
777
            throws BaseException {
778
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
779
    }
780

    
781
    @Override
782
    public void setOpenErrorHandler(OpenErrorHandler handler) {
783
        openErrorHandler = handler;
784
    }
785

    
786
    @Override
787
    public OpenErrorHandler getOpenErrorHandler() {
788
        return this.openErrorHandler;
789
    }
790

    
791
    @Override
792
    public EditableFeatureType createFeatureType() {
793
        return new DefaultEditableFeatureType(null);
794
    }
795

    
796
    @Override
797
    public DataServerExplorerPool getDataServerExplorerPool() {
798
        if (this.dataServerExplorerPool == null) {
799
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
800
        }
801
        return this.dataServerExplorerPool;
802
    }
803

    
804
    @Override
805
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
806
        this.dataServerExplorerPool = pool;
807
    }
808

    
809
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
810
        if (params instanceof DataStoreParameters) {
811
            return (DataStoreParameters) params;
812
        }
813
        String providerName;
814
        try {
815
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
816
        } catch (Exception ex) {
817
            providerName = provider;
818
        }
819
        DataStoreParameters parameters = this.createStoreParameters(providerName);
820
        ToolsLocator.getDynObjectManager().copy(params, parameters);
821
        return parameters;
822
    }
823

    
824
    @Override
825
    public List<DataType> getDataTypes() {
826
        if (dataTypes == null) {
827
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
828
            dataTypes = new ArrayList<>();
829
            dataTypes.add(manager.get(DataTypes.STRING));
830
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
831
            dataTypes.add(manager.get(DataTypes.INT));
832
            dataTypes.add(manager.get(DataTypes.DOUBLE));
833
            dataTypes.add(manager.get(DataTypes.DATE));
834
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
835
        }
836
        return dataTypes;
837
    }
838

    
839
    @Override
840
    public void setResourcesLoader(ClassLoader loader) {
841
        this.resourcesLoader = loader;
842
    }
843

    
844
    @Override
845
    public void setResourcesLoader(File folder) {
846
        if (folder == null) {
847
            this.resourcesLoader = null;
848
            return;
849
        }
850
        try {
851
            URL[] urls = new URL[]{folder.toURI().toURL()};
852
            this.resourcesLoader = new URLClassLoader(urls);
853
        } catch (Exception ex) {
854
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
855
        }
856
    }
857

    
858
    @Override
859
    public URL getResource(Object reourceLoader, String name) {
860
        URL x;
861
        if (this.resourcesLoader != null) {
862
            x = this.resourcesLoader.getResource(name);
863
            if (x != null) {
864
                return x;
865
            }
866
        }
867
        x = reourceLoader.getClass().getResource(name);
868
        return x;
869
    }
870

    
871
    @Override
872
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
873
        InputStream x;
874
        if (this.resourcesLoader != null) {
875
            x = this.resourcesLoader.getResourceAsStream(name);
876
            if (x != null) {
877
                return x;
878
            }
879
        }
880
        x = reourceLoader.getClass().getResourceAsStream(name);
881
        return x;
882
    }
883

    
884
    @Override
885
    public ExpressionBuilder createExpressionBuilder() {
886
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
887
    }
888

    
889
    public void registerFeatureCacheProvider(
890
        FeatureCacheProviderFactory providerFactory) {
891
        ToolsLocator.getExtensionPointManager()
892
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
893
            .append(providerFactory.getName(), "", providerFactory);
894
    }
895

    
896
    public FeatureCacheProvider createFeatureCacheProvider(String name,
897
        DynObject parameters) throws DataException {
898
        if (name == null) {
899
            throw new InitializeException(
900
                "It is necessary to provide a cache name", null);
901
        }
902
        if (parameters == null) {
903
            throw new InitializeException(
904
                "It is necessary to provide parameters to create the explorer",
905
                null);
906
        }
907
        FeatureCacheProviderFactory featureCacheProviderFactory;
908
        try {
909
            featureCacheProviderFactory =
910
                (FeatureCacheProviderFactory) ToolsLocator
911
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
912
                    .create(name);
913
            if (featureCacheProviderFactory == null) {
914
                throw new ProviderNotRegisteredException(name);
915
            }
916
            return featureCacheProviderFactory.createCacheProvider(parameters);
917
        } catch (InstantiationException e) {
918
            throw new InitializeException(e);
919
        } catch (IllegalAccessException e) {
920
            throw new InitializeException(e);
921
        }
922
    }
923

    
924
    @Override
925
    public List getFeatureCacheProviders() {
926
        ExtensionPoint extensionPoint =
927
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
928
        if (extensionPoint != null) {
929
            return ToolsLocator.getExtensionPointManager()
930
                .get(DATA_MANAGER_CACHE).getNames();
931
        } else {
932
            return new ArrayList();
933
        }
934
    }
935

    
936
    @Override
937
    public DynObject createCacheParameters(String name)
938
        throws InitializeException, ProviderNotRegisteredException {
939
        if (name == null) {
940
            throw new InitializeException(
941
                "It is necessary to provide a cache name", null);
942
        }
943
        FeatureCacheProviderFactory featureCacheProviderFactory;
944
        try {
945
            featureCacheProviderFactory =
946
                (FeatureCacheProviderFactory) ToolsLocator
947
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
948
                    .create(name);
949
            if (featureCacheProviderFactory == null) {
950
                throw new ProviderNotRegisteredException(name);
951
            }
952
            return featureCacheProviderFactory.createParameters();
953
        } catch (InstantiationException e) {
954
            throw new InitializeException(e);
955
        } catch (IllegalAccessException e) {
956
            throw new InitializeException(e);
957
        }
958
    }
959

    
960
    @Override
961
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
962
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
963
        DataServerExplorerParameters eparams = null;
964
        DataServerExplorer serverExplorer;
965
        try {
966
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
967
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
968
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
969
        }
970

    
971
        try {
972
            serverExplorer.add(providerName, params, overwrite);
973
        } catch (DataException e) {
974
            throw new CreateFileStoreException(e, providerName);
975
        }
976
    }
977

    
978
    @Override
979
    public FeatureSymbolTable createFeatureSymbolTable() {
980
        FeatureSymbolTable symbolTable = new DefaultFeatureSymbolTable();
981
        return symbolTable;
982
    }
983

    
984
    @Override
985
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
986
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
987
        return emulator;
988
    }
989

    
990
    @Override
991
    public void registerDataProfile(DataProfile profile) {
992
        if( profile==null ) {
993
            return;
994
        }
995
        if( this.dataProfiles==null ) {
996
            this.dataProfiles = new ArrayList<>();
997
            this.dataProfiles.add(profile);
998
            return;
999
        }
1000
        for (DataProfile theProfile : this.dataProfiles) {
1001
            if( theProfile.getID().equalsIgnoreCase(profile.getID()) ) {
1002
                return;
1003
            }
1004
        }
1005
        this.dataProfiles.add(profile);
1006
    }
1007

    
1008
    @Override
1009
    public List<DataProfile> getDataProfiles() {
1010
        if( this.dataProfiles==null ) {
1011
            return null;
1012
        }
1013
        return Collections.unmodifiableList(this.dataProfiles);
1014
    }
1015

    
1016
    @Override
1017
    public DataProfile getDataProfile(String name) {
1018
        if( StringUtils.isBlank(name) ) {
1019
            return null;
1020
        }
1021
        for (DataProfile theProfile : this.dataProfiles) {
1022
            if( name.equalsIgnoreCase(theProfile.getName()) ) {
1023
                return theProfile;
1024
            }
1025
        }
1026
        return null;
1027
    }
1028

    
1029
    private StoresRepository storesRepository;
1030
    
1031
    @Override
1032
    public StoresRepository getStoresRepository() {
1033
        if( this.storesRepository==null ) {
1034
            this.storesRepository = new BaseStoresRepository("DAL");
1035
        }
1036
        return this.storesRepository;
1037
    }
1038
    
1039
    @Override
1040
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1041
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1042
        return workspace;
1043
    }
1044

    
1045
    @Override
1046
    public void addDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1047
        this.databaseWorkspaces.put(databaseWorkspace.getId(),databaseWorkspace);
1048
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1049
        this.getStoresRepository().addRepository(repo);
1050
    }
1051

    
1052
    @Override
1053
    public DatabaseWorkspaceManager getDatabaseWorkspace(String name) {
1054
        return this.databaseWorkspaces.get(name);
1055
    }
1056
    
1057
    @Override
1058
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataStoreParameters params) {
1059
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1060
            if( databaseWorkspace.getStoresRepository().contains(params) ) {
1061
                return databaseWorkspace;
1062
            }
1063
        }
1064
        return null;
1065
    }
1066
    
1067
    @Override
1068
    public void writeDALResource(ResourcesStorage resources, DataStore store) {
1069
        ResourcesStorage.Resource resource = null;
1070
        try {
1071
            if( resources == null || resources.isReadOnly() ) {
1072
                return;
1073
            }
1074
            resource = resources.getResource("dal");
1075
            if( resource == null || resource.isReadOnly() ) {
1076
                return;
1077
            }
1078
            DALFile dalFile = DALFile.getDALFile();
1079
            dalFile.setStore((DefaultFeatureStore) store);
1080
            if( !dalFile.isEmpty() ) {
1081
                dalFile.write(resource);
1082
            }
1083
        } catch (Throwable ex) {
1084
            LOGGER.warn("Can't save DAL resource", ex);
1085
        } finally {
1086
            IOUtils.closeQuietly(resource);
1087
        }
1088
    
1089
        
1090
    }
1091

    
1092
    @Override
1093
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
1094
        ResourcesStorage.Resource resource = null;
1095
        try {
1096
            if( resources == null || resources.isReadOnly() ) {
1097
                return;
1098
            }
1099
            resource = resources.getResource("dal");
1100
            if( resource == null || resource.isReadOnly() ) {
1101
                return;
1102
            }
1103
            DALFile dalFile = DALFile.getDALFile();
1104
            dalFile.setFeatureType(featureType);
1105
            if( !dalFile.isEmpty() ) {
1106
                dalFile.write(resource);
1107
            }
1108
        } catch (Throwable ex) {
1109
            LOGGER.warn("Can't save DAL resource", ex);
1110
        } finally {
1111
            IOUtils.closeQuietly(resource);
1112
        }
1113
    }
1114

    
1115
    private Map<String,DynObjectValueItem[]> availableValues = null;
1116
    
1117
    @Override
1118
    public DynObjectValueItem[] getAvailableValues(FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1119
        String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName();
1120
        if( this.availableValues==null ) {
1121
            this.availableValues = new HashMap<>();
1122
        }
1123
        DynObjectValueItem[] values = this.availableValues.get(keyName);
1124
        if( values != null ) {
1125
            return values;
1126
        }
1127
        if( !descriptor.isForeingKey() ) {
1128
            return null;
1129
        }
1130
        ForeingKey foreingKey = descriptor.getForeingKey();
1131
        try {
1132
            StoresRepository theStoresRepository;
1133
            FeatureStore store = descriptor.getStore();
1134
            if (store == null) {
1135
                theStoresRepository = DALLocator.getDataManager().getStoresRepository();
1136

    
1137
            } else {
1138
                theStoresRepository = store.getStoresRepository();
1139
            }
1140
            FeatureStore foreingStore = (FeatureStore) theStoresRepository.getStore(
1141
                foreingKey.getTableName()
1142
            );
1143
            Expression labelExpression = foreingKey.getLabelExpression(null);
1144
            String codeName = foreingKey.getCodeName();
1145
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable();
1146
            MutableSymbolTable symbolTable = featureSymbolTable.createParent();
1147
        
1148
            int count = (int) foreingStore.getFeatureCount();
1149
            values = new DynObjectValueItem[Math.min(count, MAX_AVAILABLE_VALUES)];
1150
            int n = 0;
1151
            for (Feature feature : foreingStore.getFeatureSet()) {
1152
                Object code = feature.get(codeName);
1153
                Object value;
1154
                if (labelExpression == null) {
1155
                    value = code;
1156
                } else {
1157
                    featureSymbolTable.setFeature(feature);
1158
                    value = labelExpression.execute(symbolTable);
1159
                }
1160
                values[n++] = new DynObjectValueItem(code, Objects.toString(value, Objects.toString(code, "##ERROR##")));
1161
                if( n>=MAX_AVAILABLE_VALUES ) {
1162
                    break;
1163
                }
1164
            }
1165
            this.availableValues.put(keyName, values);
1166
            return values;
1167
        } catch (Exception ex) {
1168
            LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex);
1169
        }
1170
        return null;
1171
    }
1172

    
1173
    @Override
1174
    public String createUniqueID() {
1175
        UUID x = UUID.randomUUID();
1176
        String s = x.toString();
1177
        return s;
1178
    }
1179
}