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

History | View | Annotate | Download (47.4 KB)

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

    
3
import java.io.ByteArrayInputStream;
4
import java.io.File;
5
import java.io.InputStream;
6
import java.net.URL;
7
import java.net.URLClassLoader;
8
import java.util.ArrayList;
9
import java.util.Collections;
10
import java.util.HashMap;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.Objects;
14
import java.util.UUID;
15
import org.apache.commons.io.IOUtils;
16
import org.apache.commons.lang3.StringUtils;
17
import org.gvsig.expressionevaluator.Expression;
18
import org.gvsig.expressionevaluator.ExpressionBuilder;
19
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
20
import org.gvsig.expressionevaluator.MutableSymbolTable;
21
import org.gvsig.fmap.dal.BaseStoresRepository;
22
import org.gvsig.fmap.dal.DALLocator;
23

    
24
import org.gvsig.fmap.dal.DataFactory;
25
import org.gvsig.fmap.dal.DataManager;
26
import org.gvsig.fmap.dal.DataServerExplorer;
27
import org.gvsig.fmap.dal.DataServerExplorerFactory;
28
import org.gvsig.fmap.dal.DataServerExplorerParameters;
29
import org.gvsig.fmap.dal.DataServerExplorerPool;
30
import org.gvsig.fmap.dal.DataStore;
31
import org.gvsig.fmap.dal.DataStoreFactory_v2_4;
32
import org.gvsig.fmap.dal.DataStoreParameters;
33
import org.gvsig.fmap.dal.DataStoreProviderFactory;
34
import org.gvsig.fmap.dal.DataTypes;
35
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
36
import org.gvsig.fmap.dal.DatabaseWorkspaceManager.AddDatabaseWorkspaceListener;
37

    
38
import org.gvsig.fmap.dal.NewDataStoreParameters;
39
import org.gvsig.fmap.dal.OpenErrorHandler;
40
import org.gvsig.fmap.dal.Register;
41
import org.gvsig.fmap.dal.StoresRepository;
42
import org.gvsig.fmap.dal.exception.DataException;
43
import org.gvsig.fmap.dal.exception.InitializeException;
44
import org.gvsig.fmap.dal.exception.OpenException;
45
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
46
import org.gvsig.fmap.dal.exception.CreateFileStoreException;
47
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
48
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
49
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
50
import org.gvsig.fmap.dal.feature.DataProfile;
51
import org.gvsig.fmap.dal.feature.EditableFeatureType;
52
import org.gvsig.fmap.dal.feature.Feature;
53
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
54
import org.gvsig.fmap.dal.feature.FeatureQuery;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.dal.feature.ForeingKey;
58
import static org.gvsig.fmap.dal.feature.ForeingKey.MAX_AVAILABLE_VALUES;
59
import org.gvsig.fmap.dal.feature.impl.DALFile;
60
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
61
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
62
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
63
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
64
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
65
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
66
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
67
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
68
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
69
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
70
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
71
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
72
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
73
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
74
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureSymbolTable;
75
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
76
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
77
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
78
import org.gvsig.fmap.dal.spi.DALSPILocator;
79
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
80
import org.gvsig.fmap.dal.spi.DataStoreProvider;
81
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
82
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
83
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
84
import org.gvsig.tools.ToolsLocator;
85
import org.gvsig.tools.dataTypes.DataType;
86
import org.gvsig.tools.dataTypes.DataTypesManager;
87
import org.gvsig.tools.dynobject.DynObject;
88
import org.gvsig.tools.dynobject.DynObjectValueItem;
89
import org.gvsig.tools.dynobject.DynStruct;
90
import org.gvsig.tools.dynobject.DynStruct_v2;
91
import org.gvsig.tools.dynobject.Tags;
92
import org.gvsig.tools.evaluator.Evaluator;
93
import org.gvsig.tools.exception.BaseException;
94
import org.gvsig.tools.extensionpoint.ExtensionPoint;
95
import org.gvsig.tools.folders.FoldersManager;
96
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
97
import org.gvsig.tools.identitymanagement.UnauthorizedException;
98
import org.gvsig.tools.persistence.PersistenceManager;
99
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
100
import org.gvsig.tools.script.Script;
101
import org.gvsig.tools.script.ScriptManager;
102
import org.gvsig.tools.service.spi.Services;
103
import org.gvsig.tools.util.Callable;
104
import org.gvsig.tools.util.Invocable;
105
import org.slf4j.Logger;
106
import org.slf4j.LoggerFactory;
107

    
108
@SuppressWarnings("UseSpecificCatch")
109
public class DefaultDataManager
110
        implements DataManager, DataManagerProviderServices, Services {
111

    
112
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataManager.class);
113
    
114
    final static private String DATA_MANAGER_CACHE = "Data.manager.caches";
