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

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

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

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

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

    
90

    
91
    private class Registers {
92

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

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

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

    
121
    private final Registers registers;
122

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

    
125
    private EvaluatorFactory defaultEvaluatorFactory = null;
126

    
127
    private OpenErrorHandler openErrorHandler = null;
128

    
129
    private DataServerExplorerPool dataServerExplorerPool = null;
130

    
131
    private List<DataType> dataTypes = null;
132

    
133
    private ClassLoader resourcesLoader = null;
134

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

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

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

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

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

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

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

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

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

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

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

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

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

    
223
    }
224

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

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

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

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

    
253
    }
254

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

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

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

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

    
286
    @Override
287
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
288
        try {
289
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
290
            return explorer.getAddParameters(providerName);
291
        } catch (Exception ex) {
292
            throw new InitializeException(ex);
293
        }
294
    }
295

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

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

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

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

    
376
    }
377

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

    
393
    /**
394
     * @deprecated use openStore
395
     * @param parameters
396
     * @return
397
     * @throws InitializeException
398
     * @throws ProviderNotRegisteredException
399
     * @throws ValidateDataParametersException
400
     */
401
    @Override
402
    public DataStore createStore(DataStoreParameters parameters)
403
        throws InitializeException, ProviderNotRegisteredException,
404
        ValidateDataParametersException {
405
        return openStore(parameters.getDataStoreName(), parameters);
406
    }
407

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

    
420
        parameters.validate();
421

    
422
        String storeName = this.getStoreName(parameters);
423
        if( StringUtils.isEmpty(storeName) ) {
424
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
425
            logger.warn(msg);
426
            throw new IllegalArgumentException(msg);
427
        }
428

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

    
442
        DataStore store = (DataStore) storeFactory.create(parameters, this);
443
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
444

    
445
        storeFactory.setProvider(store, provider);
446
        return store;
447
    }
448

    
449
    @Override
450
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
451
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
452
        DataStore store = openStore(params.getDataStoreName(), params);
453
        return store;
454
    }
455

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

    
485
    @Override
486
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
487
        try {
488
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
489
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
490
            return (FeatureStore) store;
491
        } catch (Exception ex) {
492
            throw new InitializeException(ex);
493
        }
494
    }
495

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

    
507
    @Override
508
    public List<String> getStoreProviders() {
509
        return this.getStoreProviderRegister().getFactoryNames();
510
    }
511

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

    
528
    @Override
529
    public List<String> getExplorerProviders() {
530
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
531
        return names;
532
    }
533

    
534
    @Override
535
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
536

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

    
560
    @Override
561
    public List<String> getFeatureIndexProviders() {
562
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
563
        return names;
564
    }
565

    
566
    @Override
567
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
568
        this.defaultDataIndexProviders.put(dataType, name);
569
    }
570

    
571
    @Override
572
    public String getDefaultFeatureIndexProviderName(int dataType) {
573
        return this.defaultDataIndexProviders.get(dataType);
574
    }
575

    
576
    @Override
577
    public FeatureIndexProviderServices createFeatureIndexProvider(
578
            String name,
579
            FeatureStore store,
580
            FeatureType type,
581
            String indexName,
582
            FeatureAttributeDescriptor attr
583
    ) throws InitializeException, ProviderNotRegisteredException {
584

    
585
        if (name == null) {
586
            name = getDefaultFeatureIndexProviderName(attr.getType());
587
        }
588

    
589
        if (name == null) {
590
            throw new InitializeException(
591
                    "There not any index provider registered.", null);
592
        }
593
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
594
        if (indexfactory == null) {
595
            throw new InitializeException(
596
                    "There not any index provider registered with name '" + name + "'.", null);
597

    
598
        }
599
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
600

    
601
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
602
                (FeatureStoreProviderServices) store,
603
                type,
604
                provider,
605
                attr.getName(),
606
                indexName
607
        );
608
        services.initialize();
609
        return services;
610

    
611
    }
612

    
613
    @Override
614
    public String getTemporaryDirectory() {
615
        FoldersManager manager = ToolsLocator.getFoldersManager();
616
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
617
        return folder.getAbsolutePath();
618
    }
619

    
620
    @Override
621
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
622
        if (!(struct instanceof DynStruct_v2)) {
623
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
624
        }
625
        Tags tags = ((DynStruct_v2) struct).getTags();
626
        return this.createStoreParameters(tags);
627
    }
628

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

    
645
    @Override
646
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
647
        DataStoreParameters paramters = this.createStoreParameters(struct);
648
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
649
        return store;
650
    }
651

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

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

    
679
    @Override
680
    public void registerDefaultEvaluator(EvaluatorFactory evaluatorFactory) {
681
        this.defaultEvaluatorFactory = evaluatorFactory;
682
    }
683

    
684
    @Override
685
    public Evaluator createExpresion(String expression) throws InitializeException {
686
        return this.defaultEvaluatorFactory.createEvaluator(expression);
687
    }
688

    
689
    @Override
