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

History | View | Annotate | Download (33.6 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

    
13
import org.gvsig.fmap.dal.DataFactory;
14
import org.gvsig.fmap.dal.DataManager;
15
import org.gvsig.fmap.dal.DataServerExplorer;
16
import org.gvsig.fmap.dal.DataServerExplorerFactory;
17
import org.gvsig.fmap.dal.DataServerExplorerParameters;
18
import org.gvsig.fmap.dal.DataServerExplorerPool;
19
import org.gvsig.fmap.dal.DataStore;
20
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
21
import org.gvsig.fmap.dal.DataStoreParameters;
22
import org.gvsig.fmap.dal.DataStoreProviderFactory;
23
import org.gvsig.fmap.dal.DataTypes;
24
import org.gvsig.fmap.dal.ExpressionBuilder;
25
import org.gvsig.fmap.dal.ExpressionEvaluator;
26
import org.gvsig.fmap.dal.NewDataStoreParameters;
27
import org.gvsig.fmap.dal.OpenErrorHandler;
28
import org.gvsig.fmap.dal.Register;
29
import org.gvsig.fmap.dal.exception.DataException;
30
import org.gvsig.fmap.dal.exception.InitializeException;
31
import org.gvsig.fmap.dal.exception.OpenException;
32
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
33
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
34
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
35
import org.gvsig.fmap.dal.feature.EditableFeatureType;
36
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
37
import org.gvsig.fmap.dal.feature.FeatureQuery;
38
import org.gvsig.fmap.dal.feature.FeatureStore;
39
import org.gvsig.fmap.dal.feature.FeatureType;
40
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
41
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
42
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
43
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
44
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
45
import org.gvsig.fmap.dal.feature.spi.ExpressionBuilderBase;
46
import org.gvsig.fmap.dal.feature.spi.ExpressionEvaluatorBase;
47
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
48
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
49
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
50
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
51
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
52
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
53
import org.gvsig.fmap.dal.raster.NewRasterStoreParameters;
54
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
55
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
56
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
57
import org.gvsig.fmap.dal.spi.DALSPILocator;
58
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
59
import org.gvsig.fmap.dal.spi.DataStoreProvider;
60
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
61
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
62
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
63
import org.gvsig.tools.ToolsLocator;
64
import org.gvsig.tools.dataTypes.DataType;
65
import org.gvsig.tools.dataTypes.DataTypesManager;
66
import org.gvsig.tools.dynobject.DynObject;
67
import org.gvsig.tools.dynobject.DynStruct;
68
import org.gvsig.tools.dynobject.DynStruct_v2;
69
import org.gvsig.tools.dynobject.Tags;
70
import org.gvsig.tools.evaluator.Evaluator;
71
import org.gvsig.tools.exception.BaseException;
72
import org.gvsig.tools.extensionpoint.ExtensionPoint;
73
import org.gvsig.tools.folders.FoldersManager;
74
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
75
import org.gvsig.tools.identitymanagement.UnauthorizedException;
76
import org.gvsig.tools.service.spi.Services;
77
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
79

    
80
public class DefaultDataManager
81
        implements DataManager, DataManagerProviderServices, Services {
82

    
83
    private static final Logger logger = LoggerFactory.getLogger(DefaultDataManager.class);
84
    
85
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
86
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
87
        "DAL cache providers";
88

    
89
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
90

    
91

    
92
    private class Registers {
93

    
94
        private final Register store;
95
        private final Register storeProvider;
96
        private final Register serverExplorer;
97
        private final Register featureIndexProvider;
98

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

    
117
            this.store.register(new FeatureStoreFactory());
118
        }
119
    }
120
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
121

    
122
    private final Registers registers;
123

    
124
    private final Map<Integer, String> defaultDataIndexProviders;
125

    
126
    private Class defaultEvaluatorClass = null;
127

    
128
    private OpenErrorHandler openErrorHandler = null;
129

    
130
    private DataServerExplorerPool dataServerExplorerPool = null;
131

    
132
    private List<DataType> dataTypes = null;
133

    
134
    private ClassLoader resourcesLoader = null;
135

    
136
    public DefaultDataManager() {
137
        this.registers = new Registers();
138
        this.defaultDataIndexProviders = new HashMap<>();
139
    }
140

    
141
    @Override
142
    public Register getStoreRegister() {
143
        return this.registers.store;
144
    }
145

    
146
    @Override
147
    public Register getStoreProviderRegister() {
148
        return this.registers.storeProvider;
149
    }
150

    
151
    @Override
152
    public Register getServerExplorerRegister() {
153
        return this.registers.serverExplorer;
154
    }
155

    
156
    @Override
157
    public Register getFeatureIndexRegister() {
158
        return this.registers.featureIndexProvider;
159
    }
160

    
161
    private String getStoreName(DataStoreParameters parameters) {
162
        for (DataFactory factory : this.getStoreRegister()) {
163
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
164
            if (storeFactory.canUse(parameters)) {
165
                return storeFactory.getName();
166
            }
167
        }
168
        return null;
169
    }
170

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

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

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

    
202
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
203
            throw new IllegalArgumentException(parametersClass.getName()
204
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
205
        }
206

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

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

    
221
        throw new IllegalArgumentException("Not supported implemtation: name="
222
                + name + " provider class=" + storeProviderClass.getName());
223

    
224
    }
