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

History | View | Annotate | Download (40 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 org.apache.commons.lang3.StringUtils;
14
import org.gvsig.expressionevaluator.Expression;
15
import org.gvsig.expressionevaluator.ExpressionBuilder;
16
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
17
import org.gvsig.fmap.dal.BaseStoresRepository;
18

    
19
import org.gvsig.fmap.dal.DataFactory;
20
import org.gvsig.fmap.dal.DataManager;
21
import org.gvsig.fmap.dal.DataServerExplorer;
22
import org.gvsig.fmap.dal.DataServerExplorerFactory;
23
import org.gvsig.fmap.dal.DataServerExplorerParameters;
24
import org.gvsig.fmap.dal.DataServerExplorerPool;
25
import org.gvsig.fmap.dal.DataStore;
26
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
27
import org.gvsig.fmap.dal.DataStoreParameters;
28
import org.gvsig.fmap.dal.DataStoreProviderFactory;
29
import org.gvsig.fmap.dal.DataTypes;
30
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
31

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

    
91
@SuppressWarnings("UseSpecificCatch")
92
public class DefaultDataManager
93
        implements DataManager, DataManagerProviderServices, Services {
94

    
95
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataManager.class);
96
    
97
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
98
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
99
        "DAL cache providers";
100

    
101
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
102

    
103

    
104
    private class Registers {
105

    
106
        private final Register store;
107
        private final Register storeProvider;
108
        private final Register serverExplorer;
109
        private final Register featureIndexProvider;
110

    
111
        public Registers() {
112
            this.store = new RegisterImpl(
113
                    "Data.manager.stores.factory",
114
                    "DAL store factories"
115
            );
116
            this.storeProvider = new RegisterImpl(
117
                    "Data.manager.providers.factory",
118
                    "DAL store provider factories"
119
            );
120
            this.serverExplorer = new RegisterImpl(
121
                    "Data.manager.servereexplorer.factory",
122
                    "DAL server explorer factories"
123
            );
124
            this.featureIndexProvider = new RegisterImpl(
125
                    "Data.manager.feature.index.factory",
126
                    "DAL feature index factories"
127
            );
128

    
129
            this.store.register(new FeatureStoreFactory());
130
        }
131
    }
132
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
133

    
134
    private final Registers registers;
135

    
136
    private final Map<Integer, String> defaultDataIndexProviders;
137

    
138
    private OpenErrorHandler openErrorHandler = null;
139

    
140
    private DataServerExplorerPool dataServerExplorerPool = null;
141

    
142
    private List<DataType> dataTypes = null;
143

    
144
    private ClassLoader resourcesLoader = null;
145

    
146
    private List<DataProfile> dataProfiles;
147
    
148
    public DefaultDataManager() {
149
        this.registers = new Registers();
150
        this.defaultDataIndexProviders = new HashMap<>();
151
    }
152

    
153
    @Override
154
    public Register getStoreRegister() {
155
        return this.registers.store;
156
    }
157

    
158
    @Override
159
    public Register getStoreProviderRegister() {
160
        return this.registers.storeProvider;
161
    }
162

    
163
    @Override
164
    public Register getServerExplorerRegister() {
165
        return this.registers.serverExplorer;
166
    }
167

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

    
173
    private String getStoreName(DataStoreParameters parameters) {
174
        for (DataFactory factory : this.getStoreRegister()) {
175
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
176
            if (storeFactory.canUse(parameters)) {
177
                return storeFactory.getName();
178
            }
179
        }
180
        return null;
181
    }
182

    
183
    /**
184
     * @deprecated
185
     */
186
    @Override
187
    public void registerDefaultRasterStore(Class rasterStoreClass) {
188
        // Metodo usado por el raster nuevo para regstrar su factoria de store
189
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
190
    }
191

    
192
    /**
193
     * @deprecated
194
     */
195
    @Override
196
    public void registerStoreFactory(String name, Class storeFactoryClass) {
197
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
198
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
199
    }
200

    
201
    /**
202
     * @param name
203
     * @param storeProviderClass
204
     * @param parametersClass
205
     * @deprecated use registerStoreProviderFactory
206
     */
207
    @Override
208
    public void registerStoreProvider(String name, Class storeProviderClass,
209
            Class parametersClass) {
210
        if (name == null || storeProviderClass == null || parametersClass == null) {
211
            throw new IllegalArgumentException("Any parameters can be null");
212
        }
213

    
214
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
215
            throw new IllegalArgumentException(parametersClass.getName()
216
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
217
        }
218

    
219
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
220
            // Envuelve al proveedor en una factoria por defecto.
221
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
222
                    name, "", storeProviderClass, parametersClass));
