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

History | View | Annotate | Download (36 KB)

1 43020 jjdelcerro
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 43450 jjdelcerro
import org.apache.commons.lang3.StringUtils;
12 43984 jjdelcerro
import org.gvsig.expressionevaluator.Expression;
13 43205 fdiaz
14 43020 jjdelcerro
import org.gvsig.fmap.dal.DataFactory;
15
import org.gvsig.fmap.dal.DataManager;
16
import org.gvsig.fmap.dal.DataServerExplorer;
17
import org.gvsig.fmap.dal.DataServerExplorerFactory;
18
import org.gvsig.fmap.dal.DataServerExplorerParameters;
19
import org.gvsig.fmap.dal.DataServerExplorerPool;
20
import org.gvsig.fmap.dal.DataStore;
21
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
22
import org.gvsig.fmap.dal.DataStoreParameters;
23
import org.gvsig.fmap.dal.DataStoreProviderFactory;
24
import org.gvsig.fmap.dal.DataTypes;
25 43040 jjdelcerro
import org.gvsig.fmap.dal.ExpressionBuilder;
26 43521 jjdelcerro
27 43020 jjdelcerro
import org.gvsig.fmap.dal.NewDataStoreParameters;
28
import org.gvsig.fmap.dal.OpenErrorHandler;
29
import org.gvsig.fmap.dal.Register;
30 43056 jjdelcerro
import org.gvsig.fmap.dal.exception.DataException;
31 43020 jjdelcerro
import org.gvsig.fmap.dal.exception.InitializeException;
32 43205 fdiaz
import org.gvsig.fmap.dal.exception.OpenException;
33 43020 jjdelcerro
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
34 43205 fdiaz
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
35 43020 jjdelcerro
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
36 43983 jjdelcerro
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
37 43020 jjdelcerro
import org.gvsig.fmap.dal.feature.EditableFeatureType;
38
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
39
import org.gvsig.fmap.dal.feature.FeatureQuery;
40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
43
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
44
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
45
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
46
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
47 43040 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.ExpressionBuilderBase;
48 43020 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
49
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
50 43056 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
51
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
52 43020 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
53
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
54 43983 jjdelcerro
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultEvaluatorFactory;
55 43984 jjdelcerro
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
56 43983 jjdelcerro
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureSymbolTable;
57 43205 fdiaz
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
58 43020 jjdelcerro
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
59
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
60 43205 fdiaz
import org.gvsig.fmap.dal.spi.DALSPILocator;
61 43020 jjdelcerro
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
62
import org.gvsig.fmap.dal.spi.DataStoreProvider;
63
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
64
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
65
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
66
import org.gvsig.tools.ToolsLocator;
67
import org.gvsig.tools.dataTypes.DataType;
68
import org.gvsig.tools.dataTypes.DataTypesManager;
69
import org.gvsig.tools.dynobject.DynObject;
70
import org.gvsig.tools.dynobject.DynStruct;
71
import org.gvsig.tools.dynobject.DynStruct_v2;
72
import org.gvsig.tools.dynobject.Tags;
73
import org.gvsig.tools.evaluator.Evaluator;
74 43983 jjdelcerro
import org.gvsig.tools.evaluator.EvaluatorFactory;
75 43020 jjdelcerro
import org.gvsig.tools.exception.BaseException;
76 43056 jjdelcerro
import org.gvsig.tools.extensionpoint.ExtensionPoint;
77 43241 jjdelcerro
import org.gvsig.tools.folders.FoldersManager;
78 43020 jjdelcerro
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
79
import org.gvsig.tools.identitymanagement.UnauthorizedException;
80
import org.gvsig.tools.service.spi.Services;
81 43450 jjdelcerro
import org.slf4j.Logger;
82
import org.slf4j.LoggerFactory;
83 43020 jjdelcerro
84
public class DefaultDataManager
85
        implements DataManager, DataManagerProviderServices, Services {
86 43205 fdiaz
87 43450 jjdelcerro
    private static final Logger logger = LoggerFactory.getLogger(DefaultDataManager.class);
88
89 43056 jjdelcerro
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
90
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
91
        "DAL cache providers";
92 43205 fdiaz
93
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
94
95
96 43020 jjdelcerro
    private class Registers {
97
98
        private final Register store;
99
        private final Register storeProvider;
100
        private final Register serverExplorer;
101
        private final Register featureIndexProvider;
102
103
        public Registers() {
104
            this.store = new RegisterImpl(
105
                    "Data.manager.stores.factory",
106
                    "DAL store factories"
107
            );
108
            this.storeProvider = new RegisterImpl(
109
                    "Data.manager.providers.factory",
110
                    "DAL store provider factories"
111
            );
112
            this.serverExplorer = new RegisterImpl(
113
                    "Data.manager.servereexplorer.factory",
114
                    "DAL server explorer factories"
115
            );
116
            this.featureIndexProvider = new RegisterImpl(
117
                    "Data.manager.feature.index.factory",
118
                    "DAL feature index factories"
119
            );
120
121
            this.store.register(new FeatureStoreFactory());
122
        }
123
    }
124
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
125
126
    private final Registers registers;
127
128
    private final Map<Integer, String> defaultDataIndexProviders;
129
130 43521 jjdelcerro
    private EvaluatorFactory defaultEvaluatorFactory = null;
131 43020 jjdelcerro
132
    private OpenErrorHandler openErrorHandler = null;
133
134
    private DataServerExplorerPool dataServerExplorerPool = null;
135
136
    private List<DataType> dataTypes = null;
137
138
    private ClassLoader resourcesLoader = null;
139
140
    public DefaultDataManager() {
141
        this.registers = new Registers();
142
        this.defaultDataIndexProviders = new HashMap<>();
143
    }
144
145
    @Override
146
    public Register getStoreRegister() {
147
        return this.registers.store;
148
    }
149
150
    @Override
151
    public Register getStoreProviderRegister() {
152
        return this.registers.storeProvider;
153
    }
154
155
    @Override
156
    public Register getServerExplorerRegister() {
157
        return this.registers.serverExplorer;
158
    }
159
160
    @Override
161
    public Register getFeatureIndexRegister() {
162
        return this.registers.featureIndexProvider;
163
    }
164
165
    private String getStoreName(DataStoreParameters parameters) {
166
        for (DataFactory factory : this.getStoreRegister()) {
167
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
168
            if (storeFactory.canUse(parameters)) {
169
                return storeFactory.getName();
170
            }
171
        }
172
        return null;
173
    }
174
175
    /**
176
     * @deprecated
177
     */
178
    @Override
179
    public void registerDefaultRasterStore(Class rasterStoreClass) {
180
        // Metodo usado por el raster nuevo para regstrar su factoria de store
181
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
182
    }
183
184
    /**
185
     * @deprecated
186
     */
187
    @Override
188
    public void registerStoreFactory(String name, Class storeFactoryClass) {
189
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
190
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
191
    }
192
193
    /**
194
     * @param name
195
     * @param storeProviderClass
196
     * @param parametersClass
197
     * @deprecated use registerStoreProviderFactory
198
     */
199
    @Override
200
    public void registerStoreProvider(String name, Class storeProviderClass,
201
            Class parametersClass) {
202
        if (name == null || storeProviderClass == null || parametersClass == null) {
203
            throw new IllegalArgumentException("Any parameters can be null");
204
        }
205
206
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
207
            throw new IllegalArgumentException(parametersClass.getName()
208
                    + " must implement org.gvsig.fmap.dal.DataStoreParameters");
209
        }
210
211
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
212
            // Envuelve al proveedor en una factoria por defecto.
213
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
214
                    name, "", storeProviderClass, parametersClass));
