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

History | View | Annotate | Download (41.5 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.fmap.dal.impl;
25

    
26
import org.gvsig.fmap.dal.ExternalStoreProviderFactory;
27
import java.io.File;
28
import java.lang.reflect.InvocationTargetException;
29
import java.util.ArrayList;
30
import java.util.HashMap;
31
import java.util.List;
32
import java.util.Map;
33

    
34
import org.gvsig.fmap.dal.DALLocator;
35
import org.gvsig.fmap.dal.DataManager;
36
import org.gvsig.fmap.dal.DataServerExplorer;
37
import org.gvsig.fmap.dal.DataServerExplorerParameters;
38
import org.gvsig.fmap.dal.DataServerExplorerPool;
39
import org.gvsig.fmap.dal.DataStore;
40
import org.gvsig.fmap.dal.DataStoreFactory;
41
import org.gvsig.fmap.dal.DataStoreParameters;
42
import org.gvsig.fmap.dal.DataStoreProviderFactory;
43
import org.gvsig.fmap.dal.NewDataStoreParameters;
44
import org.gvsig.fmap.dal.OpenErrorHandler;
45
import org.gvsig.fmap.dal.exception.DataException;
46
import org.gvsig.fmap.dal.exception.InitializeException;
47
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
48
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
49
import org.gvsig.fmap.dal.feature.EditableFeatureType;
50
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
51
import org.gvsig.fmap.dal.feature.FeatureAttributeGetter;
52
import org.gvsig.fmap.dal.feature.FeatureQuery;
53
import org.gvsig.fmap.dal.feature.FeatureStore;
54
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
55
import org.gvsig.fmap.dal.feature.FeatureType;
56
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
57
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
58
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
59
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
60
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
61
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
62
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
63
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
64
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
65
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
66
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
67
import org.gvsig.fmap.dal.raster.RasterStoreProviderFactory;
68
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
69
import org.gvsig.fmap.dal.resource.ResourceManager;
70
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
71
import org.gvsig.fmap.dal.spi.DataServerExplorerProvider;
72
import org.gvsig.fmap.dal.spi.DataStoreInitializer;
73
import org.gvsig.fmap.dal.spi.DataStoreProvider;
74
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
75
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
76
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
77
import org.gvsig.fmap.geom.DataTypes;
78
import org.gvsig.tools.ToolsLocator;
79
import org.gvsig.tools.dataTypes.DataTypesManager;
80
import org.gvsig.tools.dynobject.DynObject;
81
import org.gvsig.tools.dynobject.DynObjectEncoder;
82
import org.gvsig.tools.dynobject.DynStruct;
83
import org.gvsig.tools.dynobject.DynStruct_v2;
84
import org.gvsig.tools.dynobject.Tags;
85
import org.gvsig.tools.evaluator.Evaluator;
86
import org.gvsig.tools.exception.BaseException;
87
import org.gvsig.tools.extensionpoint.ExtensionPoint;
88
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
89
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
90
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
91
import org.gvsig.tools.identitymanagement.UnauthorizedException;
92
import org.gvsig.tools.operations.OperationManager;
93
import org.slf4j.Logger;
94
import org.slf4j.LoggerFactory;
95

    
96
public class DefaultDataManager implements DataManager,
97
    DataManagerProviderServices {
98
    private static final Logger logger = LoggerFactory.getLogger(DefaultDataManager.class);
99
    
100
    final static private String DATA_MANAGER_STORE = "Data.manager.stores";
101
    final static private String DATA_MANAGER_STORE_DESCRIPTION =
102
        "DAL stores providers";
103

    
104
    final static private String DATA_MANAGER_STORE_PARAMS =
105
        "Data.manager.stores.params";
106
    final static private String DATA_MANAGER_STORE_PARAMS_DESCRIPTION =
107
        "DAL stores providers parameters";
108

    
109
    final static private String DATA_MANAGER_EXPLORER =
110
        "Data.manager.explorers";
111
    final static private String DATA_MANAGER_EXPLORER_DESCRIPTION =
112
        "DAL explorers providers";
113

    
114
    final static private String DATA_MANAGER_EXPLORER_PARAMS =
115
        "Data.manager.explorers.params";
116
    final static private String DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION =
117
        "DAL explorer providers parameters";
118

    
119
    final static private String DATA_MANAGER_INDEX = "Data.manager.indexes";
120
    final static private String DATA_MANAGER_INDEX_DESCRIPTION =
121
        "DAL index providers";
122

    
123
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
124
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
125
        "DAL cache providers";
126

    
127
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR =
128
        "Data.manager.expresion.evaluator";
129
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT =
130
        "default";
131
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION =
132
        "DAL expresion evaluators.";
133

    
134
    final static private String DATA_MANAGER_STORE_FACTORY =
135
        "Data.manager.stores.factory";
136
    final static private String DATA_MANAGER_STORE_FACTORY_DESCRIPTION =
137
        "DAL stores factories";
138

    
139
    final static private String DATA_MANAGER_STORE_PROVIDER_FACTORY =
140
        "Data.manager.providers.factory";
141
    final static private String DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION =
142
        "DAL store provider factories";
143
    
144
    final static private String DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER = 
145
        "Data.manager.feature.attribute.getter";
146
    final static private String DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER_DESCRIPTION = 
147
        "DAL feature attribute getters";
148

    
149
    /** This map contains the name of the default provider for each data type */
150
    private Map defaultDataIndexProviders;
151

    
152
    private OpenErrorHandler openErrorHandler;
153

    
154
    private List dataTypes;
155
    
156
    private DataServerExplorerPool dataServerExplorerPool = null;
157
    
158

    
159
    public DefaultDataManager() {
160
        /*
161
         * Create te extensions point in te registry.
162
         */
163
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE,
164
            DATA_MANAGER_STORE_DESCRIPTION);
165

    
166
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
167
            DATA_MANAGER_STORE_PARAMS_DESCRIPTION);
168

    
169
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
170
            DATA_MANAGER_EXPLORER_DESCRIPTION);
