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

History | View | Annotate | Download (40.8 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 java.io.File;
27
import java.lang.reflect.InvocationTargetException;
28
import java.util.ArrayList;
29
import java.util.HashMap;
30
import java.util.Iterator;
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.Feature;
51
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
52
import org.gvsig.fmap.dal.feature.FeatureAttributeGetter;
53
import org.gvsig.fmap.dal.feature.FeatureQuery;
54
import org.gvsig.fmap.dal.feature.FeatureStore;
55
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
58
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
59
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
60
import org.gvsig.fmap.dal.feature.impl.dynobjectutils.DynObjectFeatureFacade;
61
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
62
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
63
import org.gvsig.fmap.dal.feature.spi.DataStoreProviderToFeatureStoreProviderFactoryWrapper;
64
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
65
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
66
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
67
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
68
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
69
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
70
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
71
import org.gvsig.fmap.dal.resource.ResourceManager;
72
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
73
import org.gvsig.fmap.dal.spi.DataServerExplorerProvider;
74
import org.gvsig.fmap.dal.spi.DataStoreInitializer;
75
import org.gvsig.fmap.dal.spi.DataStoreProvider;
76
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
77
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
78
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
79
import org.gvsig.fmap.geom.DataTypes;
80
import org.gvsig.tools.ToolsLocator;
81
import org.gvsig.tools.dataTypes.DataTypesManager;
82
import org.gvsig.tools.dynobject.DynObject;
83
import org.gvsig.tools.dynobject.DynObjectEncoder;
84
import org.gvsig.tools.dynobject.DynStruct;
85
import org.gvsig.tools.dynobject.DynStruct_v2;
86
import org.gvsig.tools.dynobject.Tags;
87
import org.gvsig.tools.evaluator.Evaluator;
88
import org.gvsig.tools.exception.BaseException;
89
import org.gvsig.tools.extensionpoint.ExtensionPoint;
90
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
91
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
92
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
93
import org.gvsig.tools.identitymanagement.UnauthorizedException;
94
import org.gvsig.tools.operations.OperationManager;
95
import org.slf4j.Logger;
96
import org.slf4j.LoggerFactory;
97

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

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

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

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

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

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

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

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

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

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

    
154
    private OpenErrorHandler openErrorHandler;
155

    
156
    private List dataTypes;
157
    
158
    private DataServerExplorerPool dataServerExplorerPool = null;
159
    
160

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

    
168
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
169
            DATA_MANAGER_STORE_PARAMS_DESCRIPTION);
170

    
171
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
172
            DATA_MANAGER_EXPLORER_DESCRIPTION);
173

    
174
        ToolsLocator.getExtensionPointManager().add(
175
            DATA_MANAGER_EXPLORER_PARAMS,
176
            DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION);
177

    
178
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
179
            DATA_MANAGER_INDEX_DESCRIPTION);
180

    
181
        ToolsLocator.getExtensionPointManager().add(
182
            DATA_MANAGER_EXPRESION_EVALUATOR,
183
            DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION);
184

    
185
        ToolsLocator.getExtensionPointManager().add(
186
            DATA_MANAGER_STORE_PROVIDER_FACTORY,
187
            DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
188

    
189
        initializeIndexes();
190
    }
191

    
192
    /**
193
     * 
194
     * @return ResourceManager
195
     */
196

    
197
    public ResourceManager getResourceManager() {
198
        return DALLocator.getResourceManager();
199
    }
200

    
201
    public OperationManager getOperationManager() {
202
        return ToolsLocator.getOperationManager();
203
    }
204

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

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

    
239
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
240
            // FIXME Exception
241
            throw new IllegalArgumentException(parametersClass.getName()
242
                + " must implement org.gvsig.fmap.dal.DataStoreParameters");
243
        }
244

    
245
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
246
            ToolsLocator.getExtensionPointManager()
247
                .add(DATA_MANAGER_STORE, DATA_MANAGER_STORE_DESCRIPTION)
248
                .append(name, null, storeProviderClass);
249

    
250
            ToolsLocator
251
                .getExtensionPointManager()
252
                .add(DATA_MANAGER_STORE_PARAMS,
253
                    DATA_MANAGER_STORE_PARAMS_DESCRIPTION)
254
                .append(name, null, parametersClass);
255
            return;
256
        }
257

    
258
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
259
            // Envuelve al proveedor en una factoria por defecto.
260
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
261
                name, "", storeProviderClass, parametersClass));