215
            return;
216
        }
217
218
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
219
            // Envuelve al proveedor en una factoria por defecto.
220
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
221
                    name, "", storeProviderClass, parametersClass));
222
            return;
223
        }
224
225
        throw new IllegalArgumentException("Not supported implemtation: name="
226
                + name + " provider class=" + storeProviderClass.getName());
227
228
    }
229
230
    @Override
231
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
232
        if (name == null || explorerClass == null || parametersClass == null) {
233
            // FIXME Exception
234
            throw new IllegalArgumentException("Any parameters can be null");
235
        }
236
237
        if (!DataServerExplorerParameters.class
238
                .isAssignableFrom(parametersClass)) {
239
            // FIXME Exception
240
            throw new IllegalArgumentException(
241
                    parametersClass.getName()
242
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
243
        }
244
245
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
246
            // FIXME Exception
247
            throw new IllegalArgumentException(explorerClass.getName()
248
                    + " must implement org.gvsig.fmap.dal.DataServerExplorer");
249
        }
250
251
        // Envuelve al proveedor en una factoria por defecto.
252
        this.registerServerExplorerFactory(
253
                new DataServerExplorerToDataExplorerFactoryWrapper(
254
                        name, "", explorerClass, parametersClass
255
                )
256
        );
257
258
    }