171

    
172
        ToolsLocator.getExtensionPointManager().add(
173
            DATA_MANAGER_EXPLORER_PARAMS,
174
            DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION);
175

    
176
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
177
            DATA_MANAGER_INDEX_DESCRIPTION);
178

    
179
        ToolsLocator.getExtensionPointManager().add(
180
            DATA_MANAGER_EXPRESION_EVALUATOR,
181
            DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION);
182

    
183
        ToolsLocator.getExtensionPointManager().add(
184
            DATA_MANAGER_STORE_PROVIDER_FACTORY,
185
            DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
186

    
187
        initializeIndexes();
188
    }
189

    
190
    /**
191
     * 
192
     * @return ResourceManager
193
     */
194

    
195
    public ResourceManager getResourceManager() {
196
        return DALLocator.getResourceManager();
197
    }
198

    
199
    public OperationManager getOperationManager() {
200
        return ToolsLocator.getOperationManager();
201
    }
202

    
203
    public String getTemporaryDirectory() {
204
        // FIXME Define a better tempdir solution
205
        String tmp = System.getProperty("TMP");
206
        if (tmp == null) {
207
            tmp = System.getProperty("TEMP");
208
        }
209
        if (tmp == null) {
210
            File tmp_file = new File(System.getProperty("HOME"), "_daltmp_");
211
            int i = 1;
212
            while (!tmp_file.exists() || !tmp_file.isDirectory()) {
213
                tmp_file = new File(tmp_file.getAbsolutePath() + i);
214
                i++;
215
            }
216
            if (!tmp_file.exists()) {
217
                tmp_file.mkdir();
218
            }
219
            tmp = tmp_file.getAbsolutePath();
220
        }
221
        return tmp;
222
    }
223

    
224
    /*
225
     * ====================================================================
226
     * 
227
     * Store related services
228
     */
229
    @Override
230
    public void registerStoreProvider(String name, Class storeProviderClass,
231
        Class parametersClass) {
232
        if (name == null || storeProviderClass == null || parametersClass == null) {
233
            throw new IllegalArgumentException("Any parameters can be null");
234
        }
235

    
236
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
237
            throw new IllegalArgumentException(parametersClass.getName()
238
                + " must implement org.gvsig.fmap.dal.DataStoreParameters");
239
        }
240

    
241
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
242
            // Envuelve al proveedor en una factoria por defecto.
243
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
244
                name, "", storeProviderClass, parametersClass));
245
            return;
246
        }
247

    
248
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
249
            // Envuelve al proveedor en una factoria por defecto.
250
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
251
                name, "", storeProviderClass, parametersClass));
252
            return;
253
        }
254

    
255
        throw new IllegalArgumentException("Not supported implemtation: name="
256
            + name + " provider class=" + storeProviderClass.getName());
257

    
258
    }
259

    
260
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
261
        ExtensionPoint factories =
