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

History | View | Annotate | Download (49.5 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.expressionevaluator.impl.DefaultDALExpressionBuilder;
22
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
23
import org.gvsig.fmap.dal.BaseStoresRepository;
24
import org.gvsig.fmap.dal.DALLocator;
25

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

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

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

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

    
120
    public static final String FILESYSTEM_EXPLORER_NAME = "FilesystemExplorer";
121

    
122

    
123
    private class Registers {
124

    
125
        private final Register store;
126
        private final Register storeProvider;
127
        private final Register serverExplorer;
128
        private final Register featureIndexProvider;
129

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

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

    
153
    private final Registers registers;
154

    
155
    private final Map<Integer, String> defaultDataIndexProviders;
156

    
157
    private OpenErrorHandler openErrorHandler = null;
158

    
159
    private DataServerExplorerPool dataServerExplorerPool = null;
160

    
161
    private List<DataType> dataTypes = null;
162

    
163
    private ClassLoader resourcesLoader = null;
164

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

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

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

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

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

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

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

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

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

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

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

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

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

    
259
    }
260

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

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

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

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

    
289
    }
290

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

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

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

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

    
319
    public DataStoreParameters createStoreParameters(String providerName) throws InitializeException, ProviderNotRegisteredException {
320
      // Cuando desde python se llama a createStoreParameters con solo un argumento 
321
      // acaba entrando por aqui en lugar de por
322
      //   createStoreParameters(String providerName, Object... arguments)
323
      return this.createStoreParameters(providerName, (Object[]) null);
324
    }
325

    
326
    @Override
