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

History | View | Annotate | Download (36.4 KB)

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

    
3
import java.io.File;
4
import java.io.InputStream;
5
import java.net.URL;
6
import java.net.URLClassLoader;
7
import java.util.ArrayList;
8
import java.util.HashMap;
9
import java.util.List;
10
import java.util.Map;
11
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.expressionevaluator.Expression;
13

    
14
import org.gvsig.fmap.dal.DataFactory;
15
import org.gvsig.fmap.dal.DataManager;
16
import org.gvsig.fmap.dal.DataServerExplorer;
17
import org.gvsig.fmap.dal.DataServerExplorerFactory;
18
import org.gvsig.fmap.dal.DataServerExplorerParameters;
19
import org.gvsig.fmap.dal.DataServerExplorerPool;
20
import org.gvsig.fmap.dal.DataStore;
21
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
22
import org.gvsig.fmap.dal.DataStoreParameters;
23
import org.gvsig.fmap.dal.DataStoreProviderFactory;
24
import org.gvsig.fmap.dal.DataTypes;
25
import org.gvsig.fmap.dal.ExpressionBuilder;
26

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

    
86
public class DefaultDataManager
87
        implements DataManager, DataManagerProviderServices, Services {
88

    
89
    private static final Logger logger = LoggerFactory.getLogger(DefaultDataManager.class);
90
    
91
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
92
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
93
        "DAL cache providers";
94

    
95
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
96

    
97

    
98
    private class Registers {
99

    
100
        private final Register store;
101
        private final Register storeProvider;
102
        private final Register serverExplorer;
103
        private final Register featureIndexProvider;
104

    
105
        public Registers() {
106
            this.store = new RegisterImpl(
107
                    "Data.manager.stores.factory",
108
                    "DAL store factories"
109
            );
110
            this.storeProvider = new RegisterImpl(
111
                    "Data.manager.providers.factory",
112
                    "DAL store provider factories"
113
            );
114
            this.serverExplorer = new RegisterImpl(
115
                    "Data.manager.servereexplorer.factory",
116
                    "DAL server explorer factories"
117
            );
118
            this.featureIndexProvider = new RegisterImpl(
119
                    "Data.manager.feature.index.factory",
120
                    "DAL feature index factories"
121
            );
122

    
123
            this.store.register(new FeatureStoreFactory());
124
        }
125
    }
126
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
127

    
128
    private final Registers registers;
129

    
130
    private final Map<Integer, String> defaultDataIndexProviders;
131

    
132
    private EvaluatorFactory defaultEvaluatorFactory = null;
133

    
134
    private OpenErrorHandler openErrorHandler = null;
135

    
136
    private DataServerExplorerPool dataServerExplorerPool = null;
137

    
138
    private List<DataType> dataTypes = null;
139

    
140
    private ClassLoader resourcesLoader = null;
141

    
142
    public DefaultDataManager() {
143
        this.registers = new Registers();
144
        this.defaultDataIndexProviders = new HashMap<>();
145
    }
146

    
147
    @Override
148
    public Register getStoreRegister() {
149
        return this.registers.store;
150
    }
151

    
152
    @Override
153
    public Register getStoreProviderRegister() {
154
        return this.registers.storeProvider;
155
    }
156

    
157
    @Override
158
    public Register getServerExplorerRegister() {
159
        return this.registers.serverExplorer;
160
    }
161

    
162
    @Override
163
    public Register getFeatureIndexRegister() {
164
        return this.registers.featureIndexProvider;
165
    }
166

    
167
    private String getStoreName(DataStoreParameters parameters) {
168
        for (DataFactory factory : this.getStoreRegister()) {
169
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
170
            if (storeFactory.canUse(parameters)) {
171
                return storeFactory.getName();
172
            }
173
        }
174
        return null;
175
    }
176

    
177
    /**
178
     * @deprecated
179
     */
180
    @Override
181
    public void registerDefaultRasterStore(Class rasterStoreClass) {
182
        // Metodo usado por el raster nuevo para regstrar su factoria de store
183
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
184
    }
185

    
186
    /**
187
     * @deprecated
188
     */
189
    @Override
190
    public void registerStoreFactory(String name, Class storeFactoryClass) {
191
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
192
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
193
    }
194

    
195
    /**
196
     * @param name
197
     * @param storeProviderClass
198
     * @param parametersClass
199
     * @deprecated use registerStoreProviderFactory
200
     */
201
    @Override
202
    public void registerStoreProvider(String name, Class storeProviderClass,
203
            Class parametersClass) {
204
        if (name == null || storeProviderClass == null || parametersClass == null) {
205
            throw new IllegalArgumentException("Any parameters can be null");
206
        }
207

    
208
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
209
            throw new IllegalArgumentException(parametersClass.getName()
210
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
211
        }
212

    
213
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
214
            // Envuelve al proveedor en una factoria por defecto.
215
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
216
                    name, "", storeProviderClass, parametersClass));
