Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / impl / DefaultDataManager.java @ 42624

History | View | Annotate | Download (39.2 KB)

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

    
26
import java.io.File;
27
import java.lang.reflect.InvocationTargetException;
28
import java.util.ArrayList;
29
import java.util.HashMap;
30
import java.util.List;
31
import java.util.Map;
32

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

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

    
100
    final static private String DATA_MANAGER_STORE_PARAMS =
101
        "Data.manager.stores.params";
102
    final static private String DATA_MANAGER_STORE_PARAMS_DESCRIPTION =
103
        "DAL stores providers parameters";
104

    
105
    final static private String DATA_MANAGER_EXPLORER =
106
        "Data.manager.explorers";
107
    final static private String DATA_MANAGER_EXPLORER_DESCRIPTION =
108
        "DAL explorers providers";
109

    
110
    final static private String DATA_MANAGER_EXPLORER_PARAMS =
111
        "Data.manager.explorers.params";
112
    final static private String DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION =
113
        "DAL explorer providers parameters";
114

    
115
    final static private String DATA_MANAGER_INDEX = "Data.manager.indexes";
116
    final static private String DATA_MANAGER_INDEX_DESCRIPTION =
117
        "DAL index providers";
118

    
119
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
120
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
121
        "DAL cache providers";
122

    
123
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR =
124
        "Data.manager.expresion.evaluator";
125
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT =
126
        "default";
127
    final static private String DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION =
128
        "DAL expresion evaluators.";
129

    
130
    final static private String DATA_MANAGER_STORE_FACTORY =
131
        "Data.manager.stores.factory";
132
    final static private String DATA_MANAGER_STORE_FACTORY_DESCRIPTION =
133
        "DAL stores factories";
134

    
135
    final static private String DATA_MANAGER_STORE_PROVIDER_FACTORY =
136
        "Data.manager.providers.factory";
137
    final static private String DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION =
138
        "DAL store provider factories";
139
    
140
    final static private String DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER = 
141
        "Data.manager.feature.attribute.getter";
142
    final static private String DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER_DESCRIPTION = 
143
        "DAL feature attribute getters";
144

    
145
    /** This map contains the name of the default provider for each data type */
146
    private Map defaultDataIndexProviders;
147

    
148
    private OpenErrorHandler openErrorHandler;
149

    
150
    private List dataTypes;
151
    
152
    private DataServerExplorerPool dataServerExplorerPool = null;
153
    
154

    
155
    public DefaultDataManager() {
156
        /*
157
         * Create te extensions point in te registry.
158
         */
159
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE,
160
            DATA_MANAGER_STORE_DESCRIPTION);
161

    
162
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_STORE_PARAMS,
163
            DATA_MANAGER_STORE_PARAMS_DESCRIPTION);
164

    
165
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_EXPLORER,
166
            DATA_MANAGER_EXPLORER_DESCRIPTION);
167

    
168
        ToolsLocator.getExtensionPointManager().add(
169
            DATA_MANAGER_EXPLORER_PARAMS,
170
            DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION);
171

    
172
        ToolsLocator.getExtensionPointManager().add(DATA_MANAGER_INDEX,
173
            DATA_MANAGER_INDEX_DESCRIPTION);
174

    
175
        ToolsLocator.getExtensionPointManager().add(
176
            DATA_MANAGER_EXPRESION_EVALUATOR,
177
            DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION);
178

    
179
        ToolsLocator.getExtensionPointManager().add(
180
            DATA_MANAGER_STORE_PROVIDER_FACTORY,
181
            DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
182

    
183
        initializeIndexes();
184
    }
185

    
186
    /**
187
     * 
188
     * @return ResourceManager
189
     */
190

    
191
    public ResourceManager getResourceManager() {
192
        return DALLocator.getResourceManager();
193
    }
194

    
195
    public OperationManager getOperationManager() {
196
        return ToolsLocator.getOperationManager();
197
    }