327
    public DataStoreParameters createStoreParameters(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException {
328
        if( providerName == null ) {
329
            String msg = "Provider name can't be null.";
330
            LOGGER.warn(msg);
331
            throw new IllegalArgumentException(msg);
332
        }
333
        if( arguments!=null && arguments.length>0 ) {
334
          if( arguments.length == 1 ) { 
335
              // Desde jython entra por este metodo en lugar de los especificos
336
              // de DataStoreParameters o DynObject
337
              if( arguments[0] instanceof DataStoreParameters ) {
338
                  return this.createStoreParameters(providerName, (DataStoreParameters)(arguments[0]));
339
              } else if( arguments[0] instanceof DynObject ) {
340
                  return this.createStoreParameters(providerName, (DynObject)(arguments[0]));
341
              }
342
          }
343
          if( (arguments.length % 2)!= 0 ) {
344
              throw new IllegalArgumentException("The number of arguments must be even.");
345
          }
346
        }
347
        if( providerName == null ) {
348
            String msg = "Provider name can't be null.";
349
            LOGGER.warn(msg);
350
            throw new IllegalArgumentException(msg);
351
        }
352
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
353
        if( providerFactory == null ) {
354
            String msg = "Can't locate provider factory for '"+providerName+"'.";
355
            LOGGER.warn(msg);
356
            throw new IllegalArgumentException(msg);
357
        }
358
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
359
        if( arguments!=null && arguments.length>0 ) {
360
          for( int i=0; i<arguments.length; i+=2 ) {
361
              String name = (String) arguments[i];
362
              if( name.endsWith("=") ) {
363
                  name = name.substring(0, name.length()-1);
364
              }
365
              Object value = arguments[i+1];
366
              parameters.setDynValue(name, value);
367
          }
368
        }
369
        return parameters;
370
    }
371

    
372
    @Override
373
    public NewDataStoreParameters createNewStoreParameters(String explorerName, String providerName) throws InitializeException, ProviderNotRegisteredException {
374
        try {
375
            DataServerExplorer explorer = this.openServerExplorer(explorerName, (DataServerExplorerParameters)null);
376
            return explorer.getAddParameters(providerName);
377
        } catch (Exception ex) {
378
            throw new InitializeException(ex);
379
        }
380
    }
381

    
382
    @Override
383
    public DataServerExplorerParameters createServerExplorerParameters(String explorerName) throws InitializeException, ProviderNotRegisteredException {
384
        if( explorerName == null ) {
385
            String msg = "Explorer name can't be null.";
386
            LOGGER.warn(msg);
387
            throw new IllegalArgumentException(msg);
388
        }
389
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
390
        if( explorerFactory == null ) {
391
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
392
            LOGGER.warn(msg);
393
            throw new IllegalArgumentException(msg);
394
        }
395
        DataServerExplorerParameters params = (DataServerExplorerParameters) explorerFactory.createParameters();
396
        return params;
397
    }
398

    
399
    @Override
400
    public DataStoreParameters createMemoryStoreParameters(String autoOrderAttributeName) throws InitializeException {
401
        try {
402
            DataStoreParameters parameters = createStoreParameters(MemoryStoreProvider.NAME);
403
            if (autoOrderAttributeName != null) {
404
                parameters.setDynValue(
405
                        MemoryStoreParameters.ORDER_PARAMETER_NAME,
406
                        autoOrderAttributeName);
407
            }
408
            return parameters;
409
        } catch (Exception ex) {
410
            throw new InitializeException(ex);
411
        }
412
    }
413

    
414
    @Override
415
    public DataServerExplorer openServerExplorer(String explorerName, DataServerExplorerParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
416
        if( explorerName == null ) {
417
            String msg = "Explorer name can't be null.";
418
            LOGGER.warn(msg);
419
            throw new IllegalArgumentException(msg);
420
        }
421
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
422
        if( explorerFactory == null ) {
423
            String msg = "Can't locate server explorer factory for '"+explorerName+"'.";
424
            LOGGER.warn(msg);
425
            throw new IllegalArgumentException(msg);
426
        }
427
        if (parameters == null) {
428
            parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
429
        }
430
        DataServerExplorer explorer = (DataServerExplorer) explorerFactory.create(
431
                parameters,
432
                new DefaultDataServerExplorerProviderServices()
433
        );
434
        return explorer;
435
    }
436

    
437
    @Override
438
    public DataServerExplorer openServerExplorer(String explorerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
439
        if( arguments.length==1 && arguments[0] instanceof DataServerExplorerParameters ) {
440
            // Esto hace falta ya que desde scripting si se invoca a openServerExplorer con solo 
441
            // un parametro de tipo DataServerExplorerParameters llama ha este metodo en lugar de
442
            // llamar al que toca.
443
            return openServerExplorer(explorerName, (DataServerExplorerParameters)(arguments[0]));
444
        }
445
        if( explorerName == null ) {
446
            String msg = "Explorer name can't be null.";
447
            LOGGER.warn(msg);
448
            throw new IllegalArgumentException(msg);
449
        }
450
        if( (arguments.length % 2)!= 0 ) {
451
            throw new ValidateDataParametersException();
452
        }
453
        DataFactory explorerFactory = this.getServerExplorerRegister().getFactory(explorerName);
454
        DataServerExplorerParameters parameters = (DataServerExplorerParameters) explorerFactory.createParameters();
455
        for( int i=0; i<arguments.length; i+=2 ) {
456
            String name = (String) arguments[i];
457
            if( name.endsWith("=") ) {
458
                name = name.substring(0, name.length()-1);
459
            }
460
            Object value = arguments[i+1];
461
            parameters.setDynValue(name, value);
462
        }
463
        return this.openServerExplorer(explorerName, parameters);
464

    
465
    }
466

    
467
    /**
468
     * @param parameters
469
     * @return
470
     * @throws org.gvsig.fmap.dal.exception.InitializeException
471
     * @throws org.gvsig.fmap.dal.exception.ProviderNotRegisteredException
472
     * @throws org.gvsig.fmap.dal.exception.ValidateDataParametersException
473
     * @deprecated see openServerExplorer
474
     */
475
    @Override
476
    public DataServerExplorer createServerExplorer(
477
            DataServerExplorerParameters parameters) throws InitializeException,
478
            ProviderNotRegisteredException, ValidateDataParametersException {
479
        return openServerExplorer(parameters.getExplorerName(), parameters);
480
    }
481

    
482
    /**
483
     * @deprecated use openStore
484
     * @param parameters
485
     * @return
486
     * @throws InitializeException
487
     * @throws ProviderNotRegisteredException
488
     * @throws ValidateDataParametersException
489
     */
490
    @Override
491
    public DataStore createStore(DataStoreParameters parameters)
492
        throws InitializeException, ProviderNotRegisteredException,
493
        ValidateDataParametersException {
494
        return openStore(parameters.getDataStoreName(), parameters);
495
    }
496

    
497
    @Override
498
    public DataStore openStore(String providerName, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
499
        if( providerName == null ) {
500
            String msg = "Provider name can't be null.";
501
            LOGGER.warn(msg);
502
            throw new IllegalArgumentException(msg);
503
        }
504
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
505
        if (!identityManager.getCurrentIdentity().isAuthorized(READ_STORE_AUTHORIZATION, parameters, providerName)) {
506
            throw new UnauthorizedException(READ_STORE_AUTHORIZATION, parameters, providerName);
507
        }
508

    
509
        parameters.validate();
510

    
511
        String storeName = this.getStoreName(parameters);
512
        if( StringUtils.isEmpty(storeName) ) {
513
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
514
            LOGGER.warn(msg);
515
            throw new IllegalArgumentException(msg);
516
        }
517

    
518
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
519
        if( storeFactory == null ) {
520
            String msg = "Can't locate store factory for '"+storeName+"'.";
521
            LOGGER.warn(msg);
522
            throw new IllegalArgumentException(msg);
523
        }
524
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
525
        if( providerFactory == null ) {
526
            String msg = "Can't locate provider factory for '"+providerName+"'.";
527
            LOGGER.warn(msg);
528
            throw new IllegalArgumentException(msg);
529
        }
530

    
531
        DataStore store = (DataStore) storeFactory.create(parameters, this);
532
        DataStoreProvider provider = (DataStoreProvider) providerFactory.create(parameters, store);
533

    
534
        storeFactory.setProvider(store, provider);
535
        return store;
536
    }
537

    
538
    public DataStore openStore(DataStoreParameters parameters, DataStoreProvider provider) {
539
        String storeName = this.getStoreName(parameters);
540
        if( StringUtils.isEmpty(storeName) ) {
541
            String msg = "Can't locate the store name from the parameters. parameters=" + parameters.toString();
542
            LOGGER.warn(msg);
543
            throw new IllegalArgumentException(msg);
544
        }
545

    
546
        DataStoreFactory_v2_4 storeFactory = (DataStoreFactory_v2_4) this.getStoreRegister().getFactory(storeName);
547
        if( storeFactory == null ) {
548
            String msg = "Can't locate store factory for '"+storeName+"'.";
549
            LOGGER.warn(msg);
550
            throw new IllegalArgumentException(msg);
551
        }
552
        DataStore store = (DataStore) storeFactory.create(parameters, this);
553
        storeFactory.setProvider(store, provider);
554
        return store;
555
    }
556
    
557
    @Override
558
    public DataStore openStore(String provider, DynObject parameters) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
559
        DataStoreParameters params = toDataStoreParameters(provider, parameters);
560
        DataStore store = openStore(params.getDataStoreName(), params);
561
        return store;
562
    }