259
260
    @Override
261
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
262
        this.getStoreRegister().register(factory);
263
    }
264
265
    @Override
266
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
267
        this.getStoreProviderRegister().register(factory);
268
    }
269
270
    @Override
271
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
272
        this.getServerExplorerRegister().register(factory);
273
    }
274
275
    @Override
276
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
277 43503 jjdelcerro
        if( providerName == null ) {
278
            String msg = "Provider name can't be null.";
279
            logger.warn(msg);
280
            throw new IllegalArgumentException(msg);
281
        }
282 43020 jjdelcerro
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
283 43503 jjdelcerro
        if( providerFactory == null ) {
284
            String msg = "Can't locate provider factory for '"+providerName+"'.";
285
            logger.warn(msg);
286
            throw new IllegalArgumentException(msg);
287
        }
288 43020 jjdelcerro
        return (DataStoreParameters) providerFactory.createParameters();
289
    }
290
291
    @Override
292
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
293
        try {
294 43093 jjdelcerro
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
295 43020 jjdelcerro
            return explorer.getAddParameters(providerName);
296
        } catch (Exception ex) {
297
            throw new InitializeException(ex);
298
        }
299
    }
300
301
    @Override
302
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
303 43503 jjdelcerro
        if( explorerName == null ) {
304
            String msg = "Explorer name can't be null.";
305
            logger.warn(msg);
306
            throw new IllegalArgumentException(msg);
307
        }
308 43020 jjdelcerro
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
309 43488 jjdelcerro
        if( explorerFactory == null ) {
310
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
311
            logger.warn(msg);
312
            throw new IllegalArgumentException(msg);
313
        }
314 43020 jjdelcerro
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
315
        return params;
316
    }
317
318
    @Override
319
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
320
        try {
321
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
322
            if (autoOrderAttributeName != null) {
323
                parameters.setDynValue(
324
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
325
                        autoOrderAttributeName);
326
            }
327
            return parameters;
328
        } catch (Exception ex) {
329
            throw new InitializeException(ex);
330
        }
331
    }
332
333
    @Override
334
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
335 43503 jjdelcerro
        if( explorerName == null ) {
336
            String msg = "Explorer name can't be null.";
337
            logger.warn(msg);
338
            throw new IllegalArgumentException(msg);
339
        }
340 43020 jjdelcerro
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
341 43450 jjdelcerro
        if( explorerFactory == null ) {
342
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
343
            logger.warn(msg);
344
            throw new IllegalArgumentException(msg);
345
        }
346 43020 jjdelcerro
        if (parameters == null) {
347
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
348
        }
349
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
350
                parameters,
351
                new DefaultDataServerExplorerProviderServices()
352
        );
353
        return explorer;
354
    }
355 43205 fdiaz
356 43093 jjdelcerro
    @Override
357
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
358 43373 jjdelcerro
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
359
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorercon solo
360
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
361
            // llamar al que toca.
362
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
363
        }
364 43503 jjdelcerro
        if( explorerName == null ) {
365
            String msg = "Explorer name can't be null.";
366
            logger.warn(msg);
367
            throw new IllegalArgumentException(msg);
368
        }
369 43093 jjdelcerro
        if( (arguments.length % 2)!= 0 ) {
370
            throw new ValidateDataParametersException();
371
        }
372
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
373
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
374
        for( int i=0; i<arguments.length; i+=2 ) {
375
            String name = (String) arguments[i];
376
            Object value = arguments[i+1];
377
            parameters.setDynValue(name, value);
378
        }
379
        return this.openServerExplorer(explorerName, parameters);
380 43205 fdiaz
381 43093 jjdelcerro
    }
