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

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

    
12
import org.gvsig.fmap.dal.DataFactory;
13
import org.gvsig.fmap.dal.DataManager;
14
import org.gvsig.fmap.dal.DataServerExplorer;
15
import org.gvsig.fmap.dal.DataServerExplorerFactory;
16
import org.gvsig.fmap.dal.DataServerExplorerParameters;
17
import org.gvsig.fmap.dal.DataServerExplorerPool;
18
import org.gvsig.fmap.dal.DataStore;
19
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
20
import org.gvsig.fmap.dal.DataStoreParameters;
21
import org.gvsig.fmap.dal.DataStoreProviderFactory;
22
import org.gvsig.fmap.dal.DataTypes;
23
import org.gvsig.fmap.dal.ExpressionBuilder;
24
import org.gvsig.fmap.dal.ExpressionEvaluator;
25
import org.gvsig.fmap.dal.NewDataStoreParameters;
26
import org.gvsig.fmap.dal.OpenErrorHandler;
27
import org.gvsig.fmap.dal.Register;
28
import org.gvsig.fmap.dal.exception.DataException;
29
import org.gvsig.fmap.dal.exception.InitializeException;
30
import org.gvsig.fmap.dal.exception.OpenException;
31
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
32
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
33
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
34
import org.gvsig.fmap.dal.feature.EditableFeatureType;
35
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
36
import org.gvsig.fmap.dal.feature.FeatureQuery;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.dal.feature.FeatureType;
39
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
40
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
41
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
42
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
43
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
44
import org.gvsig.fmap.dal.feature.spi.ExpressionBuilderBase;
45
import org.gvsig.fmap.dal.feature.spi.ExpressionEvaluatorBase;
46
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
47
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
48
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
49
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
50
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
51
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
52
import org.gvsig.fmap.dal.raster.NewRasterStoreParameters;
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.identitymanagement.SimpleIdentityManager;
73
import org.gvsig.tools.identitymanagement.UnauthorizedException;
74
import org.gvsig.tools.service.spi.Services;
75

    
76
public class DefaultDataManager
77
        implements DataManager, DataManagerProviderServices, Services {
78

    
79
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
80
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
81
        "DAL cache providers";
82

    
83
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
84

    
85

    
86
    private class Registers {
87

    
88
        private final Register store;
89
        private final Register storeProvider;
90
        private final Register serverExplorer;
91
        private final Register featureIndexProvider;
92

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

    
111
            this.store.register(new FeatureStoreFactory());
112
        }
113
    }
114
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
115

    
116
    private final Registers registers;
117

    
118
    private final Map<Integer, String> defaultDataIndexProviders;
119

    
120
    private Class defaultEvaluatorClass = null;
121

    
122
    private OpenErrorHandler openErrorHandler = null;
123

    
124
    private DataServerExplorerPool dataServerExplorerPool = null;
125

    
126
    private List<DataType> dataTypes = null;
127

    
128
    private ClassLoader resourcesLoader = null;
129

    
130
    public DefaultDataManager() {
131
        this.registers = new Registers();
132
        this.defaultDataIndexProviders = new HashMap<>();
133
    }
134

    
135
    @Override
136
    public Register getStoreRegister() {
137
        return this.registers.store;
138
    }
139

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

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

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

    
155
    private String getStoreName(DataStoreParameters parameters) {
156
        for (DataFactory factory : this.getStoreRegister()) {
157
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
158
            if (storeFactory.canUse(parameters)) {
159
                return storeFactory.getName();
160
            }
161
        }
162
        return null;
163
    }
164

    
165
    /**
166
     * @deprecated
167
     */
168
    @Override
169
    public void registerDefaultRasterStore(Class rasterStoreClass) {
170
        // Metodo usado por el raster nuevo para regstrar su factoria de store
171
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
172
    }
173

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

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

    
196
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
197
            throw new IllegalArgumentException(parametersClass.getName()
198
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
199
        }
200

    
201
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
202
            // Envuelve al proveedor en una factoria por defecto.
203
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
204
                    name, "", storeProviderClass, parametersClass));
205
            return;
206
        }
207

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

    
215
        throw new IllegalArgumentException("Not supported implemtation: name="
216
                + name + " provider class=" + storeProviderClass.getName());