223
            return;
224
        }
225

    
226
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
227
            // Envuelve al proveedor en una factoria por defecto.
228
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
229
                    name, "", storeProviderClass, parametersClass));
230
            return;
231
        }
232

    
233
        throw new IllegalArgumentException("Not supported implemtation: name="
234
                + name + " provider class=" + storeProviderClass.getName());
235

    
236
    }
237

    
238
    @Override
239
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
240
        if (name == null || explorerClass == null || parametersClass == null) {
241
            // FIXME Exception
242
            throw new IllegalArgumentException("Any parameters can be null");
243
        }
244

    
245
        if (!DataServerExplorerParameters.class
246
                .isAssignableFrom(parametersClass)) {
247
            // FIXME Exception
248
            throw new IllegalArgumentException(
249
                    parametersClass.getName()
250
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
251
        }
252

    
253
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
254
            // FIXME Exception
255
            throw new IllegalArgumentException(explorerClass.getName()
256
                    + " must implement org.gvsig.fmap.dal.DataServerExplorer");
257
        }
258

    
259
        // Envuelve al proveedor en una factoria por defecto.
260
        this.registerServerExplorerFactory(
261
                new DataServerExplorerToDataExplorerFactoryWrapper(
262
                        name, "", explorerClass, parametersClass
263
                )
264
        );
265

    
266
    }
267

    
268
    @Override
269
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
270
        this.getStoreRegister().register(factory);
271
    }
272

    
273
    @Override
274
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
275
        this.getStoreProviderRegister().register(factory);
276
    }
277

    
278
    @Override
279
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
280
        this.getServerExplorerRegister().register(factory);
281
    }
282

    
283
    @Override
284
    public DataStoreParameters createStoreParameters(byte[] data) {
285
        try {
286
            PersistenceManager persistenceManager = ToolsLocator.getPersistenceManager();
287
            ByteArrayInputStream stream = new ByteArrayInputStream(data);
288
            DataStoreParameters parameters = (DataStoreParameters) persistenceManager.getObject(stream);
289
            return parameters;
290
        } catch (Exception ex) {
291
            LOGGER.warn("Can't get parameters from byte[].",ex);
292
            return null;
293
        }
294
    }
295

    
296
    @Override
297
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
298
        if( providerName == null ) {
299
            String msg = "Provider name can't be null.";
300
            LOGGER.warn(msg);
301
            throw new IllegalArgumentException(msg);
302
        }
303
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
304
        if( providerFactory == null ) {
305
            String msg = "Can't locate provider factory for '"+providerName+"'.";
306
            LOGGER.warn(msg);
307
            throw new IllegalArgumentException(msg);
308
        }
309
        return (DataStoreParameters) providerFactory.createParameters();
310
    }
311

    
312
    @Override
313
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
314
        try {
315
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
316
            return explorer.getAddParameters(providerName);
317
        } catch (Exception ex) {
318
            throw new InitializeException(ex);
319
        }
320
    }
321

    
322
    @Override
323
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
324
        if( explorerName == null ) {
325
            String msg = "Explorer name can't be null.";
326
            LOGGER.warn(msg);
327
            throw new IllegalArgumentException(msg);
328
        }
