Statistics
| Revision:

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

History | View | Annotate | Download (18 KB)

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

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

    
9
import org.gvsig.fmap.dal.DALLocator;
10
import org.gvsig.fmap.dal.DataManager;
11
import org.gvsig.fmap.dal.DataServerExplorer;
12
import org.gvsig.fmap.dal.DataServerExplorerParameters;
13
import org.gvsig.fmap.dal.DataStore;
14
import org.gvsig.fmap.dal.DataStoreParameters;
15
import org.gvsig.fmap.dal.exception.DataException;
16
import org.gvsig.fmap.dal.exception.InitializeException;
17
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
18
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
19
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
20
import org.gvsig.fmap.dal.feature.FeatureStore;
21
import org.gvsig.fmap.dal.feature.FeatureType;
22
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
23
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
24
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
25
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
26
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
27
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
28
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
29
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
30
import org.gvsig.fmap.dal.raster.impl.DefaultCoverageStore;
31
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
32
import org.gvsig.fmap.dal.resource.ResourceManager;
33
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
34
import org.gvsig.fmap.dal.spi.DataServerExplorerProvider;
35
import org.gvsig.fmap.dal.spi.DataStoreProvider;
36
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.dynobject.DynObject;
39
import org.gvsig.tools.evaluator.Evaluator;
40
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
41
import org.gvsig.tools.operations.OperationManager;
42

    
43
public class DefaultDataManager implements DataManager, DataManagerProviderServices {
44

    
45
        final static private String DATA_MANAGER_STORE = "Data.manager.stores";
46
        final static private String DATA_MANAGER_STORE_DESCRIPTION = "DAL stores providers";
47

    
48
        final static private String DATA_MANAGER_STORE_PARAMS = "Data.manager.stores.params";
49
        final static private String DATA_MANAGER_STORE_PARAMS_DESCRIPTION = "DAL stores providers parameters";
50

    
51
        final static private String DATA_MANAGER_EXPLORER = "Data.manager.explorers";
52
        final static private String DATA_MANAGER_EXPLORER_DESCRIPTION = "DAL explorers providers";
53

    
54
        final static private String DATA_MANAGER_EXPLORER_PARAMS = "Data.manager.explorers.params";
55
        final static private String DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION = "DAL explorer providers parameters";
56

    
57
        final static private String DATA_MANAGER_INDEX = "Data.manager.indexes";
58
        final static private String DATA_MANAGER_INDEX_DESCRIPTION = "DAL index providers";
59
        
60
        final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
61
        final static private String DATA_MANAGER_CACHE_DESCRIPTION = "DAL cache providers";
62

    
63
        final static private String DATA_MANAGER_EXPRESION_EVALUATOR = "Data.manager.expresion.evaluator";
64
        final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT = "default";
65
        final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION = "DAL expresion evaluators.";
66

    
67
        /** This map contains the name of the default provider for each data type */
68
        private Map defaultDataIndexProviders;
69

    
70

    
71
        public DefaultDataManager() {
72
                /*
73
                 * Create te extensions point in te registry.
74
                 */
75
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE,
76
                                DATA_MANAGER_STORE_DESCRIPTION);
77

    
78
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
79
                                DATA_MANAGER_STORE_PARAMS_DESCRIPTION);
80

    
81
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
82
                                DATA_MANAGER_EXPLORER_DESCRIPTION);
83

    
84
                ToolsLocator.getExtensionPointManager().add(
85
                                DATA_MANAGER_EXPLORER_PARAMS,
86
                                DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION);
87

    
88
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
89
                                DATA_MANAGER_INDEX_DESCRIPTION);
90

    
91
                ToolsLocator.getExtensionPointManager().add(
92
                                DATA_MANAGER_EXPRESION_EVALUATOR,
93
                                DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION);
94

    
95
                initializeIndexes();
96
        }
97

    
98
        /**
99
         *
100
         * @return ResourceManager
101
         */
102

    
103
        public ResourceManager getResourceManager() {
104
                return DALLocator.getResourceManager();
105
        }