115
    final static private String DATA_MANAGER_CACHE_DESCRIPTION =
116
        "DAL cache providers";
117

    
118
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
119

    
120

    
121
    private class Registers {
122

    
123
        private final Register store;
124
        private final Register storeProvider;
125
        private final Register serverExplorer;
126
        private final Register featureIndexProvider;
127

    
128
        public Registers() {
129
            this.store = new RegisterImpl(
130
                    "Data.manager.stores.factory",
131
                    "DAL store factories"
132
            );
133
            this.storeProvider = new RegisterImpl(
134
                    "Data.manager.providers.factory",
135
                    "DAL store provider factories"
136
            );
137
            this.serverExplorer = new RegisterImpl(
138
                    "Data.manager.servereexplorer.factory",
139
                    "DAL server explorer factories"
140
            );
141
            this.featureIndexProvider = new RegisterImpl(
142
                    "Data.manager.feature.index.factory",
143
                    "DAL feature index factories"
144
            );
145

    
146
            this.store.register(new FeatureStoreFactory());
147
        }
148
    }
149
    private static final String TAG_DAL_OPENSTORE = "dal.openstore.";
150

    
151
    private final Registers registers;
152

    
153
    private final Map<Integer, String> defaultDataIndexProviders;
154

    
155
    private OpenErrorHandler openErrorHandler = null;
156

    
157
    private DataServerExplorerPool dataServerExplorerPool = null;
158

    
159
    private List<DataType> dataTypes = null;
160

    
161
    private ClassLoader resourcesLoader = null;
162

    
163
    private List<DataProfile> dataProfiles;
164
    
165
    private final Map<String, DatabaseWorkspaceManager> databaseWorkspaces = new HashMap<>();
166
 
167
    private final Map<String,AddDatabaseWorkspaceListener> addDatabaseWorkspaceListeners = new HashMap<>();
168
    
169
    public DefaultDataManager() {
170
        this.registers = new Registers();
171
        this.defaultDataIndexProviders = new HashMap<>();
172
    }
173

    
174
    @Override
175
    public Register getStoreRegister() {
176
        return this.registers.store;
177
    }
178

    
179
    @Override
180
    public Register getStoreProviderRegister() {
181
        return this.registers.storeProvider;
182
    }
183

    
184
    @Override
185
    public Register getServerExplorerRegister() {
186
        return this.registers.serverExplorer;
187
    }
188

    
189
    @Override
190
    public Register getFeatureIndexRegister() {
191
        return this.registers.featureIndexProvider;
192
    }
193

    
194
    private String getStoreName(DataStoreParameters parameters) {
195
        for (DataFactory factory : this.getStoreRegister()) {
196
            DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) factory;
197
            if (storeFactory.canUse(parameters)) {
198
                return storeFactory.getName();
199
            }
200
        }
201
        return null;
202
    }
203

    
204
    /**
205
     * @deprecated
206
     */
207
    @Override
208
    public void registerDefaultRasterStore(Class rasterStoreClass) {
209
        // Metodo usado por el raster nuevo para regstrar su factoria de store
210
        this.getStoreRegister().register(new RasterStoreFactory(rasterStoreClass));
211
    }
212

    
213
    /**
214
     * @deprecated
215
     */
216
    @Override
217
    public void registerStoreFactory(String name, Class storeFactoryClass) {
218
        // Metodo usado por el raster viejo para registrar las factorias de sus stores
219
        this.getStoreRegister().register(new RasterStoreOldFactory(name, storeFactoryClass));
220
    }
221

    
222
    /**
223
     * @param name
224
     * @param storeProviderClass
225
     * @param parametersClass
226
     * @deprecated use registerStoreProviderFactory
227
     */
228
    @Override
229
    public void registerStoreProvider(String name, Class storeProviderClass,
230
            Class parametersClass) {
231
        if (name == null || storeProviderClass == null || parametersClass == null) {
232
            throw new IllegalArgumentException("Any parameters can be null");
233
        }
234

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

    
240
        if (CoverageStoreProvider.class.isAssignableFrom(storeProviderClass)) {
241
            // Envuelve al proveedor en una factoria por defecto.
242
            this.registerStoreProviderFactory(new DataStoreProviderToCoverageProviderFactoryWrapper(
243
                    name, "", storeProviderClass, parametersClass));
244
            return;
245
        }
246

    
247
        if (FeatureStoreProvider.class.isAssignableFrom(storeProviderClass)) {
248
            // Envuelve al proveedor en una factoria por defecto.
249
            this.registerStoreProviderFactory(new DataStoreProviderToFeatureStoreProviderFactoryWrapper(
250
                    name, "", storeProviderClass, parametersClass));
251
            return;
252
        }
253

    
254
        throw new IllegalArgumentException("Not supported implemtation: name="
255
                + name + " provider class=" + storeProviderClass.getName());
256

    
257
    }