563

    
564
    @Override
565
    public DataStore openStore(String providerName, Object... arguments) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
566
        if( arguments.length == 1 ) { 
567
            // Desde jython entra por este metodo en lugar de los especificos
568
            // de DataStoreParameters o DynObject
569
            if( arguments[0] instanceof DataStoreParameters ) {
570
                return this.openStore(providerName, (DataStoreParameters)(arguments[0]));
571
            } else if( arguments[0] instanceof DynObject ) {
572
                return this.openStore(providerName, (DynObject)(arguments[0]));
573
            }
574
        }
575
        if( (arguments.length % 2)!= 0 ) {
576
            throw new ValidateDataParametersException();
577
        }
578
        if( providerName == null ) {
579
            String msg = "Provider name can't be null.";
580
            LOGGER.warn(msg);
581
            throw new IllegalArgumentException(msg);
582
        }
583
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
584
        DataStoreParameters parameters = (DataStoreParameters) providerFactory.createParameters();
585
        for( int i=0; i<arguments.length; i+=2 ) {
586
            String name = (String) arguments[i];
587
            if( name.endsWith("=") ) {
588
                name = name.substring(0, name.length()-1);
589
            }
590
            Object value = arguments[i+1];
591
            parameters.setDynValue(name, value);
592
        }
593
        return this.openStore(providerName, parameters);
594
    }
595

    
596
    @Override
597
    public FeatureStore createMemoryStore(String autoOrderAttributeName) throws InitializeException {
598
        try {
599
            DataStoreParameters parameters = createMemoryStoreParameters(autoOrderAttributeName);
600
            DataStore store = openStore(MemoryStoreProvider.NAME, parameters);
601
            return (FeatureStore) store;
602
        } catch (Exception ex) {
603
            throw new InitializeException(ex);
604
        }
605
    }
606

    
607
    @Override
608
    public DataStoreProviderFactory getStoreProviderFactory(String providerName) {
609
        if( providerName == null ) {
610
            String msg = "Provider name can't be null.";
611
            LOGGER.warn(msg);
612
            throw new IllegalArgumentException(msg);
613
        }
614
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
615
        return (DataStoreProviderFactory) providerFactory;
616
    }
617

    
618
    @Override
619
    public List<String> getStoreProviders() {
620
        return this.getStoreProviderRegister().getFactoryNames();
621
    }
622

    
623
    @Override
624
    public List<String> getStoreProviders(String explorerName) {
625
        if( explorerName == null ) {
626
            String msg = "Explorer name can't be null.";
627
            LOGGER.warn(msg);
628
            throw new IllegalArgumentException(msg);
629
        }
630
        try {
631
            DataServerExplorer explorer = openServerExplorer(explorerName, (DataServerExplorerParameters)null);
632
            List names = explorer.getDataStoreProviderNames();
633
            return names;
634
        } catch (Exception ex) {
635
            throw new RuntimeException("Can't get stores availables for explorer '" + explorerName + "'.", ex);
636
        }
637
    }