106

    
107
        public OperationManager getOperationManager() {
108
                return ToolsLocator.getOperationManager();
109
        }
110

    
111
        public String getTemporaryDirectory() {
112
                // FIXME Define a better tempdir solution
113
                String tmp = System.getProperty("TMP");
114
                if (tmp == null) {
115
                        tmp = System.getProperty("TEMP");
116
                }
117
                if (tmp == null) {
118
                        File tmp_file = new File(System.getProperty("HOME"), "_daltmp_");
119
                        int i=1;
120
                        while (!tmp_file.exists() || !tmp_file.isDirectory()){
121
                                tmp_file = new File(tmp_file.getAbsolutePath()+i);
122
                                i++;
123
                        }
124
                        if (!tmp_file.exists()){
125
                                tmp_file.mkdir();
126
                        }
127
                        tmp = tmp_file.getAbsolutePath();
128
                }
129
                return tmp;
130
        }
131

    
132
        /*
133
         * ====================================================================
134
         *
135
         * Store related services
136
         */
137
        public void registerStoreProvider(String name,
138
                        Class storeProviderClass,
139
                        Class parametersClass) {
140
                if (name == null || storeProviderClass == null || parametersClass == null){
141
                        // FIXME Exception
142
                        throw new IllegalArgumentException(
143
                                        "Any parameters can be null");
144
                }
145

    
146
                if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
147
                        // FIXME Exception
148
                        throw new IllegalArgumentException(parametersClass.getName()
149
                                        + " must implement org.gvsig.fmap.dal.DataStoreParameters");
150
                }
151

    
152

    
153

    
154
                if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
155

    
156

    
157
                } else if (FeatureStoreProvider.class
158
                                .isAssignableFrom(storeProviderClass)) {
159

    
160

    
161
                } else{
162
                        // FIXME Exception
163
                        throw new IllegalArgumentException(
164
                                        "Not supported implemtation: name=" + name
165
                                                        + " provider class="
166
                                                        + storeProviderClass.getName());
167
                }
168

    
169
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE,
170
                                DATA_MANAGER_STORE_DESCRIPTION).append(name, null,
171
                                storeProviderClass);
172

    
173
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
174
                                DATA_MANAGER_STORE_PARAMS_DESCRIPTION).append(name, null,
175
                                parametersClass);
176
        }
177

    
178
        public DataStoreParameters createStoreParameters(String name)
179
                        throws InitializeException, ProviderNotRegisteredException {
180
                try {
181
                        DataStoreParameters params = (DataStoreParameters) ToolsLocator
182
                                        .getExtensionPointManager().get(DATA_MANAGER_STORE_PARAMS)
183
                                        .create(name);
184
                        if (params == null) {
185
                                throw new ProviderNotRegisteredException(name);
186
                        }
187
                        return params;
188
                } catch (InstantiationException e) {
189
                        throw new InitializeException(e);
190
                } catch (IllegalAccessException e) {
191
                        throw new InitializeException(e);
192
                } catch (SecurityException e) {
193
                        throw new InitializeException(e);
194
                } catch (IllegalArgumentException e) {
195
                        throw new InitializeException(e);
196
                }
197
        }
198

    
199
        public DataStore createStore(DataStoreParameters parameters)
200
                        throws InitializeException, ProviderNotRegisteredException,