262
            ToolsLocator.getExtensionPointManager().add(
263
                DATA_MANAGER_STORE_PROVIDER_FACTORY,
264
                DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
265
        factories.append(factory.getName(), factory.getDescription(), factory);
266

    
267
    }
268

    
269
    public void registerStoreFactory(String name, Class storeProviderClass) {
270
        if (name == null || storeProviderClass == null) {
271
            // FIXME Exception
272
            throw new IllegalArgumentException("Any parameters can be null");
273
        }
274

    
275
        if (!(DataStoreFactory.class.isAssignableFrom(storeProviderClass))) {
276
            // FIXME Exception
277
            throw new IllegalArgumentException(
278
                "Not supported implemtation: name=" + name + " provider class="
279
                    + storeProviderClass.getName());
280
        }
281

    
282
        ToolsLocator
283
            .getExtensionPointManager()
284
            .add(DATA_MANAGER_STORE_FACTORY,
285
                DATA_MANAGER_STORE_FACTORY_DESCRIPTION)
286
            .append(name, null, storeProviderClass);
287
    }
288

    
289
    public DataStoreParameters createStoreParameters(String name)
290
        throws InitializeException, ProviderNotRegisteredException {
291
        try {
292

    
293
            // Si hay una factoria para ese proveedor se los pedimos a la
294
            // factoria
295
            DataStoreProviderFactory providerFactory =
296
                (DataStoreProviderFactory) ToolsLocator
297
                    .getExtensionPointManager()
298
                    .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
299
            if (providerFactory != null) {
300
                return (DataStoreParameters) providerFactory.createParameters();
301
            }
302

    
303
            // Si no hay factoria lo hacemos como se hacia antes por mantener
304
            // compatibilidad.
305
            DataStoreParameters params =
306
                (DataStoreParameters) ToolsLocator.getExtensionPointManager()
307
                    .get(DATA_MANAGER_STORE_PARAMS).create(name);
308
            if (params == null) {
309
                throw new ProviderNotRegisteredException(name);
310
            }
311
            return params;
312
        } catch (InstantiationException e) {
313
            throw new InitializeException(e);
314
        } catch (IllegalAccessException e) {
315
            throw new InitializeException(e);
316
        } catch (SecurityException e) {
317
            throw new InitializeException(e);
318
        } catch (IllegalArgumentException e) {
319
            throw new InitializeException(e);
320
        }
321
    }
322
    
323
    private DataStoreParameters toDataStoreParameters(DynObject doparams) throws InitializeException, ProviderNotRegisteredException {
324
        if (doparams instanceof DataStoreParameters) {
325
            return (DataStoreParameters) doparams;
326
        }
327
        String providerName = (String) doparams.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
328
        DataStoreParameters parameters = DALLocator.getDataManager().createStoreParameters(providerName);
329
        ToolsLocator.getDynObjectManager().copy(doparams, parameters);
330
        return parameters;
331
    }
332
    
333
    private DataStore localOpenStore(String provider,
334
        DynObject doparameters) throws InitializeException,
335
        ProviderNotRegisteredException, ValidateDataParametersException {
336

    
337
        DataStoreParameters parameters = toDataStoreParameters(doparameters);
338
        
339
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
340
        if( ! identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, provider) ) {
341
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, provider);
342
        }
343
        
344
        // Usa el DynObjectEncoder y no el toString para poder ver los parametros aunque
345
        // el proveedor de datos sobreescriba el metodo toString.
346
        DynObjectEncoder encoder = ToolsLocator.getDynObjectManager().createSimpleDynObjectEncoder();
347
        logger.info("openStore('{}','{}')", provider, encoder.encode(parameters));
348
        
349
        String name = provider; 
350

    
351
        parameters.validate();
352

    
353
        DataStoreProviderFactory providerFactory = this.getStoreProviderFactory(name);
354
        if( providerFactory == null ) {
355
            throw new CantFindTheProviderFactoryException(name);
356
        }
357
        if( providerFactory instanceof FeatureStoreProviderFactory ) {
358
            DataStore store = this.createDefaultFeatureStore();
359
            this.intializeDataStore(store, parameters);
360
            return store;
361
            
362
        } else if( providerFactory instanceof RasterStoreProviderFactory ) {
363
            DataStore store = this.createDefaultRasterStore();
364
            this.intializeDataStore(store, parameters);
365
            return store;
366
            
367
        } else if( providerFactory instanceof ExternalStoreProviderFactory ) {
368
            DataStoreFactory factory = this.getStoreFactory(name);
369
            factory.setParameters(parameters);
370
            DataStore store = factory.createStore();
371
            this.intializeDataStore(store, parameters);
372
            return store;
373
            
374
        }