198

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

    
220
    /*
221
     * ====================================================================
222
     * 
223
     * Store related services
224
     */
225
    public void registerStoreProvider(String name, Class storeProviderClass,
226
        Class parametersClass) {
227
        if (name == null || storeProviderClass == null
228
            || parametersClass == null) {
229
            // FIXME Exception
230
            throw new IllegalArgumentException("Any parameters can be null");
231
        }
232

    
233
        if (!DataStoreParameters.class.isAssignableFrom(parametersClass)) {
234
            // FIXME Exception
235
            throw new IllegalArgumentException(parametersClass.getName()
236
                + " must implement org.gvsig.fmap.dal.DataStoreParameters");
237
        }
238

    
239
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
240
            ToolsLocator.getExtensionPointManager()
241
                .add(DATA_MANAGER_STORE, DATA_MANAGER_STORE_DESCRIPTION)
242
                .append(name, null, storeProviderClass);
243

    
244
            ToolsLocator
245
                .getExtensionPointManager()
246
                .add(DATA_MANAGER_STORE_PARAMS,
247
                    DATA_MANAGER_STORE_PARAMS_DESCRIPTION)
248
                .append(name, null, parametersClass);
249
            return;
250
        }
251

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

    
259
        throw new IllegalArgumentException("Not supported implemtation: name="
260
            + name + " provider class=" + storeProviderClass.getName());
261

    
262
    }
263

    
264
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
265
        ExtensionPoint factories =
266
            ToolsLocator.getExtensionPointManager().add(
267
                DATA_MANAGER_STORE_PROVIDER_FACTORY,
268
                DATA_MANAGER_STORE_PROVIDER_FACTORY_DESCRIPTION);
269
        factories.append(factory.getName(), factory.getDescription(), factory);
270

    
271
    }
272

    
273
    public void registerStoreFactory(String name, Class storeProviderClass) {
274
        if (name == null || storeProviderClass == null) {
275
            // FIXME Exception
276
            throw new IllegalArgumentException("Any parameters can be null");
277
        }
278

    
279
        if (!(DataStoreFactory.class.isAssignableFrom(storeProviderClass))) {
280
            // FIXME Exception
281
            throw new IllegalArgumentException(
282
                "Not supported implemtation: name=" + name + " provider class="
283
                    + storeProviderClass.getName());
284
        }
285

    
286
        ToolsLocator
287
            .getExtensionPointManager()
288
            .add(DATA_MANAGER_STORE_FACTORY,
289
                DATA_MANAGER_STORE_FACTORY_DESCRIPTION)
290
            .append(name, null, storeProviderClass);
291
    }
292

    
293
    public DataStoreParameters createStoreParameters(String name)
294
        throws InitializeException, ProviderNotRegisteredException {
295
        try {
296

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

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

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

    
355
        parameters.validate();
356

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

    
378
        Extension storeProviderExtension =
379
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_STORE)
380
                .get(name);
381

    
382
        if (storeProviderExtension == null) {
383
            throw new ProviderNotRegisteredException(name);
384
        }
385

    
386
        Class providerClass = storeProviderExtension.getExtension();
387
        if (providerClass == null) {
388
            throw new ProviderNotRegisteredException(name);
389
        }
390

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

    
408
                store = new DefaultFeatureStore();
409

    
410
            } else {
411
                // FIXME Exception
412
                throw new InitializeException(name, new RuntimeException(
413
                    "Not supported implemtation: name=" + name
414
                        + " provider class=" + providerClass.getName()));
415
            }
416

    
417
        this.intializeDataStore(store, parameters);
418

    
419
        return store;
420
    }
421

    
422
    public DataStore openStore(String provider, DynObject parameters)
423
        throws InitializeException, ProviderNotRegisteredException,
424
        ValidateDataParametersException {
425

    
426
        return localOpenStore(provider, parameters);
427
    }
428

    
429
    @Override