201
                        ValidateDataParametersException {
202
                String name = parameters.getDataStoreName();
203

    
204
                parameters.validate();
205

    
206
                DataStore store;
207
                Extension storeProviderExtension = ToolsLocator
208
                                .getExtensionPointManager().get(DATA_MANAGER_STORE).get(name);
209

    
210

    
211

    
212
                if (storeProviderExtension == null) {
213
                        throw new ProviderNotRegisteredException(name);
214
                }
215

    
216
                Class providerClass = storeProviderExtension.getExtension();
217
                if (providerClass == null) {
218
                        throw new ProviderNotRegisteredException(name);
219
                }
220

    
221
                if (CoverageStoreProvider.class.isAssignableFrom(providerClass)) {
222
                        store =  new DefaultCoverageStore();
223

    
224

    
225
                } else if (FeatureStoreProvider.class.isAssignableFrom(providerClass)) {
226

    
227
                        store = new DefaultFeatureStore();
228

    
229
                } else{
230
                        // FIXME Exception
231
                        throw new InitializeException(new RuntimeException(
232
                                        "Not supported implemtation: name=" + name
233
                                        + " provider class="
234
                                        + providerClass.getName()));
235
                }
236

    
237

    
238

    
239
                this.intializeDataStore((DataStoreImplementation) store, parameters);
240

    
241
                return store;
242
        }
243

    
244
        public List getStoreProviders() {
245
                return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_STORE)
246
                                .getNames();
247
        }
248

    
249
        /*
250
         * ====================================================================
251
         *
252
         * Explorer related services
253
         */
254
        public void registerExplorerProvider(String name, Class explorerClass,
255
                        Class parametersClass) {
256

    
257
                if (name == null || explorerClass == null || parametersClass == null) {
258
                        // FIXME Exception
259
                        throw new IllegalArgumentException("Any parameters can be null");
260
                }
261

    
262

    
263
                if (!DataServerExplorerParameters.class
264
                                .isAssignableFrom(parametersClass)) {
265
                        // FIXME Exception
266
                        throw new IllegalArgumentException(
267
                                        parametersClass.getName()
268
                                                        + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
269
                }
270

    
271
                if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
272
                        // FIXME Exception
273
                        throw new IllegalArgumentException(explorerClass.getName()
274
                                        + " must implement org.gvsig.fmap.dal.DataServerExplorer");
275
                }
276

    
277

    
278
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
279
                                DATA_MANAGER_EXPLORER_DESCRIPTION).append(name, null,
280
                                explorerClass);
281

    
282
                ToolsLocator.getExtensionPointManager().add(
283
                                DATA_MANAGER_EXPLORER_PARAMS,
284
                                DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION).append(name, null,
285
                                parametersClass);
286
        }
287

    
288
        public DataServerExplorerParameters createServerExplorerParameters(String name)
289
                        throws InitializeException, ProviderNotRegisteredException {
290
                try {
291
                        DataServerExplorerParameters params = (DataServerExplorerParameters) ToolsLocator
292
                                        .getExtensionPointManager()
293
                                        .get(
294
                                                        DATA_MANAGER_EXPLORER_PARAMS)
295
                                        .create(name);
296
                        if (params == null) {
297
                                throw new ProviderNotRegisteredException(name);
298
                        }
299
                        return params;
300
                } catch (InstantiationException e) {
301
                        throw new InitializeException(e);
302
                } catch (IllegalAccessException e) {
303
                        throw new InitializeException(e);
304
                } catch (SecurityException e) {
305
                        throw new InitializeException(e);
306
                } catch (IllegalArgumentException e) {
307
                        throw new InitializeException(e);
308
                }
309
        }
310

    
311
        public DataServerExplorer createServerExplorer(DataServerExplorerParameters parameters)
312
                        throws InitializeException, ProviderNotRegisteredException,
313
                        ValidateDataParametersException {
314

    
315
                parameters.validate();
316

    
317
                String name = parameters.getExplorerName();
318

    
319
                try {
320
                        DataServerExplorerProvider server = (DataServerExplorerProvider) ToolsLocator
321
                                        .getExtensionPointManager().get(DATA_MANAGER_EXPLORER)
322
                                        .create(
323
                                                        name,
324
                                                        new Object[] {
325
                                                                        parameters,
326
                                                                        new DefaultDataServerExplorerProviderServices() });
327
                        if (server == null) {
328
                                throw new ProviderNotRegisteredException(name);
329
                        }
330
                        return server;
331
                } catch (InstantiationException e) {
332
                        throw new InitializeException(e);
333
                } catch (IllegalAccessException e) {
334
                        throw new InitializeException(e);
335
                } catch (SecurityException e) {
336
                        throw new InitializeException(e);
337
                } catch (IllegalArgumentException e) {
338
                        throw new InitializeException(e);
339
                } catch (NoSuchMethodException e) {
340
                        throw new InitializeException(e);
341
                } catch (InvocationTargetException e) {
342
                        throw new InitializeException(e);
343
                }
344
        }