217
            return;
218
        }
219

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

    
227
        throw new IllegalArgumentException("Not supported implemtation: name="
228
                + name + " provider class=" + storeProviderClass.getName());
229

    
230
    }
231

    
232
    @Override
233
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
234
        if (name == null || explorerClass == null || parametersClass == null) {
235
            // FIXME Exception
236
            throw new IllegalArgumentException("Any parameters can be null");
237
        }
238

    
239
        if (!DataServerExplorerParameters.class
240
                .isAssignableFrom(parametersClass)) {
241
            // FIXME Exception
242
            throw new IllegalArgumentException(
243
                    parametersClass.getName()
244
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
245
        }
246

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

    
253
        // Envuelve al proveedor en una factoria por defecto.
254
        this.registerServerExplorerFactory(
255
                new DataServerExplorerToDataExplorerFactoryWrapper(
256
                        name, "", explorerClass, parametersClass
257
                )
258
        );
259

    
260
    }
261

    
262
    @Override
263
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
264
        this.getStoreRegister().register(factory);
265
    }
266

    
267
    @Override
268
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
269
        this.getStoreProviderRegister().register(factory);
270
    }
271

    
272
    @Override
273
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
274
        this.getServerExplorerRegister().register(factory);
275
    }
276

    
277
    @Override
278
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
279
        if( providerName == null ) {
280
            String msg = "Provider name can't be null.";
281
            logger.warn(msg);
282
            throw new IllegalArgumentException(msg);
283
        }
284
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
285
        if( providerFactory == null ) {
286
            String msg = "Can't locate provider factory for '"+providerName+"'.";
287
            logger.warn(msg);
288
            throw new IllegalArgumentException(msg);
289
        }
290
        return (DataStoreParameters) providerFactory.createParameters();
291
    }
292

    
293
    @Override
294
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
295
        try {
296
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
297
            return explorer.getAddParameters(providerName);
298
        } catch (Exception ex) {
299
            throw new InitializeException(ex);
300
        }
301
    }
302

    
303
    @Override
304
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
305
        if( explorerName == null ) {
306
            String msg = "Explorer name can't be null.";
307
            logger.warn(msg);
308
            throw new IllegalArgumentException(msg);
309
        }
310
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
311
        if( explorerFactory == null ) {
312
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
313
            logger.warn(msg);
314
            throw new IllegalArgumentException(msg);
315
        }
316
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
317
        return params;
318
    }
319

    
320
    @Override
321
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
322
        try {
323
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
324
            if (autoOrderAttributeName != null) {
325
                parameters.setDynValue(
326
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
327
                        autoOrderAttributeName);
328
            }
329
            return parameters;
330
        } catch (Exception ex) {
331
            throw new InitializeException(ex);
332
        }
333
    }
334

    
335
    @Override
336
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
337
        if( explorerName == null ) {
338
            String msg = "Explorer name can't be null.";
339
            logger.warn(msg);
340
            throw new IllegalArgumentException(msg);
341
        }
342
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
343
        if( explorerFactory == null ) {
344
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
345
            logger.warn(msg);
346
            throw new IllegalArgumentException(msg);
347
        }
348
        if (parameters == null) {
349
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
350
        }
351
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
352
                parameters,
353
                new DefaultDataServerExplorerProviderServices()
354
        );
355
        return explorer;
356
    }