262
            return;
263
        }
264

    
265
        throw new IllegalArgumentException("Not supported implemtation: name="
266
            + name + " provider class=" + storeProviderClass.getName());
267

    
268
    }
269

    
270
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
271
        ExtensionPoint factories =
272
            ToolsLocator.getExtensionPointManager().add(
273
                DATA_MANAGER_STORE_PROVIDER_FACTORY,
274
                DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
275
        factories.append(factory.getName(), factory.getDescription(), factory);
276

    
277
    }
278

    
279
    public void registerStoreFactory(String name, Class storeProviderClass) {
280
        if (name == null || storeProviderClass == null) {
281
            // FIXME Exception
282
            throw new IllegalArgumentException("Any parameters can be null");
283
        }
284

    
285
        if (!(DataStoreFactory.class.isAssignableFrom(storeProviderClass))) {
286
            // FIXME Exception
287
            throw new IllegalArgumentException(
288
                "Not supported implemtation: name=" + name + " provider class="
289
                    + storeProviderClass.getName());
290
        }
291

    
292
        ToolsLocator
293
            .getExtensionPointManager()
294
            .add(DATA_MANAGER_STORE_FACTORY,
295
                DATA_MANAGER_STORE_FACTORY_DESCRIPTION)
296
            .append(name, null, storeProviderClass);
297
    }
298

    
299
    public DataStoreParameters createStoreParameters(String name)
300
        throws InitializeException, ProviderNotRegisteredException {
301
        try {
302

    
303
            // Si hay una factoria para ese proveedor se los pedimos a la
304
            // factoria
305
            DataStoreProviderFactory providerFactory =
306
                (DataStoreProviderFactory) ToolsLocator
307
                    .getExtensionPointManager()
308
                    .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
309
            if (providerFactory != null) {
310
                return (DataStoreParameters) providerFactory.createParameters();
311
            }
312

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

    
347
        DataStoreParameters parameters = toDataStoreParameters(doparameters);
348
        
349
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
350
        if( ! identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, provider) ) {
351
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, provider);
352
        }
353
        
354
        // Usa el DynObjectEncoder y no el toString para ver los parametros aunque
355
        // el proveedor de datos sobreescriba el metodo toString.
356
        DynObjectEncoder encoder = ToolsLocator.getDynObjectManager().createSimpleDynObjectEncoder();
357
        logger.info("openStore('{}','{}')", provider, encoder.encode(parameters));
358
        
359
        String name = provider; 
360

    
361
        parameters.validate();
362

    
363
        DataStore store;
364
        try {
365
            DataStoreProviderFactory providerFactory;
366
            providerFactory =
367
                (DataStoreProviderFactory) ToolsLocator
368
                    .getExtensionPointManager()
369
                    .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
370
            if (providerFactory != null) {
371
                if (FeatureStoreProviderFactory.class
372
                    .isAssignableFrom(providerFactory.getClass())) {
373
                    store = new DefaultFeatureStore();
374
                    this.intializeDataStore(store, parameters);
375
                    return store;
376
                }
377
            }
378
        } catch (InstantiationException e1) {
379
            // ignore
380
        } catch (IllegalAccessException e1) {
381
            // ignore
382
        }
383

    
384
        Extension storeProviderExtension =
385
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_STORE)
386
                .get(name);
387

    
388
        if (storeProviderExtension == null) {
389
            throw new ProviderNotRegisteredException(name);
390
        }
391

    
392
        Class providerClass = storeProviderExtension.getExtension();
393
        if (providerClass == null) {
394
            throw new ProviderNotRegisteredException(name);
395
        }
396

    
397
        if (CoverageStoreProvider.class.isAssignableFrom(providerClass)) {
398
            ExtensionPoint.Extension point =
399
                ToolsLocator.getExtensionPointManager()
400
                    .get(DATA_MANAGER_STORE_FACTORY).get(name);
401
            DataStoreFactory factory = null;
402
            try {
403
                factory = (DataStoreFactory) point.create();
404
            } catch (InstantiationException e) {
405
                throw new InitializeException(e);
406
            } catch (IllegalAccessException e) {
407
                throw new InitializeException(e);
408
            }
409
            factory.setParameters(parameters);
410
            store = factory.createStore();
411
        } else