638

    
639
    @Override
640
    public List<String> getExplorerProviders() {
641
        List<String> names = this.getServerExplorerRegister().getFactoryNames();
642
        return names;
643
    }
644

    
645
    @Override
646
    public DataStoreProvider createProvider(DataStoreProviderServices providerServices, DataStoreParameters parameters) throws InitializeException, ProviderNotRegisteredException {
647

    
648
        String providerName = parameters.getDataStoreName();
649
        DataFactory providerFactory = this.getStoreProviderRegister().getFactory(providerName);
650
        if (providerFactory == null) {
651
            throw new ProviderNotRegisteredException(providerName);
652
        }
653
        while (true) {
654
            try {
655
                DataStoreProvider provider = (DataStoreProvider) providerFactory.create(
656
                        parameters, providerServices
657
                );
658
                return provider;
659
            } catch (Exception e) {
660
                if (openErrorHandler == null) {
661
                    throw new InitializeException(providerName, e);
662
                }
663
                boolean retry = openErrorHandler.canRetryOpen(e, parameters);
664
                if (!retry) {
665
                    throw new InitializeException(providerName, e);
666
                }
667
            }
668
        }
669
    }
670

    
671
    @Override
672
    public List<String> getFeatureIndexProviders() {
673
        List<String> names = this.getFeatureIndexRegister().getFactoryNames();
674
        return names;
675
    }
676

    
677
    @Override
678
    public void setDefaultFeatureIndexProviderName(int dataType, String name) {
679
        this.defaultDataIndexProviders.put(dataType, name);
680
    }
681

    
682
    @Override
683
    public String getDefaultFeatureIndexProviderName(int dataType) {
684
        return this.defaultDataIndexProviders.get(dataType);
685
    }
686

    
687
    @Override
688
    public FeatureIndexProviderServices createFeatureIndexProvider(
689
            String name,
690
            FeatureStore store,
691
            FeatureType type,
692
            String indexName,
693
            FeatureAttributeDescriptor attr
694
    ) throws InitializeException, ProviderNotRegisteredException {
695

    
696
        if (name == null) {
697
            name = getDefaultFeatureIndexProviderName(attr.getType());
698
        }
699

    
700
        if (name == null) {
701
            throw new InitializeException(
702
                    "There not any index provider registered.", null);
703
        }
704
        DataFactory indexfactory = this.getFeatureIndexRegister().getFactory(name);
705
        if (indexfactory == null) {
706
            throw new InitializeException(
707
                    "There not any index provider registered with name '" + name + "'.", null);
708

    
709
        }
710
        FeatureIndexProvider provider = (FeatureIndexProvider) indexfactory.create(null, null);
711

    
712
        FeatureIndexProviderServices services = new DefaultFeatureIndex(
713
                (FeatureStoreProviderServices) store,
714
                type,
715
                provider,
716
                attr.getName(),
717
                indexName
718
        );
719
        services.initialize();
720
        return services;
721

    
722
    }
723

    
724
    @Override
725
    public String getTemporaryDirectory() {
726
        FoldersManager manager = ToolsLocator.getFoldersManager();
727
        File folder = manager.getUniqueTemporaryFile("_daltmp_");
728
        return folder.getAbsolutePath();
729
    }
730

    
731
    @Override
732
    public DataStoreParameters createStoreParameters(DynStruct struct) throws InitializeException, ProviderNotRegisteredException {
733
        if (!(struct instanceof DynStruct_v2)) {
734
            throw new IllegalArgumentException("A DynStruct_v2 is required.");
735
        }
736
        Tags tags = ((DynStruct_v2) struct).getTags();
737
        return this.createStoreParameters(tags);
738
    }
739

    
740
    @Override
741
    public DataStoreParameters createStoreParameters(Tags tags) throws InitializeException, ProviderNotRegisteredException {
742
        String providerName = (String) tags.get(TAG_DAL_OPENSTORE + "provider");
743
        if (providerName == null) {
744
            throw new IllegalArgumentException("Tag DAL.OpenStore.provider is missing in struct.");
745
        }
746
        int prefixlen = TAG_DAL_OPENSTORE.length();
747
        DataStoreParameters parameters = this.createStoreParameters(providerName);
748
        for (String key : tags) {
749
            if (key.startsWith(TAG_DAL_OPENSTORE)) {
750
                parameters.setDynValue(key.substring(prefixlen), tags.get(key));
751
            }
752
        }
753
        return parameters;
754
    }
755

    
756
    @Override
757
    public DataStore openStore(DynStruct struct) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
758
        DataStoreParameters paramters = this.createStoreParameters(struct);
759
        DataStore store = this.openStore(paramters.getDataStoreName(), paramters);
760
        return store;
761
    }
762

    
763
    @Override