430
    public DataStore openStore(String provider, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
431
        return localOpenStore(provider, parameters);
432
    }
433

    
434
    
435
    
436
    /**
437
     * @deprecated see openStore
438
     */
439
    public DataStore createStore(DynObject doparameters)
440
        throws InitializeException, ProviderNotRegisteredException,
441
        ValidateDataParametersException {
442
        DataStoreParameters parameters = toDataStoreParameters(doparameters);
443
        return openStore(parameters.getDataStoreName(), parameters);
444
    }
445
    
446
    /**
447
     * @deprecated see openStore
448
     */
449
    @Override
450
    public DataStore createStore(DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
451
        return this.openStore(parameters.getDataStoreName(), parameters);
452
    }
453

    
454
    
455
    public List getStoreProviders() {
456
        ExtensionPointManager epmanager =
457
            ToolsLocator.getExtensionPointManager();
458
        List names1 = epmanager.get(DATA_MANAGER_STORE).getNames();
459
        List names2 =
460
            epmanager.get(DATA_MANAGER_STORE_PROVIDER_FACTORY).getNames();
461
        List names3 = new ArrayList();
462
        names3.addAll(names1);
463
        names3.addAll(names2);
464
        return names3;
465
    }
466

    
467
    public DataStoreProviderFactory getStoreProviderFactory(String name) {
468
        try {
469
            return (DataStoreProviderFactory) ToolsLocator
470
                .getExtensionPointManager()
471
                .get(DATA_MANAGER_STORE_PROVIDER_FACTORY).create(name);
472
        } catch (InstantiationException e) {
473
            return null;
474
        } catch (IllegalAccessException e) {
475
            return null;
476
        }
477
    }
478

    
479
    public List getStoreProviders(String name) {
480
        return getStoreProviders(); // FIXME: need filter from the name of
481
        // the explorer
482
    }
483

    
484
    public NewDataStoreParameters createNewStoreParameters(String explorer,
485
        String provider) throws InitializeException,
486
        ProviderNotRegisteredException {
487

    
488
        DataServerExplorerParameters parameters;
489
        DataServerExplorer server;
490
        try {
491
            parameters = this.createServerExplorerParameters(explorer);
492
            server =
493
                this.openServerExplorerWithoutValidate(explorer, parameters);
494
            return server.getAddParameters(provider);
495
        } catch (ValidateDataParametersException e) {
496
            throw new InitializeException(e);
497
        } catch (DataException e) {
498
            throw new InitializeException(e);
499
        }
500
    }
501

    
502
    public void newStore(String explorer, String provider,
503
        NewDataStoreParameters parameters, boolean overwrite)
504
        throws InitializeException, ProviderNotRegisteredException,
505
        ValidateDataParametersException {
506
        
507
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
508
        if( ! identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, provider) ) {
509
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, provider);
510
        }
511
        parameters.validate();
512

    
513
        DataServerExplorerParameters explorerParameters;
514
        DataServerExplorer server;
515
        explorerParameters = this.createServerExplorerParameters(explorer);
516
        server =
517
            this.openServerExplorerWithoutValidate(explorer, explorerParameters);
518
        try {
519
            server.add(provider, parameters, overwrite);
520
        } catch (DataException e) {
521
            throw new InitializeException(e);
522
        }
523
    }
524

    
525
    /*
526
     * ====================================================================
527
     * 
528
     * Explorer related services
529
     */
