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

History | View | Annotate | Download (47.7 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 openServerExplorercon 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
            Object value = arguments[i+1];
419
            parameters.setDynValue(name, value);
420
        }
421
        return this.openServerExplorer(explorerName, parameters);
422

    
423
    }
424

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

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

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

    
467
        parameters.validate();
468

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

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

    
489
        DataStore store = (DataStore) storeFactory.create(parameters, this);
490
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
491

    
492
        storeFactory.setProvider(store, provider);
493
        return store;
494
    }
495

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

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

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

    
551
    @Override
552
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
553
        try {
554
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
555
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
556
            return (FeatureStore) store;
557
        } catch (Exception ex) {
558
            throw new InitializeException(ex);
559
        }
560
    }
561

    
562
    @Override
563
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
564
        if( providerName == null ) {
565
            String msg = "Provider name can't be null.";
566
            LOGGER.warn(msg);
567
            throw new IllegalArgumentException(msg);
568
        }
569
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
570
        return (DataStoreProviderFactory) providerFactory;
571
    }
572

    
573
    @Override
574
    public List<String> getStoreProviders() {
575
        return this.getStoreProviderRegister().getFactoryNames();
576
    }
577

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

    
594
    @Override
595
    public List<String> getExplorerProviders() {
596
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
597
        return names;
598
    }
599

    
600
    @Override
601
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
602

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

    
626
    @Override
627
    public List<String> getFeatureIndexProviders() {
628
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
629
        return names;
630
    }
631

    
632
    @Override
633
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
634
        this.defaultDataIndexProviders.put(dataType, name);
635
    }
636

    
637
    @Override
638
    public String getDefaultFeatureIndexProviderName(int dataType) {
639
        return this.defaultDataIndexProviders.get(dataType);
640
    }
641

    
642
    @Override
643
    public FeatureIndexProviderServices createFeatureIndexProvider(
644
            String name,
645
            FeatureStore store,
646
            FeatureType type,
647
            String indexName,
648
            FeatureAttributeDescriptor attr
649
    ) throws InitializeException, ProviderNotRegisteredException {
650

    
651
        if (name == null) {
652
            name = getDefaultFeatureIndexProviderName(attr.getType());
653
        }
654

    
655
        if (name == null) {
656
            throw new InitializeException(
657
                    "There not any index provider registered.", null);
658
        }
659
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
660
        if (indexfactory == null) {
661
            throw new InitializeException(
662
                    "There not any index provider registered with name '" + name + "'.", null);
663

    
664
        }
665
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
666

    
667
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
668
                (FeatureStoreProviderServices) store,
669
                type,
670
                provider,
671
                attr.getName(),
672
                indexName
673
        );
674
        services.initialize();
675
        return services;
676

    
677
    }
678

    
679
    @Override
680
    public String getTemporaryDirectory() {
681
        FoldersManager manager = ToolsLocator.getFoldersManager();
682
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
683
        return folder.getAbsolutePath();
684
    }
685

    
686
    @Override
687
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
688
        if (!(struct instanceof DynStruct_v2)) {
689
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
690
        }
691
        Tags tags = ((DynStruct_v2) struct).getTags();
692
        return this.createStoreParameters(tags);
693
    }
694

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

    
711
    @Override
712
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
713
        DataStoreParameters paramters = this.createStoreParameters(struct);
714
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
715
        return store;
716
    }
717

    
718
    @Override
719
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
720
        if( explorerName == null ) {
721
            String msg = "Explorer name can't be null.";
722
            LOGGER.warn(msg);
723
            throw new IllegalArgumentException(msg);
724
        }
725
        if( providerName == null ) {
726
            String msg = "Provider name can't be null.";
727
            LOGGER.warn(msg);
728
            throw new IllegalArgumentException(msg);
729
        }
730

    
731
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
732
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
733
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
734
        }
735
        parameters.validate();
736
        try {
737
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
738
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
739
            server.add(providerName, parameters, overwrite);
740
        } catch (Exception e) {
741
            throw new InitializeException(e);
742
        }