764
    public void newStore(String explorerName, String providerName, NewDataStoreParameters parameters, boolean overwrite) throws InitializeException, ProviderNotRegisteredException, ValidateDataParametersException {
765
        if( explorerName == null ) {
766
            String msg = "Explorer name can't be null.";
767
            LOGGER.warn(msg);
768
            throw new IllegalArgumentException(msg);
769
        }
770
        if( providerName == null ) {
771
            String msg = "Provider name can't be null.";
772
            LOGGER.warn(msg);
773
            throw new IllegalArgumentException(msg);
774
        }
775

    
776
        SimpleIdentityManager identityManager = ToolsLocator.getIdentityManager();
777
        if (!identityManager.getCurrentIdentity().isAuthorized(CREATE_STORE_AUTHORIZATION, parameters, providerName)) {
778
            throw new UnauthorizedException(CREATE_STORE_AUTHORIZATION, parameters, providerName);
779
        }
780
        parameters.validate();
781
        try {
782
            DataServerExplorerParameters explorerParameters = this.createServerExplorerParameters(explorerName);
783
            DataServerExplorer server = this.openServerExplorer(explorerName, explorerParameters);
784
            server.add(providerName, parameters, overwrite);
785
        } catch (Exception e) {
786
            throw new InitializeException(e);
787
        }
788
    }
789

    
790
    @Override
791
    @Deprecated
792
    public Evaluator createExpresion(String expression) throws InitializeException {
793
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
794
        exp.setPhrase(expression);
795
        return this.createExpresion(exp);
796
    }
797

    
798
    @Override
799
    @Deprecated
800
    public Evaluator createExpresion(Expression expression) throws InitializeException {
801
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
802
        return exp;        
803
    }
804

    
805

    
806
    @Override
807
    public Evaluator createFilter(String expression) throws InitializeException {
808
        Expression exp = ExpressionEvaluatorLocator.getManager().createExpression();
809
        exp.setPhrase(expression);
810
        return this.createFilter(exp);
811
    }
812

    
813
    @Override
814
    public Evaluator createFilter(Expression expression) throws InitializeException {
815
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
816
        return exp;        
817
    }
818

    
819
    @Override
820
    public FeaturePagingHelper createFeaturePagingHelper(
821
            FeatureStore featureStore, int pageSize) throws BaseException {
822
        return new FeaturePagingHelperImpl(featureStore, pageSize);
823
    }
824

    
825
    @Override
826
    public FeaturePagingHelper createFeaturePagingHelper(
827
            FeatureStore featureStore, FeatureQuery featureQuery, int pageSize)
828
            throws BaseException {
829
        return new FeaturePagingHelperImpl(featureStore, featureQuery, pageSize);
830
    }
831

    
832
    @Override
833
    public void setOpenErrorHandler(OpenErrorHandler handler) {
834
        openErrorHandler = handler;
835
    }
836

    
837
    @Override
838
    public OpenErrorHandler getOpenErrorHandler() {
839
        return this.openErrorHandler;
840
    }
841

    
842
    @Override
843
    public EditableFeatureType createFeatureType() {
844
        return new DefaultEditableFeatureType(null);
845
    }
846

    
847
    @Override
848
    public DataServerExplorerPool getDataServerExplorerPool() {
849
        if (this.dataServerExplorerPool == null) {
850
            this.dataServerExplorerPool = new DefaultDataServerExplorerPool();
851
        }
852
        return this.dataServerExplorerPool;
853
    }
854

    
855
    @Override
856
    public void setDataServerExplorerPool(DataServerExplorerPool pool) {
857
        this.dataServerExplorerPool = pool;
858
    }
859

    
860
    public DataStoreParameters toDataStoreParameters(String provider, DynObject params) throws InitializeException, ProviderNotRegisteredException {
861
        if (params instanceof DataStoreParameters) {
862
            return (DataStoreParameters) params;
863
        }
864
        String providerName;
865
        try {
866
            providerName = (String) params.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
867
        } catch (Exception ex) {
868
            providerName = provider;
869
        }
870
        DataStoreParameters parameters = this.createStoreParameters(providerName);
871
        ToolsLocator.getDynObjectManager().copy(params, parameters);
872
        return parameters;
873
    }
874

    
875
    @Override
876
    public List<DataType> getDataTypes() {
877
        if (dataTypes == null) {
878
            DataTypesManager manager = ToolsLocator.getDataTypesManager();
879
            dataTypes = new ArrayList<>();
880
            dataTypes.add(manager.get(DataTypes.STRING));
881
            dataTypes.add(manager.get(DataTypes.BOOLEAN));
882
            dataTypes.add(manager.get(DataTypes.INT));
883
            dataTypes.add(manager.get(DataTypes.DOUBLE));
884
            dataTypes.add(manager.get(DataTypes.DATE));
885
            dataTypes.add(manager.get(DataTypes.GEOMETRY));
886
        }
887
        return dataTypes;
888
    }
