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

History | View | Annotate | Download (49.9 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.EditableFeatureAttributeDescriptor;
55
import org.gvsig.fmap.dal.feature.EditableFeatureType;
56
import org.gvsig.fmap.dal.feature.Feature;
57
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
58
import org.gvsig.fmap.dal.feature.FeatureQuery;
59
import org.gvsig.fmap.dal.feature.FeatureStore;
60
import org.gvsig.fmap.dal.feature.FeatureType;
61
import org.gvsig.fmap.dal.feature.ForeingKey;
62
import static org.gvsig.fmap.dal.feature.ForeingKey.MAX_AVAILABLE_VALUES;
63
import org.gvsig.fmap.dal.feature.impl.DALFile;
64
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureAttributeDescriptor;
65
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
66
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureAttributeDescriptor;
67
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureIndex;
68
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
69
import org.gvsig.fmap.dal.feature.impl.FeatureStoreFactory;
70
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
71
import org.gvsig.fmap.dal.feature.paging.impl.FeaturePagingHelperImpl;
72
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider;
73
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
74
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProvider;
75
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
76
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
77
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
78
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
79
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
80
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
81
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
82
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
83
import org.gvsig.fmap.dal.spi.DALSPILocator;
84
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
85
import org.gvsig.fmap.dal.spi.DataStoreProvider;
86
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
87
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters;
88
import org.gvsig.fmap.dal.store.memory.MemoryStoreProvider;
89
import org.gvsig.tools.ToolsLocator;
90
import org.gvsig.tools.dataTypes.DataType;
91
import org.gvsig.tools.dataTypes.DataTypesManager;
92
import org.gvsig.tools.dynobject.DynObject;
93
import org.gvsig.tools.dynobject.DynObjectValueItem;
94
import org.gvsig.tools.dynobject.DynStruct;
95
import org.gvsig.tools.dynobject.DynStruct_v2;
96
import org.gvsig.tools.dynobject.Tags;
97
import org.gvsig.tools.evaluator.Evaluator;
98
import org.gvsig.tools.exception.BaseException;
99
import org.gvsig.tools.extensionpoint.ExtensionPoint;
100
import org.gvsig.tools.folders.FoldersManager;
101
import org.gvsig.tools.identitymanagement.SimpleIdentityManager;
102
import org.gvsig.tools.identitymanagement.UnauthorizedException;
103
import org.gvsig.tools.persistence.PersistenceManager;
104
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
105
import org.gvsig.tools.script.Script;
106
import org.gvsig.tools.script.ScriptManager;
107
import org.gvsig.tools.service.spi.Services;
108
import org.slf4j.Logger;
109
import org.slf4j.LoggerFactory;
110

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

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

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

    
123

    
124
    private class Registers {
125

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

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

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

    
154
    private final Registers registers;
155

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

    
158
    private OpenErrorHandler openErrorHandler = null;
159

    
160
    private DataServerExplorerPool dataServerExplorerPool = null;
161

    
162
    private List<DataType> dataTypes = null;
163

    
164
    private ClassLoader resourcesLoader = null;
165

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

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

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

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

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

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

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

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

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

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

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

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

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

    
260
    }
261

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

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

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

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

    
290
    }
291

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

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

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

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

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

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

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

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

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

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

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

    
466
    }
467

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

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

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

    
510
        parameters.validate();
511

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
723
    }
724

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

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

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

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

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

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

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

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

    
806

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1262
    @Override
1263
    public EditableFeatureAttributeDescriptor createFeatureAttributeDescriptor() {
1264
        DefaultEditableFeatureAttributeDescriptor edi = new DefaultEditableFeatureAttributeDescriptor(null, false);
1265
        return edi;
1266
    }
1267

    
1268
  @Override
1269
  public DALExpressionBuilder createDALExpressionBuilder() {
1270
    return new DefaultDALExpressionBuilder();
1271
  }
1272

    
1273
}