225

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

    
233
        if (!DataServerExplorerParameters.class
234
                .isAssignableFrom(parametersClass)) {
235
            // FIXME Exception
236
            throw new IllegalArgumentException(
237
                    parametersClass.getName()
238
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
239
        }
240

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

    
247
        // Envuelve al proveedor en una factoria por defecto.
248
        this.registerServerExplorerFactory(
249
                new DataServerExplorerToDataExplorerFactoryWrapper(
250
                        name, "", explorerClass, parametersClass
251
                )
252
        );
253

    
254
    }
255

    
256
    @Override
257
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
258
        this.getStoreRegister().register(factory);
259
    }
260

    
261
    @Override
262
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
263
        this.getStoreProviderRegister().register(factory);
264
    }
265

    
266
    @Override
267
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
268
        this.getServerExplorerRegister().register(factory);
269
    }
270

    
271
    @Override
272
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
273
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
274
        return (DataStoreParameters) providerFactory.createParameters();
275
    }
276

    
277
    @Override
278
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
279
        try {
280
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
281
            return explorer.getAddParameters(providerName);
282
        } catch (Exception ex) {
283
            throw new InitializeException(ex);
284
        }
285
    }
286

    
287
    @Override
288
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
289
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
290
        if( explorerFactory == null ) {
291
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
292
            logger.warn(msg);
293
            throw new IllegalArgumentException(msg);
294
        }
295
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
296
        return params;
297
    }
298

    
299
    @Override
300
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
301
        try {
302
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
303
            if (autoOrderAttributeName != null) {
304
                parameters.setDynValue(
305
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
306
                        autoOrderAttributeName);
307
            }
308
            return parameters;
309
        } catch (Exception ex) {
310
            throw new InitializeException(ex);
311
        }
312
    }
313

    
314
    @Override
315
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
316
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
317
        if( explorerFactory == null ) {
318
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
319
            logger.warn(msg);
320
            throw new IllegalArgumentException(msg);
321
        }
322
        if (parameters == null) {
323
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
324
        }
325
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
326
                parameters,
327
                new DefaultDataServerExplorerProviderServices()
328
        );
329
        return explorer;
330
    }
331

    
332
    @Override
333
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
334
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
335
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorercon solo 
336
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
337
            // llamar al que toca.
338
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
339
        }
340
        if( (arguments.length % 2)!= 0 ) {
341
            throw new ValidateDataParametersException();
342
        }
343
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
344
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
345
        for( int i=0; i<arguments.length; i+=2 ) {
346
            String name = (String) arguments[i];
347
            Object value = arguments[i+1];
348
            parameters.setDynValue(name, value);
349
        }
350
        return this.openServerExplorer(explorerName, parameters);
351

    
352
    }
353

    
354
    /**
355
     * @param parameters
356
     * @return
357
     * @throws org.gvsig.fmap.dal.exception.InitializeException
358
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
359
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
360
     * @deprecated see openServerExplorer
361
     */
362
    @Override
363
    public DataServerExplorer createServerExplorer(
364
            DataServerExplorerParameters parameters) throws InitializeException,
365
            ProviderNotRegisteredException, ValidateDataParametersException {
366
        return openServerExplorer(parameters.getExplorerName(), parameters);
367
    }
368

    
369
    /**
370
     * @deprecated use openStore
371
     * @param parameters
372
     * @return
373
     * @throws InitializeException
374
     * @throws ProviderNotRegisteredException
375
     * @throws ValidateDataParametersException
376
     */
377
    @Override
378
    public DataStore createStore(DataStoreParameters parameters)
379
        throws InitializeException, ProviderNotRegisteredException,