258

    
259
    @Override
260
    public void registerExplorerProvider(String name, Class explorerClass, Class parametersClass) {
261
        if (name == null || explorerClass == null || parametersClass == null) {
262
            // FIXME Exception
263
            throw new IllegalArgumentException("Any parameters can be null");
264
        }
265

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

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

    
280
        // Envuelve al proveedor en una factoria por defecto.
281
        this.registerServerExplorerFactory(
282
                new DataServerExplorerToDataExplorerFactoryWrapper(
283
                        name, "", explorerClass, parametersClass
284
                )
285
        );
286

    
287
    }
288

    
289
    @Override
290
    public void registerStoreFactory(DataStoreFactory_v2_4 factory) {
291
        this.getStoreRegister().register(factory);
292
    }
293

    
294
    @Override
295
    public void registerStoreProviderFactory(DataStoreProviderFactory factory) {
296
        this.getStoreProviderRegister().register(factory);
297
    }
298

    
299
    @Override
300
    public void registerServerExplorerFactory(DataServerExplorerFactory factory) {
301
        this.getServerExplorerRegister().register(factory);
302
    }
303

    
304
    @Override
305
    public DataStoreParameters createStoreParameters(byte[] data) {
306
        try {
307
            PersistenceManager persistenceManager = ToolsLocator.getPersistenceManager();
308
            ByteArrayInputStream stream = new ByteArrayInputStream(data);
309
            DataStoreParameters parameters = (DataStoreParameters) persistenceManager.getObject(stream);
310
            return parameters;
311
        } catch (Exception ex) {
312
            LOGGER.warn("Can't get parameters from byte[].",ex);
313
            return null;
314
        }
315
    }
316

    
317
    @Override
318
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
319
        if( providerName == null ) {
320
            String msg = "Provider name can't be null.";
321
            LOGGER.warn(msg);
322
            throw new IllegalArgumentException(msg);
323
        }
324
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
325
        if( providerFactory == null ) {
326
            String msg = "Can't locate provider factory for '"+providerName+"'.";
327
            LOGGER.warn(msg);
328
            throw new IllegalArgumentException(msg);
329
        }
330
        return (DataStoreParameters) providerFactory.createParameters();
331
    }
332

    
333
    @Override
334
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
335
        try {
336
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
337
            return explorer.getAddParameters(providerName);
338
        } catch (Exception ex) {
339
            throw new InitializeException(ex);
340
        }
341
    }
342

    
343
    @Override
344
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
345
        if( explorerName == null ) {
346
            String msg = "Explorer name can't be null.";
347
            LOGGER.warn(msg);
348
            throw new IllegalArgumentException(msg);
349
        }
350
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
351
        if( explorerFactory == null ) {
352
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
353
            LOGGER.warn(msg);
354
            throw new IllegalArgumentException(msg);
355
        }
356
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
357
        return params;
358
    }
359

    
360
    @Override
361
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
362
        try {
363
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
364
            if (autoOrderAttributeName != null) {
365
                parameters.setDynValue(
366
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
367
                        autoOrderAttributeName);
368
            }
369
            return parameters;
370
        } catch (Exception ex) {
371
            throw new InitializeException(ex);
372
        }
373
    }
374

    
375
    @Override
376
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
377
        if( explorerName == null ) {
378
            String msg = "Explorer name can't be null.";
379
            LOGGER.warn(msg);
380
            throw new IllegalArgumentException(msg);
381
        }
382
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
383
        if( explorerFactory == null ) {
384
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
385
            LOGGER.warn(msg);
386
            throw new IllegalArgumentException(msg);
387
        }
388
        if (parameters == null) {
389
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
390
        }
391
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
392
                parameters,
393
                new DefaultDataServerExplorerProviderServices()
394
        );
395
        return explorer;
396
    }
397

    
398
    @Override
399
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
400
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
401
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorer con solo 
402
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
403
            // llamar al que toca.
404
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
405
        }
406
        if( explorerName == null ) {
407
            String msg = "Explorer name can't be null.";
408
            LOGGER.warn(msg);
409
            throw new IllegalArgumentException(msg);
410
        }
411
        if( (arguments.length % 2)!= 0 ) {
412
            throw new ValidateDataParametersException();
413
        }
414
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
415
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
416
        for( int i=0; i<arguments.length; i+=2 ) {
417
            String name = (String) arguments[i];
418
            if( name.endsWith("=") ) {
419
                name = name.substring(0, name.length()-1);
420
            }
421
            Object value = arguments[i+1];
422
            parameters.setDynValue(name, value);
423
        }
424
        return this.openServerExplorer(explorerName, parameters);
425

    
426
    }