530
    public void registerExplorerProvider(String name, Class explorerClass,
531
        Class parametersClass) {
532

    
533
        if (name == null || explorerClass == null || parametersClass == null) {
534
            // FIXME Exception
535
            throw new IllegalArgumentException("Any parameters can be null");
536
        }
537

    
538
        if (!DataServerExplorerParameters.class
539
            .isAssignableFrom(parametersClass)) {
540
            // FIXME Exception
541
            throw new IllegalArgumentException(
542
                parametersClass.getName()
543
                    + " must implement org.gvsig.fmap.dal.DataServerExplorerParameters");
544
        }
545

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

    
552
        ToolsLocator.getExtensionPointManager()
553
            .add(DATA_MANAGER_EXPLORER, DATA_MANAGER_EXPLORER_DESCRIPTION)
554
            .append(name, null, explorerClass);
555

    
556
        ToolsLocator
557
            .getExtensionPointManager()
558
            .add(DATA_MANAGER_EXPLORER_PARAMS,
559
                DATA_MANAGER_EXPLORER_PARAMS_DESCRIPTION)
560
            .append(name, null, parametersClass);
561
    }
562

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

    
585
    public DataServerExplorer openServerExplorer(String explorer,
586
        DataServerExplorerParameters parameters) throws InitializeException,
587
        ProviderNotRegisteredException, ValidateDataParametersException {
588

    
589
        if (parameters != null) {
590
            parameters.validate();
591
        }
592
        return this.openServerExplorerWithoutValidate(explorer, parameters);
593
    }
594

    
595
    private DataServerExplorer openServerExplorerWithoutValidate(
596
        String explorerName, DataServerExplorerParameters parameters)
597
        throws InitializeException, ProviderNotRegisteredException,
598
        ValidateDataParametersException {
599

    
600
        String name = explorerName; // parameters.getExplorerName();
601

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

    
630
    /**
631
     * @deprecated see openServerExplorer
632
     */
633
    public DataServerExplorer createServerExplorer(
634
        DataServerExplorerParameters parameters) throws InitializeException,
635
        ProviderNotRegisteredException, ValidateDataParametersException {
636
        return openServerExplorer(parameters.getExplorerName(), parameters);
637
    }
638

    
639
    public List getExplorerProviders() {
640
        return ToolsLocator.getExtensionPointManager()
641
            .get(DATA_MANAGER_EXPLORER).getNames();
642
    }
643

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

    
672
    public void registerDefaultEvaluator(Class evaluatorClass) {
673
        if (!Evaluator.class.isAssignableFrom(evaluatorClass)) {
674
            throw new ClassCastException();
675
        }
676
        ToolsLocator
677
            .getExtensionPointManager()
678
            .add(DATA_MANAGER_EXPRESION_EVALUATOR,
679
                DATA_MANAGER_EXPRESION_EVALUATOR_DESCRIPTION)
680
            .append(DATA_MANAGER_EXPRESION_EVALUATOR_DEFAULT,
681
                "Default expresion evaluator for use in DAL", evaluatorClass);
682
    }
683

    
684
    /*
685
     * ====================================================================
686
     * 
687
     * Index related services
688
     */
689

    
690
    public List getFeatureIndexProviders() {
691
        return ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_INDEX)
692
            .getNames();
693
    }
694

    
695
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
696
        defaultDataIndexProviders.put(new Integer(dataType), name);
697
    }
698

    
699
    public String getDefaultFeatureIndexProviderName(int dataType) {
700
        return (String) defaultDataIndexProviders.get(new Integer(dataType));
701
    }
702

    
703
    public FeatureIndexProviderServices createFeatureIndexProvider(String name,
704
        FeatureStore store, FeatureType type, String indexName,
705
        FeatureAttributeDescriptor attr) throws InitializeException,
