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

History | View | Annotate | Download (36 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.FeatureSymbolTable;
37
import org.gvsig.fmap.dal.feature.EditableFeatureType;
38
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
39
import org.gvsig.fmap.dal.feature.FeatureQuery;
40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
43
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
44
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
45
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
46
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
47
import org.gvsig.fmap.dal.feature.spi.ExpressionBuilderBase;
48
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
49
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
50
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
51
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
52
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
53
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
54
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultEvaluatorFactory;
55
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
56
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureSymbolTable;
57
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
58
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
59
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
60
import org.gvsig.fmap.dal.spi.DALSPILocator;
61
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
62
import org.gvsig.fmap.dal.spi.DataStoreProvider;
63
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
64
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
65
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
66
import org.gvsig.tools.ToolsLocator;
67
import org.gvsig.tools.dataTypes.DataType;
68
import org.gvsig.tools.dataTypes.DataTypesManager;
69
import org.gvsig.tools.dynobject.DynObject;
70
import org.gvsig.tools.dynobject.DynStruct;
71
import org.gvsig.tools.dynobject.DynStruct_v2;
72
import org.gvsig.tools.dynobject.Tags;
73
import org.gvsig.tools.evaluator.Evaluator;
74
import org.gvsig.tools.evaluator.EvaluatorFactory;
75
import org.gvsig.tools.exception.BaseException;
76
import org.gvsig.tools.extensionpoint.ExtensionPoint;
77
import org.gvsig.tools.folders.FoldersManager;
78
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
79
import org.gvsig.tools.identitymanagement.UnauthorizedException;
80
import org.gvsig.tools.service.spi.Services;
81
import org.slf4j.Logger;
82
import org.slf4j.LoggerFactory;
83

    
84
public class DefaultDataManager
85
        implements DataManager, DataManagerProviderServices, Services {
86

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

    
93
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
94

    
95

    
96
    private class Registers {
97

    
98
        private final Register store;
99
        private final Register storeProvider;
100
        private final Register serverExplorer;
101
        private final Register featureIndexProvider;
102

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

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

    
126
    private final Registers registers;
127

    
128
    private final Map<Integer, String> defaultDataIndexProviders;
129

    
130
    private EvaluatorFactory defaultEvaluatorFactory = null;
131

    
132
    private OpenErrorHandler openErrorHandler = null;
133

    
134
    private DataServerExplorerPool dataServerExplorerPool = null;
135

    
136
    private List<DataType> dataTypes = null;
137

    
138
    private ClassLoader resourcesLoader = null;
139

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

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

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

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

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

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

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

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

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

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

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

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

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

    
228
    }
229

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

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

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

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

    
258
    }
259

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

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

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

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

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

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

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

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

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

    
381
    }
382

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

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

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

    
425
        parameters.validate();
426

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

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

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

    
450
        storeFactory.setProvider(store, provider);
451
        return store;
452
    }
453

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

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

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

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

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

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

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

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

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

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

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

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

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

    
590
        if (name == null) {
591
            name = getDefaultFeatureIndexProviderName(attr.getType());
592
        }
593

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

    
603
        }
604
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
605

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

    
616
    }
617

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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