Statistics
| Revision:

root / branches / dal_time_support / libraries / libFMap_dal / src / org / gvsig / fmap / dal / impl / DefaultDataManager.java @ 35770

History | View | Annotate | Download (29.8 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.NewDataStoreParameters;
18
import org.gvsig.fmap.dal.OpenErrorHandler;
19
import org.gvsig.fmap.dal.exception.DataException;
20
import org.gvsig.fmap.dal.exception.InitializeException;
21
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
22
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
23
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
24
import org.gvsig.fmap.dal.feature.FeatureAttributeGetter;
25
import org.gvsig.fmap.dal.feature.FeatureQuery;
26
import org.gvsig.fmap.dal.feature.FeatureStore;
27
import org.gvsig.fmap.dal.feature.FeatureType;
28
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
29
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
30
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
31
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
32
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
33
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
34
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
35
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
36
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
37
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
38
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
39
import org.gvsig.fmap.dal.resource.ResourceManager;
40
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
41
import org.gvsig.fmap.dal.spi.DataServerExplorerProvider;
42
import org.gvsig.fmap.dal.spi.DataStoreInitializer;
43
import org.gvsig.fmap.dal.spi.DataStoreProvider;
44
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
45
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
46
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
47
import org.gvsig.tools.ToolsLocator;
48
import org.gvsig.tools.dynobject.DynObject;
49
import org.gvsig.tools.evaluator.Evaluator;
50
import org.gvsig.tools.exception.BaseException;
51
import org.gvsig.tools.extensionpoint.ExtensionPoint;
52
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
53
import org.gvsig.tools.operations.OperationManager;
54

    
55
public class DefaultDataManager implements DataManager,
56
DataManagerProviderServices {
57

    
58
    final static private String DATA_MANAGER_STORE = "Data.manager.stores";
59
    final static private String DATA_MANAGER_STORE_DESCRIPTION = "DAL stores providers";
60

    
61
    final static private String DATA_MANAGER_STORE_PARAMS = "Data.manager.stores.params";
62
    final static private String DATA_MANAGER_STORE_PARAMS_DESCRIPTION = "DAL stores providers parameters";
63

    
64
    final static private String DATA_MANAGER_EXPLORER = "Data.manager.explorers";
65
    final static private String DATA_MANAGER_EXPLORER_DESCRIPTION = "DAL explorers providers";
66

    
67
    final static private String DATA_MANAGER_EXPLORER_PARAMS = "Data.manager.explorers.params";
68
    final static private String DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION = "DAL explorer providers parameters";
69

    
70
    final static private String DATA_MANAGER_INDEX = "Data.manager.indexes";
71
    final static private String DATA_MANAGER_INDEX_DESCRIPTION = "DAL index providers";
72

    
73
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
74
    final static private String DATA_MANAGER_CACHE_DESCRIPTION = "DAL cache providers";
75

    
76
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR = "Data.manager.expresion.evaluator";
77
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT = "default";
78
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION = "DAL expresion evaluators.";
79

    
80
    final static private String DATA_MANAGER_STORE_FACTORY = "Data.manager.stores.factory";
81
    final static private String DATA_MANAGER_STORE_FACTORY_DESCRIPTION = "DAL stores factories";
82

    
83
    final static private String DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER = "Data.manager.feature.attribute.getter";
84
    final static private String DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER_DESCRIPTION = "DAL feature attribute getters";
85

    
86
    /** This map contains the name of the default provider for each data type */
87
    private Map defaultDataIndexProviders;
88

    
89
    private OpenErrorHandler openErrorHandler;
90

    
91
    public DefaultDataManager() {
92
        /*
93
         * Create te extensions point in te registry.
94
         */
95
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE,
96
            DATA_MANAGER_STORE_DESCRIPTION);
97

    
98
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
99
            DATA_MANAGER_STORE_PARAMS_DESCRIPTION);
100

    
101
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
102
            DATA_MANAGER_EXPLORER_DESCRIPTION);