706
        ProviderNotRegisteredException {
707

    
708
        if (name == null) {
709
            name = getDefaultFeatureIndexProviderName(attr.getType());
710
        }
711

    
712
        if (name == null) {
713
            throw new InitializeException(
714
                "There not any index provider registered.", null);
715
        }
716

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

    
740
    public void registerFeatureIndexProvider(String name, String description,
741
        Class clazz, int dataType) {
742
        ToolsLocator.getExtensionPointManager()
743
            .add(DATA_MANAGER_INDEX, DATA_MANAGER_INDEX_DESCRIPTION)
744
            .append(name, null, clazz);
745

    
746
        if (getDefaultFeatureIndexProviderName(dataType) == null) {
747
            setDefaultFeatureIndexProviderName(dataType, name);
748
        }
749
    }
750

    
751
    private void initializeIndexes() {
752
        this.defaultDataIndexProviders = new HashMap();
753
    }
754

    
755
    public void intializeDataStore(DataStore store,
756
        DataStoreParameters parameters) throws InitializeException,
757
        ProviderNotRegisteredException {
758

    
759
        ((DataStoreInitializer) store).intializePhase1(this, parameters);
760
        DataStoreProvider provider =
761
            this.createProvider((DataStoreProviderServices) store, parameters);
762
        ((DataStoreInitializer) store).intializePhase2(provider);
763

    
764
    }
765

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

    
810
    public void registerFeatureCacheProvider(
811
        FeatureCacheProviderFactory providerFactory) {
812
        ToolsLocator.getExtensionPointManager()
813
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
814
            .append(providerFactory.getName(), "", providerFactory);
815
    }
816

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

    
845
    public List getFeatureCacheProviders() {
846
        ExtensionPoint extensionPoint =
847
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
848
        if (extensionPoint != null) {
849
            return ToolsLocator.getExtensionPointManager()
850
                .get(DATA_MANAGER_CACHE).getNames();
851
        } else {
852
            return new ArrayList();
853
        }
854
    }
855

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

    
879
    public DataStoreParameters createMemoryStoreParameters(
880
        String autoOrderAttributeName) throws InitializeException {
881

    
882
        DataStoreParameters parameters;
883
        try {
884
            parameters = createStoreParameters(MemoryStoreProvider.NAME);
885
            if (autoOrderAttributeName != null) {
886
                parameters.setDynValue(
887
                    MemoryStoreParameters.ORDER_PARAMETER_NAME,
888
                    autoOrderAttributeName);
889
            }
890
            return parameters;
891
        } catch (ProviderNotRegisteredException e) {
892
            throw new InitializeException("MemoryStoreProvider", e);
893
        }
894
    }
895

    
896
    public FeatureStore createMemoryStore(String autoOrderAttributeName)
897
        throws InitializeException {
898

    
899
        DataStoreParameters parameters =
900
            createMemoryStoreParameters(autoOrderAttributeName);
901
        try {
902
            return (FeatureStore) createStore(parameters);
903
        } catch (ValidateDataParametersException e) {
904
            throw new InitializeException("MemoryStoreProvider", e);
905
        } catch (ProviderNotRegisteredException e) {
906
            throw new InitializeException("MemoryStoreProvider", e);
907
        }
908
    }
909

    
910
    public FeaturePagingHelper createFeaturePagingHelper(
911
        FeatureStore featureStore, int pageSize) throws BaseException {
912
        return new FeaturePagingHelperImpl(featureStore, pageSize);
913
    }
914

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

    
921
    public void setOpenErrorHandler(OpenErrorHandler handler) {
922
        openErrorHandler = handler;
923
    }
924
    
925
    public OpenErrorHandler getOpenErrorHandler() {
926
        return this.openErrorHandler;
927
    }
928
            
929
    public EditableFeatureType createFeatureType() {
930
        return new DefaultEditableFeatureType();
931
    }
932

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

    
963
        try{
964
            return (FeatureAttributeGetter) ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_FEATURE_ATTTRIBUTE_GETTER).create(name);
965
        } catch (InstantiationException e) {
966
            throw new InitializeException("FeatureAttributeGetter", e);
967
        } catch (IllegalAccessException e) {
968
            throw new InitializeException("FeatureAttributeGetter", e);
969
        }
970
    }
971

    
972
    public DataServerExplorerPool getDataServerExplorerPool() {
973
        if( this.dataServerExplorerPool==null )  {
974
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
975
        }
976
        return this.dataServerExplorerPool;
977
    }
978
    
979
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
980
        this.dataServerExplorerPool = pool;
981
    }
982
    
983
    
984
}