357

    
358
    @Override
359
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
360
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
361
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorercon solo 
362
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
363
            // llamar al que toca.
364
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
365
        }
366
        if( explorerName == null ) {
367
            String msg = "Explorer name can't be null.";
368
            logger.warn(msg);
369
            throw new IllegalArgumentException(msg);
370
        }
371
        if( (arguments.length % 2)!= 0 ) {
372
            throw new ValidateDataParametersException();
373
        }
374
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
375
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
376
        for( int i=0; i<arguments.length; i+=2 ) {
377
            String name = (String) arguments[i];
378
            Object value = arguments[i+1];
379
            parameters.setDynValue(name, value);
380
        }
381
        return this.openServerExplorer(explorerName, parameters);
382

    
383
    }
384

    
385
    /**
386
     * @param parameters
387
     * @return
388
     * @throws org.gvsig.fmap.dal.exception.InitializeException
389
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
390
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
391
     * @deprecated see openServerExplorer
392
     */
393
    @Override
394
    public DataServerExplorer createServerExplorer(
395
            DataServerExplorerParameters parameters) throws InitializeException,
396
            ProviderNotRegisteredException, ValidateDataParametersException {
397
        return openServerExplorer(parameters.getExplorerName(), parameters);
398
    }
399

    
400
    /**
401
     * @deprecated use openStore
402
     * @param parameters
403
     * @return
404
     * @throws InitializeException
405
     * @throws ProviderNotRegisteredException
406
     * @throws ValidateDataParametersException
407
     */
408
    @Override
409
    public DataStore createStore(DataStoreParameters parameters)
410
        throws InitializeException, ProviderNotRegisteredException,
411
        ValidateDataParametersException {
412
        return openStore(parameters.getDataStoreName(), parameters);
413
    }
414

    
415
    @Override
416
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
417
        if( providerName == null ) {
418
            String msg = "Provider name can't be null.";
419
            logger.warn(msg);
420
            throw new IllegalArgumentException(msg);
421
        }
422
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
423
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
424
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
425
        }
426

    
427
        parameters.validate();
428

    
429
        String storeName = this.getStoreName(parameters);
430
        if( StringUtils.isEmpty(storeName) ) {
431
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
432
            logger.warn(msg);
433
            throw new IllegalArgumentException(msg);
434
        }
435

    
436
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
437
        if( storeFactory == null ) {
438
            String msg = "Can't locate store factory for '"+storeName+"'.";
439
            logger.warn(msg);
440
            throw new IllegalArgumentException(msg);
441
        }
442
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
443
        if( providerFactory == null ) {
444
            String msg = "Can't locate provider factory for '"+providerName+"'.";
445
            logger.warn(msg);
446
            throw new IllegalArgumentException(msg);
447
        }
448

    
449
        DataStore store = (DataStore) storeFactory.create(parameters, this);
450
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
451

    
452
        storeFactory.setProvider(store, provider);
453
        return store;
454
    }
455

    
456
    @Override
457
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
458
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
459
        DataStore store = openStore(params.getDataStoreName(), params);
460
        return store;
461
    }
462

    
463
    @Override
464
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
465
        if( arguments.length == 1 ) { 
466
            // Desde jython entra por este metodo en lugar de los especificos
467
            // de DataStoreParameters o DynObject
468
            if( arguments[0] instanceof DataStoreParameters ) {
469
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
470
            } else if( arguments[0] instanceof DynObject ) {
471
                return this.openStore(providerName, (DynObject)(arguments[0]));
472
            }
473
        }
474
        if( (arguments.length % 2)!= 0 ) {
475
            throw new ValidateDataParametersException();
476
        }
477
        if( providerName == null ) {
478
            String msg = "Provider name can't be null.";
479
            logger.warn(msg);
480
            throw new IllegalArgumentException(msg);
481
        }
482
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
483
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
484
        for( int i=0; i<arguments.length; i+=2 ) {
485
            String name = (String) arguments[i];
486
            Object value = arguments[i+1];
487
            parameters.setDynValue(name, value);
488
        }
489
        return this.openStore(providerName, parameters);
490
    }
491

    
492
    @Override