103

    
104
        ToolsLocator.getExtensionPointManager().add(
105
            DATA_MANAGER_EXPLORER_PARAMS,
106
            DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION);
107

    
108
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
109
            DATA_MANAGER_INDEX_DESCRIPTION);
110

    
111
        ToolsLocator.getExtensionPointManager().add(
112
            DATA_MANAGER_EXPRESION_EVALUATOR,
113
            DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION);
114

    
115
        initializeIndexes();
116
    }
117

    
118
    /**
119
     *
120
     * @return ResourceManager
121
     */
122

    
123
    public ResourceManager getResourceManager() {
124
        return DALLocator.getResourceManager();
125
    }
126

    
127
    public OperationManager getOperationManager() {
128
        return ToolsLocator.getOperationManager();
129
    }
130

    
131
    public String getTemporaryDirectory() {
132
        // FIXME Define a better tempdir solution
133
        String tmp = System.getProperty("TMP");
134
        if (tmp == null) {
135
            tmp = System.getProperty("TEMP");
136
        }
137
        if (tmp == null) {
138
            File tmp_file = new File(System.getProperty("HOME"), "_daltmp_");
139
            int i = 1;
140
            while (!tmp_file.exists() || !tmp_file.isDirectory()) {
141
                tmp_file = new File(tmp_file.getAbsolutePath() + i);
142
                i++;
143
            }
144
            if (!tmp_file.exists()) {
145
                tmp_file.mkdir();
146
            }
147
            tmp = tmp_file.getAbsolutePath();
148
        }
149
        return tmp;
150
    }
151

    
152
    /*
153
     * ====================================================================
154
     * 
155
     * Store related services
156
     */
157
    public void registerStoreProvider(String name, Class storeProviderClass,
158
        Class parametersClass) {
159
        if (name == null || storeProviderClass == null
160
            || parametersClass == null) {
161
            // FIXME Exception
162
            throw new IllegalArgumentException("Any parameters can be null");
163
        }
164

    
165
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
166
            // FIXME Exception
167
            throw new IllegalArgumentException(parametersClass.getName()
168
                + " must implement org.gvsig.fmap.dal.DataStoreParameters");
169
        }
170

    
171
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
172

    
173
        } else if (FeatureStoreProvider.class
174
            .isAssignableFrom(storeProviderClass)) {
175

    
176
        } else {
177
            // FIXME Exception
178
            throw new IllegalArgumentException(
179
                "Not supported implemtation: name=" + name
180
                + " provider class=" + storeProviderClass.getName());
181
        }
182

    
183
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE,
184
            DATA_MANAGER_STORE_DESCRIPTION).append(name, null,
185
                storeProviderClass);
186

    
187
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
188
            DATA_MANAGER_STORE_PARAMS_DESCRIPTION).append(name, null,
189
                parametersClass);
190
    }
191

    
192
    /*
193
     * (non-Javadoc)
194
     * @see org.gvsig.fmap.dal.spi.DataManagerProviderServices#registerStoreFactory(java.lang.String, java.lang.Class)
195
     */
196
    public void registerStoreFactory(String name, Class storeProviderClass) {
197
        if (name == null || storeProviderClass == null) {
198
            // FIXME Exception
199
            throw new IllegalArgumentException("Any parameters can be null");
200
        }
201

    
202
        if(!(DataStoreFactory.class.isAssignableFrom(storeProviderClass))) {
203
            // FIXME Exception
204
            throw new IllegalArgumentException(
205
                "Not supported implemtation: name=" + name
206
                + " provider class=" + storeProviderClass.getName());
207
        }
208

    
209
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_FACTORY,
210
            DATA_MANAGER_STORE_FACTORY_DESCRIPTION).append(name, null,
211
                storeProviderClass);
212
    }
213

    
214
    public DataStoreParameters createStoreParameters(String name)
