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

History | View | Annotate | Download (28.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
import org.gvsig.fmap.dal.DataFactory;
12
import org.gvsig.fmap.dal.DataManager;
13
import static org.gvsig.fmap.dal.DataManager.READ_STORE_AUTHORIZATION;
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.NewDataStoreParameters;
25
import org.gvsig.fmap.dal.OpenErrorHandler;
26
import org.gvsig.fmap.dal.Register;
27
import org.gvsig.fmap.dal.exception.DataException;
28
import org.gvsig.fmap.dal.exception.InitializeException;
29
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
30
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
31
import org.gvsig.fmap.dal.feature.EditableFeatureType;
32
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
33
import org.gvsig.fmap.dal.feature.FeatureQuery;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.feature.FeatureType;
36
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
37
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
38
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
39
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
40
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
41
import org.gvsig.fmap.dal.feature.spi.ExpressionBuilderBase;
42
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
43
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
44
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
45
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
46
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
47
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
48
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
49
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
50
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
51
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
52
import org.gvsig.fmap.dal.spi.DataStoreProvider;
53
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
54
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
55
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
56
import org.gvsig.tools.ToolsLocator;
57
import org.gvsig.tools.dataTypes.DataType;
58
import org.gvsig.tools.dataTypes.DataTypesManager;
59
import org.gvsig.tools.dynobject.DynObject;
60
import org.gvsig.tools.dynobject.DynStruct;
61
import org.gvsig.tools.dynobject.DynStruct_v2;
62
import org.gvsig.tools.dynobject.Tags;
63
import org.gvsig.tools.evaluator.Evaluator;
64
import org.gvsig.tools.exception.BaseException;
65
import org.gvsig.tools.extensionpoint.ExtensionPoint;
66
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
67
import org.gvsig.tools.identitymanagement.UnauthorizedException;
68
import org.gvsig.tools.service.spi.Services;
69

    
70
public class DefaultDataManager
71
        implements DataManager, DataManagerProviderServices, Services {
72
    
73
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
74
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
75
        "DAL cache providers";
76
    
77
    private class Registers {
78

    
79
        private final Register store;
80
        private final Register storeProvider;
81
        private final Register serverExplorer;
82
        private final Register featureIndexProvider;
83

    
84
        public Registers() {
85
            this.store = new RegisterImpl(
86
                    "Data.manager.stores.factory",
87
                    "DAL store factories"
88
            );
89
            this.storeProvider = new RegisterImpl(
90
                    "Data.manager.providers.factory",
91
                    "DAL store provider factories"
92
            );
93
            this.serverExplorer = new RegisterImpl(
94
                    "Data.manager.servereexplorer.factory",
95
                    "DAL server explorer factories"
96
            );
97
            this.featureIndexProvider = new RegisterImpl(
98
                    "Data.manager.feature.index.factory",
99
                    "DAL feature index factories"
100
            );
101

    
102
            this.store.register(new FeatureStoreFactory());
103
        }
104
    }
105
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
106

    
107
    private final Registers registers;
108

    
109
    private final Map<Integer, String> defaultDataIndexProviders;
110

    
111
    private Class defaultEvaluatorClass = null;
112

    
113
    private OpenErrorHandler openErrorHandler = null;
114

    
115
    private DataServerExplorerPool dataServerExplorerPool = null;
116

    
117
    private List<DataType> dataTypes = null;
118

    
119
    private ClassLoader resourcesLoader = null;
120

    
121
    public DefaultDataManager() {
122
        this.registers = new Registers();
123
        this.defaultDataIndexProviders = new HashMap<>();
124
    }
125

    
126
    @Override
127
    public Register getStoreRegister() {
128
        return this.registers.store;
129
    }
130

    
131
    @Override
132
    public Register getStoreProviderRegister() {
133
        return this.registers.storeProvider;
134
    }
135

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

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

    
146
    private String getStoreName(DataStoreParameters parameters) {
147
        for (DataFactory factory : this.getStoreRegister()) {
148
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
149
            if (storeFactory.canUse(parameters)) {
150
                return storeFactory.getName();
151
            }
152
        }
153
        return null;
154
    }
155

    
156
    /**
157
     * @deprecated
158
     */
159
    @Override
160
    public void registerDefaultRasterStore(Class rasterStoreClass) {
161
        // Metodo usado por el raster nuevo para regstrar su factoria de store
162
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
163
    }
164

    
165
    /**
166
     * @deprecated
167
     */
168
    @Override
169
    public void registerStoreFactory(String name, Class storeFactoryClass) {
170
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
171
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
172
    }
173

    
174
    /**
175
     * @param name
176
     * @param storeProviderClass
177
     * @param parametersClass
178
     * @deprecated use registerStoreProviderFactory
179
     */
180
    @Override
181
    public void registerStoreProvider(String name, Class storeProviderClass,
182
            Class parametersClass) {
183
        if (name == null || storeProviderClass == null || parametersClass == null) {
184
            throw new IllegalArgumentException("Any parameters can be null");
185
        }
186

    
187
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
188
            throw new IllegalArgumentException(parametersClass.getName()
189
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
190
        }
191

    
192
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
193
            // Envuelve al proveedor en una factoria por defecto.
194
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
195
                    name, "", storeProviderClass, parametersClass));
196
            return;
197
        }