329
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
330
        if( explorerFactory == null ) {
331
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
332
            LOGGER.warn(msg);
333
            throw new IllegalArgumentException(msg);
334
        }
335
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
336
        return params;
337
    }
338

    
339
    @Override
340
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
341
        try {
342
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
343
            if (autoOrderAttributeName != null) {
344
                parameters.setDynValue(
345
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
346
                        autoOrderAttributeName);
347
            }
348
            return parameters;
349
        } catch (Exception ex) {
350
            throw new InitializeException(ex);
351
        }
352
    }
353

    
354
    @Override
355
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
356
        if( explorerName == null ) {
357
            String msg = "Explorer name can't be null.";
358
            LOGGER.warn(msg);
359
            throw new IllegalArgumentException(msg);
360
        }
361
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
362
        if( explorerFactory == null ) {
363
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
364
            LOGGER.warn(msg);
365
            throw new IllegalArgumentException(msg);
366
        }
367
        if (parameters == null) {
368
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
369
        }
370
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
371
                parameters,
372
                new DefaultDataServerExplorerProviderServices()
373
        );
374
        return explorer;
375
    }
376

    
377
    @Override
378
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
379
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
380
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorercon solo 
381
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
382
            // llamar al que toca.
383
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
384
        }
385
        if( explorerName == null ) {
386
            String msg = "Explorer name can't be null.";
387
            LOGGER.warn(msg);
388
            throw new IllegalArgumentException(msg);
389
        }
390
        if( (arguments.length % 2)!= 0 ) {
391
            throw new ValidateDataParametersException();
392
        }
393
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
394
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
395
        for( int i=0; i<arguments.length; i+=2 ) {
396
            String name = (String) arguments[i];
397
            Object value = arguments[i+1];
398
            parameters.setDynValue(name, value);
399
        }
400
        return this.openServerExplorer(explorerName, parameters);
401

    
402
    }
403

    
404
    /**
405
     * @param parameters
406
     * @return
407
     * @throws org.gvsig.fmap.dal.exception.InitializeException
408
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
409
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
410
     * @deprecated see openServerExplorer
411
     */
412
    @Override
413
    public DataServerExplorer createServerExplorer(
414
            DataServerExplorerParameters parameters) throws InitializeException,
415
            ProviderNotRegisteredException, ValidateDataParametersException {
416
        return openServerExplorer(parameters.getExplorerName(), parameters);
417
    }
418

    
419
    /**
420
     * @deprecated use openStore
421
     * @param parameters
422
     * @return
423
     * @throws InitializeException
424
     * @throws ProviderNotRegisteredException
425
     * @throws ValidateDataParametersException
426
     */
427
    @Override
428
    public DataStore createStore(DataStoreParameters parameters)
429
        throws InitializeException, ProviderNotRegisteredException,
430
        ValidateDataParametersException {
431
        return openStore(parameters.getDataStoreName(), parameters);
432
    }
433

    
434
    @Override
435
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
436
        if( providerName == null ) {
437
            String msg = "Provider name can't be null.";
438
            LOGGER.warn(msg);
439
            throw new IllegalArgumentException(msg);
440
        }
441
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
442
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
443
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
444
        }
445

    
446
        parameters.validate();
447

    
448
        String storeName = this.getStoreName(parameters);
449
        if( StringUtils.isEmpty(storeName) ) {
450
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
451
            LOGGER.warn(msg);
452
            throw new IllegalArgumentException(msg);
453
        }
454

    
455
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
456
        if( storeFactory == null ) {
457
            String msg = "Can't locate store factory for '"+storeName+"'.";
458
            LOGGER.warn(msg);
459
            throw new IllegalArgumentException(msg);
460
        }