345

    
346
        public List getExplorerProviders() {
347
                return ToolsLocator.getExtensionPointManager().get(
348
                                DATA_MANAGER_EXPLORER).getNames();
349
        }
350

    
351

    
352
        /*
353
         * ====================================================================
354
         *
355
         * Expresion evaluation related services
356
         */
357
        public Evaluator createExpresion(String expresion)
358
                        throws InitializeException {
359
                try {
360
                        return (Evaluator) ToolsLocator.getExtensionPointManager().get(
361
                                        DATA_MANAGER_EXPRESION_EVALUATOR).create(
362
                                        DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
363
                                        new Object[] { expresion });
364
                } catch (SecurityException e) {
365
                        throw new InitializeException(e);
366
                } catch (IllegalArgumentException e) {
367
                        throw new InitializeException(e);
368
                } catch (NoSuchMethodException e) {
369
                        throw new InitializeException(e);
370
                } catch (InstantiationException e) {
371
                        throw new InitializeException(e);
372
                } catch (IllegalAccessException e) {
373
                        throw new InitializeException(e);
374
                } catch (InvocationTargetException e) {
375
                        throw new InitializeException(e);
376
                }
377
        }
378

    
379
        public void registerDefaultEvaluator(Class evaluatorClass) {
380
                if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
381
                        throw new ClassCastException();
382
                }
383
                ToolsLocator.getExtensionPointManager().add(
384
                                DATA_MANAGER_EXPRESION_EVALUATOR,
385
                                DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION).append(
386
                                DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
387
                                "Default expresion evaluator for use in DAL", evaluatorClass);
388
        }
389

    
390
        /*
391
         * ====================================================================
392
         *
393
         * Index related services
394
         */
395

    
396

    
397
        public List getFeatureIndexProviders() {
398
                return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_INDEX)
399
                .getNames();
400
        }
401

    
402
        public void setDefaultFeatureIndexProviderName(int dataType, String name) {
403
                defaultDataIndexProviders.put(new Integer(dataType), name);
404
        }
405

    
406
        public String getDefaultFeatureIndexProviderName(int dataType) {
407
                return (String) defaultDataIndexProviders.get(new Integer(dataType));
408
        }
409

    
410
        public FeatureIndexProviderServices createFeatureIndexProvider(
411
                        String name, FeatureStore store, FeatureType type, String indexName,
412
                        FeatureAttributeDescriptor attr)
413
                        throws InitializeException, ProviderNotRegisteredException {
414

    
415
                        if (name == null) {
416
                                name = getDefaultFeatureIndexProviderName(attr.getDataType());
417
                        }
418

    
419
                        if (name == null) {
420
                                throw new InitializeException("There not any index provider registered.", null);
421
                        }
422

    
423
                        try {
424
                                FeatureIndexProvider provider = (FeatureIndexProvider) ToolsLocator
425
                                                .getExtensionPointManager()
426
                                                .get(
427
                                                                DATA_MANAGER_INDEX)
428
                                                .create(name);
429
                                if (provider == null) {
430
                                        throw new ProviderNotRegisteredException(name);
431
                                }
432
                                FeatureIndexProviderServices services = new DefaultFeatureIndex((FeatureStoreProviderServices) store, type, provider, attr.getName(), indexName);
433
                                services.initialize();
434
                                return services;
435
                        } catch (InstantiationException e) {
436
                                throw new InitializeException(e);
437
                        } catch (IllegalAccessException e) {
438
                                throw new InitializeException(e);
439
                        } catch (SecurityException e) {
440
                                throw new InitializeException(e);
441
                        } catch (IllegalArgumentException e) {
442
                                throw new InitializeException(e);
443
                        }
444
        }
