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

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

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

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

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

    
86

    
87
    private class Registers {
88

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

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

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

    
117
    private final Registers registers;
118

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

    
121
    private Class defaultEvaluatorClass = null;
122

    
123
    private OpenErrorHandler openErrorHandler = null;
124

    
125
    private DataServerExplorerPool dataServerExplorerPool = null;
126

    
127
    private List<DataType> dataTypes = null;
128

    
129
    private ClassLoader resourcesLoader = null;
130

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

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

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

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

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

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

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

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

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

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

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

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

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

    
219
    }
220

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

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

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

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

    
249
    }
250

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

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

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

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

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

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

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

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

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

    
331
    }
332

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

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

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

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

    
371
        parameters.validate();
372

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
532
    }
533

    
534
    @Override
535
    public String getTemporaryDirectory() {
536
        FoldersManager manager = ToolsLocator.getFoldersManager();
537
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
538
        return folder.getAbsolutePath();
539
    }
540

    
541
    @Override
542
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
543
        if (!(struct instanceof DynStruct_v2)) {
544
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
545
        }
546
        Tags tags = ((DynStruct_v2) struct).getTags();
547
        return this.createStoreParameters(tags);
548
    }
549

    
550
    @Override
551
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
552
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
553
        if (providerName == null) {
554
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
555
        }
556
        int prefixlen = TAG_DAL_OPENSTORE.length();
557
        DataStoreParameters parameters = this.createStoreParameters(providerName);
558
        for (String key : tags) {
559
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
560
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
561
            }
562
        }
563
        return parameters;
564
    }
565

    
566
    @Override
567
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
568
        DataStoreParameters paramters = this.createStoreParameters(struct);
569
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
570
        return store;
571
    }
572

    
573
    @Override
574
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
575

    
576
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
577
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
578
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
579
        }
580
        parameters.validate();
581
        try {
582
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
583
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
584
            server.add(providerName, parameters, overwrite);
585
        } catch (Exception e) {
586
            throw new InitializeException(e);
587
        }
588
    }
589

    
590
    @Override
591
    public void registerDefaultEvaluator(Class evaluatorClass) {
592
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
593
            throw new ClassCastException();
594
        }
595
        this.defaultEvaluatorClass = evaluatorClass;
596
    }
597

    
598
    @Override
599
    public Evaluator createExpresion(String expression) throws InitializeException {
600
        try {
601
            Evaluator eval = (Evaluator) this.defaultEvaluatorClass.
602
                    getConstructor(String.class).newInstance(expression);
603
            return eval;
604
        } catch (Exception ex) {
605
            throw new InitializeException(ex);
606
        }
607
    }
608

    
609
    @Override
610
    public  ExpressionEvaluator createExpresion() {
611
        return new ExpressionEvaluatorBase();
612
    }
613

    
614
    @Override
615
    public FeaturePagingHelper createFeaturePagingHelper(
616
            FeatureStore featureStore, int pageSize) throws BaseException {
617
        return new FeaturePagingHelperImpl(featureStore, pageSize);
618
    }
619

    
620
    @Override
621
    public FeaturePagingHelper createFeaturePagingHelper(
622
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
623
            throws BaseException {
624
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
625
    }
626

    
627
    @Override
628
    public void setOpenErrorHandler(OpenErrorHandler handler) {
629
        openErrorHandler = handler;
630
    }
631

    
632
    @Override
633
    public OpenErrorHandler getOpenErrorHandler() {
634
        return this.openErrorHandler;
635
    }
636

    
637
    @Override
638
    public EditableFeatureType createFeatureType() {
639
        return new DefaultEditableFeatureType();
640
    }
641

    
642
    @Override
643
    public DataServerExplorerPool getDataServerExplorerPool() {
644
        if (this.dataServerExplorerPool == null) {
645
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
646
        }
647
        return this.dataServerExplorerPool;
648
    }
649

    
650
    @Override
651
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
652
        this.dataServerExplorerPool = pool;
653
    }
654

    
655
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
656
        if (params instanceof DataStoreParameters) {
657
            return (DataStoreParameters) params;
658
        }