427

    
428
    /**
429
     * @param parameters
430
     * @return
431
     * @throws org.gvsig.fmap.dal.exception.InitializeException
432
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
433
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
434
     * @deprecated see openServerExplorer
435
     */
436
    @Override
437
    public DataServerExplorer createServerExplorer(
438
            DataServerExplorerParameters parameters) throws InitializeException,
439
            ProviderNotRegisteredException, ValidateDataParametersException {
440
        return openServerExplorer(parameters.getExplorerName(), parameters);
441
    }
442

    
443
    /**
444
     * @deprecated use openStore
445
     * @param parameters
446
     * @return
447
     * @throws InitializeException
448
     * @throws ProviderNotRegisteredException
449
     * @throws ValidateDataParametersException
450
     */
451
    @Override
452
    public DataStore createStore(DataStoreParameters parameters)
453
        throws InitializeException, ProviderNotRegisteredException,
454
        ValidateDataParametersException {
455
        return openStore(parameters.getDataStoreName(), parameters);
456
    }
457

    
458
    @Override
459
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
460
        if( providerName == null ) {
461
            String msg = "Provider name can't be null.";
462
            LOGGER.warn(msg);
463
            throw new IllegalArgumentException(msg);
464
        }
465
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
466
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
467
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
468
        }
469

    
470
        parameters.validate();
471

    
472
        String storeName = this.getStoreName(parameters);
473
        if( StringUtils.isEmpty(storeName) ) {
474
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
475
            LOGGER.warn(msg);
476
            throw new IllegalArgumentException(msg);
477
        }
478

    
479
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
480
        if( storeFactory == null ) {
481
            String msg = "Can't locate store factory for '"+storeName+"'.";
482
            LOGGER.warn(msg);
483
            throw new IllegalArgumentException(msg);
484
        }
485
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
486
        if( providerFactory == null ) {
487
            String msg = "Can't locate provider factory for '"+providerName+"'.";
488
            LOGGER.warn(msg);
489
            throw new IllegalArgumentException(msg);
490
        }
491

    
492
        DataStore store = (DataStore) storeFactory.create(parameters, this);
493
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
494

    
495
        storeFactory.setProvider(store, provider);
496
        return store;
497
    }
498

    
499
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
500
        String storeName = this.getStoreName(parameters);
501
        if( StringUtils.isEmpty(storeName) ) {
502
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
503
            LOGGER.warn(msg);
504
            throw new IllegalArgumentException(msg);
505
        }
506

    
507
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
508
        if( storeFactory == null ) {
509
            String msg = "Can't locate store factory for '"+storeName+"'.";
510
            LOGGER.warn(msg);
511
            throw new IllegalArgumentException(msg);
512
        }
513
        DataStore store = (DataStore) storeFactory.create(parameters, this);
514
        storeFactory.setProvider(store, provider);
515
        return store;
516
    }
517
    
518
    @Override
519
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
520
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
521
        DataStore store = openStore(params.getDataStoreName(), params);
522
        return store;
523
    }
524

    
525
    @Override
526
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
527
        if( arguments.length == 1 ) { 
528
            // Desde jython entra por este metodo en lugar de los especificos
529
            // de DataStoreParameters o DynObject
530
            if( arguments[0] instanceof DataStoreParameters ) {
531
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
532
            } else if( arguments[0] instanceof DynObject ) {
533
                return this.openStore(providerName, (DynObject)(arguments[0]));
534
            }
535
        }
536
        if( (arguments.length % 2)!= 0 ) {
537
            throw new ValidateDataParametersException();
538
        }
539
        if( providerName == null ) {
540
            String msg = "Provider name can't be null.";
541
            LOGGER.warn(msg);
542
            throw new IllegalArgumentException(msg);
543
        }
544
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
545
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
546
        for( int i=0; i<arguments.length; i+=2 ) {
547
            String name = (String) arguments[i];
548
            if( name.endsWith("=") ) {
549
                name = name.substring(0, name.length()-1);
550
            }
551
            Object value = arguments[i+1];
552
            parameters.setDynValue(name, value);
553
        }
554
        return this.openStore(providerName, parameters);
555
    }
556

    
557
    @Override
558
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
559
        try {
560
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
561
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
562
            return (FeatureStore) store;
563
        } catch (Exception ex) {
564
            throw new InitializeException(ex);
565
        }
566
    }
567

    
568
    @Override
569
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
570
        if( providerName == null ) {
571
            String msg = "Provider name can't be null.";
572
            LOGGER.warn(msg);
573
            throw new IllegalArgumentException(msg);
574
        }
575
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
576
        return (DataStoreProviderFactory) providerFactory;
577
    }
578

    
579
    @Override
580
    public List<String> getStoreProviders() {
581
        return this.getStoreProviderRegister().getFactoryNames();
582
    }
583

    
584
    @Override
