Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / impl / DefaultDataManager.java @ 36477

History | View | Annotate | Download (28.2 KB)

1
package org.gvsig.fmap.dal.impl;
2

    
3
import java.io.File;
4
import java.lang.reflect.InvocationTargetException;
5
import java.util.ArrayList;
6
import java.util.HashMap;
7
import java.util.List;
8
import java.util.Map;
9

    
10
import org.gvsig.fmap.dal.DALLocator;
11
import org.gvsig.fmap.dal.DataManager;
12
import org.gvsig.fmap.dal.DataServerExplorer;
13
import org.gvsig.fmap.dal.DataServerExplorerParameters;
14
import org.gvsig.fmap.dal.DataStore;
15
import org.gvsig.fmap.dal.DataStoreFactory;
16
import org.gvsig.fmap.dal.DataStoreParameters;
17
import org.gvsig.fmap.dal.DataStoreProviderFactory;
18
import org.gvsig.fmap.dal.NewDataStoreParameters;
19
import org.gvsig.fmap.dal.OpenErrorHandler;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.exception.InitializeException;
22
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
23
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
24
import org.gvsig.fmap.dal.feature.EditableFeatureType;
25
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
26
import org.gvsig.fmap.dal.feature.FeatureQuery;
27
import org.gvsig.fmap.dal.feature.FeatureStore;
28
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
29
import org.gvsig.fmap.dal.feature.FeatureType;
30
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
31
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
32
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
33
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
34
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
35
import org.gvsig.fmap.dal.feature.spi.BaseFeatureStoreProviderFactory;
36
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
37
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
38
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
39
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
40
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
41
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
42
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
43
import org.gvsig.fmap.dal.resource.ResourceManager;
44
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
45
import org.gvsig.fmap.dal.spi.DataServerExplorerProvider;
46
import org.gvsig.fmap.dal.spi.DataStoreInitializer;
47
import org.gvsig.fmap.dal.spi.DataStoreProvider;
48
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
49
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
50
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
51
import org.gvsig.tools.ToolsLocator;
52
import org.gvsig.tools.dynobject.DynObject;
53
import org.gvsig.tools.evaluator.Evaluator;
54
import org.gvsig.tools.exception.BaseException;
55
import org.gvsig.tools.extensionpoint.ExtensionPoint;
56
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
57
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
58
import org.gvsig.tools.operations.OperationManager;
59
import org.slf4j.Logger;
60
import org.slf4j.LoggerFactory;
61

    
62
public class DefaultDataManager implements DataManager,
63
                DataManagerProviderServices {
64

    
65
        private static Logger LOG = LoggerFactory
66
                        .getLogger(DefaultDataManager.class);
67

    
68
        final static private String DATA_MANAGER_STORE = "Data.manager.stores";
69
        final static private String DATA_MANAGER_STORE_DESCRIPTION = "DAL stores providers";
70

    
71
        final static private String DATA_MANAGER_STORE_PARAMS = "Data.manager.stores.params";
72
        final static private String DATA_MANAGER_STORE_PARAMS_DESCRIPTION = "DAL stores providers parameters";
73

    
74
        final static private String DATA_MANAGER_EXPLORER = "Data.manager.explorers";
75
        final static private String DATA_MANAGER_EXPLORER_DESCRIPTION = "DAL explorers providers";
76

    
77
        final static private String DATA_MANAGER_EXPLORER_PARAMS = "Data.manager.explorers.params";
78
        final static private String DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION = "DAL explorer providers parameters";
79

    
80
        final static private String DATA_MANAGER_INDEX = "Data.manager.indexes";
81
        final static private String DATA_MANAGER_INDEX_DESCRIPTION = "DAL index providers";
82

    
83
        final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
84
        final static private String DATA_MANAGER_CACHE_DESCRIPTION = "DAL cache providers";
85

    
86
        final static private String DATA_MANAGER_EXPRESION_EVALUATOR = "Data.manager.expresion.evaluator";
87
        final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT = "default";
88
        final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION = "DAL expresion evaluators.";
89

    
90
        final static private String DATA_MANAGER_STORE_FACTORY = "Data.manager.stores.factory";
91
        final static private String DATA_MANAGER_STORE_FACTORY_DESCRIPTION = "DAL stores factories";
92

    
93
        final static private String DATA_MANAGER_STORE_PROVIDER_FACTORY = "Data.manager.providers.factory";
94
        final static private String DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION = "DAL store provider factories";
95

    
96
        /** This map contains the name of the default provider for each data type */
97
        private Map defaultDataIndexProviders;
98

    
99
        private OpenErrorHandler openErrorHandler;
100

    
101
        public DefaultDataManager() {
102
                /*
103
                 * Create te extensions point in te registry.
104
                 */
105
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE,
106
                                DATA_MANAGER_STORE_DESCRIPTION);
107

    
108
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
109
                                DATA_MANAGER_STORE_PARAMS_DESCRIPTION);
