Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / impl / DefaultDataManager.java @ 43799

History | View | Annotate | Download (35.2 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
        //FIXME: Se debe a?adir un bind en el setProvider en los stores y aqu? hacer un dispose
447
        // DisposeUtils.dispose(provider);
448
        return store;
449
    }
450

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

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

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

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

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

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

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

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

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

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

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

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

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

    
587
        if (name == null) {
588
            name = getDefaultFeatureIndexProviderName(attr.getType());
589
        }
590

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

    
600
        }
601
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
602

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

    
613
    }
614

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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