889

    
890
    @Override
891
    public void setResourcesLoader(ClassLoader loader) {
892
        this.resourcesLoader = loader;
893
    }
894

    
895
    @Override
896
    public void setResourcesLoader(File folder) {
897
        if (folder == null) {
898
            this.resourcesLoader = null;
899
            return;
900
        }
901
        try {
902
            URL[] urls = new URL[]{folder.toURI().toURL()};
903
            this.resourcesLoader = new URLClassLoader(urls);
904
        } catch (Exception ex) {
905
            throw new IllegalArgumentException("Can't create a ClassLoader from '" + folder.toString() + "'.", ex);
906
        }
907
    }
908

    
909
    @Override
910
    public URL getResource(Object reourceLoader, String name) {
911
        URL x;
912
        if (this.resourcesLoader != null) {
913
            x = this.resourcesLoader.getResource(name);
914
            if (x != null) {
915
                return x;
916
            }
917
        }
918
        x = reourceLoader.getClass().getResource(name);
919
        return x;
920
    }
921

    
922
    @Override
923
    public InputStream getResourceAsStream(Object reourceLoader, String name) {
924
        InputStream x;
925
        if (this.resourcesLoader != null) {
926
            x = this.resourcesLoader.getResourceAsStream(name);
927
            if (x != null) {
928
                return x;
929
            }
930
        }
931
        x = reourceLoader.getClass().getResourceAsStream(name);
932
        return x;
933
    }
934

    
935
    @Override
936
    public ExpressionBuilder createExpressionBuilder() {
937
        return ExpressionEvaluatorLocator.getManager().createExpressionBuilder();
938
    }
939

    
940
    public void registerFeatureCacheProvider(
941
        FeatureCacheProviderFactory providerFactory) {
942
        ToolsLocator.getExtensionPointManager()
943
            .add(DATA_MANAGER_CACHE, DATA_MANAGER_CACHE_DESCRIPTION)
944
            .append(providerFactory.getName(), "", providerFactory);
945
    }
946

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

    
975
    @Override
976
    public List getFeatureCacheProviders() {
977
        ExtensionPoint extensionPoint =
978
            ToolsLocator.getExtensionPointManager().get(DATA_MANAGER_CACHE);
979
        if (extensionPoint != null) {
980
            return ToolsLocator.getExtensionPointManager()
981
                .get(DATA_MANAGER_CACHE).getNames();
982
        } else {
983
            return new ArrayList();
984
        }
985
    }
986

    
987
    @Override
988
    public DynObject createCacheParameters(String name)
989
        throws InitializeException, ProviderNotRegisteredException {
990
        if (name == null) {
991
            throw new InitializeException(
992
                "It is necessary to provide a cache name", null);
993
        }
994
        FeatureCacheProviderFactory featureCacheProviderFactory;
995
        try {
996
            featureCacheProviderFactory =
997
                (FeatureCacheProviderFactory) ToolsLocator
998
                    .getExtensionPointManager().get(DATA_MANAGER_CACHE)
999
                    .create(name);
1000
            if (featureCacheProviderFactory == null) {
1001
                throw new ProviderNotRegisteredException(name);
1002
            }
1003
            return featureCacheProviderFactory.createParameters();
1004
        } catch (InstantiationException e) {
1005
            throw new InitializeException(e);
1006
        } catch (IllegalAccessException e) {
1007
            throw new InitializeException(e);
1008
        }
1009
    }
1010

    
1011
    @Override
1012
    public void createFileStore(String providerName, NewDataStoreParameters params, boolean overwrite) throws DataException {
1013
        DataManagerProviderServices dataManager = DALSPILocator.getDataManagerProviderServices();
1014
        DataServerExplorerParameters eparams = null;
1015
        DataServerExplorer serverExplorer;
1016
        try {
1017
            serverExplorer = dataManager.openServerExplorer(FILESYSTEM_EXPLORER_NAME, eparams);
1018
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
1019
            throw new OpenException(FILESYSTEM_EXPLORER_NAME, e);
1020
        }
1021

    
1022
        try {
1023
            serverExplorer.add(providerName, params, overwrite);
1024
        } catch (DataException e) {
1025
            throw new CreateFileStoreException(e, providerName);
1026
        }
1027
    }
1028

    
1029
    @Override
1030
    public FeatureSymbolTable createFeatureSymbolTable() {
1031
        FeatureSymbolTable symbolTable = new FeatureSymbolTableImpl();
1032
        return symbolTable;
1033
    }
1034

    
1035
    @Override