217

    
218
    }
219

    
220
    @Override
221
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
222
        if (name == null || explorerClass == null || parametersClass == null) {
223
            // FIXME Exception
224
            throw new IllegalArgumentException("Any parameters can be null");
225
        }
226

    
227
        if (!DataServerExplorerParameters.class
228
                .isAssignableFrom(parametersClass)) {
229
            // FIXME Exception
230
            throw new IllegalArgumentException(
231
                    parametersClass.getName()
232
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
233
        }
234

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

    
241
        // Envuelve al proveedor en una factoria por defecto.
242
        this.registerServerExplorerFactory(
243
                new DataServerExplorerToDataExplorerFactoryWrapper(
244
                        name, "", explorerClass, parametersClass
245
                )
246
        );
247

    
248
    }
249

    
250
    @Override
251
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
252
        this.getStoreRegister().register(factory);
253
    }
254

    
255
    @Override
256
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
257
        this.getStoreProviderRegister().register(factory);
258
    }
259

    
260
    @Override
261
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
262
        this.getServerExplorerRegister().register(factory);
263
    }
264

    
265
    @Override
266
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
267
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
268
        return (DataStoreParameters) providerFactory.createParameters();
269
    }
270

    
271
    @Override
272
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
273
        try {
274
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
275
            return explorer.getAddParameters(providerName);
276
        } catch (Exception ex) {
277
            throw new InitializeException(ex);
278
        }
279
    }
280

    
281
    @Override
282
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
283
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
284
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
285
        return params;
286
    }
287

    
288
    @Override
289
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
290
        try {
291
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
292
            if (autoOrderAttributeName != null) {
293
                parameters.setDynValue(
294
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
295
                        autoOrderAttributeName);
296
            }
297
            return parameters;
298
        } catch (Exception ex) {
299
            throw new InitializeException(ex);
300
        }
301
    }
302

    
303
    @Override
304
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
305
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
306
        if (parameters == null) {
307
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
308
        }
309
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
310
                parameters,
311
                new DefaultDataServerExplorerProviderServices()
312
        );
313
        return explorer;
314
    }
315

    
316
    @Override
317
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
318
        if( (arguments.length % 2)!= 0 ) {
319
            throw new ValidateDataParametersException();
320
        }
321
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
322
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
323
        for( int i=0; i<arguments.length; i+=2 ) {
324
            String name = (String) arguments[i];
325
            Object value = arguments[i+1];
326
            parameters.setDynValue(name, value);
327
        }
328
        return this.openServerExplorer(explorerName, parameters);
329

    
330
    }
331

    
332
    /**
333
     * @param parameters
334
     * @return
335
     * @throws org.gvsig.fmap.dal.exception.InitializeException
336
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
337
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
338
     * @deprecated see openServerExplorer
339
     */
340
    @Override
341
    public DataServerExplorer createServerExplorer(
342
            DataServerExplorerParameters parameters) throws InitializeException,
343
            ProviderNotRegisteredException, ValidateDataParametersException {
344
        return openServerExplorer(parameters.getExplorerName(), parameters);
345
    }
346

    
347
    /**
348
     * @deprecated use openStore
349
     * @param parameters
350
     * @return
351
     * @throws InitializeException
352
     * @throws ProviderNotRegisteredException
353
     * @throws ValidateDataParametersException
354
     */
355
    @Override
356
    public DataStore createStore(DataStoreParameters parameters)
357
        throws InitializeException, ProviderNotRegisteredException,
358
        ValidateDataParametersException {
359
        return openStore(parameters.getDataStoreName(), parameters);
360
    }
361

    
362
    @Override
363
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
364

    
365
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
366
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
367
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
368
        }
369

    
370
        parameters.validate();
371

    
372
        String storeName = this.getStoreName(parameters);
373

    
374
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
375
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
376

    
377
        DataStore store = (DataStore) storeFactory.create(parameters, this);
378
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
379

    
380
        storeFactory.setProvider(store, provider);
381
        return store;
382
    }
383

    
384
    @Override
385
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
386
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
387
        DataStore store = openStore(params.getDataStoreName(), params);
388
        return store;
389
    }
390

    
391
    @Override