585
    public List<String> getStoreProviders(String explorerName) {
586
        if( explorerName == null ) {
587
            String msg = "Explorer name can't be null.";
588
            LOGGER.warn(msg);
589
            throw new IllegalArgumentException(msg);
590
        }
591
        try {
592
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
593
            List names = explorer.getDataStoreProviderNames();
594
            return names;
595
        } catch (Exception ex) {
596
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
597
        }
598
    }
599

    
600
    @Override
601
    public List<String> getExplorerProviders() {
602
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
603
        return names;
604
    }
605

    
606
    @Override
607
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
608

    
609
        String providerName = parameters.getDataStoreName();
610
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
611
        if (providerFactory == null) {
612
            throw new ProviderNotRegisteredException(providerName);
613
        }
614
        while (true) {
615
            try {
616
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
617
                        parameters, providerServices
618
                );
619
                return provider;
620
            } catch (Exception e) {
621
                if (openErrorHandler == null) {
622
                    throw new InitializeException(providerName, e);
623
                }
624
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
625
                if (!retry) {
626
                    throw new InitializeException(providerName, e);
627
                }
628
            }
629
        }
630
    }
631

    
632
    @Override
633
    public List<String> getFeatureIndexProviders() {
634
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
635
        return names;
636
    }
637

    
638
    @Override
639
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
640
        this.defaultDataIndexProviders.put(dataType, name);
641
    }
642

    
643
    @Override
644
    public String getDefaultFeatureIndexProviderName(int dataType) {
645
        return this.defaultDataIndexProviders.get(dataType);
646
    }
647

    
648
    @Override
649
    public FeatureIndexProviderServices createFeatureIndexProvider(
650
            String name,
651
            FeatureStore store,
652
            FeatureType type,
653
            String indexName,
654
            FeatureAttributeDescriptor attr
655
    ) throws InitializeException, ProviderNotRegisteredException {
656

    
657
        if (name == null) {
658
            name = getDefaultFeatureIndexProviderName(attr.getType());
659
        }
660

    
661
        if (name == null) {
662
            throw new InitializeException(
663
                    "There not any index provider registered.", null);
664
        }
665
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
666
        if (indexfactory == null) {
667
            throw new InitializeException(
668
                    "There not any index provider registered with name '" + name + "'.", null);
669

    
670
        }
671
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
672

    
673
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
674
                (FeatureStoreProviderServices) store,
675
                type,
676
                provider,
677
                attr.getName(),
678
                indexName
679
        );
680
        services.initialize();
681
        return services;
682

    
683
    }
684

    
685
    @Override
686
    public String getTemporaryDirectory() {
687
        FoldersManager manager = ToolsLocator.getFoldersManager();
688
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
689
        return folder.getAbsolutePath();
690
    }
691

    
692
    @Override
693
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
694
        if (!(struct instanceof DynStruct_v2)) {
695
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
696
        }
697
        Tags tags = ((DynStruct_v2) struct).getTags();
698
        return this.createStoreParameters(tags);
699
    }
700

    
701
    @Override
702
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
703
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
704
        if (providerName == null) {
705
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
706
        }
707
        int prefixlen = TAG_DAL_OPENSTORE.length();
708
        DataStoreParameters parameters = this.createStoreParameters(providerName);
709
        for (String key : tags) {
710
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
711
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
712
            }
713
        }
714
        return parameters;
715
    }
716

    
717
    @Override
718
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
719
        DataStoreParameters paramters = this.createStoreParameters(struct);
720
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
721
        return store;
722
    }
723

    
724
    @Override
725
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
726
        if( explorerName == null ) {
727
            String msg = "Explorer name can't be null.";
728
            LOGGER.warn(msg);
729
            throw new IllegalArgumentException(msg);
730
        }
731
        if( providerName == null ) {
732
            String msg = "Provider name can't be null.";
733
            LOGGER.warn(msg);
734
            throw new IllegalArgumentException(msg);
735
        }
736

    
737
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
738
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
739
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
740
        }
741
        parameters.validate();
742
        try {
743
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
744
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
745
            server.add(providerName, parameters, overwrite);
746
        } catch (Exception e) {
747
            throw new InitializeException(e);
748
        }
749
    }
750

    
751
    @Override
752
    @Deprecated
753
    public Evaluator createExpresion(String expression) throws InitializeException {
754
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
755
        exp.setPhrase(expression);
756
        return this.createExpresion(exp);
757
    }
758

    
759
    @Override
760
    @Deprecated
761
    public Evaluator createExpresion(Expression expression) throws InitializeException {
762
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
763
        return exp;        
764
    }
765

    
766

    
767
    @Override
768
    public Evaluator createFilter(String expression) throws InitializeException {
769
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
770
        exp.setPhrase(expression);
771
        return this.createFilter(exp);
772
    }
773

    
774
    @Override