1036
    public FeatureAttributeEmulatorExpression createFeatureAttributeEmulatorExpression(FeatureType type, Expression expression) {
1037
        FeatureAttributeEmulatorExpression emulator = new DefaultFeatureAttributeEmulatorExpression(type, expression);
1038
        return emulator;
1039
    }
1040

    
1041
    @Override
1042
    public void registerDataProfile(DataProfile profile) {
1043
        if( profile==null ) {
1044
            return;
1045
        }
1046
        if( this.dataProfiles==null ) {
1047
            this.dataProfiles = new ArrayList<>();
1048
            this.dataProfiles.add(profile);
1049
            return;
1050
        }
1051
        for (DataProfile theProfile : this.dataProfiles) {
1052
            if( theProfile.getID().equalsIgnoreCase(profile.getID()) ) {
1053
                return;
1054
            }
1055
        }
1056
        this.dataProfiles.add(profile);
1057
    }
1058

    
1059
    @Override
1060
    public List<DataProfile> getDataProfiles() {
1061
        if( this.dataProfiles==null ) {
1062
            return null;
1063
        }
1064
        return Collections.unmodifiableList(this.dataProfiles);
1065
    }
1066

    
1067
    @Override
1068
    public DataProfile getDataProfile(String name) {
1069
        if( StringUtils.isBlank(name) ) {
1070
            return null;
1071
        }
1072
        for (DataProfile theProfile : this.dataProfiles) {
1073
            if( name.equalsIgnoreCase(theProfile.getName()) ) {
1074
                return theProfile;
1075
            }
1076
        }
1077
        return null;
1078
    }
1079

    
1080
    private StoresRepository storesRepository;
1081
    
1082
    @Override
1083
    public StoresRepository getStoresRepository() {
1084
        if( this.storesRepository==null ) {
1085
            this.storesRepository = new BaseStoresRepository("DAL");
1086
        }
1087
        return this.storesRepository;
1088
    }
1089
    
1090
    @Override
1091
    public DatabaseWorkspaceManager createDatabaseWorkspaceManager(DataServerExplorerParameters connection) {
1092
        DatabaseWorkspaceManager workspace = new DefaultDatabaseWorkspaceManager(connection);
1093
        return workspace;
1094
    }
1095

    
1096
    @Override
1097
    public void addDatabaseWorkspace(DatabaseWorkspaceManager databaseWorkspace) {
1098
        this.databaseWorkspaces.put(databaseWorkspace.getId(),databaseWorkspace);
1099
        StoresRepository repo = databaseWorkspace.getStoresRepository();
1100
        this.getStoresRepository().addRepository(repo);
1101

    
1102
        for (AddDatabaseWorkspaceListener listener : this.addDatabaseWorkspaceListeners.values()) {
1103
            if( listener!=null ) {
1104
                try {
1105
                    listener.onAddDatabaseWorkspace(databaseWorkspace);
1106
                } catch(Throwable th) {
1107
                    LOGGER.warn("Problems calling databaseworkspace listener '"+listener.getName()+"'.",th);
1108
                }
1109
            }
1110
        }
1111
        try {
1112
            ResourcesStorage resources = databaseWorkspace.getResourcesStorage();
1113
            ScriptManager scriptManager = ToolsLocator.getScriptManager();
1114
            Script script = scriptManager.loadScript(resources, "OnConnectToWorkspace.script");
1115
            if( script != null ) {
1116
                script.invokeFunction("main", new Object[] {databaseWorkspace});
1117
            }
1118
        } catch(Throwable th) {
1119
            LOGGER.warn("Problems executing 'OnConnectToWorkspace.script' from workspace '"+databaseWorkspace.getId()+"'.",th);
1120
        }
1121
    }
1122
    
1123
    @Override
1124
    public void addDatabaseWorkspaceListener(AddDatabaseWorkspaceListener listener) {
1125
        this.addDatabaseWorkspaceListeners.put(listener.getName(), listener);
1126
    }
1127

    
1128
    @Override
1129
    public DatabaseWorkspaceManager getDatabaseWorkspace(String name) {
1130
        return this.databaseWorkspaces.get(name);
1131
    }
1132
    
1133
    @Override
1134
    public DatabaseWorkspaceManager getDatabaseWorkspace(DataStoreParameters params) {
1135
        for (DatabaseWorkspaceManager databaseWorkspace : this.databaseWorkspaces.values()) {
1136
            if( databaseWorkspace.getStoresRepository().contains(params) ) {
1137
                return databaseWorkspace;
1138
            }
1139
        }
1140
        return null;
1141
    }
1142
    
1143
    @Override