392
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
393
        if( arguments.length == 1 ) { 
394
            // Desde jython entra por este metodo en lugar de los especificos
395
            // de DataStoreParameters o DynObject
396
            if( arguments[0] instanceof DataStoreParameters ) {
397
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
398
            } else if( arguments[0] instanceof DynObject ) {
399
                return this.openStore(providerName, (DynObject)(arguments[0]));
400
            }
401
        }
402
        if( (arguments.length % 2)!= 0 ) {
403
            throw new ValidateDataParametersException();
404
        }
405
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
406
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
407
        for( int i=0; i<arguments.length; i+=2 ) {
408
            String name = (String) arguments[i];
409
            Object value = arguments[i+1];
410
            parameters.setDynValue(name, value);
411
        }
412
        return this.openStore(providerName, parameters);
413
    }
414

    
415
    @Override
416
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
417
        try {
418
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
419
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
420
            return (FeatureStore) store;
421
        } catch (Exception ex) {
422
            throw new InitializeException(ex);
423
        }
424
    }
425

    
426
    @Override
427
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
428
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
429
        return (DataStoreProviderFactory) providerFactory;
430
    }
431

    
432
    @Override
433
    public List<String> getStoreProviders() {
434
        return this.getStoreProviderRegister().getFactoryNames();
435
    }
436

    
437
    @Override
438
    public List<String> getStoreProviders(String explorerName) {
439
        try {
440
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
441
            List names = explorer.getDataStoreProviderNames();
442
            return names;
443
        } catch (Exception ex) {
444
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
445
        }
446
    }
447

    
448
    @Override
449
    public List<String> getExplorerProviders() {
450
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
451
        return names;
452
    }
453

    
454
    @Override
455
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
456

    
457
        String providerName = parameters.getDataStoreName();
458
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
459
        if (providerFactory == null) {
460
            throw new ProviderNotRegisteredException(providerName);
461
        }
462
        while (true) {
463
            try {
464
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
465
                        parameters, providerServices
466
                );
467
                return provider;
468
            } catch (Exception e) {
469
                if (openErrorHandler == null) {
470
                    throw new InitializeException(providerName, e);
471
                }
472
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
473
                if (!retry) {
474
                    throw new InitializeException(providerName, e);
475
                }
476
            }
477
        }
478
    }
479

    
480
    @Override
481
    public List<String> getFeatureIndexProviders() {
482
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
483
        return names;
484
    }
485

    
486
    @Override
487
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
488
        this.defaultDataIndexProviders.put(dataType, name);
489
    }
490

    
491
    @Override
492
    public String getDefaultFeatureIndexProviderName(int dataType) {
493
        return this.defaultDataIndexProviders.get(dataType);
494
    }
495

    
496
    @Override
497
    public FeatureIndexProviderServices createFeatureIndexProvider(
498
            String name,
499
            FeatureStore store,
500
            FeatureType type,
501
            String indexName,
502
            FeatureAttributeDescriptor attr
503
    ) throws InitializeException, ProviderNotRegisteredException {
504

    
505
        if (name == null) {
506
            name = getDefaultFeatureIndexProviderName(attr.getType());
507
        }
508

    
509
        if (name == null) {
510
            throw new InitializeException(
511
                    "There not any index provider registered.", null);
512
        }
513
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
514
        if (indexfactory == null) {
515
            throw new InitializeException(
516
                    "There not any index provider registered with name '" + name + "'.", null);
517

    
518
        }
519
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
520

    
521
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
522
                (FeatureStoreProviderServices) store,
523
                type,
524
                provider,
525
                attr.getName(),
526
                indexName
527
        );
528
        services.initialize();
529
        return services;
530

    
531
    }
532

    
533
    @Override
534
    public String getTemporaryDirectory() {
535
        // FIXME Define a better tempdir solution
536
        String tmp = System.getProperty("TMP");
537
        if (tmp == null) {
538
            tmp = System.getProperty("TEMP");
539
        }
540
        if (tmp == null) {
541
            File tmp_file = new File(System.getProperty("HOME"), "_daltmp_");
542
            int i = 1;
543
            while (!tmp_file.exists() || !tmp_file.isDirectory()) {
544
                tmp_file = new File(tmp_file.getAbsolutePath() + i);
545
                i++;
546
            }
547
            if (!tmp_file.exists()) {
548
                tmp_file.mkdir();
549
            }
550
            tmp = tmp_file.getAbsolutePath();
551
        }
552
        return tmp;
553
    }