412
            if (FeatureStoreProvider.class.isAssignableFrom(providerClass)) {
413

    
414
                store = new DefaultFeatureStore();
415

    
416
            } else {
417
                // FIXME Exception
418
                throw new InitializeException(name, new RuntimeException(
419
                    "Not supported implemtation: name=" + name
420
                        + " provider class=" + providerClass.getName()));
421
            }
422

    
423
        this.intializeDataStore(store, parameters);
424

    
425
        return store;
426
    }
427

    
428
    public DataStore openStore(String provider, DynObject parameters)
429
        throws InitializeException, ProviderNotRegisteredException,
430
        ValidateDataParametersException {
431

    
432
        return localOpenStore(provider, parameters);
433
    }
434

    
435
    @Override
436
    public DataStore openStore(String provider, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
437
        return localOpenStore(provider, parameters);
438
    }
439

    
440
    
441
    
442
    /**
443
     * @deprecated see openStore
444
     */
445
    public DataStore createStore(DynObject doparameters)
446
        throws InitializeException, ProviderNotRegisteredException,
447
        ValidateDataParametersException {
448
        DataStoreParameters parameters = toDataStoreParameters(doparameters);
449
        return openStore(parameters.getDataStoreName(), parameters);
450
    }
451
    
452
    /**
453
     * @deprecated see openStore
454
     */
455
    @Override
456
    public DataStore createStore(DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
457
        return this.openStore(parameters.getDataStoreName(), parameters);
458
    }
459

    
460
    
461
    public List getStoreProviders() {
462
        ExtensionPointManager epmanager =
463
            ToolsLocator.getExtensionPointManager();
464
        List names1 = epmanager.get(DATA_MANAGER_STORE).getNames();
465
        List names2 =
466
            epmanager.get(DATA_MANAGER_STORE_PROVIDER_FACTORY).getNames();
467
        List names3 = new ArrayList();
468
        names3.addAll(names1);
469
        names3.addAll(names2);
470
        return names3;
471
    }
472

    
473
    public DataStoreProviderFactory getStoreProviderFactory(String name) {
474
        try {
475
            return (DataStoreProviderFactory) ToolsLocator
476
                .getExtensionPointManager()
477
                .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
478
        } catch (InstantiationException e) {
479
            return null;
480
        } catch (IllegalAccessException e) {
481
            return null;
482
        }
483
    }
484

    
485
    public List getStoreProviders(String name) {
486
        return getStoreProviders(); // FIXME: need filter from the name of
487
        // the explorer
488
    }
489

    
490
    public NewDataStoreParameters createNewStoreParameters(String explorer,
491
        String provider) throws InitializeException,
492
        ProviderNotRegisteredException {
493

    
494
        DataServerExplorerParameters parameters;
495
        DataServerExplorer server;
496
        try {
497
            parameters = this.createServerExplorerParameters(explorer);
498
            server =
499
                this.openServerExplorerWithoutValidate(explorer, parameters);
500
            return server.getAddParameters(provider);
501
        } catch (ValidateDataParametersException e) {
502
            throw new InitializeException(e);
503
        } catch (DataException e) {
504
            throw new InitializeException(e);
505
        }
506
    }
507

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

    
519
        DataServerExplorerParameters explorerParameters;
520
        DataServerExplorer server;
521
        explorerParameters = this.createServerExplorerParameters(explorer);
522
        server =
523
            this.openServerExplorerWithoutValidate(explorer, explorerParameters);
524
        try {
525
            server.add(provider, parameters, overwrite);
526
        } catch (DataException e) {
527
            throw new InitializeException(e);
528
        }
529
    }
530

    
531
    /*
532
     * ====================================================================
533
     * 
534
     * Explorer related services
535
     */
536
    public void registerExplorerProvider(String name, Class explorerClass,
537
        Class parametersClass) {
538

    
539
        if (name == null || explorerClass == null || parametersClass == null) {
540
            // FIXME Exception
541
            throw new IllegalArgumentException("Any parameters can be null");
542
        }
543

    
544
        if (!DataServerExplorerParameters.class
545
            .isAssignableFrom(parametersClass)) {
546
            // FIXME Exception
547
            throw new IllegalArgumentException(
548
                parametersClass.getName()
549
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
550
        }
551

    
552
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
553
            // FIXME Exception
554
            throw new IllegalArgumentException(explorerClass.getName()
555
                + " must implement org.gvsig.fmap.dal.DataServerExplorer");
556
        }
557

    
558
        ToolsLocator.getExtensionPointManager()
559
            .add(DATA_MANAGER_EXPLORER, DATA_MANAGER_EXPLORER_DESCRIPTION)
560
            .append(name, null, explorerClass);
561

    
562
        ToolsLocator
563
            .getExtensionPointManager()
564
            .add(DATA_MANAGER_EXPLORER_PARAMS,
565
                DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION)
566
            .append(name, null, parametersClass);
567
    }