461
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
462
        if( providerFactory == null ) {
463
            String msg = "Can't locate provider factory for '"+providerName+"'.";
464
            LOGGER.warn(msg);
465
            throw new IllegalArgumentException(msg);
466
        }
467

    
468
        DataStore store = (DataStore) storeFactory.create(parameters, this);
469
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
470

    
471
        storeFactory.setProvider(store, provider);
472
        return store;
473
    }
474

    
475
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
476
        String storeName = this.getStoreName(parameters);
477
        if( StringUtils.isEmpty(storeName) ) {
478
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
479
            LOGGER.warn(msg);
480
            throw new IllegalArgumentException(msg);
481
        }
482

    
483
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
484
        if( storeFactory == null ) {
485
            String msg = "Can't locate store factory for '"+storeName+"'.";
486
            LOGGER.warn(msg);
487
            throw new IllegalArgumentException(msg);
488
        }
489
        DataStore store = (DataStore) storeFactory.create(parameters, this);
490
        storeFactory.setProvider(store, provider);
491
        return store;
492
    }
493
    
494
    @Override
495
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
496
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
497
        DataStore store = openStore(params.getDataStoreName(), params);
498
        return store;
499
    }
500

    
501
    @Override
502
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
503
        if( arguments.length == 1 ) { 
504
            // Desde jython entra por este metodo en lugar de los especificos
505
            // de DataStoreParameters o DynObject
506
            if( arguments[0] instanceof DataStoreParameters ) {
507
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
508
            } else if( arguments[0] instanceof DynObject ) {
509
                return this.openStore(providerName, (DynObject)(arguments[0]));
510
            }
511
        }
512
        if( (arguments.length % 2)!= 0 ) {
513
            throw new ValidateDataParametersException();
514
        }
515
        if( providerName == null ) {
516
            String msg = "Provider name can't be null.";
517
            LOGGER.warn(msg);
518
            throw new IllegalArgumentException(msg);
519
        }
520
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
521
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
522
        for( int i=0; i<arguments.length; i+=2 ) {
523
            String name = (String) arguments[i];
524
            Object value = arguments[i+1];
525
            parameters.setDynValue(name, value);
526
        }
527
        return this.openStore(providerName, parameters);
528
    }
529

    
530
    @Override
531
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
532
        try {
533
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
534
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
535
            return (FeatureStore) store;
536
        } catch (Exception ex) {
537
            throw new InitializeException(ex);
538
        }
539
    }
540

    
541
    @Override
542
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
543
        if( providerName == null ) {
544
            String msg = "Provider name can't be null.";
545
            LOGGER.warn(msg);
546
            throw new IllegalArgumentException(msg);
547
        }
548
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
549
        return (DataStoreProviderFactory) providerFactory;
550
    }
551

    
552
    @Override
553
    public List<String> getStoreProviders() {
554
        return this.getStoreProviderRegister().getFactoryNames();
555
    }
556

    
557
    @Override
558
    public List<String> getStoreProviders(String explorerName) {
559
        if( explorerName == null ) {
560
            String msg = "Explorer name can't be null.";
561
            LOGGER.warn(msg);
562
            throw new IllegalArgumentException(msg);
563
        }
564
        try {
565
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
566
            List names = explorer.getDataStoreProviderNames();
567
            return names;
568
        } catch (Exception ex) {
569
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
570
        }
571
    }
572

    
573
    @Override
574
    public List<String> getExplorerProviders() {
575
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
576
        return names;
577
    }
578

    
579
    @Override
580
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
581

    
582
        String providerName = parameters.getDataStoreName();
583
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
584
        if (providerFactory == null) {
585
            throw new ProviderNotRegisteredException(providerName);
586
        }
587
        while (true) {
588
            try {
589
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
590
                        parameters, providerServices
591
                );
592
                return provider;
593
            } catch (Exception e) {
594
                if (openErrorHandler == null) {
595
                    throw new InitializeException(providerName, e);
596
                }
597
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
598
                if (!retry) {
599
                    throw new InitializeException(providerName, e);
600
                }
601
            }