493
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
494
        try {
495
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
496
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
497
            return (FeatureStore) store;
498
        } catch (Exception ex) {
499
            throw new InitializeException(ex);
500
        }
501
    }
502

    
503
    @Override
504
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
505
        if( providerName == null ) {
506
            String msg = "Provider name can't be null.";
507
            logger.warn(msg);
508
            throw new IllegalArgumentException(msg);
509
        }
510
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
511
        return (DataStoreProviderFactory) providerFactory;
512
    }
513

    
514
    @Override
515
    public List<String> getStoreProviders() {
516
        return this.getStoreProviderRegister().getFactoryNames();
517
    }
518

    
519
    @Override
520
    public List<String> getStoreProviders(String explorerName) {
521
        if( explorerName == null ) {
522
            String msg = "Explorer name can't be null.";
523
            logger.warn(msg);
524
            throw new IllegalArgumentException(msg);
525
        }
526
        try {
527
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
528
            List names = explorer.getDataStoreProviderNames();
529
            return names;
530
        } catch (Exception ex) {
531
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
532
        }
533
    }
534

    
535
    @Override
536
    public List<String> getExplorerProviders() {
537
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
538
        return names;
539
    }
540

    
541
    @Override
542
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
543

    
544
        String providerName = parameters.getDataStoreName();
545
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
546
        if (providerFactory == null) {
547
            throw new ProviderNotRegisteredException(providerName);
548
        }
549
        while (true) {
550
            try {
551
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
552
                        parameters, providerServices
553
                );
554
                return provider;
555
            } catch (Exception e) {
556
                if (openErrorHandler == null) {
557
                    throw new InitializeException(providerName, e);
558
                }
559
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
560
                if (!retry) {
561
                    throw new InitializeException(providerName, e);
562
                }
563
            }
564
        }
565
    }
566

    
567
    @Override
568
    public List<String> getFeatureIndexProviders() {
569
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
570
        return names;
571
    }
572

    
573
    @Override
574
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
575
        this.defaultDataIndexProviders.put(dataType, name);
576
    }
577

    
578
    @Override
579
    public String getDefaultFeatureIndexProviderName(int dataType) {
580
        return this.defaultDataIndexProviders.get(dataType);
581
    }
582

    
583
    @Override
584
    public FeatureIndexProviderServices createFeatureIndexProvider(
585
            String name,
586
            FeatureStore store,
587
            FeatureType type,
588
            String indexName,
589
            FeatureAttributeDescriptor attr
590
    ) throws InitializeException, ProviderNotRegisteredException {
591

    
592
        if (name == null) {
593
            name = getDefaultFeatureIndexProviderName(attr.getType());
594
        }
595

    
596
        if (name == null) {
597
            throw new InitializeException(
598
                    "There not any index provider registered.", null);
599
        }
600
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
601
        if (indexfactory == null) {
602
            throw new InitializeException(
603
                    "There not any index provider registered with name '" + name + "'.", null);
604

    
605
        }
606
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
607

    
608
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
609
                (FeatureStoreProviderServices) store,
610
                type,
611
                provider,
612
                attr.getName(),
613
                indexName
614
        );
615
        services.initialize();
616
        return services;
617

    
618
    }
619

    
620
    @Override
621
    public String getTemporaryDirectory() {
622
        FoldersManager manager = ToolsLocator.getFoldersManager();
623
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
624
        return folder.getAbsolutePath();
625
    }
626

    
627
    @Override
628
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
629
        if (!(struct instanceof DynStruct_v2)) {
630
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
631
        }
632
        Tags tags = ((DynStruct_v2) struct).getTags();
633
        return this.createStoreParameters(tags);
634
    }
635

    
636
    @Override
637
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
638
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
639
        if (providerName == null) {
640
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
641
        }
642
        int prefixlen = TAG_DAL_OPENSTORE.length();
643
        DataStoreParameters parameters = this.createStoreParameters(providerName);
644
        for (String key : tags) {
645
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
646
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
647
            }
648
        }
649
        return parameters;
650
    }
651

    
652
    @Override
653
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
654
        DataStoreParameters paramters = this.createStoreParameters(struct);