775
    public Evaluator createFilter(Expression expression) throws InitializeException {
776
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
777
        return exp;        
778
    }
779

    
780
    @Override
781
    public FeaturePagingHelper createFeaturePagingHelper(
782
            FeatureStore featureStore, int pageSize) throws BaseException {
783
        return new FeaturePagingHelperImpl(featureStore, pageSize);
784
    }
785

    
786
    @Override
787
    public FeaturePagingHelper createFeaturePagingHelper(
788
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
789
            throws BaseException {
790
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
791
    }
792

    
793
    @Override
794
    public void setOpenErrorHandler(OpenErrorHandler handler) {
795
        openErrorHandler = handler;
796
    }
797

    
798
    @Override
799
    public OpenErrorHandler getOpenErrorHandler() {
800
        return this.openErrorHandler;
801
    }
802

    
803
    @Override
804
    public EditableFeatureType createFeatureType() {
805
        return new DefaultEditableFeatureType(null);
806
    }
807

    
808
    @Override
809
    public DataServerExplorerPool getDataServerExplorerPool() {
810
        if (this.dataServerExplorerPool == null) {
811
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
812
        }
813
        return this.dataServerExplorerPool;
814
    }
815

    
816
    @Override
817
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
818
        this.dataServerExplorerPool = pool;
819
    }
820

    
821
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
822
        if (params instanceof DataStoreParameters) {
823
            return (DataStoreParameters) params;
824
        }
825
        String providerName;
826
        try {
827
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
828
        } catch (Exception ex) {
829
            providerName = provider;
830
        }
831
        DataStoreParameters parameters = this.createStoreParameters(providerName);
832
        ToolsLocator.getDynObjectManager().copy(params, parameters);
833
        return parameters;
834
    }
835

    
836
    @Override
837
    public List<DataType> getDataTypes() {
838
        if (dataTypes == null) {
839
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
840
            dataTypes = new ArrayList<>();
841
            dataTypes.add(manager.get(DataTypes.STRING));
842
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
843
            dataTypes.add(manager.get(DataTypes.INT));
844
            dataTypes.add(manager.get(DataTypes.DOUBLE));
845
            dataTypes.add(manager.get(DataTypes.DATE));
846
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
847
        }
848
        return dataTypes;
849
    }
850

    
851
    @Override
852
    public void setResourcesLoader(ClassLoader loader) {
853
        this.resourcesLoader = loader;
854
    }
855

    
856
    @Override
857
    public void setResourcesLoader(File folder) {
858
        if (folder == null) {
859
            this.resourcesLoader = null;
860
            return;
861
        }
862
        try {
863
            URL[] urls = new URL[]{folder.toURI().toURL()};
864
            this.resourcesLoader = new URLClassLoader(urls);
865
        } catch (Exception ex) {
866
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
867
        }
868
    }
869

    
870
    @Override
871
    public URL getResource(Object reourceLoader, String name) {
872
        URL x;
873
        if (this.resourcesLoader != null) {
874
            x = this.resourcesLoader.getResource(name);
875
            if (x != null) {
876
                return x;
877
            }
878
        }
879
        x = reourceLoader.getClass().getResource(name);
880
        return x;
881
    }
882

    
883
    @Override
884
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
885
        InputStream x;
886
        if (this.resourcesLoader != null) {
887
            x = this.resourcesLoader.getResourceAsStream(name);
888
            if (x != null) {
889
                return x;
890
            }
891
        }
892
        x = reourceLoader.getClass().getResourceAsStream(name);
893
        return x;
894
    }
895

    
896
    @Override
897
    public ExpressionBuilder createExpressionBuilder() {
898
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
899
    }
900

    
901
    public void registerFeatureCacheProvider(
902
        FeatureCacheProviderFactory providerFactory) {
903
        ToolsLocator.getExtensionPointManager()
904
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
905
            .append(providerFactory.getName(), "", providerFactory);
906
    }
907

    
908
    public FeatureCacheProvider createFeatureCacheProvider(String name,
909
        DynObject parameters) throws DataException {
910
        if (name == null) {
911
            throw new InitializeException(
912
                "It is necessary to provide a cache name", null);
913
        }
914
        if (parameters == null) {
915
            throw new InitializeException(
916
                "It is necessary to provide parameters to create the explorer",
917
                null);
918
        }
919
        FeatureCacheProviderFactory featureCacheProviderFactory;
920
        try {
921
            featureCacheProviderFactory =
922
                (FeatureCacheProviderFactory) ToolsLocator
923
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
924
                    .create(name);
925
            if (featureCacheProviderFactory == null) {
926
                throw new ProviderNotRegisteredException(name);
927
            }
928
            return featureCacheProviderFactory.createCacheProvider(parameters);
929
        } catch (InstantiationException e) {
930
            throw new InitializeException(e);
931
        } catch (IllegalAccessException e) {
932
            throw new InitializeException(e);
933
        }
934
    }