198

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

    
206
        throw new IllegalArgumentException("Not supported implemtation: name="
207
                + name + " provider class=" + storeProviderClass.getName());
208

    
209
    }
210

    
211
    @Override
212
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
213
        if (name == null || explorerClass == null || parametersClass == null) {
214
            // FIXME Exception
215
            throw new IllegalArgumentException("Any parameters can be null");
216
        }
217

    
218
        if (!DataServerExplorerParameters.class
219
                .isAssignableFrom(parametersClass)) {
220
            // FIXME Exception
221
            throw new IllegalArgumentException(
222
                    parametersClass.getName()
223
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
224
        }
225

    
226
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
227
            // FIXME Exception
228
            throw new IllegalArgumentException(explorerClass.getName()
229
                    + " must implement org.gvsig.fmap.dal.DataServerExplorer");
230
        }
231

    
232
        // Envuelve al proveedor en una factoria por defecto.
233
        this.registerServerExplorerFactory(
234
                new DataServerExplorerToDataExplorerFactoryWrapper(
235
                        name, "", explorerClass, parametersClass
236
                )
237
        );
238

    
239
    }
240

    
241
    @Override
242
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
243
        this.getStoreRegister().register(factory);
244
    }
245

    
246
    @Override
247
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
248
        this.getStoreProviderRegister().register(factory);
249
    }
250

    
251
    @Override
252
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
253
        this.getServerExplorerRegister().register(factory);
254
    }
255

    
256
    @Override
257
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
258
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
259
        return (DataStoreParameters) providerFactory.createParameters();
260
    }
261

    
262
    @Override
263
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
264
        try {
265
            DataServerExplorer explorer = this.openServerExplorer(explorerName, null);
266
            return explorer.getAddParameters(providerName);
267
        } catch (Exception ex) {
268
            throw new InitializeException(ex);
269
        }
270
    }
271

    
272
    @Override
273
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
274
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
275
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
276
        return params;
277
    }
278

    
279
    @Override
280
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
281
        try {
282
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
283
            if (autoOrderAttributeName != null) {
284
                parameters.setDynValue(
285
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
286
                        autoOrderAttributeName);
287
            }
288
            return parameters;
289
        } catch (Exception ex) {
290
            throw new InitializeException(ex);
291
        }
292
    }
293

    
294
    @Override
295
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
296
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
297
        if (parameters == null) {
298
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
299
        }
300
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
301
                parameters,
302
                new DefaultDataServerExplorerProviderServices()
303
        );
304
        return explorer;
305
    }
306

    
307
    /**
308
     * @param parameters
309
     * @return
310
     * @throws org.gvsig.fmap.dal.exception.InitializeException
311
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
312
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
313
     * @deprecated see openServerExplorer
314
     */
315
    @Override
316
    public DataServerExplorer createServerExplorer(
317
            DataServerExplorerParameters parameters) throws InitializeException,
318
            ProviderNotRegisteredException, ValidateDataParametersException {
319
        return openServerExplorer(parameters.getExplorerName(), parameters);
320
    }