110

    
111
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
112
                                DATA_MANAGER_EXPLORER_DESCRIPTION);
113

    
114
                ToolsLocator.getExtensionPointManager().add(
115
                                DATA_MANAGER_EXPLORER_PARAMS,
116
                                DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION);
117

    
118
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
119
                                DATA_MANAGER_INDEX_DESCRIPTION);
120

    
121
                ToolsLocator.getExtensionPointManager().add(
122
                                DATA_MANAGER_EXPRESION_EVALUATOR,
123
                                DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION);
124
                
125
                ToolsLocator.getExtensionPointManager().add(
126
                                DATA_MANAGER_STORE_PROVIDER_FACTORY,
127
                                DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
128

    
129
                initializeIndexes();
130
        }
131

    
132
        /**
133
         *
134
         * @return ResourceManager
135
         */
136

    
137
        public ResourceManager getResourceManager() {
138
                return DALLocator.getResourceManager();
139
        }
140

    
141
        public OperationManager getOperationManager() {
142
                return ToolsLocator.getOperationManager();
143
        }
144

    
145
        public String getTemporaryDirectory() {
146
                // FIXME Define a better tempdir solution
147
                String tmp = System.getProperty("TMP");
148
                if (tmp == null) {
149
                        tmp = System.getProperty("TEMP");
150
                }
151
                if (tmp == null) {
152
                        File tmp_file = new File(System.getProperty("HOME"), "_daltmp_");
153
                        int i = 1;
154
                        while (!tmp_file.exists() || !tmp_file.isDirectory()) {
155
                                tmp_file = new File(tmp_file.getAbsolutePath() + i);
156
                                i++;
157
                        }
158
                        if (!tmp_file.exists()) {
159
                                tmp_file.mkdir();
160
                        }
161
                        tmp = tmp_file.getAbsolutePath();
162
                }
163
                return tmp;
164
        }
165

    
166
        /*
167
         * ====================================================================
168
         * 
169
         * Store related services
170
         */
171
        public void registerStoreProvider(String name, Class storeProviderClass,
172
                        Class parametersClass) {
173
                if (name == null || storeProviderClass == null
174
                                || parametersClass == null) {
175
                        // FIXME Exception
176
                        throw new IllegalArgumentException("Any parameters can be null");
177
                }
178

    
179
                if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
180
                        // FIXME Exception
181
                        throw new IllegalArgumentException(parametersClass.getName()
182
                                        + " must implement org.gvsig.fmap.dal.DataStoreParameters");
183
                }
184

    
185
                if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
186
                        ToolsLocator.getExtensionPointManager()
187
                                        .add(DATA_MANAGER_STORE, DATA_MANAGER_STORE_DESCRIPTION)
188
                                        .append(name, null, storeProviderClass);
189

    
190
                        ToolsLocator
191
                                        .getExtensionPointManager()
192
                                        .add(DATA_MANAGER_STORE_PARAMS,
193
                                                        DATA_MANAGER_STORE_PARAMS_DESCRIPTION)
194
                                        .append(name, null, parametersClass);
195
                        return;