935

    
936
    @Override
937
    public List getFeatureCacheProviders() {
938
        ExtensionPoint extensionPoint =
939
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
940
        if (extensionPoint != null) {
941
            return ToolsLocator.getExtensionPointManager()
942
                .get(DATA_MANAGER_CACHE).getNames();
943
        } else {
944
            return new ArrayList();
945
        }
946
    }
947

    
948
    @Override
949
    public DynObject createCacheParameters(String name)
950
        throws InitializeException, ProviderNotRegisteredException {
951
        if (name == null) {
952
            throw new InitializeException(
953
                "It is necessary to provide a cache name", null);
954
        }
955
        FeatureCacheProviderFactory featureCacheProviderFactory;
956
        try {
957
            featureCacheProviderFactory =
958
                (FeatureCacheProviderFactory) ToolsLocator
959
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
960
                    .create(name);
961
            if (featureCacheProviderFactory == null) {
962
                throw new ProviderNotRegisteredException(name);
963
            }
964
            return featureCacheProviderFactory.createParameters();
965
        } catch (InstantiationException e) {
966
            throw new InitializeException(e);
967
        } catch (IllegalAccessException e) {
968
            throw new InitializeException(e);
969
        }
970
    }
971

    
972
    @Override
973
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
974
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
975
        DataServerExplorerParameters eparams = null;
976
        DataServerExplorer serverExplorer;
977
        try {
978
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
979
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
980
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
981
        }
982

    
983
        try {
984
            serverExplorer.add(providerName, params, overwrite);
985
        } catch (DataException e) {
986
            throw new CreateFileStoreException(e, providerName);
987
        }
988
    }
989

    
990
    @Override
991
    public FeatureSymbolTable createFeatureSymbolTable() {
992
        FeatureSymbolTable symbolTable = new DefaultFeatureSymbolTable();
993
        return symbolTable;
994
    }
995

    
996
    @Override
997
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
998
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
999
        return emulator;
1000
    }
1001

    
1002
    @Override
1003
    public void registerDataProfile(DataProfile profile) {
1004
        if( profile==null ) {
1005
            return;
1006
        }
1007
        if( this.dataProfiles==null ) {
1008
            this.dataProfiles = new ArrayList<>();
1009
            this.dataProfiles.add(profile);
1010
            return;
1011
        }
1012
        for (DataProfile theProfile : this.dataProfiles) {
1013
            if( theProfile.getID().equalsIgnoreCase(profile.getID()) ) {
1014
                return;
1015
            }
1016
        }
1017
        this.dataProfiles.add(profile);
1018
    }
1019

    
1020
    @Override
1021
    public List<DataProfile> getDataProfiles() {
1022
        if( this.dataProfiles==null ) {
1023
            return null;
1024
        }
1025
        return Collections.unmodifiableList(this.dataProfiles);
1026
    }
1027

    
1028
    @Override
1029
    public DataProfile getDataProfile(String name) {
1030
        if( StringUtils.isBlank(name) ) {
1031
            return null;
1032
        }
1033
        for (DataProfile theProfile : this.dataProfiles) {
1034
            if( name.equalsIgnoreCase(theProfile.getName()) ) {
1035
                return theProfile;
1036
            }
1037
        }
1038
        return null;
1039
    }
1040

    
1041
    private StoresRepository storesRepository;
1042
    
1043
    @Override
1044
    public StoresRepository getStoresRepository() {
1045
        if( this.storesRepository==null ) {
1046
            this.storesRepository = new BaseStoresRepository("DAL");
1047
        }
1048
        return this.storesRepository;
1049
    }
1050
    
1051
    @Override
1052
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1053
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1054
        return workspace;
1055
    }
1056

    
1057
    @Override
1058
    public void addDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1059
        this.databaseWorkspaces.put(databaseWorkspace.getId(),databaseWorkspace);
1060
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1061
        this.getStoresRepository().addRepository(repo);
1062

    
1063
        for (AddDatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1064
            if( listener!=null ) {
1065
                try {
1066
                    listener.onAddDatabaseWorkspace(databaseWorkspace);
1067
                } catch(Throwable th) {
1068
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1069
                }
1070
            }
1071
        }
1072
        try {
1073
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1074
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1075
            Script script = scriptManager.loadScript(resources, "OnConnectToWorkspace.script");
1076
            if( script != null ) {
1077
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1078
            }
1079
        } catch(Throwable th) {
1080
            LOGGER.warn("Problems executing 'OnConnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1081
        }
1082
    }
1083
    
1084
    @Override
1085
    public void addDatabaseWorkspaceListener(AddDatabaseWorkspaceListener listener) {
1086
        this.addDatabaseWorkspaceListeners.put(listener.getName(), listener);
1087
    }