321

    
322
    /**
323
     * @deprecated use openStore
324
     * @param parameters
325
     * @return
326
     * @throws InitializeException
327
     * @throws ProviderNotRegisteredException
328
     * @throws ValidateDataParametersException 
329
     */
330
    @Override
331
    public DataStore createStore(DataStoreParameters parameters)
332
        throws InitializeException, ProviderNotRegisteredException,
333
        ValidateDataParametersException {
334
        return openStore(parameters.getDataStoreName(), parameters);
335
    }
336
    
337
    @Override
338
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
339

    
340
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
341
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
342
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
343
        }
344

    
345
        String storeName = this.getStoreName(parameters);
346

    
347
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
348
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
349

    
350
        DataStore store = (DataStore) storeFactory.create(parameters, this);
351
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
352

    
353
        storeFactory.setProvider(store, provider);
354
        return store;
355
    }
356

    
357
    @Override
358
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
359
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
360
        DataStore store = openStore(params.getDataStoreName(), params);
361
        return store;
362
    }
363

    
364
    @Override
365
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
366
        try {
367
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
368
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
369
            return (FeatureStore) store;
370
        } catch (Exception ex) {
371
            throw new InitializeException(ex);
372
        }
373
    }
374

    
375
    @Override
376
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
377
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
378
        return (DataStoreProviderFactory) providerFactory;
379
    }
380

    
381
    @Override
382
    public List<String> getStoreProviders() {
383
        return this.getStoreProviderRegister().getFactoryNames();
384
    }
385

    
386
    @Override
387
    public List<String> getStoreProviders(String explorerName) {
388
        try {
389
            DataServerExplorer explorer = openServerExplorer(explorerName, null);
390
            List names = explorer.getDataStoreProviderNames();
391
            return names;
392
        } catch (Exception ex) {
393
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
394
        }
395
    }
396

    
397
    @Override
398
    public List<String> getExplorerProviders() {
399
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
400
        return names;
401
    }
402

    
403
    @Override
404
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
405

    
406
        String providerName = parameters.getDataStoreName();
407
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
408
        if (providerFactory == null) {
409
            throw new ProviderNotRegisteredException(providerName);
410
        }
411
        while (true) {
412
            try {
413
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
414
                        parameters, providerServices
415
                );
416
                return provider;
417
            } catch (Exception e) {
418
                if (openErrorHandler == null) {
419
                    throw new InitializeException(providerName, e);
420
                }
421
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
422
                if (!retry) {
423
                    throw new InitializeException(providerName, e);
424
                }
425
            }
426
        }
427
    }
428

    
429
    @Override
430
    public List<String> getFeatureIndexProviders() {
431
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
432
        return names;
433
    }
434

    
435
    @Override
436
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
437
        this.defaultDataIndexProviders.put(dataType, name);
438
    }
439

    
440
    @Override
441
    public String getDefaultFeatureIndexProviderName(int dataType) {
442
        return this.defaultDataIndexProviders.get(dataType);
443
    }
444

    
445
    @Override
446
    public FeatureIndexProviderServices createFeatureIndexProvider(
447
            String name,
448
            FeatureStore store,
449
            FeatureType type,
450
            String indexName,
451
            FeatureAttributeDescriptor attr
452
    ) throws InitializeException, ProviderNotRegisteredException {
453

    
454
        if (name == null) {
455
            name = getDefaultFeatureIndexProviderName(attr.getType());
456
        }
457

    
458
        if (name == null) {
459
            throw new InitializeException(
460
                    "There not any index provider registered.", null);
461
        }
462
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
463
        if (indexfactory == null) {
464
            throw new InitializeException(
465
                    "There not any index provider registered with name '" + name + "'.", null);
466

    
467
        }
468
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
469

    
470
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
471
                (FeatureStoreProviderServices) store,
472
                type,
473
                provider,
474
                attr.getName(),
475
                indexName
476
        );
477
        services.initialize();
478
        return services;
479

    
480
    }
481

    
482
    @Override