375
        throw new UnsupportedProviderFactoryException(name,providerFactory);
376
    }
377

    
378
    private static class UnsupportedProviderFactoryException extends InitializeException {
379
        private static final long serialVersionUID = 2635455949723618046L;
380

    
381
        public UnsupportedProviderFactoryException(String resourceName,DataStoreProviderFactory providerFactory) {
382
                super("Error intializing resource '%(resource)'. Unsupported provider factory '%(factory).", 
383
                    "_UnsupportedProviderFactoryException", 
384
                    serialVersionUID
385
                );
386
                setValue("resource", resourceName);
387
                setValue("factory", providerFactory.getClass().getName());
388
        }
389
        
390
    }
391
    
392
    private static class CantFindTheProviderFactoryException extends InitializeException {
393
        private static final long serialVersionUID = -2736434434177690011L;
394

    
395
        public CantFindTheProviderFactoryException(String resourceName) {
396
                super("Error intializing resource '%(resource)'. Can't find provider factory for this resource.", 
397
                    "_CantFindTheProviderFactoryException", 
398
                    serialVersionUID
399
                );
400
                setValue("resource", resourceName);
401
        }
402
        
403
    }
404
    
405
    private DataStore createDefaultFeatureStore() {
406
        return new DefaultFeatureStore();
407
    }
408
    
409
    private DataStore createDefaultRasterStore() {
410
        try {
411
            return (DataStore) this.defaultRasterStoreClass.newInstance();
412
        } catch (InstantiationException | IllegalAccessException ex) {
413
            throw new RuntimeException("Can't create the default RasterStore", ex);
414
        }
415
    }
416
    
417
    private Class defaultRasterStoreClass = null;
418
    public void registerDefaultRasterStore(Class rasterStoreClass) {
419
        this.defaultRasterStoreClass = rasterStoreClass;
420
    }
421
    
422
    private DataStoreFactory getStoreFactory(String name) throws InitializeException {
423
        ExtensionPoint.Extension point =
424
            ToolsLocator.getExtensionPointManager()
425
                .get(DATA_MANAGER_STORE_FACTORY).get(name);
426
        try {
427
            DataStoreFactory factory = (DataStoreFactory) point.create();
428
            return factory;
429
        } catch (InstantiationException | IllegalAccessException e) {
430
            throw new InitializeException(e);
431
        }
432
    }
433
    
434
    public DataStore openStore(String provider, DynObject parameters)
435
        throws InitializeException, ProviderNotRegisteredException,
436
        ValidateDataParametersException {
437

    
438
        return localOpenStore(provider, parameters);
439
    }
440

    
441
    @Override
442
    public DataStore openStore(String provider, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
443
        return localOpenStore(provider, parameters);
444
    }
445

    
446
    
447
    
448
    /**
449
     * @deprecated see openStore
450
     */
451
    public DataStore createStore(DynObject doparameters)
452
        throws InitializeException, ProviderNotRegisteredException,
453
        ValidateDataParametersException {
454
        DataStoreParameters parameters = toDataStoreParameters(doparameters);
455
        return openStore(parameters.getDataStoreName(), parameters);
456
    }
457
    
458
    /**
459
     * @deprecated see openStore
460
     */
461
    @Override
462
    public DataStore createStore(DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
463
        return this.openStore(parameters.getDataStoreName(), parameters);
464
    }
465

    
466
    
467
    public List getStoreProviders() {
468
        ExtensionPointManager epmanager =
469
            ToolsLocator.getExtensionPointManager();
470
        List names1 = epmanager.get(DATA_MANAGER_STORE).getNames();
471
        List names2 =
472
            epmanager.get(DATA_MANAGER_STORE_PROVIDER_FACTORY).getNames();
473
        List names3 = new ArrayList();
474
        names3.addAll(names1);
475
        names3.addAll(names2);
476
        return names3;
477
    }
478

    
479
    @Override
480
    public DataStoreProviderFactory getStoreProviderFactory(String name) {
481
        try {
482
            return (DataStoreProviderFactory) ToolsLocator
483
                .getExtensionPointManager()
484
                .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
485
        } catch (InstantiationException | IllegalAccessException e) {
486
            return null;
487
        }
488
    }