743
    }
744

    
745
    @Override
746
    @Deprecated
747
    public Evaluator createExpresion(String expression) throws InitializeException {
748
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
749
        exp.setPhrase(expression);
750
        return this.createExpresion(exp);
751
    }
752

    
753
    @Override
754
    @Deprecated
755
    public Evaluator createExpresion(Expression expression) throws InitializeException {
756
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
757
        return exp;        
758
    }
759

    
760

    
761
    @Override
762
    public Evaluator createFilter(String expression) throws InitializeException {
763
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
764
        exp.setPhrase(expression);
765
        return this.createFilter(exp);
766
    }
767

    
768
    @Override
769
    public Evaluator createFilter(Expression expression) throws InitializeException {
770
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
771
        return exp;        
772
    }
773

    
774
    @Override
775
    public FeaturePagingHelper createFeaturePagingHelper(
776
            FeatureStore featureStore, int pageSize) throws BaseException {
777
        return new FeaturePagingHelperImpl(featureStore, pageSize);
778
    }
779

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

    
787
    @Override
788
    public void setOpenErrorHandler(OpenErrorHandler handler) {
789
        openErrorHandler = handler;
790
    }
791

    
792
    @Override
793
    public OpenErrorHandler getOpenErrorHandler() {
794
        return this.openErrorHandler;
795
    }
796

    
797
    @Override
798
    public EditableFeatureType createFeatureType() {
799
        return new DefaultEditableFeatureType(null);
800
    }
801

    
802
    @Override
803
    public DataServerExplorerPool getDataServerExplorerPool() {
804
        if (this.dataServerExplorerPool == null) {
805
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
806
        }
807
        return this.dataServerExplorerPool;
808
    }
809

    
810
    @Override
811
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
812
        this.dataServerExplorerPool = pool;
813
    }
814

    
815
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
816
        if (params instanceof DataStoreParameters) {
817
            return (DataStoreParameters) params;
818
        }
819
        String providerName;
820
        try {
821
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
822
        } catch (Exception ex) {
823
            providerName = provider;
824
        }
825
        DataStoreParameters parameters = this.createStoreParameters(providerName);
826
        ToolsLocator.getDynObjectManager().copy(params, parameters);
827
        return parameters;
828
    }
829

    
830
    @Override
831
    public List<DataType> getDataTypes() {
832
        if (dataTypes == null) {
833
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
834
            dataTypes = new ArrayList<>();
835
            dataTypes.add(manager.get(DataTypes.STRING));
836
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
837
            dataTypes.add(manager.get(DataTypes.INT));
838
            dataTypes.add(manager.get(DataTypes.DOUBLE));
839
            dataTypes.add(manager.get(DataTypes.DATE));
840
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
841
        }
842
        return dataTypes;
843
    }
844

    
845
    @Override
846
    public void setResourcesLoader(ClassLoader loader) {
847
        this.resourcesLoader = loader;
848
    }
849

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

    
864
    @Override
865
    public URL getResource(Object reourceLoader, String name) {
866
        URL x;
867
        if (this.resourcesLoader != null) {
868
            x = this.resourcesLoader.getResource(name);
869
            if (x != null) {
870
                return x;
871
            }
872
        }
873
        x = reourceLoader.getClass().getResource(name);
874
        return x;
875
    }
876

    
877
    @Override
878
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
879
        InputStream x;
880
        if (this.resourcesLoader != null) {
881
            x = this.resourcesLoader.getResourceAsStream(name);
882
            if (x != null) {
883
                return x;
884
            }
885
        }
886
        x = reourceLoader.getClass().getResourceAsStream(name);
887
        return x;
888
    }
889

    
890
    @Override
891
    public ExpressionBuilder createExpressionBuilder() {
892
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
893
    }
894

    
895
    public void registerFeatureCacheProvider(
896
        FeatureCacheProviderFactory providerFactory) {
897
        ToolsLocator.getExtensionPointManager()
898
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
899
            .append(providerFactory.getName(), "", providerFactory);
900
    }