215
    throws InitializeException, ProviderNotRegisteredException {
216
        try {
217
            DataStoreParameters params = (DataStoreParameters) ToolsLocator
218
            .getExtensionPointManager().get(DATA_MANAGER_STORE_PARAMS)
219
            .create(name);
220
            if (params == null) {
221
                throw new ProviderNotRegisteredException(name);
222
            }
223
            return params;
224
        } catch (InstantiationException e) {
225
            throw new InitializeException(e);
226
        } catch (IllegalAccessException e) {
227
            throw new InitializeException(e);
228
        } catch (SecurityException e) {
229
            throw new InitializeException(e);
230
        } catch (IllegalArgumentException e) {
231
            throw new InitializeException(e);
232
        }
233
    }
234

    
235
    public DataStore localOpenStore(String provider, DataStoreParameters parameters)
236
    throws InitializeException, ProviderNotRegisteredException,
237
    ValidateDataParametersException {
238
        String name = provider; //parameters.getDataStoreName();
239

    
240
        parameters.validate();
241

    
242
        DataStore store;
243
        Extension storeProviderExtension = ToolsLocator
244
        .getExtensionPointManager().get(DATA_MANAGER_STORE).get(name);
245

    
246
        if (storeProviderExtension == null) {
247
            throw new ProviderNotRegisteredException(name);
248
        }
249

    
250
        Class providerClass = storeProviderExtension.getExtension();
251
        if (providerClass == null) {
252
            throw new ProviderNotRegisteredException(name);
253
        }
254

    
255
        if (CoverageStoreProvider.class.isAssignableFrom(providerClass)) {
256
            ExtensionPoint.Extension point = ToolsLocator.getExtensionPointManager().
257
            get(DATA_MANAGER_STORE_FACTORY).get(name);
258
            DataStoreFactory factory = null;
259
            try {
260
                factory = (DataStoreFactory)point.create();
261
            } catch (InstantiationException e) {
262
                throw new InitializeException(e);
263
            } catch (IllegalAccessException e) {
264
                throw new InitializeException(e);
265
            }
266
            factory.setParameters(parameters);
267
            store = factory.createStore();
268
        } else if (FeatureStoreProvider.class.isAssignableFrom(providerClass)) {
269

    
270
            store = new DefaultFeatureStore();
271

    
272
        } else {
273
            // FIXME Exception
274
            throw new InitializeException(name, new RuntimeException(
275
                "Not supported implemtation: name=" + name
276
                + " provider class=" + providerClass.getName()));
277
        }
278

    
279
        this.intializeDataStore(store, parameters);
280

    
281
        return store;
282
    }
283

    
284
    public DataStore openStore(String provider, DataStoreParameters parameters)
285
            throws InitializeException, ProviderNotRegisteredException,
286
            ValidateDataParametersException {
287

    
288
//      try {
289
            return localOpenStore(provider, parameters);
290
//      } catch (Exception e) {
291
//          // TODO: handle exception
292
//      }
293
        
294
    }
295

    
296
    /**
297
     * @deprecated see openStore
298
     */
299
    public DataStore createStore(DataStoreParameters parameters)
300
    throws InitializeException, ProviderNotRegisteredException,
301
    ValidateDataParametersException {
302
        return openStore(parameters.getDataStoreName(), parameters);
303
    }
304

    
305
    public List getStoreProviders() {
306
        return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_STORE)
307
        .getNames();
308
    }
309

    
310
    public List getStoreProviders(String name) {
311
        return getStoreProviders(); // FIXME: need filter from the name of
312
        // the explorer
313
    }
314

    
315
    public NewDataStoreParameters createNewStoreParameters(String explorer,
316
        String provider) throws InitializeException,
317
        ProviderNotRegisteredException {
318

    
319
        DataServerExplorerParameters parameters;
320
        DataServerExplorer server;
321
        try {
322
            parameters = this.createServerExplorerParameters(explorer);
323
            server = this.openServerExplorerWithoutValidate(explorer, parameters);
324
            return server.getAddParameters(provider);
325
        } catch (ValidateDataParametersException e) {
326
            throw new InitializeException(e);
327
        } catch (DataException e) {
328
            throw new InitializeException(e);
329
        }
330
    }