382 43205 fdiaz
383 43020 jjdelcerro
    /**
384
     * @param parameters
385
     * @return
386
     * @throws org.gvsig.fmap.dal.exception.InitializeException
387
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
388
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
389
     * @deprecated see openServerExplorer
390
     */
391
    @Override
392
    public DataServerExplorer createServerExplorer(
393
            DataServerExplorerParameters parameters) throws InitializeException,
394
            ProviderNotRegisteredException, ValidateDataParametersException {
395
        return openServerExplorer(parameters.getExplorerName(), parameters);
396
    }
397
398 43045 jjdelcerro
    /**
399
     * @deprecated use openStore
400
     * @param parameters
401
     * @return
402
     * @throws InitializeException
403
     * @throws ProviderNotRegisteredException
404 43205 fdiaz
     * @throws ValidateDataParametersException
405 43045 jjdelcerro
     */
406 43020 jjdelcerro
    @Override
407 43045 jjdelcerro
    public DataStore createStore(DataStoreParameters parameters)
408
        throws InitializeException, ProviderNotRegisteredException,
409
        ValidateDataParametersException {
410
        return openStore(parameters.getDataStoreName(), parameters);
411
    }
412 43205 fdiaz
413 43045 jjdelcerro
    @Override
414 43020 jjdelcerro
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
415 43503 jjdelcerro
        if( providerName == null ) {
416
            String msg = "Provider name can't be null.";
417
            logger.warn(msg);
418
            throw new IllegalArgumentException(msg);
419
        }
420 43020 jjdelcerro
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
421
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
422
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
423
        }
424
425 43088 jjdelcerro
        parameters.validate();
426 43205 fdiaz
427 43020 jjdelcerro
        String storeName = this.getStoreName(parameters);
428 43450 jjdelcerro
        if( StringUtils.isEmpty(storeName) ) {
429
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
430
            logger.warn(msg);
431
            throw new IllegalArgumentException(msg);
432
        }
433 43020 jjdelcerro
434
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
435 43450 jjdelcerro
        if( storeFactory == null ) {
436
            String msg = "Can't locate store factory for '"+storeName+"'.";
437
            logger.warn(msg);
438
            throw new IllegalArgumentException(msg);
439
        }
440 43020 jjdelcerro
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
441 43450 jjdelcerro
        if( providerFactory == null ) {
442
            String msg = "Can't locate provider factory for '"+providerName+"'.";
443
            logger.warn(msg);
444
            throw new IllegalArgumentException(msg);
445
        }
446 43020 jjdelcerro
447
        DataStore store = (DataStore) storeFactory.create(parameters, this);
448
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
449
450
        storeFactory.setProvider(store, provider);
451
        return store;
452
    }
453
454
    @Override
455
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
456
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
457
        DataStore store = openStore(params.getDataStoreName(), params);
458
        return store;
459
    }
460
461
    @Override
462 43093 jjdelcerro
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
463 43239 jjdelcerro
        if( arguments.length == 1 ) {
464
            // Desde jython entra por este metodo en lugar de los especificos
465
            // de DataStoreParameters o DynObject
466
            if( arguments[0] instanceof DataStoreParameters ) {
467
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
468
            } else if( arguments[0] instanceof DynObject ) {
469
                return this.openStore(providerName, (DynObject)(arguments[0]));
470
            }
471
        }
472 43093 jjdelcerro
        if( (arguments.length % 2)!= 0 ) {
473
            throw new ValidateDataParametersException();
474
        }
475 43503 jjdelcerro
        if( providerName == null ) {
476
            String msg = "Provider name can't be null.";
477
            logger.warn(msg);
478
            throw new IllegalArgumentException(msg);
479
        }
480 43093 jjdelcerro
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
481
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
482
        for( int i=0; i<arguments.length; i+=2 ) {
483
            String name = (String) arguments[i];
484
            Object value = arguments[i+1];
485
            parameters.setDynValue(name, value);
486
        }
487
        return this.openStore(providerName, parameters);
488
    }
489 43205 fdiaz
490 43093 jjdelcerro
    @Override
491 43020 jjdelcerro
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
492
        try {
493
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
494
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
495
            return (FeatureStore) store;
496
        } catch (Exception ex) {
497
            throw new InitializeException(ex);
498
        }
499
    }
500
501
    @Override