196
                }
197

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

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

    
207
        }
208

    
209
        public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
210
                ExtensionPoint factories = ToolsLocator.getExtensionPointManager().add(
211
                                DATA_MANAGER_STORE_PROVIDER_FACTORY,
212
                                DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
213
                factories.append(factory.getName(), factory.getDescription(), factory);
214

    
215
        }
216

    
217
        public void registerStoreFactory(String name, Class storeProviderClass) {
218
                if (name == null || storeProviderClass == null) {
219
                        // FIXME Exception
220
                        throw new IllegalArgumentException("Any parameters can be null");
221
                }
222

    
223
                if (!(DataStoreFactory.class.isAssignableFrom(storeProviderClass))) {
224
                        // FIXME Exception
225
                        throw new IllegalArgumentException(
226
                                        "Not supported implemtation: name=" + name
227
                                                        + " provider class=" + storeProviderClass.getName());
228
                }
229

    
230
                ToolsLocator
231
                                .getExtensionPointManager()
232
                                .add(DATA_MANAGER_STORE_FACTORY,
233
                                                DATA_MANAGER_STORE_FACTORY_DESCRIPTION)
234
                                .append(name, null, storeProviderClass);
235
        }
236

    
237
        public DataStoreParameters createStoreParameters(String name)
238
                        throws InitializeException, ProviderNotRegisteredException {
239
                try {
240
                        
241
                        // Si hay una factoria para ese proveedor se los pedimos a la factoria
242
                        DataStoreProviderFactory providerFactory = (DataStoreProviderFactory) ToolsLocator
243
                                        .getExtensionPointManager().get(DATA_MANAGER_STORE_PROVIDER_FACTORY)
244
                                        .create(name);
245
                        if( providerFactory != null ) {
246
                                return (DataStoreParameters) providerFactory.createParameters();
247
                        }
248
                        
249
                        // Si no hay factoria lo hacemos como se hacia antes por mantener
250
                        // compatibilidad.
251
                         DataStoreParameters params = (DataStoreParameters) ToolsLocator
252
                                        .getExtensionPointManager().get(DATA_MANAGER_STORE_PARAMS)
253
                                        .create(name);
254
                        if (params == null) {
255
                                throw new ProviderNotRegisteredException(name);
256
                        }
257
                        return params;
258
                } catch (InstantiationException e) {
259
                        throw new InitializeException(e);
260
                } catch (IllegalAccessException e) {
261
                        throw new InitializeException(e);
262
                } catch (SecurityException e) {
263
                        throw new InitializeException(e);
264
                } catch (IllegalArgumentException e) {
265
                        throw new InitializeException(e);
266
                }
267
        }
268

    
269
        private DataStore localOpenStore(String provider,
270
                        DataStoreParameters parameters) throws InitializeException,