901

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

    
930
    @Override
931
    public List getFeatureCacheProviders() {
932
        ExtensionPoint extensionPoint =
933
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
934
        if (extensionPoint != null) {
935
            return ToolsLocator.getExtensionPointManager()
936
                .get(DATA_MANAGER_CACHE).getNames();
937
        } else {
938
            return new ArrayList();
939
        }
940
    }
941

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

    
966
    @Override
967
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
968
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
969
        DataServerExplorerParameters eparams = null;
970
        DataServerExplorer serverExplorer;
971
        try {
972
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
973
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
974
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
975
        }
976

    
977
        try {
978
            serverExplorer.add(providerName, params, overwrite);
979
        } catch (DataException e) {
980
            throw new CreateFileStoreException(e, providerName);
981
        }
982
    }
983

    
984
    @Override
985
    public FeatureSymbolTable createFeatureSymbolTable() {
986
        FeatureSymbolTable symbolTable = new DefaultFeatureSymbolTable();
987
        return symbolTable;
988
    }
989

    
990
    @Override
991
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
992
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
993
        return emulator;
994
    }
995

    
996
    @Override
997
    public void registerDataProfile(DataProfile profile) {
998
        if( profile==null ) {
999
            return;
1000
        }
1001
        if( this.dataProfiles==null ) {
1002
            this.dataProfiles = new ArrayList<>();
1003
            this.dataProfiles.add(profile);
1004
            return;
1005
        }
1006
        for (DataProfile theProfile : this.dataProfiles) {
1007
            if( theProfile.getID().equalsIgnoreCase(profile.getID()) ) {
1008
                return;
1009
            }
1010
        }
1011
        this.dataProfiles.add(profile);
1012
    }
1013

    
1014
    @Override
1015
    public List<DataProfile> getDataProfiles() {
1016
        if( this.dataProfiles==null ) {
1017
            return null;
1018
        }
1019
        return Collections.unmodifiableList(this.dataProfiles);
1020
    }
1021

    
1022
    @Override
1023
    public DataProfile getDataProfile(String name) {
1024
        if( StringUtils.isBlank(name) ) {
1025
            return null;
1026
        }
1027
        for (DataProfile theProfile : this.dataProfiles) {
1028
            if( name.equalsIgnoreCase(theProfile.getName()) ) {
1029
                return theProfile;
1030
            }
1031
        }
1032
        return null;
1033
    }
1034

    
1035
    private StoresRepository storesRepository;
1036
    
1037
    @Override
1038
    public StoresRepository getStoresRepository() {
1039
        if( this.storesRepository==null ) {
1040
            this.storesRepository = new BaseStoresRepository("DAL");
1041
        }
1042
        return this.storesRepository;
1043
    }
1044
    
1045
    @Override
1046
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1047
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1048
        return workspace;
1049
    }
1050

    
1051
    @Override
1052
    public void addDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1053
        this.databaseWorkspaces.put(databaseWorkspace.getId(),databaseWorkspace);
1054
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1055
        this.getStoresRepository().addRepository(repo);
1056

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

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

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

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

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

    
1204
    @Override
1205
    public String createUniqueID() {
1206
        UUID x = UUID.randomUUID();
1207
        String s = x.toString();
1208
        return s;
1209
    }
1210
        @Override
1211
    public int getDefaultSize(int dataType) {
1212
        int size;
1213
        switch (dataType) {
1214
            case DataTypes.STRING:
1215
                size = 50;
1216
                break;
1217
            case DataTypes.INT:
1218
                size = 10;
1219
                break;
1220
            case DataTypes.LONG:
1221
                size = 20;
1222
                break;
1223
            case DataTypes.FLOAT:
1224
                size = 10;
1225
                break;
1226
            case DataTypes.DOUBLE:
1227
                size = 20;
1228
                break;
1229
            default:
1230
                size = 0;
1231
        }
1232
        return size;
1233
    }
1234
}