502
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
503 43503 jjdelcerro
        if( providerName == null ) {
504
            String msg = "Provider name can't be null.";
505
            logger.warn(msg);
506
            throw new IllegalArgumentException(msg);
507
        }
508 43020 jjdelcerro
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
509
        return (DataStoreProviderFactory) providerFactory;
510
    }
511
512
    @Override
513
    public List<String> getStoreProviders() {
514
        return this.getStoreProviderRegister().getFactoryNames();
515
    }
516
517
    @Override
518
    public List<String> getStoreProviders(String explorerName) {
519 43503 jjdelcerro
        if( explorerName == null ) {
520
            String msg = "Explorer name can't be null.";
521
            logger.warn(msg);
522
            throw new IllegalArgumentException(msg);
523
        }
524 43020 jjdelcerro
        try {
525 43093 jjdelcerro
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
526 43020 jjdelcerro
            List names = explorer.getDataStoreProviderNames();
527
            return names;
528
        } catch (Exception ex) {
529
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
530
        }
531
    }
532
533
    @Override
534
    public List<String> getExplorerProviders() {
535
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
536
        return names;
537
    }
538
539
    @Override
540
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
541
542
        String providerName = parameters.getDataStoreName();
543
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
544
        if (providerFactory == null) {
545
            throw new ProviderNotRegisteredException(providerName);
546
        }
547
        while (true) {
548
            try {
549
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
550
                        parameters, providerServices
551
                );
552
                return provider;
553
            } catch (Exception e) {
554
                if (openErrorHandler == null) {
555
                    throw new InitializeException(providerName, e);
556
                }
557
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
558
                if (!retry) {
559
                    throw new InitializeException(providerName, e);
560
                }
561
            }
562
        }
563
    }
564
565
    @Override
566
    public List<String> getFeatureIndexProviders() {
567
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
568
        return names;
569
    }
570
571
    @Override
572
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
573
        this.defaultDataIndexProviders.put(dataType, name);
574
    }
575
576
    @Override
577
    public String getDefaultFeatureIndexProviderName(int dataType) {
578
        return this.defaultDataIndexProviders.get(dataType);
579
    }
580
581
    @Override
582
    public FeatureIndexProviderServices createFeatureIndexProvider(
583
            String name,
584
            FeatureStore store,
585
            FeatureType type,
586
            String indexName,
587
            FeatureAttributeDescriptor attr
588
    ) throws InitializeException, ProviderNotRegisteredException {
589
590
        if (name == null) {
591
            name = getDefaultFeatureIndexProviderName(attr.getType());
592
        }
593
594
        if (name == null) {
595
            throw new InitializeException(
596
                    "There not any index provider registered.", null);
597
        }
598
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
599
        if (indexfactory == null) {
600
            throw new InitializeException(
601
                    "There not any index provider registered with name '" + name + "'.", null);
602
603
        }
604
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
605
606
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
607
                (FeatureStoreProviderServices) store,
608
                type,
609
                provider,
610
                attr.getName(),
611
                indexName
612
        );
613
        services.initialize();
614
        return services;
615
616
    }
617
618
    @Override
619
    public String getTemporaryDirectory() {
620 43241 jjdelcerro
        FoldersManager manager = ToolsLocator.getFoldersManager();
621
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
622
        return folder.getAbsolutePath();
623 43020 jjdelcerro
    }
624
625
    @Override
626
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
627
        if (!(struct instanceof DynStruct_v2)) {
628
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
629
        }
630
        Tags tags = ((DynStruct_v2) struct).getTags();
631
        return this.createStoreParameters(tags);
632
    }
633
634
    @Override
635
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
636
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
637
        if (providerName == null) {
638
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
639
        }
640
        int prefixlen = TAG_DAL_OPENSTORE.length();
641
        DataStoreParameters parameters = this.createStoreParameters(providerName);
642
        for (String key : tags) {
643
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
644
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
645
            }
646
        }
647
        return parameters;
648
    }
649
650
    @Override
651
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
652
        DataStoreParameters paramters = this.createStoreParameters(struct);
653
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
654
        return store;
655
    }
656
657
    @Override
658
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
659 43503 jjdelcerro
        if( explorerName == null ) {
660
            String msg = "Explorer name can't be null.";
661
            logger.warn(msg);
662
            throw new IllegalArgumentException(msg);
663
        }