331

    
332
    public void newStore(String explorer, String provider, NewDataStoreParameters parameters, boolean overwrite)
333
    throws InitializeException, ProviderNotRegisteredException,
334
    ValidateDataParametersException {
335

    
336
        parameters.validate();
337

    
338
        DataServerExplorerParameters explorerParameters;
339
        DataServerExplorer server;
340
        explorerParameters = this.createServerExplorerParameters(explorer);
341
        server = this.openServerExplorerWithoutValidate(explorer, explorerParameters);
342
        try {
343
            server.add(provider, parameters, overwrite);
344
        } catch (DataException e) {
345
            throw new InitializeException(e);
346
        }
347
    }
348

    
349
    /*
350
     * ====================================================================
351
     *
352
     * Explorer related services
353
     */
354
    public void registerExplorerProvider(String name, Class explorerClass,
355
        Class parametersClass) {
356

    
357
        if (name == null || explorerClass == null || parametersClass == null) {
358
            // FIXME Exception
359
            throw new IllegalArgumentException("Any parameters can be null");
360
        }
361

    
362
        if (!DataServerExplorerParameters.class
363
            .isAssignableFrom(parametersClass)) {
364
            // FIXME Exception
365
            throw new IllegalArgumentException(
366
                parametersClass.getName()
367
                + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
368
        }
369

    
370
        if (!DataServerExplorer.class.isAssignableFrom(explorerClass)) {
371
            // FIXME Exception
372
            throw new IllegalArgumentException(explorerClass.getName()
373
                + " must implement org.gvsig.fmap.dal.DataServerExplorer");
374
        }
375

    
376
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
377
            DATA_MANAGER_EXPLORER_DESCRIPTION).append(name, null,
378
                explorerClass);
379

    
380
        ToolsLocator.getExtensionPointManager().add(
381
            DATA_MANAGER_EXPLORER_PARAMS,
382
            DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION).append(name, null,
383
                parametersClass);
384
    }
385

    
386
    public DataServerExplorerParameters createServerExplorerParameters(
387
        String name) throws InitializeException,
388
        ProviderNotRegisteredException {
389
        try {
390
            DataServerExplorerParameters params = (DataServerExplorerParameters) ToolsLocator
391
            .getExtensionPointManager().get(
392
                DATA_MANAGER_EXPLORER_PARAMS).create(name);
393
            if (params == null) {
394
                throw new ProviderNotRegisteredException(name);
395
            }
396
            return params;
397
        } catch (InstantiationException e) {
398
            throw new InitializeException(e);
399
        } catch (IllegalAccessException e) {
400
            throw new InitializeException(e);
401
        } catch (SecurityException e) {
402
            throw new InitializeException(e);
403
        } catch (IllegalArgumentException e) {
404
            throw new InitializeException(e);
405
        }
406
    }
407

    
408
    public DataServerExplorer openServerExplorer(
409
        String explorer, 
410
        DataServerExplorerParameters parameters)
411
    throws InitializeException, ProviderNotRegisteredException,
412
    ValidateDataParametersException {
413

    
414
        if( parameters != null ) {
415
            parameters.validate();
416
        }
417
        return this.openServerExplorerWithoutValidate(explorer, parameters);
418
    }
419

    
420
    private DataServerExplorer openServerExplorerWithoutValidate(
421
        String explorerName, 
422
        DataServerExplorerParameters parameters)
423
    throws InitializeException, ProviderNotRegisteredException,