483
    public String getTemporaryDirectory() {
484
        // FIXME Define a better tempdir solution
485
        String tmp = System.getProperty("TMP");
486
        if (tmp == null) {
487
            tmp = System.getProperty("TEMP");
488
        }
489
        if (tmp == null) {
490
            File tmp_file = new File(System.getProperty("HOME"), "_daltmp_");
491
            int i = 1;
492
            while (!tmp_file.exists() || !tmp_file.isDirectory()) {
493
                tmp_file = new File(tmp_file.getAbsolutePath() + i);
494
                i++;
495
            }
496
            if (!tmp_file.exists()) {
497
                tmp_file.mkdir();
498
            }
499
            tmp = tmp_file.getAbsolutePath();
500
        }
501
        return tmp;
502
    }
503

    
504
    @Override
505
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
506
        if (!(struct instanceof DynStruct_v2)) {
507
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
508
        }
509
        Tags tags = ((DynStruct_v2) struct).getTags();
510
        return this.createStoreParameters(tags);
511
    }
512

    
513
    @Override
514
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
515
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
516
        if (providerName == null) {
517
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
518
        }
519
        int prefixlen = TAG_DAL_OPENSTORE.length();
520
        DataStoreParameters parameters = this.createStoreParameters(providerName);
521
        for (String key : tags) {
522
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
523
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
524
            }
525
        }
526
        return parameters;
527
    }
528

    
529
    @Override
530
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
531
        DataStoreParameters paramters = this.createStoreParameters(struct);
532
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
533
        return store;
534
    }
535

    
536
    @Override
537
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
538

    
539
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
540
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
541
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
542
        }
543
        parameters.validate();
544
        try {
545
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
546
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
547
            server.add(providerName, parameters, overwrite);
548
        } catch (Exception e) {
549
            throw new InitializeException(e);
550
        }
551
    }
552

    
553
    @Override
554
    public void registerDefaultEvaluator(Class evaluatorClass) {
555
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
556
            throw new ClassCastException();
557
        }
558
        this.defaultEvaluatorClass = evaluatorClass;
559
    }
560

    
561
    @Override
562
    public Evaluator createExpresion(String expression) throws InitializeException {
563
        try {
564
            Evaluator eval = (Evaluator) this.defaultEvaluatorClass.
565
                    getConstructor(String.class).newInstance(expression);
566
            return eval;
567
        } catch (Exception ex) {
568
            throw new InitializeException(ex);
569
        }
570
    }
571

    
572
    @Override
573
    public FeaturePagingHelper createFeaturePagingHelper(
574
            FeatureStore featureStore, int pageSize) throws BaseException {
575
        return new FeaturePagingHelperImpl(featureStore, pageSize);
576
    }
577

    
578
    @Override
579
    public FeaturePagingHelper createFeaturePagingHelper(
580
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
581
            throws BaseException {
582
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
583
    }
584

    
585
    @Override
586
    public void setOpenErrorHandler(OpenErrorHandler handler) {
587
        openErrorHandler = handler;
588
    }
589

    
590
    @Override
591
    public OpenErrorHandler getOpenErrorHandler() {
592
        return this.openErrorHandler;
593
    }
594

    
595
    @Override
596
    public EditableFeatureType createFeatureType() {
597
        return new DefaultEditableFeatureType();
598
    }
599

    
600
    @Override
601
    public DataServerExplorerPool getDataServerExplorerPool() {
602
        if (this.dataServerExplorerPool == null) {
603
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
604
        }
605
        return this.dataServerExplorerPool;
606
    }
607

    
608
    @Override
609
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
610
        this.dataServerExplorerPool = pool;
611
    }
612

    
613
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
614
        if (params instanceof DataStoreParameters) {
615
            return (DataStoreParameters) params;
616
        }
617
        String providerName;
618
        try {
619
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
620
        } catch (Exception ex) {
621
            providerName = provider;
622
        }
623
        DataStoreParameters parameters = this.createStoreParameters(providerName);
624
        ToolsLocator.getDynObjectManager().copy(params, parameters);
625
        return parameters;
626
    }
627

    
628
    @Override
629
    public List<DataType> getDataTypes() {
630
        if (dataTypes == null) {
631
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
632
            dataTypes = new ArrayList<>();
633
            dataTypes.add(manager.get(DataTypes.STRING));
634
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
635
            dataTypes.add(manager.get(DataTypes.INT));
636
            dataTypes.add(manager.get(DataTypes.DOUBLE));
637
            dataTypes.add(manager.get(DataTypes.DATE));
638
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
639
        }
640
        return dataTypes;
641
    }