271
                        ProviderNotRegisteredException, ValidateDataParametersException {
272
                String name = provider; // parameters.getDataStoreName();
273

    
274
                parameters.validate();
275

    
276
                DataStore store;
277
                try {
278
                        DataStoreProviderFactory providerFactory;
279
                        providerFactory = (DataStoreProviderFactory) ToolsLocator
280
                        .getExtensionPointManager().get(DATA_MANAGER_STORE_PROVIDER_FACTORY)
281
                        .create(name);
282
                        if( providerFactory != null ) {
283
                                if (FeatureStoreProviderFactory.class.isAssignableFrom(providerFactory.getClass())){
284
                                        store = new DefaultFeatureStore();
285
                                        this.intializeDataStore(store, parameters);
286
                                        return store;
287
                                }
288
                        }
289
                } catch (InstantiationException e1) {
290
                        // ignore
291
                } catch (IllegalAccessException e1) {
292
                        // ignore
293
                }
294

    
295

    
296
                Extension storeProviderExtension = ToolsLocator
297
                                .getExtensionPointManager().get(DATA_MANAGER_STORE).get(name);
298

    
299
                if (storeProviderExtension == null) {
300
                        throw new ProviderNotRegisteredException(name);
301
                }
302

    
303
                Class providerClass = storeProviderExtension.getExtension();
304
                if (providerClass == null) {
305
                        throw new ProviderNotRegisteredException(name);
306
                }
307

    
308
                if (CoverageStoreProvider.class.isAssignableFrom(providerClass)) {
309
                        ExtensionPoint.Extension point = ToolsLocator
310
                                        .getExtensionPointManager().get(DATA_MANAGER_STORE_FACTORY)
311
                                        .get(name);
312
                        DataStoreFactory factory = null;
313
                        try {
314
                                factory = (DataStoreFactory) point.create();
315
                        } catch (InstantiationException e) {
316
                                throw new InitializeException(e);
317
                        } catch (IllegalAccessException e) {
318
                                throw new InitializeException(e);
319
                        }
320
                        factory.setParameters(parameters);
321
                        store = factory.createStore();
322
                } else if (FeatureStoreProvider.class.isAssignableFrom(providerClass)) {
323

    
324
                        store = new DefaultFeatureStore();
325

    
326
                } else {
327
                        // FIXME Exception
328
                        throw new InitializeException(name, new RuntimeException(
329
                                        "Not supported implemtation: name=" + name
330
                                                        + " provider class=" + providerClass.getName()));
331
                }
332

    
333
                this.intializeDataStore(store, parameters);
334

    
335
                return store;
336
        }
337

    
338
        public DataStore openStore(String provider, DataStoreParameters parameters)
339
                        throws InitializeException, ProviderNotRegisteredException,
340
                        ValidateDataParametersException {
341

    
342
                return localOpenStore(provider, parameters);
343
        }
344

    
345
        /**
346
         * @deprecated see openStore
347
         */
348
        public DataStore createStore(DataStoreParameters parameters)
349
                        throws InitializeException, ProviderNotRegisteredException,
350
                        ValidateDataParametersException {
351
                try {
352
                        int i = 1 / 0;
353
                } catch (Throwable e) {
354
                        LOG.info(
355
                                        "Use of deprcated method. Replace calling to it by calling to openStore",
356
                                        e);
357
                }
358
                return openStore(parameters.getDataStoreName(), parameters);
359
        }
360

    
361
        public List getStoreProviders() {
362
                ExtensionPointManager epmanager = ToolsLocator.getExtensionPointManager();
363
                List  names1 = epmanager.get(DATA_MANAGER_STORE).getNames();
364
                List  names2 = epmanager.get(DATA_MANAGER_STORE_PROVIDER_FACTORY).getNames();
365
                List names3 = new ArrayList();
366
                names3.addAll(names1);
367
                names3.addAll(names2);
368
                return names3;
369
        }
370

    
371
        public DataStoreProviderFactory getStoreProviderFactory(String name) {
372
                try {
373
                        return (DataStoreProviderFactory) ToolsLocator
374
                                        .getExtensionPointManager()
375
                                        .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
376
                } catch (InstantiationException e) {
377
                        return null;
378
                } catch (IllegalAccessException e) {
379
                        return null;
380
                }
381
        }
382

    
383
        public List getStoreProviders(String name) {
384
                return getStoreProviders(); // FIXME: need filter from the name of
385
                // the explorer
386
        }
387

    
388
        public NewDataStoreParameters createNewStoreParameters(String explorer,
389
                        String provider) throws InitializeException,
390
                        ProviderNotRegisteredException {
391

    
392
                DataServerExplorerParameters parameters;
393
                DataServerExplorer server;
394
                try {
395
                        parameters = this.createServerExplorerParameters(explorer);
396
                        server = this.openServerExplorerWithoutValidate(explorer,
397
                                        parameters);
398
                        return server.getAddParameters(provider);
399
                } catch (ValidateDataParametersException e) {
400
                        throw new InitializeException(e);
401
                } catch (DataException e) {
402
                        throw new InitializeException(e);
403
                }
404
        }
405

    
406
        public void newStore(String explorer, String provider,
407
                        NewDataStoreParameters parameters, boolean overwrite)