554

    
555
    @Override
556
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
557
        if (!(struct instanceof DynStruct_v2)) {
558
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
559
        }
560
        Tags tags = ((DynStruct_v2) struct).getTags();
561
        return this.createStoreParameters(tags);
562
    }
563

    
564
    @Override
565
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
566
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
567
        if (providerName == null) {
568
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
569
        }
570
        int prefixlen = TAG_DAL_OPENSTORE.length();
571
        DataStoreParameters parameters = this.createStoreParameters(providerName);
572
        for (String key : tags) {
573
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
574
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
575
            }
576
        }
577
        return parameters;
578
    }
579

    
580
    @Override
581
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
582
        DataStoreParameters paramters = this.createStoreParameters(struct);
583
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
584
        return store;
585
    }
586

    
587
    @Override
588
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
589

    
590
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
591
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
592
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
593
        }
594
        parameters.validate();
595
        try {
596
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
597
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
598
            server.add(providerName, parameters, overwrite);
599
        } catch (Exception e) {
600
            throw new InitializeException(e);
601
        }
602
    }
603

    
604
    @Override
605
    public void registerDefaultEvaluator(Class evaluatorClass) {
606
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
607
            throw new ClassCastException();
608
        }
609
        this.defaultEvaluatorClass = evaluatorClass;
610
    }
611

    
612
    @Override
613
    public Evaluator createExpresion(String expression) throws InitializeException {
614
        try {
615
            Evaluator eval = (Evaluator) this.defaultEvaluatorClass.
616
                    getConstructor(String.class).newInstance(expression);
617
            return eval;
618
        } catch (Exception ex) {
619
            throw new InitializeException(ex);
620
        }
621
    }
622

    
623
    @Override
624
    public  ExpressionEvaluator createExpresion() {
625
        return new ExpressionEvaluatorBase();
626
    }
627

    
628
    @Override
629
    public FeaturePagingHelper createFeaturePagingHelper(
630
            FeatureStore featureStore, int pageSize) throws BaseException {
631
        return new FeaturePagingHelperImpl(featureStore, pageSize);
632
    }
633

    
634
    @Override
635
    public FeaturePagingHelper createFeaturePagingHelper(
636
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
637
            throws BaseException {
638
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
639
    }
640

    
641
    @Override
642
    public void setOpenErrorHandler(OpenErrorHandler handler) {
643
        openErrorHandler = handler;
644
    }
645

    
646
    @Override
647
    public OpenErrorHandler getOpenErrorHandler() {
648
        return this.openErrorHandler;
649
    }
650

    
651
    @Override
652
    public EditableFeatureType createFeatureType() {
653
        return new DefaultEditableFeatureType();
654
    }
655

    
656
    @Override
657
    public DataServerExplorerPool getDataServerExplorerPool() {
658
        if (this.dataServerExplorerPool == null) {
659
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
660
        }
661
        return this.dataServerExplorerPool;
662
    }
663

    
664
    @Override
665
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
666
        this.dataServerExplorerPool = pool;
667
    }
668

    
669
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
670
        if (params instanceof DataStoreParameters) {
671
            return (DataStoreParameters) params;
672
        }
673
        String providerName;
674
        try {
675
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
676
        } catch (Exception ex) {
677
            providerName = provider;
678
        }
679
        DataStoreParameters parameters = this.createStoreParameters(providerName);
680
        ToolsLocator.getDynObjectManager().copy(params, parameters);
681
        return parameters;
682
    }
683

    
684
    @Override
685
    public List<DataType> getDataTypes() {
686
        if (dataTypes == null) {
687
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
688
            dataTypes = new ArrayList<>();
689
            dataTypes.add(manager.get(DataTypes.STRING));
690
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
691
            dataTypes.add(manager.get(DataTypes.INT));
692
            dataTypes.add(manager.get(DataTypes.DOUBLE));
693
            dataTypes.add(manager.get(DataTypes.DATE));
694
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
695
        }
696
        return dataTypes;
697
    }
698

    
699
    @Override
700
    public void setResourcesLoader(ClassLoader loader) {
701
        this.resourcesLoader = loader;
702
    }