380
        ValidateDataParametersException {
381
        return openStore(parameters.getDataStoreName(), parameters);
382
    }
383

    
384
    @Override
385
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
386

    
387
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
388
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
389
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
390
        }
391

    
392
        parameters.validate();
393

    
394
        String storeName = this.getStoreName(parameters);
395
        if( StringUtils.isEmpty(storeName) ) {
396
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
397
            logger.warn(msg);
398
            throw new IllegalArgumentException(msg);
399
        }
400

    
401
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
402
        if( storeFactory == null ) {
403
            String msg = "Can't locate store factory for '"+storeName+"'.";
404
            logger.warn(msg);
405
            throw new IllegalArgumentException(msg);
406
        }
407
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
408
        if( providerFactory == null ) {
409
            String msg = "Can't locate provider factory for '"+providerName+"'.";
410
            logger.warn(msg);
411
            throw new IllegalArgumentException(msg);
412
        }
413

    
414
        DataStore store = (DataStore) storeFactory.create(parameters, this);
415
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
416

    
417
        storeFactory.setProvider(store, provider);
418
        return store;
419
    }
420

    
421
    @Override
422
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
423
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
424
        DataStore store = openStore(params.getDataStoreName(), params);
425
        return store;
426
    }
427

    
428
    @Override
429
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
430
        if( arguments.length == 1 ) { 
431
            // Desde jython entra por este metodo en lugar de los especificos
432
            // de DataStoreParameters o DynObject
433
            if( arguments[0] instanceof DataStoreParameters ) {
434
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
435
            } else if( arguments[0] instanceof DynObject ) {
436
                return this.openStore(providerName, (DynObject)(arguments[0]));
437
            }
438
        }
439
        if( (arguments.length % 2)!= 0 ) {
440
            throw new ValidateDataParametersException();
441
        }
442
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
443
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
444
        for( int i=0; i<arguments.length; i+=2 ) {
445
            String name = (String) arguments[i];
446
            Object value = arguments[i+1];
447
            parameters.setDynValue(name, value);
448
        }
449
        return this.openStore(providerName, parameters);
450
    }
451

    
452
    @Override
453
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
454
        try {
455
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
456
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
457
            return (FeatureStore) store;
458
        } catch (Exception ex) {
459
            throw new InitializeException(ex);
460
        }
461
    }
462

    
463
    @Override
464
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
465
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
466
        return (DataStoreProviderFactory) providerFactory;
467
    }
468

    
469
    @Override
470
    public List<String> getStoreProviders() {
471
        return this.getStoreProviderRegister().getFactoryNames();
472
    }
473

    
474
    @Override
475
    public List<String> getStoreProviders(String explorerName) {
476
        try {
477
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
478
            List names = explorer.getDataStoreProviderNames();
479
            return names;
480
        } catch (Exception ex) {
481
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
482
        }
483
    }
484

    
485
    @Override
486
    public List<String> getExplorerProviders() {
487
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
488
        return names;
489
    }
490

    
491
    @Override
492
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
493

    
494
        String providerName = parameters.getDataStoreName();
495
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
496
        if (providerFactory == null) {
497
            throw new ProviderNotRegisteredException(providerName);
498
        }
499
        while (true) {
500
            try {
501
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
502
                        parameters, providerServices
503
                );
504
                return provider;
505
            } catch (Exception e) {
506
                if (openErrorHandler == null) {
507
                    throw new InitializeException(providerName, e);
508
                }
509
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
510
                if (!retry) {
511
                    throw new InitializeException(providerName, e);
512
                }
513
            }
514
        }
515
    }
516

    
517
    @Override
518
    public List<String> getFeatureIndexProviders() {
519
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
520
        return names;
521
    }
522

    
523
    @Override
524
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
525
        this.defaultDataIndexProviders.put(dataType, name);
526
    }
527

    
528
    @Override
529
    public String getDefaultFeatureIndexProviderName(int dataType) {
530
        return this.defaultDataIndexProviders.get(dataType);
531
    }
532

    
533
    @Override
534
    public FeatureIndexProviderServices createFeatureIndexProvider(
535
            String name,
536
            FeatureStore store,
537
            FeatureType type,
538
            String indexName,
539
            FeatureAttributeDescriptor attr
540
    ) throws InitializeException, ProviderNotRegisteredException {
541

    
542
        if (name == null) {
543
            name = getDefaultFeatureIndexProviderName(attr.getType());
544
        }
545

    
546
        if (name == null) {
547
            throw new InitializeException(
548
                    "There not any index provider registered.", null);
549
        }
550
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
551
        if (indexfactory == null) {
552
            throw new InitializeException(
553
                    "There not any index provider registered with name '" + name + "'.", null);
554

    
555
        }
556
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
557

    
558
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
559
                (FeatureStoreProviderServices) store,
560
                type,
561
                provider,
562
                attr.getName(),
563
                indexName
564
        );