568

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

    
591
    public DataServerExplorer openServerExplorer(String explorer,
592
        DataServerExplorerParameters parameters) throws InitializeException,
593
        ProviderNotRegisteredException, ValidateDataParametersException {
594

    
595
        if (parameters != null) {
596
            parameters.validate();
597
        }
598
        return this.openServerExplorerWithoutValidate(explorer, parameters);
599
    }
600

    
601
    private DataServerExplorer openServerExplorerWithoutValidate(
602
        String explorerName, DataServerExplorerParameters parameters)
603
        throws InitializeException, ProviderNotRegisteredException,
604
        ValidateDataParametersException {
605

    
606
        String name = explorerName; // parameters.getExplorerName();
607

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

    
636
    /**
637
     * @deprecated see openServerExplorer
638
     */
639
    public DataServerExplorer createServerExplorer(
640
        DataServerExplorerParameters parameters) throws InitializeException,
641
        ProviderNotRegisteredException, ValidateDataParametersException {
642
        return openServerExplorer(parameters.getExplorerName(), parameters);
643
    }
644

    
645
    public List getExplorerProviders() {
646
        return ToolsLocator.getExtensionPointManager()
647
            .get(DATA_MANAGER_EXPLORER).getNames();
648
    }
649

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

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

    
690
    /*
691
     * ====================================================================
692
     * 
693
     * Index related services
694
     */
695

    
696
    public List getFeatureIndexProviders() {
697
        return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_INDEX)
698
            .getNames();
699
    }
700

    
701
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
702
        defaultDataIndexProviders.put(new Integer(dataType), name);
703
    }
704

    
705
    public String getDefaultFeatureIndexProviderName(int dataType) {
706
        return (String) defaultDataIndexProviders.get(new Integer(dataType));
707
    }
708

    
709
    public FeatureIndexProviderServices createFeatureIndexProvider(String name,
710
        FeatureStore store, FeatureType type, String indexName,
711
        FeatureAttributeDescriptor attr) throws InitializeException,