703

    
704
    @Override
705
    public void setResourcesLoader(File folder) {
706
        if (folder == null) {
707
            this.resourcesLoader = null;
708
            return;
709
        }
710
        try {
711
            URL[] urls = new URL[]{folder.toURI().toURL()};
712
            this.resourcesLoader = new URLClassLoader(urls);
713
        } catch (Exception ex) {
714
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
715
        }
716
    }
717

    
718
    @Override
719
    public URL getResource(Object reourceLoader, String name) {
720
        URL x;
721
        if (this.resourcesLoader != null) {
722
            x = this.resourcesLoader.getResource(name);
723
            if (x != null) {
724
                return x;
725
            }
726
        }
727
        x = reourceLoader.getClass().getResource(name);
728
        return x;
729
    }
730

    
731
    @Override
732
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
733
        InputStream x;
734
        if (this.resourcesLoader != null) {
735
            x = this.resourcesLoader.getResourceAsStream(name);
736
            if (x != null) {
737
                return x;
738
            }
739
        }
740
        x = reourceLoader.getClass().getResourceAsStream(name);
741
        return x;
742
    }
743

    
744
    @Override
745
    public ExpressionBuilder createExpressionBuilder() {
746
        return new ExpressionBuilderBase();
747
    }
748

    
749
    public void registerFeatureCacheProvider(
750
        FeatureCacheProviderFactory providerFactory) {
751
        ToolsLocator.getExtensionPointManager()
752
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
753
            .append(providerFactory.getName(), "", providerFactory);
754
    }
755

    
756
    public FeatureCacheProvider createFeatureCacheProvider(String name,
757
        DynObject parameters) throws DataException {
758
        if (name == null) {
759
            throw new InitializeException(
760
                "It is necessary to provide a cache name", null);
761
        }
762
        if (parameters == null) {
763
            throw new InitializeException(
764
                "It is necessary to provide parameters to create the explorer",
765
                null);
766
        }
767
        FeatureCacheProviderFactory featureCacheProviderFactory;
768
        try {
769
            featureCacheProviderFactory =
770
                (FeatureCacheProviderFactory) ToolsLocator
771
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
772
                    .create(name);
773
            if (featureCacheProviderFactory == null) {
774
                throw new ProviderNotRegisteredException(name);
775
            }
776
            return featureCacheProviderFactory.createCacheProvider(parameters);
777
        } catch (InstantiationException e) {
778
            throw new InitializeException(e);
779
        } catch (IllegalAccessException e) {
780
            throw new InitializeException(e);
781
        }
782
    }
783

    
784
    @Override
785
    public List getFeatureCacheProviders() {
786
        ExtensionPoint extensionPoint =
787
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
788
        if (extensionPoint != null) {
789
            return ToolsLocator.getExtensionPointManager()
790
                .get(DATA_MANAGER_CACHE).getNames();
791
        } else {
792
            return new ArrayList();
793
        }
794
    }
795

    
796
    @Override
797
    public DynObject createCacheParameters(String name)
798
        throws InitializeException, ProviderNotRegisteredException {
799
        if (name == null) {
800
            throw new InitializeException(
801
                "It is necessary to provide a cache name", null);
802
        }
803
        FeatureCacheProviderFactory featureCacheProviderFactory;
804
        try {
805
            featureCacheProviderFactory =
806
                (FeatureCacheProviderFactory) ToolsLocator
807
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
808
                    .create(name);
809
            if (featureCacheProviderFactory == null) {
810
                throw new ProviderNotRegisteredException(name);
811
            }
812
            return featureCacheProviderFactory.createParameters();
813
        } catch (InstantiationException e) {
814
            throw new InitializeException(e);
815
        } catch (IllegalAccessException e) {
816
            throw new InitializeException(e);
817
        }
818
    }
819

    
820
    @Override
821
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
822
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
823
        DataServerExplorerParameters eparams = null;
824
        DataServerExplorer serverExplorer;
825
        try {
826
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
827
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
828
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
829
        }
830

    
831
        try {
832
            serverExplorer.add(providerName, params, overwrite);
833
        } catch (DataException e) {
834
            throw new CreateFileStoreException(e, providerName);
835
        }
836
    }
837

    
838

    
839
}