408
                        throws InitializeException, ProviderNotRegisteredException,
409
                        ValidateDataParametersException {
410

    
411
                parameters.validate();
412

    
413
                DataServerExplorerParameters explorerParameters;
414
                DataServerExplorer server;
415
                explorerParameters = this.createServerExplorerParameters(explorer);
416
                server = this.openServerExplorerWithoutValidate(explorer,
417
                                explorerParameters);
418
                try {
419
                        server.add(provider, parameters, overwrite);
420
                } catch (DataException e) {
421
                        throw new InitializeException(e);
422
                }
423
        }
424

    
425
        /*
426
         * ====================================================================
427
         * 
428
         * Explorer related services
429
         */
430
        public void registerExplorerProvider(String name, Class explorerClass,
431
                        Class parametersClass) {
432

    
433
                if (name == null || explorerClass == null || parametersClass == null) {
434
                        // FIXME Exception
435
                        throw new IllegalArgumentException("Any parameters can be null");
436
                }
437

    
438
                if (!DataServerExplorerParameters.class
439
                                .isAssignableFrom(parametersClass)) {
440
                        // FIXME Exception
441
                        throw new IllegalArgumentException(
442
                                        parametersClass.getName()
443
                                                        + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
444
                }
445

    
446
                if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
447
                        // FIXME Exception
448
                        throw new IllegalArgumentException(explorerClass.getName()
449
                                        + " must implement org.gvsig.fmap.dal.DataServerExplorer");
450
                }
451

    
452
                ToolsLocator.getExtensionPointManager()
453
                                .add(DATA_MANAGER_EXPLORER, DATA_MANAGER_EXPLORER_DESCRIPTION)
454
                                .append(name, null, explorerClass);
455

    
456
                ToolsLocator
457
                                .getExtensionPointManager()
458
                                .add(DATA_MANAGER_EXPLORER_PARAMS,
459
                                                DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION)
460
                                .append(name, null, parametersClass);
461
        }
462

    
463
        public DataServerExplorerParameters createServerExplorerParameters(
464
                        String name) throws InitializeException,
465
                        ProviderNotRegisteredException {
466
                try {
467
                        DataServerExplorerParameters params = (DataServerExplorerParameters) ToolsLocator
468
                                        .getExtensionPointManager()
469
                                        .get(DATA_MANAGER_EXPLORER_PARAMS).create(name);
470
                        if (params == null) {
471
                                throw new ProviderNotRegisteredException(name);
472
                        }
473
                        return params;
474
                } catch (InstantiationException e) {
475
                        throw new InitializeException(e);
476
                } catch (IllegalAccessException e) {
477
                        throw new InitializeException(e);
478
                } catch (SecurityException e) {
479
                        throw new InitializeException(e);
480
                } catch (IllegalArgumentException e) {
481
                        throw new InitializeException(e);
482
                }
483
        }
484

    
485
        public DataServerExplorer openServerExplorer(String explorer,
486
                        DataServerExplorerParameters parameters)
487
                        throws InitializeException, ProviderNotRegisteredException,
488
                        ValidateDataParametersException {
489

    
490
                if (parameters != null) {
491
                        parameters.validate();
492
                }
493
                return this.openServerExplorerWithoutValidate(explorer, parameters);
494
        }
495

    
496
        private DataServerExplorer openServerExplorerWithoutValidate(
497
                        String explorerName, DataServerExplorerParameters parameters)
498
                        throws InitializeException, ProviderNotRegisteredException,