424
    ValidateDataParametersException {
425

    
426
        String name = explorerName; //parameters.getExplorerName();
427

    
428
        try {
429
            DataServerExplorerProvider server = (DataServerExplorerProvider) ToolsLocator
430
            .getExtensionPointManager()
431
            .get(DATA_MANAGER_EXPLORER)
432
            .create(
433
                name,
434
                new Object[] {
435
                    parameters,
436
                    new DefaultDataServerExplorerProviderServices() });
437
            if (server == null) {
438
                throw new ProviderNotRegisteredException(name);
439
            }
440
            return server;
441
        } catch (InstantiationException e) {
442
            throw new InitializeException(e);
443
        } catch (IllegalAccessException e) {
444
            throw new InitializeException(e);
445
        } catch (SecurityException e) {
446
            throw new InitializeException(e);
447
        } catch (IllegalArgumentException e) {
448
            throw new InitializeException(e);
449
        } catch (NoSuchMethodException e) {
450
            throw new InitializeException(e);
451
        } catch (InvocationTargetException e) {
452
            throw new InitializeException(e);
453
        }
454
    }
455

    
456
    /**
457
     * @deprecated see openServerExplorer
458
     */
459
    public DataServerExplorer createServerExplorer(
460
        DataServerExplorerParameters parameters)
461
    throws InitializeException, ProviderNotRegisteredException,
462
    ValidateDataParametersException {
463
        return openServerExplorer(parameters.getExplorerName(), parameters);
464
    }
465

    
466
    public List getExplorerProviders() {
467
        return ToolsLocator.getExtensionPointManager().get(
468
            DATA_MANAGER_EXPLORER).getNames();
469
    }
470

    
471
    /*
472
     * ====================================================================
473
     *
474
     * Expresion evaluation related services
475
     */
476
    public Evaluator createExpresion(String expresion)
477
    throws InitializeException {
478
        try {
479
            return (Evaluator) ToolsLocator.getExtensionPointManager().get(
480
                DATA_MANAGER_EXPRESION_EVALUATOR).create(
481
                    DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
482
                    new Object[] { expresion });
483
        } catch (SecurityException e) {
484
            throw new InitializeException(e);
485
        } catch (IllegalArgumentException e) {
486
            throw new InitializeException(e);
487
        } catch (NoSuchMethodException e) {
488
            throw new InitializeException(e);
489
        } catch (InstantiationException e) {
490
            throw new InitializeException(e);
491
        } catch (IllegalAccessException e) {
492
            throw new InitializeException(e);
493
        } catch (InvocationTargetException e) {
494
            throw new InitializeException(e);
495
        }
496
    }
497

    
498
    public void registerDefaultEvaluator(Class evaluatorClass) {
499
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
500
            throw new ClassCastException();
501
        }
502
        ToolsLocator.getExtensionPointManager().add(
503
            DATA_MANAGER_EXPRESION_EVALUATOR,
504
            DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION).append(
505
                DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
506
                "Default expresion evaluator for use in DAL", evaluatorClass);
507
    }
508

    
509
    /*
510
     * ====================================================================
511
     *
512
     * Index related services
513
     */
514

    
515
    public List getFeatureIndexProviders() {
516
        return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_INDEX)
517
        .getNames();
518
    }
519

    
520
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
521
        defaultDataIndexProviders.put(new Integer(dataType), name);
522
    }
523

    
524
    public String getDefaultFeatureIndexProviderName(int dataType) {
525
        return (String) defaultDataIndexProviders.get(new Integer(dataType));
526
    }
527

    
528
    public FeatureIndexProviderServices createFeatureIndexProvider(String name,
529
        FeatureStore store, FeatureType type, String indexName,
530
        FeatureAttributeDescriptor attr) throws InitializeException,