602
        }
603
    }
604

    
605
    @Override
606
    public List<String> getFeatureIndexProviders() {
607
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
608
        return names;
609
    }
610

    
611
    @Override
612
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
613
        this.defaultDataIndexProviders.put(dataType, name);
614
    }
615

    
616
    @Override
617
    public String getDefaultFeatureIndexProviderName(int dataType) {
618
        return this.defaultDataIndexProviders.get(dataType);
619
    }
620

    
621
    @Override
622
    public FeatureIndexProviderServices createFeatureIndexProvider(
623
            String name,
624
            FeatureStore store,
625
            FeatureType type,
626
            String indexName,
627
            FeatureAttributeDescriptor attr
628
    ) throws InitializeException, ProviderNotRegisteredException {
629

    
630
        if (name == null) {
631
            name = getDefaultFeatureIndexProviderName(attr.getType());
632
        }
633

    
634
        if (name == null) {
635
            throw new InitializeException(
636
                    "There not any index provider registered.", null);
637
        }
638
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
639
        if (indexfactory == null) {
640
            throw new InitializeException(
641
                    "There not any index provider registered with name '" + name + "'.", null);
642

    
643
        }
644
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
645

    
646
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
647
                (FeatureStoreProviderServices) store,
648
                type,
649
                provider,
650
                attr.getName(),
651
                indexName
652
        );
653
        services.initialize();
654
        return services;
655

    
656
    }
657

    
658
    @Override
659
    public String getTemporaryDirectory() {
660
        FoldersManager manager = ToolsLocator.getFoldersManager();
661
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
662
        return folder.getAbsolutePath();
663
    }
664

    
665
    @Override
666
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
667
        if (!(struct instanceof DynStruct_v2)) {
668
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
669
        }
670
        Tags tags = ((DynStruct_v2) struct).getTags();
671
        return this.createStoreParameters(tags);
672
    }
673

    
674
    @Override
675
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
676
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
677
        if (providerName == null) {
678
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
679
        }
680
        int prefixlen = TAG_DAL_OPENSTORE.length();
681
        DataStoreParameters parameters = this.createStoreParameters(providerName);
682
        for (String key : tags) {
683
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
684
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
685
            }
686
        }
687
        return parameters;
688
    }
689

    
690
    @Override
691
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
692
        DataStoreParameters paramters = this.createStoreParameters(struct);
693
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
694
        return store;
695
    }
696

    
697
    @Override
698
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
699
        if( explorerName == null ) {
700
            String msg = "Explorer name can't be null.";
701
            LOGGER.warn(msg);
702
            throw new IllegalArgumentException(msg);
703
        }
704
        if( providerName == null ) {
705
            String msg = "Provider name can't be null.";
706
            LOGGER.warn(msg);
707
            throw new IllegalArgumentException(msg);
708
        }
709

    
710
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
711
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
712
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
713
        }
714
        parameters.validate();
715
        try {
716
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
717
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
718
            server.add(providerName, parameters, overwrite);
719
        } catch (Exception e) {
720
            throw new InitializeException(e);
721
        }
722
    }
723

    
724
    @Override
725
    @Deprecated
726
    public Evaluator createExpresion(String expression) throws InitializeException {
727
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
728
        exp.setPhrase(expression);
729
        return this.createExpresion(exp);
730
    }
731

    
732
    @Override
733
    @Deprecated
734
    public Evaluator createExpresion(Expression expression) throws InitializeException {
735
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
736
        return exp;        
737
    }
738

    
739

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

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

    
753
    @Override
754
    public FeaturePagingHelper createFeaturePagingHelper(
755
            FeatureStore featureStore, int pageSize) throws BaseException {
756
        return new FeaturePagingHelperImpl(featureStore, pageSize);
757
    }
758

    
759
    @Override