499
                        ValidateDataParametersException {
500

    
501
                String name = explorerName; // parameters.getExplorerName();
502

    
503
                try {
504
                        DataServerExplorerProvider server = (DataServerExplorerProvider) ToolsLocator
505
                                        .getExtensionPointManager()
506
                                        .get(DATA_MANAGER_EXPLORER)
507
                                        .create(name,
508
                                                        new Object[] {
509
                                                                        parameters,
510
                                                                        new DefaultDataServerExplorerProviderServices() });
511
                        if (server == null) {
512
                                throw new ProviderNotRegisteredException(name);
513
                        }
514
                        return server;
515
                } catch (InstantiationException e) {
516
                        throw new InitializeException(e);
517
                } catch (IllegalAccessException e) {
518
                        throw new InitializeException(e);
519
                } catch (SecurityException e) {
520
                        throw new InitializeException(e);
521
                } catch (IllegalArgumentException e) {
522
                        throw new InitializeException(e);
523
                } catch (NoSuchMethodException e) {
524
                        throw new InitializeException(e);
525
                } catch (InvocationTargetException e) {
526
                        throw new InitializeException(e);
527
                }
528
        }
529

    
530
        /**
531
         * @deprecated see openServerExplorer
532
         */
533
        public DataServerExplorer createServerExplorer(
534
                        DataServerExplorerParameters parameters)
535
                        throws InitializeException, ProviderNotRegisteredException,
536
                        ValidateDataParametersException {
537
                return openServerExplorer(parameters.getExplorerName(), parameters);
538
        }
539

    
540
        public List getExplorerProviders() {
541
                return ToolsLocator.getExtensionPointManager()
542
                                .get(DATA_MANAGER_EXPLORER).getNames();
543
        }
544

    
545
        /*
546
         * ====================================================================
547
         * 
548
         * Expresion evaluation related services
549
         */
550
        public Evaluator createExpresion(String expresion)
551
                        throws InitializeException {
552
                try {
553
                        return (Evaluator) ToolsLocator
554
                                        .getExtensionPointManager()
555
                                        .get(DATA_MANAGER_EXPRESION_EVALUATOR)
556
                                        .create(DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
557
                                                        new Object[] { expresion });
558
                } catch (SecurityException e) {
559
                        throw new InitializeException(e);
560
                } catch (IllegalArgumentException e) {
561
                        throw new InitializeException(e);
562
                } catch (NoSuchMethodException e) {
563
                        throw new InitializeException(e);
564
                } catch (InstantiationException e) {
565
                        throw new InitializeException(e);
566
                } catch (IllegalAccessException e) {
567
                        throw new InitializeException(e);
568
                } catch (InvocationTargetException e) {
569
                        throw new InitializeException(e);
570
                }
571
        }
572

    
573
        public void registerDefaultEvaluator(Class evaluatorClass) {
574
                if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
575
                        throw new ClassCastException();
576
                }
577
                ToolsLocator
578
                                .getExtensionPointManager()
579
                                .add(DATA_MANAGER_EXPRESION_EVALUATOR,
580
                                                DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION)
581
                                .append(DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
582
                                                "Default expresion evaluator for use in DAL",
583
                                                evaluatorClass);
584
        }
585

    
586
        /*
587
         * ====================================================================
588
         * 
589
         * Index related services
590
         */
591

    
592
        public List getFeatureIndexProviders() {
593
                return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_INDEX)
594
                                .getNames();
595
        }
596

    
597
        public void setDefaultFeatureIndexProviderName(int dataType, String name) {
598
                defaultDataIndexProviders.put(new Integer(dataType), name);
599
        }
600

    
601
        public String getDefaultFeatureIndexProviderName(int dataType) {
602
                return (String) defaultDataIndexProviders.get(new Integer(dataType));
603
        }
604

    
605
        public FeatureIndexProviderServices createFeatureIndexProvider(String name,
606
                        FeatureStore store, FeatureType type, String indexName,
607
                        FeatureAttributeDescriptor attr) throws InitializeException,