664
        if( providerName == null ) {
665
            String msg = "Provider name can't be null.";
666
            logger.warn(msg);
667
            throw new IllegalArgumentException(msg);
668
        }
669 43020 jjdelcerro
670
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
671
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
672
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
673
        }
674
        parameters.validate();
675
        try {
676
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
677
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
678
            server.add(providerName, parameters, overwrite);
679
        } catch (Exception e) {
680
            throw new InitializeException(e);
681
        }
682
    }
683
684
    @Override
685 43521 jjdelcerro
    public void registerDefaultEvaluator(EvaluatorFactory evaluatorFactory) {
686
        this.defaultEvaluatorFactory = evaluatorFactory;
687 43020 jjdelcerro
    }
688
689
    @Override
690
    public Evaluator createExpresion(String expression) throws InitializeException {
691 43521 jjdelcerro
        return this.defaultEvaluatorFactory.createEvaluator(expression);
692 43020 jjdelcerro
    }
693
694
    @Override
695 43984 jjdelcerro
    public Evaluator createExpresion(Expression expression) throws InitializeException {
696
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
697
        return exp;
698
    }
699
700
    @Override
701 43020 jjdelcerro
    public FeaturePagingHelper createFeaturePagingHelper(
702
            FeatureStore featureStore, int pageSize) throws BaseException {
703
        return new FeaturePagingHelperImpl(featureStore, pageSize);
704
    }
705
706
    @Override
707
    public FeaturePagingHelper createFeaturePagingHelper(
708
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
709
            throws BaseException {
710
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
711
    }
712
713
    @Override
714
    public void setOpenErrorHandler(OpenErrorHandler handler) {
715
        openErrorHandler = handler;
716
    }
717
718
    @Override
719
    public OpenErrorHandler getOpenErrorHandler() {
720
        return this.openErrorHandler;
721
    }
722
723
    @Override
724
    public EditableFeatureType createFeatureType() {
725 43739 jjdelcerro
        return new DefaultEditableFeatureType(null);
726 43020 jjdelcerro
    }
727
728
    @Override
729
    public DataServerExplorerPool getDataServerExplorerPool() {
730
        if (this.dataServerExplorerPool == null) {
731
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
732
        }
733
        return this.dataServerExplorerPool;
734
    }
735
736
    @Override
737
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
738
        this.dataServerExplorerPool = pool;
739
    }
740
741
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
742
        if (params instanceof DataStoreParameters) {
743
            return (DataStoreParameters) params;
744
        }
745
        String providerName;
746
        try {
747
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
748
        } catch (Exception ex) {
749
            providerName = provider;
750
        }
751
        DataStoreParameters parameters = this.createStoreParameters(providerName);
752
        ToolsLocator.getDynObjectManager().copy(params, parameters);
753
        return parameters;
754
    }
755
756
    @Override
757
    public List<DataType> getDataTypes() {
758
        if (dataTypes == null) {
759
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
760
            dataTypes = new ArrayList<>();
761
            dataTypes.add(manager.get(DataTypes.STRING));
762
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
763
            dataTypes.add(manager.get(DataTypes.INT));
764
            dataTypes.add(manager.get(DataTypes.DOUBLE));
765
            dataTypes.add(manager.get(DataTypes.DATE));
766
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
767
        }
768
        return dataTypes;
769
    }
770
771
    @Override
772
    public void setResourcesLoader(ClassLoader loader) {
773
        this.resourcesLoader = loader;
774
    }
775
776
    @Override
777
    public void setResourcesLoader(File folder) {
778
        if (folder == null) {
779
            this.resourcesLoader = null;
780
            return;
781
        }
782
        try {
783
            URL[] urls = new URL[]{folder.toURI().toURL()};
784
            this.resourcesLoader = new URLClassLoader(urls);
785
        } catch (Exception ex) {
786
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
787
        }
788
    }
789
790
    @Override
791
    public URL getResource(Object reourceLoader, String name) {
792
        URL x;
793
        if (this.resourcesLoader != null) {
794
            x = this.resourcesLoader.getResource(name);
795
            if (x != null) {
796
                return x;
797
            }
798
        }
799
        x = reourceLoader.getClass().getResource(name);
800
        return x;
801
    }