531
        ProviderNotRegisteredException {
532

    
533
        if (name == null) {
534
            name = getDefaultFeatureIndexProviderName(attr.getType());
535
        }
536

    
537
        if (name == null) {
538
            throw new InitializeException(
539
                "There not any index provider registered.", null);
540
        }
541

    
542
        try {
543
            FeatureIndexProvider provider = (FeatureIndexProvider) ToolsLocator
544
            .getExtensionPointManager().get(DATA_MANAGER_INDEX).create(
545
                name);
546
            if (provider == null) {
547
                throw new ProviderNotRegisteredException(name);
548
            }
549
            FeatureIndexProviderServices services = new DefaultFeatureIndex(
550
                (FeatureStoreProviderServices) store, type, provider, attr
551
                .getName(), indexName);
552
            services.initialize();
553
            return services;
554
        } catch (InstantiationException e) {
555
            throw new InitializeException(e);
556
        } catch (IllegalAccessException e) {
557
            throw new InitializeException(e);
558
        } catch (SecurityException e) {
559
            throw new InitializeException(e);
560
        } catch (IllegalArgumentException e) {
561
            throw new InitializeException(e);
562
        }
563
    }
564

    
565
    public void registerFeatureIndexProvider(String name, String description,
566
        Class clazz, int dataType) {
567
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
568
            DATA_MANAGER_INDEX_DESCRIPTION).append(name, null, clazz);
569

    
570
        if (getDefaultFeatureIndexProviderName(dataType) == null) {
571
            setDefaultFeatureIndexProviderName(dataType, name);
572
        }
573
    }
574

    
575
    private void initializeIndexes() {
576
        this.defaultDataIndexProviders = new HashMap();
577
    }
578

    
579
    public void intializeDataStore(DataStore store,
580
        DataStoreParameters parameters) throws InitializeException,
581
        ProviderNotRegisteredException {
582

    
583
        ((DataStoreInitializer)store).intializePhase1(this, parameters);
584
        DataStoreProvider provider = this.createProvider((DataStoreProviderServices) store, parameters);
585
        ((DataStoreInitializer)store).intializePhase2(provider);
586

    
587
    }
588

    
589
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
590
        String name = parameters.getDataStoreName();
591
        DataStoreProvider provider = null;
592
        boolean retry = true;
593
        while (retry){
594
            try {
595
                provider = (DataStoreProvider) ToolsLocator
596
                .getExtensionPointManager().get(DATA_MANAGER_STORE).create(
597
                        name,
598
                        new Object[] { parameters, providerServices });
599
                retry = false;
600
            } catch (Exception e) {
601
                retry = openErrorHandler.canRetryOpen(e, parameters);
602
                if (!retry){
603
                    throw new InitializeException(parameters.getDataStoreName(), e);
604
                }
605
            }
606
        }
607
        if (provider == null) {
608
            throw new ProviderNotRegisteredException(name);
609
        }
610
        return provider;
611
    }
612

    
613
    public void registerFeatureCacheProvider(
614
        FeatureCacheProviderFactory providerFactory) {
615
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_CACHE,
616
            DATA_MANAGER_CACHE_DESCRIPTION).append(
617
                providerFactory.getName(), "", 
618
                providerFactory);                   
619
    }
620

    
621
    public FeatureCacheProvider createFeatureCacheProvider(String name,
622
        DynObject parameters) throws DataException {
623
        if (name == null) {
624
            throw new InitializeException("It is necessary to provide a cache name", null);
625
        }
626
        if (parameters == null){
627
            throw new InitializeException("It is necessary to provide parameters to create the explorer", null);
628
        }
629
        FeatureCacheProviderFactory featureCacheProviderFactory;
630
        try {
631
            featureCacheProviderFactory = (FeatureCacheProviderFactory) ToolsLocator
632
            .getExtensionPointManager().get(DATA_MANAGER_CACHE).create(name);
633
            if (featureCacheProviderFactory == null) {
634
                throw new ProviderNotRegisteredException(name);
635
            }
636
            return featureCacheProviderFactory.createCacheProvider(parameters);     
637
        } catch (InstantiationException e) {
638
            throw new InitializeException(e);
639
        } catch (IllegalAccessException e) {
640
            throw new InitializeException(e);
641
        }       
642
    }