760
    public FeaturePagingHelper createFeaturePagingHelper(
761
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
762
            throws BaseException {
763
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
764
    }
765

    
766
    @Override
767
    public void setOpenErrorHandler(OpenErrorHandler handler) {
768
        openErrorHandler = handler;
769
    }
770

    
771
    @Override
772
    public OpenErrorHandler getOpenErrorHandler() {
773
        return this.openErrorHandler;
774
    }
775

    
776
    @Override
777
    public EditableFeatureType createFeatureType() {
778
        return new DefaultEditableFeatureType(null);
779
    }
780

    
781
    @Override
782
    public DataServerExplorerPool getDataServerExplorerPool() {
783
        if (this.dataServerExplorerPool == null) {
784
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
785
        }
786
        return this.dataServerExplorerPool;
787
    }
788

    
789
    @Override
790
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
791
        this.dataServerExplorerPool = pool;
792
    }
793

    
794
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
795
        if (params instanceof DataStoreParameters) {
796
            return (DataStoreParameters) params;
797
        }
798
        String providerName;
799
        try {
800
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
801
        } catch (Exception ex) {
802
            providerName = provider;
803
        }
804
        DataStoreParameters parameters = this.createStoreParameters(providerName);
805
        ToolsLocator.getDynObjectManager().copy(params, parameters);
806
        return parameters;
807
    }
808

    
809
    @Override
810
    public List<DataType> getDataTypes() {
811
        if (dataTypes == null) {
812
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
813
            dataTypes = new ArrayList<>();
814
            dataTypes.add(manager.get(DataTypes.STRING));
815
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
816
            dataTypes.add(manager.get(DataTypes.INT));
817
            dataTypes.add(manager.get(DataTypes.DOUBLE));
818
            dataTypes.add(manager.get(DataTypes.DATE));
819
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
820
        }
821
        return dataTypes;
822
    }
823

    
824
    @Override
825
    public void setResourcesLoader(ClassLoader loader) {
826
        this.resourcesLoader = loader;
827
    }
828

    
829
    @Override
830
    public void setResourcesLoader(File folder) {
831
        if (folder == null) {
832
            this.resourcesLoader = null;
833
            return;
834
        }
835
        try {
836
            URL[] urls = new URL[]{folder.toURI().toURL()};
837
            this.resourcesLoader = new URLClassLoader(urls);
838
        } catch (Exception ex) {
839
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
840
        }
841
    }
842

    
843
    @Override
844
    public URL getResource(Object reourceLoader, String name) {
845
        URL x;
846
        if (this.resourcesLoader != null) {
847
            x = this.resourcesLoader.getResource(name);
848
            if (x != null) {
849
                return x;
850
            }
851
        }
852
        x = reourceLoader.getClass().getResource(name);
853
        return x;
854
    }
855

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

    
869
    @Override
870
    public ExpressionBuilder createExpressionBuilder() {
871
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
872
    }
873

    
874
    public void registerFeatureCacheProvider(
875
        FeatureCacheProviderFactory providerFactory) {
876
        ToolsLocator.getExtensionPointManager()
877
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
878
            .append(providerFactory.getName(), "", providerFactory);
879
    }
880

    
881
    public FeatureCacheProvider createFeatureCacheProvider(String name,
882
        DynObject parameters) throws DataException {
883
        if (name == null) {
884
            throw new InitializeException(
885
                "It is necessary to provide a cache name", null);
886
        }
887
        if (parameters == null) {
888
            throw new InitializeException(
889
                "It is necessary to provide parameters to create the explorer",
890
                null);
891
        }
892
        FeatureCacheProviderFactory featureCacheProviderFactory;
893
        try {
894
            featureCacheProviderFactory =
895
                (FeatureCacheProviderFactory) ToolsLocator
896
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
897
                    .create(name);
898
            if (featureCacheProviderFactory == null) {
899
                throw new ProviderNotRegisteredException(name);
900
            }
901
            return featureCacheProviderFactory.createCacheProvider(parameters);
902
        } catch (InstantiationException e) {
903
            throw new InitializeException(e);
904
        } catch (IllegalAccessException e) {
905
            throw new InitializeException(e);
906
        }
907
    }