489

    
490
    public List getStoreProviders(String name) {
491
        return getStoreProviders(); // FIXME: need filter from the name of
492
        // the explorer
493
    }
494

    
495
    public NewDataStoreParameters createNewStoreParameters(String explorer,
496
        String provider) throws InitializeException,
497
        ProviderNotRegisteredException {
498

    
499
        DataServerExplorerParameters parameters;
500
        DataServerExplorer server;
501
        try {
502
            parameters = this.createServerExplorerParameters(explorer);
503
            server =
504
                this.openServerExplorerWithoutValidate(explorer, parameters);
505
            return server.getAddParameters(provider);
506
        } catch (ValidateDataParametersException e) {
507
            throw new InitializeException(e);
508
        } catch (DataException e) {
509
            throw new InitializeException(e);
510
        }
511
    }
512

    
513
    public void newStore(String explorer, String provider,
514
        NewDataStoreParameters parameters, boolean overwrite)
515
        throws InitializeException, ProviderNotRegisteredException,
516
        ValidateDataParametersException {
517
        
518
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
519
        if( ! identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, provider) ) {
520
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, provider);
521
        }
522
        parameters.validate();
523

    
524
        DataServerExplorerParameters explorerParameters;
525
        DataServerExplorer server;
526
        explorerParameters = this.createServerExplorerParameters(explorer);
527
        server =
528
            this.openServerExplorerWithoutValidate(explorer, explorerParameters);
529
        try {
530
            server.add(provider, parameters, overwrite);
531
        } catch (DataException e) {
532
            throw new InitializeException(e);
533
        }
534
    }
535

    
536
    /*
537
     * ====================================================================
538
     * 
539
     * Explorer related services
540
     */
541
    public void registerExplorerProvider(String name, Class explorerClass,
542
        Class parametersClass) {
543

    
544
        if (name == null || explorerClass == null || parametersClass == null) {
545
            // FIXME Exception
546
            throw new IllegalArgumentException("Any parameters can be null");
547
        }
548

    
549
        if (!DataServerExplorerParameters.class
550
            .isAssignableFrom(parametersClass)) {
551
            // FIXME Exception
552
            throw new IllegalArgumentException(
553
                parametersClass.getName()
554
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
555
        }
556

    
557
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
558
            // FIXME Exception
559
            throw new IllegalArgumentException(explorerClass.getName()
560
                + " must implement org.gvsig.fmap.dal.DataServerExplorer");
561
        }
562

    
563
        ToolsLocator.getExtensionPointManager()
564
            .add(DATA_MANAGER_EXPLORER, DATA_MANAGER_EXPLORER_DESCRIPTION)
565
            .append(name, null, explorerClass);
566

    
567
        ToolsLocator
568
            .getExtensionPointManager()
569
            .add(DATA_MANAGER_EXPLORER_PARAMS,
570
                DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION)
571
            .append(name, null, parametersClass);
572
    }
573

    
574
    public DataServerExplorerParameters createServerExplorerParameters(
575
        String name) throws InitializeException, ProviderNotRegisteredException {
576
        try {
577
            DataServerExplorerParameters params =
578
                (DataServerExplorerParameters) ToolsLocator
579
                    .getExtensionPointManager()
580
                    .get(DATA_MANAGER_EXPLORER_PARAMS).create(name);
581
            if (params == null) {
582
                throw new ProviderNotRegisteredException(name);
583
            }
584
            return params;
585
        } catch (InstantiationException e) {
586
            throw new InitializeException(e);
587
        } catch (IllegalAccessException e) {
588
            throw new InitializeException(e);
589
        } catch (SecurityException e) {
590
            throw new InitializeException(e);
591
        } catch (IllegalArgumentException e) {
592
            throw new InitializeException(e);
593
        }
594
    }
595

    
596
    public DataServerExplorer openServerExplorer(String explorer,
597
        DataServerExplorerParameters parameters) throws InitializeException,
598
        ProviderNotRegisteredException, ValidateDataParametersException {
599

    
600
        if (parameters != null) {
601
            parameters.validate();
602
        }
603
        return this.openServerExplorerWithoutValidate(explorer, parameters);
604
    }
605

    
606
    private DataServerExplorer openServerExplorerWithoutValidate(
607
        String explorerName, DataServerExplorerParameters parameters)
608
        throws InitializeException, ProviderNotRegisteredException,