643

    
644
    public List getFeatureCacheProviders() {
645
        ExtensionPoint extensionPoint = ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
646
        if (extensionPoint != null){
647
            return ToolsLocator.getExtensionPointManager().get(
648
                DATA_MANAGER_CACHE).getNames();
649
        }else{
650
            return new ArrayList();
651
        }  
652
    }
653

    
654
    public DynObject createCacheParameters(String name)
655
    throws InitializeException, ProviderNotRegisteredException {
656
        if (name == null) {
657
            throw new InitializeException("It is necessary to provide a cache name", null);
658
        }
659
        FeatureCacheProviderFactory featureCacheProviderFactory;
660
        try {
661
            featureCacheProviderFactory = (FeatureCacheProviderFactory) ToolsLocator
662
            .getExtensionPointManager().get(DATA_MANAGER_CACHE).create(name);
663
            if (featureCacheProviderFactory == null) {
664
                throw new ProviderNotRegisteredException(name);
665
            }
666
            return featureCacheProviderFactory.createParameters();      
667
        } catch (InstantiationException e) {
668
            throw new InitializeException(e);
669
        } catch (IllegalAccessException e) {
670
            throw new InitializeException(e);
671
        }       
672
    }
673

    
674
    public DataStoreParameters createMemoryStoreParameters(
675
        String autoOrderAttributeName) throws InitializeException {
676

    
677
        DataStoreParameters parameters;
678
        try {
679
            parameters = createStoreParameters(MemoryStoreProvider.NAME);
680
            if (autoOrderAttributeName != null) {
681
                parameters.setDynValue(
682
                    MemoryStoreParameters.ORDER_PARAMETER_NAME,
683
                    autoOrderAttributeName);
684
            }
685
            return parameters;
686
        } catch (ProviderNotRegisteredException e) {
687
            throw new InitializeException("MemoryStoreProvider", e);
688
        }
689
    }
690

    
691
    public FeatureStore createMemoryStore(String autoOrderAttributeName)
692
    throws InitializeException {
693

    
694
        DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
695
        try {
696
            return (FeatureStore) createStore(parameters);
697
        } catch (ValidateDataParametersException e) {
698
            throw new InitializeException("MemoryStoreProvider", e);
699
        } catch (ProviderNotRegisteredException e) {
700
            throw new InitializeException("MemoryStoreProvider", e);
701
        }
702
    }
703

    
704
    public FeaturePagingHelper createFeaturePagingHelper(
705
        FeatureStore featureStore, int pageSize) throws BaseException {
706
        return new FeaturePagingHelperImpl(featureStore, pageSize);
707
    }
708

    
709
    public FeaturePagingHelper createFeaturePagingHelper(
710
        FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
711
    throws BaseException {
712
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
713
    }
714

    
715
    public void registerFeatureAttributeGetter(String name, Class clazz) {
716
        if (name == null || clazz == null) {           
717
            throw new IllegalArgumentException("Any parameters can be null");
718
        }
719

    
720
        if(!(FeatureAttributeGetter.class.isAssignableFrom(clazz))) {            
721
            throw new IllegalArgumentException(
722
                "Not supported implemtation: name=" + name
723
                + " class=" + clazz.getName());
724
        }
725

    
726
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER,
727
            DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER_DESCRIPTION).append(name, null,
728
                clazz);
729

    
730
    }
731

    
732
    public FeatureAttributeGetter createFeatureAttributeGetter(String name) throws InitializeException {
733
        if (name == null) {           
734
            throw new IllegalArgumentException("The parameter can not be null");
735
        }
736

    
737
        try{
738
            return (FeatureAttributeGetter) ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER).create(name);
739
        } catch (InstantiationException e) {
740
            throw new InitializeException("FeatureAttributeGetter", e);
741
        } catch (IllegalAccessException e) {
742
            throw new InitializeException("FeatureAttributeGetter", e);
743
        }
744
    }
745

    
746
        public void setOpenErrorHandler(OpenErrorHandler handler) {
747
                openErrorHandler = handler;
748
                
749
        }
750

    
751
}