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

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

    
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.expressionevaluator.FeatureSymbolTable;
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.impl.expressionevaluator.DefaultEvaluatorFactory;
54
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureSymbolTable;
55
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
56
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
57
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
58
import org.gvsig.fmap.dal.spi.DALSPILocator;
59
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
60
import org.gvsig.fmap.dal.spi.DataStoreProvider;
61
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
62
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
63
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
64
import org.gvsig.tools.ToolsLocator;
65
import org.gvsig.tools.dataTypes.DataType;
66
import org.gvsig.tools.dataTypes.DataTypesManager;
67
import org.gvsig.tools.dynobject.DynObject;
68
import org.gvsig.tools.dynobject.DynStruct;
69
import org.gvsig.tools.dynobject.DynStruct_v2;
70
import org.gvsig.tools.dynobject.Tags;
71
import org.gvsig.tools.evaluator.Evaluator;
72
import org.gvsig.tools.evaluator.EvaluatorFactory;
73
import org.gvsig.tools.exception.BaseException;
74
import org.gvsig.tools.extensionpoint.ExtensionPoint;
75
import org.gvsig.tools.folders.FoldersManager;
76
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
77
import org.gvsig.tools.identitymanagement.UnauthorizedException;
78
import org.gvsig.tools.service.spi.Services;
79
import org.slf4j.Logger;
80
import org.slf4j.LoggerFactory;
81

    
82
public class DefaultDataManager
83
        implements DataManager, DataManagerProviderServices, Services {
84

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

    
91
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
92

    
93

    
94
    private class Registers {
95

    
96
        private final Register store;
97
        private final Register storeProvider;
98
        private final Register serverExplorer;
99
        private final Register featureIndexProvider;
100

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

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

    
124
    private final Registers registers;
125

    
126
    private final Map<Integer, String> defaultDataIndexProviders;
127

    
128
    private EvaluatorFactory defaultEvaluatorFactory = null;
129

    
130
    private OpenErrorHandler openErrorHandler = null;
131

    
132
    private DataServerExplorerPool dataServerExplorerPool = null;
133

    
134
    private List<DataType> dataTypes = null;
135

    
136
    private ClassLoader resourcesLoader = null;
137

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

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

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

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

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

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

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

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

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

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

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

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

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

    
226
    }
227

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

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

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

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

    
256
    }
257

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

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

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

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

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

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

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

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

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

    
379
    }
380

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

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

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

    
423
        parameters.validate();
424

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

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

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

    
448
        storeFactory.setProvider(store, provider);
449
        return store;
450
    }
451

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
614
    }
615

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
902
    @Override
903
    public FeatureSymbolTable createFeatureSymbolTable() {
904
        FeatureSymbolTable symbolTable = new DefaultFeatureSymbolTable();
905
        return symbolTable;
906
    }
907

    
908
    @Override
909
    public EvaluatorFactory createEvaluatorFactory() {
910
        EvaluatorFactory f = new DefaultEvaluatorFactory();
911
        return f;
912
    }
913
    
914
}