609
        ValidateDataParametersException {
610

    
611
        String name = explorerName; // parameters.getExplorerName();
612

    
613
        try {
614
            DataServerExplorerProvider server =
615
                (DataServerExplorerProvider) ToolsLocator
616
                    .getExtensionPointManager()
617
                    .get(DATA_MANAGER_EXPLORER)
618
                    .create(
619
                        name,
620
                        new Object[] { parameters,
621
                            new DefaultDataServerExplorerProviderServices() });
622
            if (server == null) {
623
                throw new ProviderNotRegisteredException(name);
624
            }
625
            return server;
626
        } catch (InstantiationException e) {
627
            throw new InitializeException(e);
628
        } catch (IllegalAccessException e) {
629
            throw new InitializeException(e);
630
        } catch (SecurityException e) {
631
            throw new InitializeException(e);
632
        } catch (IllegalArgumentException e) {
633
            throw new InitializeException(e);
634
        } catch (NoSuchMethodException e) {
635
            throw new InitializeException(e);
636
        } catch (InvocationTargetException e) {
637
            throw new InitializeException(e);
638
        }
639
    }
640

    
641
    /**
642
     * @deprecated see openServerExplorer
643
     */
644
    public DataServerExplorer createServerExplorer(
645
        DataServerExplorerParameters parameters) throws InitializeException,
646
        ProviderNotRegisteredException, ValidateDataParametersException {
647
        return openServerExplorer(parameters.getExplorerName(), parameters);
648
    }
649

    
650
    public List getExplorerProviders() {
651
        return ToolsLocator.getExtensionPointManager()
652
            .get(DATA_MANAGER_EXPLORER).getNames();
653
    }
654

    
655
    /*
656
     * ====================================================================
657
     * 
658
     * Expresion evaluation related services
659
     */
660
    public Evaluator createExpresion(String expresion)
661
        throws InitializeException {
662
        try {
663
            return (Evaluator) ToolsLocator
664
                .getExtensionPointManager()
665
                .get(DATA_MANAGER_EXPRESION_EVALUATOR)
666
                .create(DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
667
                    new Object[] { expresion });
668
        } catch (SecurityException e) {
669
            throw new InitializeException(e);
670
        } catch (IllegalArgumentException e) {
671
            throw new InitializeException(e);
672
        } catch (NoSuchMethodException e) {
673
            throw new InitializeException(e);
674
        } catch (InstantiationException e) {
675
            throw new InitializeException(e);
676
        } catch (IllegalAccessException e) {
677
            throw new InitializeException(e);
678
        } catch (InvocationTargetException e) {
679
            throw new InitializeException(e);
680
        }
681
    }
682

    
683
    public void registerDefaultEvaluator(Class evaluatorClass) {
684
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
685
            throw new ClassCastException();
686
        }
687
        ToolsLocator
688
            .getExtensionPointManager()
689
            .add(DATA_MANAGER_EXPRESION_EVALUATOR,
690
                DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION)
691
            .append(DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
692
                "Default expresion evaluator for use in DAL", evaluatorClass);
693
    }
694

    
695
    /*
696
     * ====================================================================
697
     * 
698
     * Index related services
699
     */
700

    
701
    public List getFeatureIndexProviders() {
702
        return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_INDEX)
703
            .getNames();
704
    }
705

    
706
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
707
        defaultDataIndexProviders.put(new Integer(dataType), name);
708
    }
709

    
710
    public String getDefaultFeatureIndexProviderName(int dataType) {
711
        return (String) defaultDataIndexProviders.get(new Integer(dataType));
712
    }
713

    
714
    public FeatureIndexProviderServices createFeatureIndexProvider(String name,
715
        FeatureStore store, FeatureType type, String indexName,
716
        FeatureAttributeDescriptor attr) throws InitializeException,
717
        ProviderNotRegisteredException {
718

    
719
        if (name == null) {
720
            name = getDefaultFeatureIndexProviderName(attr.getType());
721
        }
722

    
723
        if (name == null) {
724
            throw new InitializeException(
725
                "There not any index provider registered.", null);
726
        }
727

    
728
        try {
729
            FeatureIndexProvider provider =
730
                (FeatureIndexProvider) ToolsLocator.getExtensionPointManager()
731
                    .get(DATA_MANAGER_INDEX).create(name);
732
            if (provider == null) {
733
                throw new ProviderNotRegisteredException(name);
734
            }
735
            FeatureIndexProviderServices services =
736
                new DefaultFeatureIndex((FeatureStoreProviderServices) store,
737
                    type, provider, attr.getName(), indexName);
738
            services.initialize();
739
            return services;
740
        } catch (InstantiationException e) {
741
            throw new InitializeException(e);
742
        } catch (IllegalAccessException e) {
743
            throw new InitializeException(e);
744
        } catch (SecurityException e) {
745
            throw new InitializeException(e);
746
        } catch (IllegalArgumentException e) {
747
            throw new InitializeException(e);
748
        }
749
    }
