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

History | View | Annotate | Download (45.5 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 org.apache.commons.io.IOUtils;
15
import org.apache.commons.lang3.StringUtils;
16
import org.gvsig.expressionevaluator.Expression;
17
import org.gvsig.expressionevaluator.ExpressionBuilder;
18
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
19
import org.gvsig.expressionevaluator.MutableSymbolTable;
20
import org.gvsig.fmap.dal.BaseStoresRepository;
21
import org.gvsig.fmap.dal.DALLocator;
22

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

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

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

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

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

    
115

    
116
    private class Registers {
117

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

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

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

    
146
    private final Registers registers;
147

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

    
150
    private OpenErrorHandler openErrorHandler = null;
151

    
152
    private DataServerExplorerPool dataServerExplorerPool = null;
153

    
154
    private List<DataType> dataTypes = null;
155

    
156
    private ClassLoader resourcesLoader = null;
157

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

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

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

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

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

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

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

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

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

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

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

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

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

    
250
    }
251

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

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

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

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

    
280
    }
281

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

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

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

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

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

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

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

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

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

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

    
416
    }
417

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

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

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

    
460
        parameters.validate();
461

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
670
    }
671

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

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

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

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

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

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

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

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

    
753

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1172
}