1088

    
1089
    @Override
1090
    public DatabaseWorkspaceManager getDatabaseWorkspace(String name) {
1091
        return this.databaseWorkspaces.get(name);
1092
    }
1093
    
1094
    @Override
1095
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataStoreParameters params) {
1096
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1097
            if( databaseWorkspace.getStoresRepository().contains(params) ) {
1098
                return databaseWorkspace;
1099
            }
1100
        }
1101
        return null;
1102
    }
1103
    
1104
    @Override
1105
    public void writeDALResource(ResourcesStorage resources, DataStore store) {
1106
        ResourcesStorage.Resource resource = null;
1107
        try {
1108
            if( resources == null || resources.isReadOnly() ) {
1109
                return;
1110
            }
1111
            resource = resources.getResource("dal");
1112
            if( resource == null || resource.isReadOnly() ) {
1113
                return;
1114
            }
1115
            DALFile dalFile = DALFile.getDALFile();
1116
            dalFile.setStore((DefaultFeatureStore) store);
1117
            if( !dalFile.isEmpty() ) {
1118
                dalFile.write(resource);
1119
            }
1120
        } catch (Throwable ex) {
1121
            LOGGER.warn("Can't save DAL resource", ex);
1122
        } finally {
1123
            IOUtils.closeQuietly(resource);
1124
        }
1125
    
1126
        
1127
    }
1128

    
1129
    @Override
1130
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
1131
        ResourcesStorage.Resource resource = null;
1132
        try {
1133
            if( resources == null || resources.isReadOnly() ) {
1134
                return;
1135
            }
1136
            resource = resources.getResource("dal");
1137
            if( resource == null || resource.isReadOnly() ) {
1138
                return;
1139
            }
1140
            DALFile dalFile = DALFile.getDALFile();
1141
            dalFile.setFeatureType(featureType);
1142
            if( !dalFile.isEmpty() ) {
1143
                dalFile.write(resource);
1144
            }
1145
        } catch (Throwable ex) {
1146
            LOGGER.warn("Can't save DAL resource", ex);
1147
        } finally {
1148
            IOUtils.closeQuietly(resource);
1149
        }
1150
    }
1151

    
1152
    private Map<String,DynObjectValueItem[]> availableValues = null;
1153
    
1154
    @Override
1155
    public DynObjectValueItem[] getAvailableValues(FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1156
        String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName();
1157
        if( this.availableValues==null ) {
1158
            this.availableValues = new HashMap<>();
1159
        }
1160
        DynObjectValueItem[] values = this.availableValues.get(keyName);
1161
        if( values != null ) {
1162
            return values;
1163
        }
1164
        if( !descriptor.isForeingKey() ) {
1165
            return null;
1166
        }
1167
        ForeingKey foreingKey = descriptor.getForeingKey();
1168
        try {
1169
            StoresRepository theStoresRepository;
1170
            FeatureStore store = descriptor.getStore();
1171
            if (store == null) {
1172
                theStoresRepository = DALLocator.getDataManager().getStoresRepository();
1173

    
1174
            } else {
1175
                theStoresRepository = store.getStoresRepository();
1176
            }
1177
            FeatureStore foreingStore = (FeatureStore) theStoresRepository.getStore(
1178
                foreingKey.getTableName()
1179
            );
1180
            Expression labelExpression = foreingKey.getLabelExpression(null);
1181
            String codeName = foreingKey.getCodeName();
1182
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable();
1183
            MutableSymbolTable symbolTable = featureSymbolTable.createParent();
1184
        
1185
            int count = (int) foreingStore.getFeatureCount();
1186
            values = new DynObjectValueItem[Math.min(count, MAX_AVAILABLE_VALUES)];
1187
            int n = 0;
1188
            for (Feature feature : foreingStore.getFeatureSet()) {
1189
                Object code = feature.get(codeName);
1190
                Object value;
1191
                if (labelExpression == null) {
1192
                    value = code;
1193
                } else {
1194
                    featureSymbolTable.setFeature(feature);
1195
                    value = labelExpression.execute(symbolTable);
1196
                }
1197
                values[n++] = new DynObjectValueItem(code, Objects.toString(value, Objects.toString(code, "##ERROR##")));
1198
                if( n>=MAX_AVAILABLE_VALUES ) {
1199
                    break;
1200
                }
1201
            }
1202
            this.availableValues.put(keyName, values);
1203
            return values;
1204
        } catch (Exception ex) {
1205
            LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex);
1206
        }
1207
        return null;
1208
    }
1209

    
1210
    @Override
1211
    public String createUniqueID() {
1212
        UUID x = UUID.randomUUID();
1213
        String s = x.toString();
1214
        return s;
1215
    }
1216
}