750

    
751
    public void registerFeatureIndexProvider(String name, String description,
752
        Class clazz, int dataType) {
753
        ToolsLocator.getExtensionPointManager()
754
            .add(DATA_MANAGER_INDEX, DATA_MANAGER_INDEX_DESCRIPTION)
755
            .append(name, null, clazz);
756

    
757
        if (getDefaultFeatureIndexProviderName(dataType) == null) {
758
            setDefaultFeatureIndexProviderName(dataType, name);
759
        }
760
    }
761

    
762
    private void initializeIndexes() {
763
        this.defaultDataIndexProviders = new HashMap();
764
    }
765

    
766
    public void intializeDataStore(DataStore store,
767
        DataStoreParameters parameters) throws InitializeException,
768
        ProviderNotRegisteredException {
769

    
770
        ((DataStoreInitializer) store).intializePhase1(this, parameters);
771
        DataStoreProvider provider =
772
            this.createProvider((DataStoreProviderServices) store, parameters);
773
        ((DataStoreInitializer) store).intializePhase2(provider);
774

    
775
    }
776

    
777
    public DataStoreProvider createProvider(
778
        DataStoreProviderServices providerServices,
779
            DataStoreParameters parameters) throws InitializeException,
780
        ProviderNotRegisteredException {
781
        String name = parameters.getDataStoreName();
782
        DataStoreProvider provider = null;
783
        boolean retry = true;
784
        while (retry) {
785
            try {
786
                DataStoreProviderFactory providerFactory =
787
                    (DataStoreProviderFactory) ToolsLocator
788
                        .getExtensionPointManager()
789
                        .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
790
                if (providerFactory != null) {
791
                    provider =
792
                        (DataStoreProvider) providerFactory.createProvider(
793
                            parameters, providerServices);
794
                } else {
795
                    provider =
796
                        (DataStoreProvider) ToolsLocator
797
                            .getExtensionPointManager()
798
                            .get(DATA_MANAGER_STORE)
799
                            .create(name,
800
                                new Object[] { parameters, providerServices });
801
                }
802
                retry = false;
803
            } catch (Exception e) {
804
                if (openErrorHandler != null) {
805
                    retry = openErrorHandler.canRetryOpen(e, parameters);
806
                } else {
807
                    retry = false;
808
                }
809
                if (!retry) {
810
                    throw new InitializeException(
811
                        parameters.getDataStoreName(), e);
812
                }
813
            }
814
        }
815
        if (provider == null) {
816
            throw new ProviderNotRegisteredException(name);
817
        }
818
        return provider;
819
    }
820

    
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
    public List getFeatureCacheProviders() {
857
        ExtensionPoint extensionPoint =
858
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
859
        if (extensionPoint != null) {
860
            return ToolsLocator.getExtensionPointManager()
861
                .get(DATA_MANAGER_CACHE).getNames();
862
        } else {
863
            return new ArrayList();
864
        }
865
    }
866

    
867
    public DynObject createCacheParameters(String name)
868
        throws InitializeException, ProviderNotRegisteredException {
869
        if (name == null) {
870
            throw new InitializeException(
871
                "It is necessary to provide a cache name", null);
872
        }
873
        FeatureCacheProviderFactory featureCacheProviderFactory;
874
        try {
875
            featureCacheProviderFactory =
876
                (FeatureCacheProviderFactory) ToolsLocator
877
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
878
                    .create(name);
879
            if (featureCacheProviderFactory == null) {
880
                throw new ProviderNotRegisteredException(name);
881
            }
882
            return featureCacheProviderFactory.createParameters();
883
        } catch (InstantiationException e) {
884
            throw new InitializeException(e);
885
        } catch (IllegalAccessException e) {
886
            throw new InitializeException(e);
887
        }
888
    }
889

    
890
    public DataStoreParameters createMemoryStoreParameters(
891
        String autoOrderAttributeName) throws InitializeException {
892

    
893
        DataStoreParameters parameters;
894
        try {
895
            parameters = createStoreParameters(MemoryStoreProvider.NAME);
896
            if (autoOrderAttributeName != null) {
897
                parameters.setDynValue(
898
                    MemoryStoreParameters.ORDER_PARAMETER_NAME,
899
                    autoOrderAttributeName);
900
            }
901
            return parameters;
902
        } catch (ProviderNotRegisteredException e) {
903
            throw new InitializeException("MemoryStoreProvider", e);
904
        }
905
    }