608
                        ProviderNotRegisteredException {
609

    
610
                if (name == null) {
611
                        name = getDefaultFeatureIndexProviderName(attr.getType());
612
                }
613

    
614
                if (name == null) {
615
                        throw new InitializeException(
616
                                        "There not any index provider registered.", null);
617
                }
618

    
619
                try {
620
                        FeatureIndexProvider provider = (FeatureIndexProvider) ToolsLocator
621
                                        .getExtensionPointManager().get(DATA_MANAGER_INDEX)
622
                                        .create(name);
623
                        if (provider == null) {
624
                                throw new ProviderNotRegisteredException(name);
625
                        }
626
                        FeatureIndexProviderServices services = new DefaultFeatureIndex(
627
                                        (FeatureStoreProviderServices) store, type, provider,
628
                                        attr.getName(), indexName);
629
                        services.initialize();
630
                        return services;
631
                } catch (InstantiationException e) {
632
                        throw new InitializeException(e);
633
                } catch (IllegalAccessException e) {
634
                        throw new InitializeException(e);
635
                } catch (SecurityException e) {
636
                        throw new InitializeException(e);
637
                } catch (IllegalArgumentException e) {
638
                        throw new InitializeException(e);
639
                }
640
        }
641

    
642
        public void registerFeatureIndexProvider(String name, String description,
643
                        Class clazz, int dataType) {
644
                ToolsLocator.getExtensionPointManager()
645
                                .add(DATA_MANAGER_INDEX, DATA_MANAGER_INDEX_DESCRIPTION)
646
                                .append(name, null, clazz);
647

    
648
                if (getDefaultFeatureIndexProviderName(dataType) == null) {
649
                        setDefaultFeatureIndexProviderName(dataType, name);
650
                }
651
        }
652

    
653
        private void initializeIndexes() {
654
                this.defaultDataIndexProviders = new HashMap();
655
        }
656

    
657
        public void intializeDataStore(DataStore store,
658
                        DataStoreParameters parameters) throws InitializeException,
659
                        ProviderNotRegisteredException {
660

    
661
                ((DataStoreInitializer) store).intializePhase1(this, parameters);
662
                DataStoreProvider provider = this.createProvider(
663
                                (DataStoreProviderServices) store, parameters);
664
                ((DataStoreInitializer) store).intializePhase2(provider);
665

    
666
        }
667

    
668
        public DataStoreProvider createProvider(
669
                        DataStoreProviderServices providerServices,
670
                        DataStoreParameters parameters) throws InitializeException,
671
                        ProviderNotRegisteredException {
672
                String name = parameters.getDataStoreName();
673
                DataStoreProvider provider = null;
674
                boolean retry = true;
675
                while (retry) {
676
                        try {
677
                                DataStoreProviderFactory providerFactory = (DataStoreProviderFactory) ToolsLocator
678
                                .getExtensionPointManager()
679
                                .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
680
                                if( providerFactory!=null ) {
681
                                        provider = (DataStoreProvider) providerFactory.createProvider(parameters, providerServices);
682
                                } else {
683
                                        provider = (DataStoreProvider) ToolsLocator
684
                                                        .getExtensionPointManager()
685
                                                        .get(DATA_MANAGER_STORE)
686
                                                        .create(name,
687
                                                                        new Object[] { parameters, providerServices });
688
                                }
689
                                retry = false;
690
                        } catch (Exception e) {
691
                                if (openErrorHandler != null) {
692
                                        retry = openErrorHandler.canRetryOpen(e, parameters);
693
                                } else {
694
                                        retry = false;
695
                                }
696
                                if (!retry) {
697
                                        throw new InitializeException(
698
                                                        parameters.getDataStoreName(), e);
699
                                }
700
                        }
701
                }
702
                if (provider == null) {
703
                        throw new ProviderNotRegisteredException(name);
704
                }
705
                return provider;
706
        }
707

    
708
        public void registerFeatureCacheProvider(
709
                        FeatureCacheProviderFactory providerFactory) {
710
                ToolsLocator.getExtensionPointManager()
711
                                .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
712
                                .append(providerFactory.getName(), "", providerFactory);
713
        }