445

    
446
        public void registerFeatureIndexProvider(String name, String description,
447
                        Class clazz, int dataType) {
448
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
449
                                DATA_MANAGER_INDEX_DESCRIPTION).append(name, null,
450
                                clazz);
451

    
452
                if (getDefaultFeatureIndexProviderName(dataType) == null) {
453
                        setDefaultFeatureIndexProviderName(dataType, name);
454
                }
455
        }
456

    
457
        private void initializeIndexes() {
458
                this.defaultDataIndexProviders = new HashMap();
459
        }
460

    
461
        public void intializeDataStore(DataStoreImplementation store,
462
                        DataStoreParameters parameters)
463
                        throws InitializeException, ProviderNotRegisteredException {
464

    
465
                store.intializePhase1(this, parameters);
466
                String name = parameters.getDataStoreName();
467
                DataStoreProvider provider;
468
                try {
469
                        provider = (DataStoreProvider) ToolsLocator
470
                                        .getExtensionPointManager().get(DATA_MANAGER_STORE).create(
471
                                                        name,
472
                                                        new Object[] { parameters,
473
                                                                        (DataStoreProviderServices) store });
474

    
475
                } catch (Exception e) {
476
                        throw new InitializeException(e);
477
                }
478
                if (provider == null) {
479
                        throw new ProviderNotRegisteredException(name);
480
                }
481
                store.intializePhase2(provider);
482

    
483
        }
484
        
485
        public void registerFeatureCacheProvider(
486
                        FeatureCacheProviderFactory providerFactory) {
487
                ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_CACHE,
488
                        DATA_MANAGER_CACHE_DESCRIPTION).append(
489
                                        providerFactory.getName(), "", 
490
                                        providerFactory);                                        
491
        }
492

    
493
         public FeatureCacheProvider createFeatureCacheProvider(String name,
494
                                DynObject parameters) throws DataException {
495
                if (name == null) {
496
                        throw new InitializeException("It is necessary to provide a cache name", null);
497
                }
498
                if (parameters == null){
499
                        throw new InitializeException("It is necessary to provide parameters to create the explorer", null);
500
                }
501
                FeatureCacheProviderFactory featureCacheProviderFactory;
502
                try {
503
                        featureCacheProviderFactory = (FeatureCacheProviderFactory) ToolsLocator
504
                        .getExtensionPointManager().get(DATA_MANAGER_CACHE).create(name);
505
                        if (featureCacheProviderFactory == null) {
506
                                throw new ProviderNotRegisteredException(name);
507
                        }
508
                        return featureCacheProviderFactory.createCacheProvider(parameters);                
509
                } catch (InstantiationException e) {
510
                        throw new InitializeException(e);
511
                } catch (IllegalAccessException e) {
512
                        throw new InitializeException(e);
513
                }                
514
        }
515

    
516
        public List getFeatureCacheProviders() {
517
                return ToolsLocator.getExtensionPointManager().get(
518
                                DATA_MANAGER_CACHE).getNames();
519
        }
520

    
521
        public DynObject createCacheParameters(String name)
522
                        throws InitializeException, ProviderNotRegisteredException {
523
                if (name == null) {
524
                        throw new InitializeException("It is necessary to provide a cache name", null);
525
                }
526
                FeatureCacheProviderFactory featureCacheProviderFactory;
527
                try {
528
                        featureCacheProviderFactory = (FeatureCacheProviderFactory) ToolsLocator
529
                        .getExtensionPointManager().get(DATA_MANAGER_CACHE).create(name);
530
                        if (featureCacheProviderFactory == null) {
531
                                throw new ProviderNotRegisteredException(name);
532
                        }
533
                        return featureCacheProviderFactory.createParameters();                
534
                } catch (InstantiationException e) {
535
                        throw new InitializeException(e);
536
                } catch (IllegalAccessException e) {
537
                        throw new InitializeException(e);
538
                }                
539
        }
540
}