655
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
656
        return store;
657
    }
658

    
659
    @Override
660
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
661
        if( explorerName == null ) {
662
            String msg = "Explorer name can't be null.";
663
            logger.warn(msg);
664
            throw new IllegalArgumentException(msg);
665
        }
666
        if( providerName == null ) {
667
            String msg = "Provider name can't be null.";
668
            logger.warn(msg);
669
            throw new IllegalArgumentException(msg);
670
        }
671

    
672
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
673
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
674
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
675
        }
676
        parameters.validate();
677
        try {
678
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
679
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
680
            server.add(providerName, parameters, overwrite);
681
        } catch (Exception e) {
682
            throw new InitializeException(e);
683
        }
684
    }
685

    
686
    @Override
687
    public void registerDefaultEvaluator(EvaluatorFactory evaluatorFactory) {
688
        this.defaultEvaluatorFactory = evaluatorFactory;
689
    }
690

    
691
    @Override
692
    public Evaluator createExpresion(String expression) throws InitializeException {
693
        return this.defaultEvaluatorFactory.createEvaluator(expression);
694
    }
695

    
696
    @Override
697
    public Evaluator createExpresion(Expression expression) throws InitializeException {
698
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
699
        return exp;        
700
    }
701

    
702
    @Override
703
    public FeaturePagingHelper createFeaturePagingHelper(
704
            FeatureStore featureStore, int pageSize) throws BaseException {
705
        return new FeaturePagingHelperImpl(featureStore, pageSize);
706
    }
707

    
708
    @Override
709
    public FeaturePagingHelper createFeaturePagingHelper(
710
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
711
            throws BaseException {
712
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
713
    }
714

    
715
    @Override
716
    public void setOpenErrorHandler(OpenErrorHandler handler) {
717
        openErrorHandler = handler;
718
    }
719

    
720
    @Override
721
    public OpenErrorHandler getOpenErrorHandler() {
722
        return this.openErrorHandler;
723
    }
724

    
725
    @Override
726
    public EditableFeatureType createFeatureType() {
727
        return new DefaultEditableFeatureType(null);
728
    }
729

    
730
    @Override
731
    public DataServerExplorerPool getDataServerExplorerPool() {
732
        if (this.dataServerExplorerPool == null) {
733
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
734
        }
735
        return this.dataServerExplorerPool;
736
    }
737

    
738
    @Override
739
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
740
        this.dataServerExplorerPool = pool;
741
    }
742

    
743
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
744
        if (params instanceof DataStoreParameters) {
745
            return (DataStoreParameters) params;
746
        }
747
        String providerName;
748
        try {
749
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
750
        } catch (Exception ex) {
751
            providerName = provider;
752
        }
753
        DataStoreParameters parameters = this.createStoreParameters(providerName);
754
        ToolsLocator.getDynObjectManager().copy(params, parameters);
755
        return parameters;
756
    }
757

    
758
    @Override
759
    public List<DataType> getDataTypes() {
760
        if (dataTypes == null) {
761
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
762
            dataTypes = new ArrayList<>();
763
            dataTypes.add(manager.get(DataTypes.STRING));
764
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
765
            dataTypes.add(manager.get(DataTypes.INT));
766
            dataTypes.add(manager.get(DataTypes.DOUBLE));
767
            dataTypes.add(manager.get(DataTypes.DATE));
768
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
769
        }
770
        return dataTypes;
771
    }
772

    
773
    @Override
774
    public void setResourcesLoader(ClassLoader loader) {
775
        this.resourcesLoader = loader;
776
    }
777

    
778
    @Override
779
    public void setResourcesLoader(File folder) {
780
        if (folder == null) {
781
            this.resourcesLoader = null;
782
            return;
783
        }
784
        try {
785
            URL[] urls = new URL[]{folder.toURI().toURL()};
786
            this.resourcesLoader = new URLClassLoader(urls);
787
        } catch (Exception ex) {
788
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
789
        }
790
    }
791

    
792
    @Override