659
        String providerName;
660
        try {
661
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
662
        } catch (Exception ex) {
663
            providerName = provider;
664
        }
665
        DataStoreParameters parameters = this.createStoreParameters(providerName);
666
        ToolsLocator.getDynObjectManager().copy(params, parameters);
667
        return parameters;
668
    }
669

    
670
    @Override
671
    public List<DataType> getDataTypes() {
672
        if (dataTypes == null) {
673
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
674
            dataTypes = new ArrayList<>();
675
            dataTypes.add(manager.get(DataTypes.STRING));
676
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
677
            dataTypes.add(manager.get(DataTypes.INT));
678
            dataTypes.add(manager.get(DataTypes.DOUBLE));
679
            dataTypes.add(manager.get(DataTypes.DATE));
680
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
681
        }
682
        return dataTypes;
683
    }
684

    
685
    @Override
686
    public void setResourcesLoader(ClassLoader loader) {
687
        this.resourcesLoader = loader;
688
    }
689

    
690
    @Override
691
    public void setResourcesLoader(File folder) {
692
        if (folder == null) {
693
            this.resourcesLoader = null;
694
            return;
695
        }
696
        try {
697
            URL[] urls = new URL[]{folder.toURI().toURL()};
698
            this.resourcesLoader = new URLClassLoader(urls);
699
        } catch (Exception ex) {
700
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
701
        }
702
    }
703

    
704
    @Override
705
    public URL getResource(Object reourceLoader, String name) {
706
        URL x;
707
        if (this.resourcesLoader != null) {
708
            x = this.resourcesLoader.getResource(name);
709
            if (x != null) {
710
                return x;
711
            }
712
        }
713
        x = reourceLoader.getClass().getResource(name);
714
        return x;
715
    }
716

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

    
730
    @Override
731
    public ExpressionBuilder createExpressionBuilder() {
732
        return new ExpressionBuilderBase();
733
    }
734

    
735
    public void registerFeatureCacheProvider(
736
        FeatureCacheProviderFactory providerFactory) {
737
        ToolsLocator.getExtensionPointManager()
738
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
739
            .append(providerFactory.getName(), "", providerFactory);
740
    }
741

    
742
    public FeatureCacheProvider createFeatureCacheProvider(String name,
743
        DynObject parameters) throws DataException {
744
        if (name == null) {
745
            throw new InitializeException(
746
                "It is necessary to provide a cache name", null);
747
        }
748
        if (parameters == null) {
749
            throw new InitializeException(
750
                "It is necessary to provide parameters to create the explorer",
751
                null);
752
        }
753
        FeatureCacheProviderFactory featureCacheProviderFactory;
754
        try {
755
            featureCacheProviderFactory =
756
                (FeatureCacheProviderFactory) ToolsLocator
757
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
758
                    .create(name);
759
            if (featureCacheProviderFactory == null) {
760
                throw new ProviderNotRegisteredException(name);
761
            }
762
            return featureCacheProviderFactory.createCacheProvider(parameters);
763
        } catch (InstantiationException e) {
764
            throw new InitializeException(e);
765
        } catch (IllegalAccessException e) {
766
            throw new InitializeException(e);
767
        }
768
    }
769

    
770
    @Override
771
    public List getFeatureCacheProviders() {
772
        ExtensionPoint extensionPoint =
773
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
774
        if (extensionPoint != null) {
775
            return ToolsLocator.getExtensionPointManager()
776
                .get(DATA_MANAGER_CACHE).getNames();
777
        } else {
778
            return new ArrayList();
779
        }
780
    }
781

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

    
806
    @Override
807
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
808
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
809
        DataServerExplorerParameters eparams = null;
810
        DataServerExplorer serverExplorer;
811
        try {
812
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
813
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
814
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
815
        }
816

    
817
        try {
818
            serverExplorer.add(providerName, params, overwrite);
819
        } catch (DataException e) {
820
            throw new CreateFileStoreException(e, providerName);
821
        }
822
    }
823

    
824

    
825
}