906

    
907
    public FeatureStore createMemoryStore(String autoOrderAttributeName)
908
        throws InitializeException {
909

    
910
        DataStoreParameters parameters =
911
            createMemoryStoreParameters(autoOrderAttributeName);
912
        try {
913
            return (FeatureStore) createStore(parameters);
914
        } catch (ValidateDataParametersException e) {
915
            throw new InitializeException("MemoryStoreProvider", e);
916
        } catch (ProviderNotRegisteredException e) {
917
            throw new InitializeException("MemoryStoreProvider", e);
918
        }
919
    }
920

    
921
    public FeaturePagingHelper createFeaturePagingHelper(
922
        FeatureStore featureStore, int pageSize) throws BaseException {
923
        return new FeaturePagingHelperImpl(featureStore, pageSize);
924
    }
925

    
926
    public FeaturePagingHelper createFeaturePagingHelper(
927
        FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
928
        throws BaseException {
929
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
930
    }
931

    
932
    public void setOpenErrorHandler(OpenErrorHandler handler) {
933
        openErrorHandler = handler;
934
    }
935
    
936
    public OpenErrorHandler getOpenErrorHandler() {
937
        return this.openErrorHandler;
938
    }
939
            
940
    public EditableFeatureType createFeatureType() {
941
        return new DefaultEditableFeatureType();
942
    }
943

    
944
    public List getDataTypes() {
945
        if (dataTypes == null) {
946
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
947
            dataTypes = new ArrayList();
948
            dataTypes.add(manager.get(DataTypes.STRING));
949
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
950
            dataTypes.add(manager.get(DataTypes.INT));
951
            dataTypes.add(manager.get(DataTypes.DOUBLE));
952
            dataTypes.add(manager.get(DataTypes.DATE));
953
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
954
        }
955
        return dataTypes;
956
    }
957
    
958
    public void registerFeatureAttributeGetter(String name, Class clazz) {
959
        if (name == null || clazz == null) {           
960
            throw new IllegalArgumentException("Any parameters can be null");
961
        }
962
        if(!(FeatureAttributeGetter.class.isAssignableFrom(clazz))) {            
963
            throw new IllegalArgumentException(
964
                "Not supported implemtation: name=" + name
965
                + " class=" + clazz.getName());
966
        }
967
    }
968
    
969
    public FeatureAttributeGetter createFeatureAttributeGetter(String name) throws InitializeException {
970
        if (name == null) {           
971
            throw new IllegalArgumentException("The parameter can not be null");
972
        }
973

    
974
        try{
975
            return (FeatureAttributeGetter) ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER).create(name);
976
        } catch (InstantiationException e) {
977
            throw new InitializeException("FeatureAttributeGetter", e);
978
        } catch (IllegalAccessException e) {
979
            throw new InitializeException("FeatureAttributeGetter", e);
980
        }
981
    }
982

    
983
    public DataServerExplorerPool getDataServerExplorerPool() {
984
        if( this.dataServerExplorerPool==null )  {
985
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
986
        }
987
        return this.dataServerExplorerPool;
988
    }
989
    
990
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
991
        this.dataServerExplorerPool = pool;
992
    }
993

    
994
    private static final String DAL_OpenStore = "dal.openstore.";
995
    
996
    @Override
997
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
998
        if( !(struct instanceof DynStruct_v2 ) ) {
999
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
1000
        }
1001
        Tags tags = ((DynStruct_v2)struct).getTags();
1002
        return this.createStoreParameters(tags);
1003
    }
1004

    
1005
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
1006
        String providerName = (String) tags.get(DAL_OpenStore+"provider");
1007
        if( providerName == null ) {
1008
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
1009
        }
1010
        int prefixlen = DAL_OpenStore.length();
1011
        DataStoreParameters parameters = this.createStoreParameters(providerName);
1012
        for( String key : tags ) {
1013
            if( key.startsWith(DAL_OpenStore) ) {
1014
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
1015
            }
1016
        }
1017
        return parameters;
1018
    }
1019

    
1020
    @Override
1021
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
1022
        DataStoreParameters paramters = this.createStoreParameters(struct);
1023
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
1024
        return store;
1025
    }
1026
  
1027
}