712
        ProviderNotRegisteredException {
713

    
714
        if (name == null) {
715
            name = getDefaultFeatureIndexProviderName(attr.getType());
716
        }
717

    
718
        if (name == null) {
719
            throw new InitializeException(
720
                "There not any index provider registered.", null);
721
        }
722

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

    
746
    public void registerFeatureIndexProvider(String name, String description,
747
        Class clazz, int dataType) {
748
        ToolsLocator.getExtensionPointManager()
749
            .add(DATA_MANAGER_INDEX, DATA_MANAGER_INDEX_DESCRIPTION)
750
            .append(name, null, clazz);
751

    
752
        if (getDefaultFeatureIndexProviderName(dataType) == null) {
753
            setDefaultFeatureIndexProviderName(dataType, name);
754
        }
755
    }
756

    
757
    private void initializeIndexes() {
758
        this.defaultDataIndexProviders = new HashMap();
759
    }
760

    
761
    public void intializeDataStore(DataStore store,
762
        DataStoreParameters parameters) throws InitializeException,
763
        ProviderNotRegisteredException {
764

    
765
        ((DataStoreInitializer) store).intializePhase1(this, parameters);
766
        DataStoreProvider provider =
767
            this.createProvider((DataStoreProviderServices) store, parameters);
768
        ((DataStoreInitializer) store).intializePhase2(provider);
769

    
770
    }
771

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

    
816
    public void registerFeatureCacheProvider(
817
        FeatureCacheProviderFactory providerFactory) {
818
        ToolsLocator.getExtensionPointManager()
819
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
820
            .append(providerFactory.getName(), "", providerFactory);
821
    }
822

    
823
    public FeatureCacheProvider createFeatureCacheProvider(String name,
824
        DynObject parameters) throws DataException {
825
        if (name == null) {
826
            throw new InitializeException(
827
                "It is necessary to provide a cache name", null);
828
        }
829
        if (parameters == null) {
830
            throw new InitializeException(
831
                "It is necessary to provide parameters to create the explorer",
832
                null);
833
        }
834
        FeatureCacheProviderFactory featureCacheProviderFactory;
835
        try {
836
            featureCacheProviderFactory =
837
                (FeatureCacheProviderFactory) ToolsLocator
838
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
839
                    .create(name);
840
            if (featureCacheProviderFactory == null) {
841
                throw new ProviderNotRegisteredException(name);
842
            }
843
            return featureCacheProviderFactory.createCacheProvider(parameters);
844
        } catch (InstantiationException e) {
845
            throw new InitializeException(e);
846
        } catch (IllegalAccessException e) {
847
            throw new InitializeException(e);
848
        }
849
    }
850

    
851
    public List getFeatureCacheProviders() {
852
        ExtensionPoint extensionPoint =
853
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
854
        if (extensionPoint != null) {
855
            return ToolsLocator.getExtensionPointManager()
856
                .get(DATA_MANAGER_CACHE).getNames();
857
        } else {
858
            return new ArrayList();
859
        }
860
    }
861

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

    
885
    public DataStoreParameters createMemoryStoreParameters(
886
        String autoOrderAttributeName) throws InitializeException {
887

    
888
        DataStoreParameters parameters;
889
        try {
890
            parameters = createStoreParameters(MemoryStoreProvider.NAME);
891
            if (autoOrderAttributeName != null) {
892
                parameters.setDynValue(
893
                    MemoryStoreParameters.ORDER_PARAMETER_NAME,
894
                    autoOrderAttributeName);
895
            }
896
            return parameters;
897
        } catch (ProviderNotRegisteredException e) {
898
            throw new InitializeException("MemoryStoreProvider", e);
899
        }
900
    }
901

    
902
    public FeatureStore createMemoryStore(String autoOrderAttributeName)
903
        throws InitializeException {
904

    
905
        DataStoreParameters parameters =
906
            createMemoryStoreParameters(autoOrderAttributeName);
907
        try {
908
            return (FeatureStore) createStore(parameters);
909
        } catch (ValidateDataParametersException e) {
910
            throw new InitializeException("MemoryStoreProvider", e);
911
        } catch (ProviderNotRegisteredException e) {
912
            throw new InitializeException("MemoryStoreProvider", e);
913
        }
914
    }
915

    
916
    public FeaturePagingHelper createFeaturePagingHelper(
917
        FeatureStore featureStore, int pageSize) throws BaseException {
918
        return new FeaturePagingHelperImpl(featureStore, pageSize);
919
    }
920

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

    
927
    public void setOpenErrorHandler(OpenErrorHandler handler) {
928
        openErrorHandler = handler;
929
    }
930
    
931
    public OpenErrorHandler getOpenErrorHandler() {
932
        return this.openErrorHandler;
933
    }
934
            
935
    public EditableFeatureType createFeatureType() {
936
        return new DefaultEditableFeatureType();
937
    }
938

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

    
969
        try{
970
            return (FeatureAttributeGetter) ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER).create(name);
971
        } catch (InstantiationException e) {
972
            throw new InitializeException("FeatureAttributeGetter", e);
973
        } catch (IllegalAccessException e) {
974
            throw new InitializeException("FeatureAttributeGetter", e);
975
        }
976
    }
977

    
978
    public DataServerExplorerPool getDataServerExplorerPool() {
979
        if( this.dataServerExplorerPool==null )  {
980
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
981
        }
982
        return this.dataServerExplorerPool;
983
    }
984
    
985
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
986
        this.dataServerExplorerPool = pool;
987
    }
988

    
989
    private static final String DAL_OpenStore = "dal.openstore.";
990
    
991
    @Override
992
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
993
        if( !(struct instanceof DynStruct_v2 ) ) {
994
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
995
        }
996
        Tags tags = ((DynStruct_v2)struct).getTags();
997
        String providerName = (String) tags.get(DAL_OpenStore+"provider");
998
        if( providerName == null ) {
999
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
1000
        }
1001
        int prefixlen = DAL_OpenStore.length();
1002
        DataStoreParameters parameters = this.createStoreParameters(providerName);
1003
        for( String key : tags ) {
1004
            if( key.startsWith(DAL_OpenStore) ) {
1005
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
1006
            }
1007
        }
1008
        return parameters;
1009
    }
1010

    
1011
    @Override
1012
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
1013
        DataStoreParameters paramters = this.createStoreParameters(struct);
1014
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
1015
        return store;
1016
    }
1017
  
1018
}