642

    
643
    @Override
644
    public void setResourcesLoader(ClassLoader loader) {
645
        this.resourcesLoader = loader;
646
    }
647

    
648
    @Override
649
    public void setResourcesLoader(File folder) {
650
        if (folder == null) {
651
            this.resourcesLoader = null;
652
            return;
653
        }
654
        try {
655
            URL[] urls = new URL[]{folder.toURI().toURL()};
656
            this.resourcesLoader = new URLClassLoader(urls);
657
        } catch (Exception ex) {
658
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
659
        }
660
    }
661

    
662
    @Override
663
    public URL getResource(Object reourceLoader, String name) {
664
        URL x;
665
        if (this.resourcesLoader != null) {
666
            x = this.resourcesLoader.getResource(name);
667
            if (x != null) {
668
                return x;
669
            }
670
        }
671
        x = reourceLoader.getClass().getResource(name);
672
        return x;
673
    }
674

    
675
    @Override
676
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
677
        InputStream x;
678
        if (this.resourcesLoader != null) {
679
            x = this.resourcesLoader.getResourceAsStream(name);
680
            if (x != null) {
681
                return x;
682
            }
683
        }
684
        x = reourceLoader.getClass().getResourceAsStream(name);
685
        return x;
686
    }
687
    
688
    @Override
689
    public ExpressionBuilder createExpressionBuilder() {
690
        return new ExpressionBuilderBase();
691
    }
692

    
693
    public void registerFeatureCacheProvider(
694
        FeatureCacheProviderFactory providerFactory) {
695
        ToolsLocator.getExtensionPointManager()
696
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
697
            .append(providerFactory.getName(), "", providerFactory);
698
    }
699

    
700
    public FeatureCacheProvider createFeatureCacheProvider(String name,
701
        DynObject parameters) throws DataException {
702
        if (name == null) {
703
            throw new InitializeException(
704
                "It is necessary to provide a cache name", null);
705
        }
706
        if (parameters == null) {
707
            throw new InitializeException(
708
                "It is necessary to provide parameters to create the explorer",
709
                null);
710
        }
711
        FeatureCacheProviderFactory featureCacheProviderFactory;
712
        try {
713
            featureCacheProviderFactory =
714
                (FeatureCacheProviderFactory) ToolsLocator
715
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
716
                    .create(name);
717
            if (featureCacheProviderFactory == null) {
718
                throw new ProviderNotRegisteredException(name);
719
            }
720
            return featureCacheProviderFactory.createCacheProvider(parameters);
721
        } catch (InstantiationException e) {
722
            throw new InitializeException(e);
723
        } catch (IllegalAccessException e) {
724
            throw new InitializeException(e);
725
        }
726
    }
727

    
728
    public List getFeatureCacheProviders() {
729
        ExtensionPoint extensionPoint =
730
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
731
        if (extensionPoint != null) {
732
            return ToolsLocator.getExtensionPointManager()
733
                .get(DATA_MANAGER_CACHE).getNames();
734
        } else {
735
            return new ArrayList();
736
        }
737
    }
738

    
739
    public DynObject createCacheParameters(String name)
740
        throws InitializeException, ProviderNotRegisteredException {
741
        if (name == null) {
742
            throw new InitializeException(
743
                "It is necessary to provide a cache name", null);
744
        }
745
        FeatureCacheProviderFactory featureCacheProviderFactory;
746
        try {
747
            featureCacheProviderFactory =
748
                (FeatureCacheProviderFactory) ToolsLocator
749
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
750
                    .create(name);
751
            if (featureCacheProviderFactory == null) {
752
                throw new ProviderNotRegisteredException(name);
753
            }
754
            return featureCacheProviderFactory.createParameters();
755
        } catch (InstantiationException e) {
756
            throw new InitializeException(e);
757
        } catch (IllegalAccessException e) {
758
            throw new InitializeException(e);
759
        }
760
    }
761

    
762

    
763

    
764
}