565
        services.initialize();
566
        return services;
567

    
568
    }
569

    
570
    @Override
571
    public String getTemporaryDirectory() {
572
        FoldersManager manager = ToolsLocator.getFoldersManager();
573
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
574
        return folder.getAbsolutePath();
575
    }
576

    
577
    @Override
578
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
579
        if (!(struct instanceof DynStruct_v2)) {
580
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
581
        }
582
        Tags tags = ((DynStruct_v2) struct).getTags();
583
        return this.createStoreParameters(tags);
584
    }
585

    
586
    @Override
587
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
588
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
589
        if (providerName == null) {
590
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
591
        }
592
        int prefixlen = TAG_DAL_OPENSTORE.length();
593
        DataStoreParameters parameters = this.createStoreParameters(providerName);
594
        for (String key : tags) {
595
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
596
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
597
            }
598
        }
599
        return parameters;
600
    }
601

    
602
    @Override
603
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
604
        DataStoreParameters paramters = this.createStoreParameters(struct);
605
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
606
        return store;
607
    }
608

    
609
    @Override
610
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
611

    
612
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
613
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
614
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
615
        }
616
        parameters.validate();
617
        try {
618
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
619
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
620
            server.add(providerName, parameters, overwrite);
621
        } catch (Exception e) {
622
            throw new InitializeException(e);
623
        }
624
    }
625

    
626
    @Override
627
    public void registerDefaultEvaluator(Class evaluatorClass) {
628
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
629
            throw new ClassCastException();
630
        }
631
        this.defaultEvaluatorClass = evaluatorClass;
632
    }
633

    
634
    @Override
635
    public Evaluator createExpresion(String expression) throws InitializeException {
636
        try {
637
            Evaluator eval = (Evaluator) this.defaultEvaluatorClass.
638
                    getConstructor(String.class).newInstance(expression);
639
            return eval;
640
        } catch (Exception ex) {
641
            throw new InitializeException(ex);
642
        }
643
    }
644

    
645
    @Override
646
    public  ExpressionEvaluator createExpresion() {
647
        return new ExpressionEvaluatorBase();
648
    }
649

    
650
    @Override
651
    public FeaturePagingHelper createFeaturePagingHelper(
652
            FeatureStore featureStore, int pageSize) throws BaseException {
653
        return new FeaturePagingHelperImpl(featureStore, pageSize);
654
    }
655

    
656
    @Override
657
    public FeaturePagingHelper createFeaturePagingHelper(
658
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
659
            throws BaseException {
660
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
661
    }
662

    
663
    @Override
664
    public void setOpenErrorHandler(OpenErrorHandler handler) {
665
        openErrorHandler = handler;
666
    }
667

    
668
    @Override
669
    public OpenErrorHandler getOpenErrorHandler() {
670
        return this.openErrorHandler;
671
    }
672

    
673
    @Override
674
    public EditableFeatureType createFeatureType() {
675
        return new DefaultEditableFeatureType();
676
    }
677

    
678
    @Override
679
    public DataServerExplorerPool getDataServerExplorerPool() {
680
        if (this.dataServerExplorerPool == null) {
681
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
682
        }
683
        return this.dataServerExplorerPool;
684
    }
685

    
686
    @Override
687
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
688
        this.dataServerExplorerPool = pool;
689
    }
690

    
691
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
692
        if (params instanceof DataStoreParameters) {
693
            return (DataStoreParameters) params;
694
        }
695
        String providerName;
696
        try {
697
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
698
        } catch (Exception ex) {
699
            providerName = provider;
700
        }
701
        DataStoreParameters parameters = this.createStoreParameters(providerName);
702
        ToolsLocator.getDynObjectManager().copy(params, parameters);
703
        return parameters;
704
    }
705

    
706
    @Override
707
    public List<DataType> getDataTypes() {
708
        if (dataTypes == null) {
709
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
710
            dataTypes = new ArrayList<>();
711
            dataTypes.add(manager.get(DataTypes.STRING));
712
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
713
            dataTypes.add(manager.get(DataTypes.INT));
714
            dataTypes.add(manager.get(DataTypes.DOUBLE));
715
            dataTypes.add(manager.get(DataTypes.DATE));
716
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
717
        }
718
        return dataTypes;
719
    }