908

    
909
    @Override
910
    public List getFeatureCacheProviders() {
911
        ExtensionPoint extensionPoint =
912
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
913
        if (extensionPoint != null) {
914
            return ToolsLocator.getExtensionPointManager()
915
                .get(DATA_MANAGER_CACHE).getNames();
916
        } else {
917
            return new ArrayList();
918
        }
919
    }
920

    
921
    @Override
922
    public DynObject createCacheParameters(String name)
923
        throws InitializeException, ProviderNotRegisteredException {
924
        if (name == null) {
925
            throw new InitializeException(
926
                "It is necessary to provide a cache name", null);
927
        }
928
        FeatureCacheProviderFactory featureCacheProviderFactory;
929
        try {
930
            featureCacheProviderFactory =
931
                (FeatureCacheProviderFactory) ToolsLocator
932
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
933
                    .create(name);
934
            if (featureCacheProviderFactory == null) {
935
                throw new ProviderNotRegisteredException(name);
936
            }
937
            return featureCacheProviderFactory.createParameters();
938
        } catch (InstantiationException e) {
939
            throw new InitializeException(e);
940
        } catch (IllegalAccessException e) {
941
            throw new InitializeException(e);
942
        }
943
    }
944

    
945
    @Override
946
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
947
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
948
        DataServerExplorerParameters eparams = null;
949
        DataServerExplorer serverExplorer;
950
        try {
951
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
952
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
953
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
954
        }
955

    
956
        try {
957
            serverExplorer.add(providerName, params, overwrite);
958
        } catch (DataException e) {
959
            throw new CreateFileStoreException(e, providerName);
960
        }
961
    }
962

    
963
    @Override
964
    public FeatureSymbolTable createFeatureSymbolTable() {
965
        FeatureSymbolTable symbolTable = new DefaultFeatureSymbolTable();
966
        return symbolTable;
967
    }
968

    
969
    @Override
970
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
971
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
972
        return emulator;
973
    }
974

    
975
    @Override
976
    public void registerDataProfile(DataProfile profile) {
977
        if( profile==null ) {
978
            return;
979
        }
980
        if( this.dataProfiles==null ) {
981
            this.dataProfiles = new ArrayList<>();
982
            this.dataProfiles.add(profile);
983
            return;
984
        }
985
        for (DataProfile theProfile : this.dataProfiles) {
986
            if( theProfile.getID().equalsIgnoreCase(profile.getID()) ) {
987
                return;
988
            }
989
        }
990
        this.dataProfiles.add(profile);
991
    }
992

    
993
    @Override
994
    public List<DataProfile> getDataProfiles() {
995
        if( this.dataProfiles==null ) {
996
            return null;
997
        }
998
        return Collections.unmodifiableList(this.dataProfiles);
999
    }
1000

    
1001
    @Override
1002
    public DataProfile getDataProfile(String name) {
1003
        if( StringUtils.isBlank(name) ) {
1004
            return null;
1005
        }
1006
        for (DataProfile theProfile : this.dataProfiles) {
1007
            if( name.equalsIgnoreCase(theProfile.getName()) ) {
1008
                return theProfile;
1009
            }
1010
        }
1011
        return null;
1012
    }
1013

    
1014
    private StoresRepository storesRepository;
1015
    
1016
    @Override
1017
    public StoresRepository getStoresRepository() {
1018
        if( this.storesRepository==null ) {
1019
            this.storesRepository = new BaseStoresRepository("DAL");
1020
        }
1021
        return this.storesRepository;
1022
    }
1023
    
1024
    @Override
1025
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1026
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1027
        return workspace;
1028
    }
1029
}