793
    public URL getResource(Object reourceLoader, String name) {
794
        URL x;
795
        if (this.resourcesLoader != null) {
796
            x = this.resourcesLoader.getResource(name);
797
            if (x != null) {
798
                return x;
799
            }
800
        }
801
        x = reourceLoader.getClass().getResource(name);
802
        return x;
803
    }
804

    
805
    @Override
806
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
807
        InputStream x;
808
        if (this.resourcesLoader != null) {
809
            x = this.resourcesLoader.getResourceAsStream(name);
810
            if (x != null) {
811
                return x;
812
            }
813
        }
814
        x = reourceLoader.getClass().getResourceAsStream(name);
815
        return x;
816
    }
817

    
818
    @Override
819
    public ExpressionBuilder createExpressionBuilder() {
820
        return new ExpressionBuilderBase();
821
    }
822

    
823
    public void registerFeatureCacheProvider(
824
        FeatureCacheProviderFactory providerFactory) {
825
        ToolsLocator.getExtensionPointManager()
826
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
827
            .append(providerFactory.getName(), "", providerFactory);
828
    }
829

    
830
    public FeatureCacheProvider createFeatureCacheProvider(String name,
831
        DynObject parameters) throws DataException {
832
        if (name == null) {
833
            throw new InitializeException(
834
                "It is necessary to provide a cache name", null);
835
        }
836
        if (parameters == null) {
837
            throw new InitializeException(
838
                "It is necessary to provide parameters to create the explorer",
839
                null);
840
        }
841
        FeatureCacheProviderFactory featureCacheProviderFactory;
842
        try {
843
            featureCacheProviderFactory =
844
                (FeatureCacheProviderFactory) ToolsLocator
845
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
846
                    .create(name);
847
            if (featureCacheProviderFactory == null) {
848
                throw new ProviderNotRegisteredException(name);
849
            }
850
            return featureCacheProviderFactory.createCacheProvider(parameters);
851
        } catch (InstantiationException e) {
852
            throw new InitializeException(e);
853
        } catch (IllegalAccessException e) {
854
            throw new InitializeException(e);
855
        }
856
    }
857

    
858
    @Override
859
    public List getFeatureCacheProviders() {
860
        ExtensionPoint extensionPoint =
861
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
862
        if (extensionPoint != null) {
863
            return ToolsLocator.getExtensionPointManager()
864
                .get(DATA_MANAGER_CACHE).getNames();
865
        } else {
866
            return new ArrayList();
867
        }
868
    }
869

    
870
    @Override
871
    public DynObject createCacheParameters(String name)
872
        throws InitializeException, ProviderNotRegisteredException {
873
        if (name == null) {
874
            throw new InitializeException(
875
                "It is necessary to provide a cache name", null);
876
        }
877
        FeatureCacheProviderFactory featureCacheProviderFactory;
878
        try {
879
            featureCacheProviderFactory =
880
                (FeatureCacheProviderFactory) ToolsLocator
881
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
882
                    .create(name);
883
            if (featureCacheProviderFactory == null) {
884
                throw new ProviderNotRegisteredException(name);
885
            }
886
            return featureCacheProviderFactory.createParameters();
887
        } catch (InstantiationException e) {
888
            throw new InitializeException(e);
889
        } catch (IllegalAccessException e) {
890
            throw new InitializeException(e);
891
        }
892
    }
893

    
894
    @Override
895
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
896
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
897
        DataServerExplorerParameters eparams = null;
898
        DataServerExplorer serverExplorer;
899
        try {
900
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
901
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
902
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
903
        }
904

    
905
        try {
906
            serverExplorer.add(providerName, params, overwrite);
907
        } catch (DataException e) {
908
            throw new CreateFileStoreException(e, providerName);
909
        }
910
    }
911

    
912
    @Override
913
    public FeatureSymbolTable createFeatureSymbolTable() {
914
        FeatureSymbolTable symbolTable = new DefaultFeatureSymbolTable();
915
        return symbolTable;
916
    }
917

    
918
    @Override
919
    public EvaluatorFactory createEvaluatorFactory() {
920
        EvaluatorFactory f = new DefaultEvaluatorFactory();
921
        return f;
922
    }
923

    
924
    @Override
925
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
926
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
927
        return emulator;
928
    }
929

    
930

    
931
}