720

    
721
    @Override
722
    public void setResourcesLoader(ClassLoader loader) {
723
        this.resourcesLoader = loader;
724
    }
725

    
726
    @Override
727
    public void setResourcesLoader(File folder) {
728
        if (folder == null) {
729
            this.resourcesLoader = null;
730
            return;
731
        }
732
        try {
733
            URL[] urls = new URL[]{folder.toURI().toURL()};
734
            this.resourcesLoader = new URLClassLoader(urls);
735
        } catch (Exception ex) {
736
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
737
        }
738
    }
739

    
740
    @Override
741
    public URL getResource(Object reourceLoader, String name) {
742
        URL x;
743
        if (this.resourcesLoader != null) {
744
            x = this.resourcesLoader.getResource(name);
745
            if (x != null) {
746
                return x;
747
            }
748
        }
749
        x = reourceLoader.getClass().getResource(name);
750
        return x;
751
    }
752

    
753
    @Override
754
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
755
        InputStream x;
756
        if (this.resourcesLoader != null) {
757
            x = this.resourcesLoader.getResourceAsStream(name);
758
            if (x != null) {
759
                return x;
760
            }
761
        }
762
        x = reourceLoader.getClass().getResourceAsStream(name);
763
        return x;
764
    }
765

    
766
    @Override
767
    public ExpressionBuilder createExpressionBuilder() {
768
        return new ExpressionBuilderBase();
769
    }
770

    
771
    public void registerFeatureCacheProvider(
772
        FeatureCacheProviderFactory providerFactory) {
773
        ToolsLocator.getExtensionPointManager()
774
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
775
            .append(providerFactory.getName(), "", providerFactory);
776
    }
777

    
778
    public FeatureCacheProvider createFeatureCacheProvider(String name,
779
        DynObject parameters) throws DataException {
780
        if (name == null) {
781
            throw new InitializeException(
782
                "It is necessary to provide a cache name", null);
783
        }
784
        if (parameters == null) {
785
            throw new InitializeException(
786
                "It is necessary to provide parameters to create the explorer",
787
                null);
788
        }
789
        FeatureCacheProviderFactory featureCacheProviderFactory;
790
        try {
791
            featureCacheProviderFactory =
792
                (FeatureCacheProviderFactory) ToolsLocator
793
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
794
                    .create(name);
795
            if (featureCacheProviderFactory == null) {
796
                throw new ProviderNotRegisteredException(name);
797
            }
798
            return featureCacheProviderFactory.createCacheProvider(parameters);
799
        } catch (InstantiationException e) {
800
            throw new InitializeException(e);
801
        } catch (IllegalAccessException e) {
802
            throw new InitializeException(e);
803
        }
804
    }
805

    
806
    @Override
807
    public List getFeatureCacheProviders() {
808
        ExtensionPoint extensionPoint =
809
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
810
        if (extensionPoint != null) {
811
            return ToolsLocator.getExtensionPointManager()
812
                .get(DATA_MANAGER_CACHE).getNames();
813
        } else {
814
            return new ArrayList();
815
        }
816
    }
817

    
818
    @Override
819
    public DynObject createCacheParameters(String name)
820
        throws InitializeException, ProviderNotRegisteredException {
821
        if (name == null) {
822
            throw new InitializeException(
823
                "It is necessary to provide a cache name", null);
824
        }
825
        FeatureCacheProviderFactory featureCacheProviderFactory;
826
        try {
827
            featureCacheProviderFactory =
828
                (FeatureCacheProviderFactory) ToolsLocator
829
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
830
                    .create(name);
831
            if (featureCacheProviderFactory == null) {
832
                throw new ProviderNotRegisteredException(name);
833
            }
834
            return featureCacheProviderFactory.createParameters();
835
        } catch (InstantiationException e) {
836
            throw new InitializeException(e);
837
        } catch (IllegalAccessException e) {
838
            throw new InitializeException(e);
839
        }
840
    }
841

    
842
    @Override
843
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
844
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
845
        DataServerExplorerParameters eparams = null;
846
        DataServerExplorer serverExplorer;
847
        try {
848
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
849
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
850
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
851
        }
852

    
853
        try {
854
            serverExplorer.add(providerName, params, overwrite);
855
        } catch (DataException e) {
856
            throw new CreateFileStoreException(e, providerName);
857
        }
858
    }
859
}