802
803
    @Override
804
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
805
        InputStream x;
806
        if (this.resourcesLoader != null) {
807
            x = this.resourcesLoader.getResourceAsStream(name);
808
            if (x != null) {
809
                return x;
810
            }
811
        }
812
        x = reourceLoader.getClass().getResourceAsStream(name);
813
        return x;
814
    }
815 43205 fdiaz
816 43040 jjdelcerro
    @Override
817
    public ExpressionBuilder createExpressionBuilder() {
818
        return new ExpressionBuilderBase();
819
    }
820 43056 jjdelcerro
821
    public void registerFeatureCacheProvider(
822
        FeatureCacheProviderFactory providerFactory) {
823
        ToolsLocator.getExtensionPointManager()
824
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
825
            .append(providerFactory.getName(), "", providerFactory);
826
    }
827
828
    public FeatureCacheProvider createFeatureCacheProvider(String name,
829
        DynObject parameters) throws DataException {
830
        if (name == null) {
831
            throw new InitializeException(
832
                "It is necessary to provide a cache name", null);
833
        }
834
        if (parameters == null) {
835
            throw new InitializeException(
836
                "It is necessary to provide parameters to create the explorer",
837
                null);
838
        }
839
        FeatureCacheProviderFactory featureCacheProviderFactory;
840
        try {
841
            featureCacheProviderFactory =
842
                (FeatureCacheProviderFactory) ToolsLocator
843
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
844
                    .create(name);
845
            if (featureCacheProviderFactory == null) {
846
                throw new ProviderNotRegisteredException(name);
847
            }
848
            return featureCacheProviderFactory.createCacheProvider(parameters);
849
        } catch (InstantiationException e) {
850
            throw new InitializeException(e);
851
        } catch (IllegalAccessException e) {
852
            throw new InitializeException(e);
853
        }
854
    }
855
856 43093 jjdelcerro
    @Override
857 43056 jjdelcerro
    public List getFeatureCacheProviders() {
858
        ExtensionPoint extensionPoint =
859
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
860
        if (extensionPoint != null) {
861
            return ToolsLocator.getExtensionPointManager()
862
                .get(DATA_MANAGER_CACHE).getNames();
863
        } else {
864
            return new ArrayList();
865
        }
866
    }
867
868 43093 jjdelcerro
    @Override
869 43056 jjdelcerro
    public DynObject createCacheParameters(String name)
870
        throws InitializeException, ProviderNotRegisteredException {
871
        if (name == null) {
872
            throw new InitializeException(
873
                "It is necessary to provide a cache name", null);
874
        }
875
        FeatureCacheProviderFactory featureCacheProviderFactory;
876
        try {
877
            featureCacheProviderFactory =
878
                (FeatureCacheProviderFactory) ToolsLocator
879
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
880
                    .create(name);
881
            if (featureCacheProviderFactory == null) {
882
                throw new ProviderNotRegisteredException(name);
883
            }
884
            return featureCacheProviderFactory.createParameters();
885
        } catch (InstantiationException e) {
886
            throw new InitializeException(e);
887
        } catch (IllegalAccessException e) {
888
            throw new InitializeException(e);
889
        }
890
    }
891
892 43205 fdiaz
    @Override
893 43212 jjdelcerro
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
894 43205 fdiaz
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
895
        DataServerExplorerParameters eparams = null;
896
        DataServerExplorer serverExplorer;
897
        try {
898
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
899
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
900
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
901
        }
902 43056 jjdelcerro
903 43205 fdiaz
        try {
904
            serverExplorer.add(providerName, params, overwrite);
905
        } catch (DataException e) {
906
            throw new CreateFileStoreException(e, providerName);
907
        }
908
    }
909 43983 jjdelcerro
910
    @Override
911
    public FeatureSymbolTable createFeatureSymbolTable() {
912
        FeatureSymbolTable symbolTable = new DefaultFeatureSymbolTable();
913
        return symbolTable;
914
    }
915
916
    @Override
917
    public EvaluatorFactory createEvaluatorFactory() {
918
        EvaluatorFactory f = new DefaultEvaluatorFactory();
919
        return f;
920
    }
921
922 43020 jjdelcerro
}