714

    
715
        public FeatureCacheProvider createFeatureCacheProvider(String name,
716
                        DynObject parameters) throws DataException {
717
                if (name == null) {
718
                        throw new InitializeException(
719
                                        "It is necessary to provide a cache name", null);
720
                }
721
                if (parameters == null) {
722
                        throw new InitializeException(
723
                                        "It is necessary to provide parameters to create the explorer",
724
                                        null);
725
                }
726
                FeatureCacheProviderFactory featureCacheProviderFactory;
727
                try {
728
                        featureCacheProviderFactory = (FeatureCacheProviderFactory) ToolsLocator
729
                                        .getExtensionPointManager().get(DATA_MANAGER_CACHE)
730
                                        .create(name);
731
                        if (featureCacheProviderFactory == null) {
732
                                throw new ProviderNotRegisteredException(name);
733
                        }
734
                        return featureCacheProviderFactory.createCacheProvider(parameters);
735
                } catch (InstantiationException e) {
736
                        throw new InitializeException(e);
737
                } catch (IllegalAccessException e) {
738
                        throw new InitializeException(e);
739
                }
740
        }
741

    
742
        public List getFeatureCacheProviders() {
743
                ExtensionPoint extensionPoint = ToolsLocator.getExtensionPointManager()
744
                                .get(DATA_MANAGER_CACHE);
745
                if (extensionPoint != null) {
746
                        return ToolsLocator.getExtensionPointManager()
747
                                        .get(DATA_MANAGER_CACHE).getNames();
748
                } else {
749
                        return new ArrayList();
750
                }
751
        }
752

    
753
        public DynObject createCacheParameters(String name)
754
                        throws InitializeException, ProviderNotRegisteredException {
755
                if (name == null) {
756
                        throw new InitializeException(
757
                                        "It is necessary to provide a cache name", null);
758
                }
759
                FeatureCacheProviderFactory featureCacheProviderFactory;
760
                try {
761
                        featureCacheProviderFactory = (FeatureCacheProviderFactory) ToolsLocator
762
                                        .getExtensionPointManager().get(DATA_MANAGER_CACHE)
763
                                        .create(name);
764
                        if (featureCacheProviderFactory == null) {
765
                                throw new ProviderNotRegisteredException(name);
766
                        }
767
                        return featureCacheProviderFactory.createParameters();
768
                } catch (InstantiationException e) {
769
                        throw new InitializeException(e);
770
                } catch (IllegalAccessException e) {
771
                        throw new InitializeException(e);
772
                }
773
        }
774

    
775
        public DataStoreParameters createMemoryStoreParameters(
776
                        String autoOrderAttributeName) throws InitializeException {
777

    
778
                DataStoreParameters parameters;
779
                try {
780
                        parameters = createStoreParameters(MemoryStoreProvider.NAME);
781
                        if (autoOrderAttributeName != null) {
782
                                parameters.setDynValue(
783
                                                MemoryStoreParameters.ORDER_PARAMETER_NAME,
784
                                                autoOrderAttributeName);
785
                        }
786
                        return parameters;
787
                } catch (ProviderNotRegisteredException e) {
788
                        throw new InitializeException("MemoryStoreProvider", e);
789
                }
790
        }
791

    
792
        public FeatureStore createMemoryStore(String autoOrderAttributeName)
793
                        throws InitializeException {
794

    
795
                DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
796
                try {
797
                        return (FeatureStore) createStore(parameters);
798
                } catch (ValidateDataParametersException e) {
799
                        throw new InitializeException("MemoryStoreProvider", e);
800
                } catch (ProviderNotRegisteredException e) {
801
                        throw new InitializeException("MemoryStoreProvider", e);
802
                }
803
        }
804

    
805
        public FeaturePagingHelper createFeaturePagingHelper(
806
                        FeatureStore featureStore, int pageSize) throws BaseException {
807
                return new FeaturePagingHelperImpl(featureStore, pageSize);
808
        }
809

    
810
        public FeaturePagingHelper createFeaturePagingHelper(
811
                        FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
812
                        throws BaseException {
813
                return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
814
        }
815

    
816
        public void setOpenErrorHandler(OpenErrorHandler handler) {
817
                openErrorHandler = handler;
818

    
819
        }
820

    
821
        public EditableFeatureType createFeatureType() {
822
                return new DefaultEditableFeatureType();
823
        }
824
}