1144
    public void writeDALResource(ResourcesStorage resources, DataStore store) {
1145
        ResourcesStorage.Resource resource = null;
1146
        try {
1147
            if( resources == null || resources.isReadOnly() ) {
1148
                return;
1149
            }
1150
            resource = resources.getResource("dal");
1151
            if( resource == null || resource.isReadOnly() ) {
1152
                return;
1153
            }
1154
            DALFile dalFile = DALFile.getDALFile();
1155
            dalFile.setStore((DefaultFeatureStore) store);
1156
            if( !dalFile.isEmpty() ) {
1157
                dalFile.write(resource);
1158
            }
1159
        } catch (Throwable ex) {
1160
            LOGGER.warn("Can't save DAL resource", ex);
1161
        } finally {
1162
            IOUtils.closeQuietly(resource);
1163
        }
1164
    
1165
        
1166
    }
1167

    
1168
    @Override
1169
    public void writeDALResource(ResourcesStorage resources, FeatureType featureType) {
1170
        ResourcesStorage.Resource resource = null;
1171
        try {
1172
            if( resources == null || resources.isReadOnly() ) {
1173
                return;
1174
            }
1175
            resource = resources.getResource("dal");
1176
            if( resource == null || resource.isReadOnly() ) {
1177
                return;
1178
            }
1179
            DALFile dalFile = DALFile.getDALFile();
1180
            dalFile.setFeatureType(featureType);
1181
            if( !dalFile.isEmpty() ) {
1182
                dalFile.write(resource);
1183
            }
1184
        } catch (Throwable ex) {
1185
            LOGGER.warn("Can't save DAL resource", ex);
1186
        } finally {
1187
            IOUtils.closeQuietly(resource);
1188
        }
1189
    }
1190

    
1191
    private Map<String,DynObjectValueItem[]> availableValues = null;
1192
    
1193
    @Override
1194
    public void clearAvailableValuesCache() {
1195
      this.availableValues = null;
1196
    }
1197
    
1198
    @Override
1199
    public DynObjectValueItem[] getAvailableValues(FeatureStore myStore, FeatureAttributeDescriptor descriptor) {
1200
        String keyName = myStore.getFullName() + ":columnName=" + descriptor.getName();
1201
        if( this.availableValues==null ) {
1202
            this.availableValues = new HashMap<>();
1203
        }
1204
        DynObjectValueItem[] values = this.availableValues.get(keyName);
1205
        if( values != null ) {
1206
            return values;
1207
        }
1208
        if( !descriptor.isForeingKey() ) {
1209
            return null;
1210
        }
1211
        ForeingKey foreingKey = descriptor.getForeingKey();
1212
        try {
1213
            StoresRepository theStoresRepository;
1214
            FeatureStore store = descriptor.getStore();
1215
            if (store == null) {
1216
                theStoresRepository = DALLocator.getDataManager().getStoresRepository();
1217

    
1218
            } else {
1219
                theStoresRepository = store.getStoresRepository();
1220
            }
1221
            FeatureStore foreingStore = (FeatureStore) theStoresRepository.getStore(
1222
                foreingKey.getTableName()
1223
            );
1224
            Expression labelExpression = foreingKey.getLabelExpression(null);
1225
            String codeName = foreingKey.getCodeName();
1226
            FeatureSymbolTable featureSymbolTable = this.createFeatureSymbolTable();
1227
            MutableSymbolTable symbolTable = featureSymbolTable.createParent();
1228
        
1229
            int count = (int) foreingStore.getFeatureCount();
1230
            values = new DynObjectValueItem[Math.min(count, MAX_AVAILABLE_VALUES)];
1231
            int n = 0;
1232
            for (Feature feature : foreingStore.getFeatureSet()) {
1233
                Object code = feature.get(codeName);
1234
                Object value;
1235
                if (labelExpression == null) {
1236
                    value = code;
1237
                } else {
1238
                    featureSymbolTable.setFeature(feature);
1239
                    value = labelExpression.execute(symbolTable);
1240
                }
1241
                values[n++] = new DynObjectValueItem(code, Objects.toString(value, Objects.toString(code, "##ERROR##")));
1242
                if( n>=MAX_AVAILABLE_VALUES ) {
1243
                    break;
1244
                }
1245
            }
1246
            this.availableValues.put(keyName, values);
1247
            return values;
1248
        } catch (Exception ex) {
1249
            LOGGER.warn("Can't get available values for field '"+myStore.getName()+"."+descriptor.getName()+"' from table '" + foreingKey.getTableName() + "'.", ex);
1250
        }
1251
        return null;
1252
    }
1253

    
1254
    @Override
1255
    public String createUniqueID() {
1256
        UUID x = UUID.randomUUID();
1257
        String s = x.toString();
1258
        return s;
1259
    }
1260

    
1261
  @Override
1262
  public DALExpressionBuilder createDALExpressionBuilder() {
1263
    return new DefaultDALExpressionBuilder();
1264
  }
1265

    
1266
}