690
    public FeaturePagingHelper createFeaturePagingHelper(
691
            FeatureStore featureStore, int pageSize) throws BaseException {
692
        return new FeaturePagingHelperImpl(featureStore, pageSize);
693
    }
694

    
695
    @Override
696
    public FeaturePagingHelper createFeaturePagingHelper(
697
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
698
            throws BaseException {
699
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
700
    }
701

    
702
    @Override
703
    public void setOpenErrorHandler(OpenErrorHandler handler) {
704
        openErrorHandler = handler;
705
    }
706

    
707
    @Override
708
    public OpenErrorHandler getOpenErrorHandler() {
709
        return this.openErrorHandler;
710
    }
711

    
712
    @Override
713
    public EditableFeatureType createFeatureType() {
714
        return new DefaultEditableFeatureType(null);
715
    }
716

    
717
    @Override
718
    public DataServerExplorerPool getDataServerExplorerPool() {
719
        if (this.dataServerExplorerPool == null) {
720
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
721
        }
722
        return this.dataServerExplorerPool;
723
    }
724

    
725
    @Override
726
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
727
        this.dataServerExplorerPool = pool;
728
    }
729

    
730
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
731
        if (params instanceof DataStoreParameters) {
732
            return (DataStoreParameters) params;
733
        }
734
        String providerName;
735
        try {
736
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
737
        } catch (Exception ex) {
738
            providerName = provider;
739
        }
740
        DataStoreParameters parameters = this.createStoreParameters(providerName);
741
        ToolsLocator.getDynObjectManager().copy(params, parameters);
742
        return parameters;
743
    }
744

    
745
    @Override
746
    public List<DataType> getDataTypes() {
747
        if (dataTypes == null) {
748
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
749
            dataTypes = new ArrayList<>();
750
            dataTypes.add(manager.get(DataTypes.STRING));
751
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
752
            dataTypes.add(manager.get(DataTypes.INT));
753
            dataTypes.add(manager.get(DataTypes.DOUBLE));
754
            dataTypes.add(manager.get(DataTypes.DATE));
755
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
756
        }
757
        return dataTypes;
758
    }
759

    
760
    @Override
761
    public void setResourcesLoader(ClassLoader loader) {
762
        this.resourcesLoader = loader;
763
    }
764

    
765
    @Override
766
    public void setResourcesLoader(File folder) {
767
        if (folder == null) {
768
            this.resourcesLoader = null;
769
            return;
770
        }
771
        try {
772
            URL[] urls = new URL[]{folder.toURI().toURL()};
773
            this.resourcesLoader = new URLClassLoader(urls);
774
        } catch (Exception ex) {
775
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
776
        }
777
    }
778

    
779
    @Override
780
    public URL getResource(Object reourceLoader, String name) {
781
        URL x;
782
        if (this.resourcesLoader != null) {
783
            x = this.resourcesLoader.getResource(name);
784
            if (x != null) {
785
                return x;
786
            }
787
        }
788
        x = reourceLoader.getClass().getResource(name);
789
        return x;
790
    }
791

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

    
805
    @Override
806
    public ExpressionBuilder createExpressionBuilder() {
807
        return new ExpressionBuilderBase();
808
    }
809

    
810
    public void registerFeatureCacheProvider(
811
        FeatureCacheProviderFactory providerFactory) {
812
        ToolsLocator.getExtensionPointManager()
813
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
814
            .append(providerFactory.getName(), "", providerFactory);
815
    }
816

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

    
845
    @Override
846
    public List getFeatureCacheProviders() {
847
        ExtensionPoint extensionPoint =
848
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
849
        if (extensionPoint != null) {
850
            return ToolsLocator.getExtensionPointManager()
851
                .get(DATA_MANAGER_CACHE).getNames();
852
        } else {
853
            return new ArrayList();
854
        }
855
    }
856

    
857
    @Override
858
    public DynObject createCacheParameters(String name)
859
        throws InitializeException, ProviderNotRegisteredException {
860
        if (name == null) {
861
            throw new InitializeException(
862
                "It is necessary to provide a cache name", null);
863
        }
864
        FeatureCacheProviderFactory featureCacheProviderFactory;
865
        try {
866
            featureCacheProviderFactory =
867
                (FeatureCacheProviderFactory) ToolsLocator
868
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
869
                    .create(name);
870
            if (featureCacheProviderFactory == null) {
871
                throw new ProviderNotRegisteredException(name);
872
            }
873
            return featureCacheProviderFactory.createParameters();
874
        } catch (InstantiationException e) {
875
            throw new InitializeException(e);
876
        } catch (IllegalAccessException e) {
877
            throw new InitializeException(e);
878
        }
879
    }
880

    
881
    @Override
882
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
883
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
884
        DataServerExplorerParameters eparams = null;
885
        DataServerExplorer serverExplorer;
886
        try {
887
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
888
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
889
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
890
        }
891

    
892
        try {
893
            serverExplorer.add(providerName, params, overwrite);
894
        } catch (DataException e) {
895
            throw new CreateFileStoreException(e, providerName);
896
        }
897
    }
898
}