Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.db / org.gvsig.fmap.dal.db.jdbc / src / main / java / org / gvsig / fmap / dal / store / jdbc2 / spi / JDBCServerExplorerBase.java @ 47606

History | View | Annotate | Download (47 KB)

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

    
26
import java.io.File;
27
import java.util.ArrayList;
28
import java.util.Arrays;
29
import java.util.Collections;
30
import java.util.HashMap;
31
import java.util.List;
32
import java.util.Map;
33
import java.util.Objects;
34
import javax.json.JsonObject;
35
import javax.json.JsonString;
36
import javax.json.JsonValue;
37
import org.apache.commons.codec.binary.Hex;
38
import org.apache.commons.collections.map.LRUMap;
39
import org.apache.commons.lang3.BooleanUtils;
40
import org.apache.commons.lang3.ObjectUtils;
41
import org.apache.commons.lang3.StringUtils;
42
import org.apache.commons.lang3.tuple.ImmutablePair;
43
import org.apache.commons.lang3.tuple.Pair;
44
import org.gvsig.expressionevaluator.ExpressionBuilder;
45
import org.gvsig.expressionevaluator.ExpressionUtils;
46
import org.gvsig.fmap.dal.DALLocator;
47
import org.gvsig.fmap.dal.DataManager;
48
import org.gvsig.fmap.dal.DataStore;
49
import org.gvsig.fmap.dal.DataStoreParameters;
50
import org.gvsig.fmap.dal.DataTransaction;
51
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
52
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_NAME;
53
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_CONFIGURATION_VALUE;
54
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_CONFIGURATION_NAME;
55
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
56
import org.gvsig.fmap.dal.NewDataStoreParameters;
57
import org.gvsig.fmap.dal.SQLBuilder;
58
import org.gvsig.fmap.dal.SQLBuilder.Privilege;
59
import org.gvsig.fmap.dal.exception.CloseException;
60
import org.gvsig.fmap.dal.exception.DataException;
61
import org.gvsig.fmap.dal.exception.InitializeException;
62
import org.gvsig.fmap.dal.exception.OpenException;
63
import org.gvsig.fmap.dal.exception.RemoveException;
64
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
65
import org.gvsig.fmap.dal.feature.EditableFeature;
66
import org.gvsig.fmap.dal.feature.EditableFeatureType;
67
import org.gvsig.fmap.dal.feature.Feature;
68
import org.gvsig.fmap.dal.feature.FeatureStore;
69
import org.gvsig.fmap.dal.feature.FeatureType;
70
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
71
import org.gvsig.fmap.dal.feature.spi.CompoundResourcesStorageWithSupportTransactions;
72
import org.gvsig.fmap.dal.feature.spi.LocalTransaction;
73
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
74
import org.gvsig.fmap.dal.serverexplorer.db.spi.AbstractDBServerExplorer;
75
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
76
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
77
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
78
import org.gvsig.fmap.dal.spi.DataTransactionServices;
79
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
80
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
81
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
82
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
83
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCExecuteSQLException;
84
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
85
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
86
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
87
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCResourcesStorage.TABLENAME_SERVER_EXPLORER_MARK;
88
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CanCreateTablesOperation;
89
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CreateTableOperation;
90
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.DropTableOperation;
91
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ExecuteOperation;
92
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
93
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ListTablesOperation;
94
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.RetrieveValueOperation;
95
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.UpdateTableStatisticsOperation;
96
import org.gvsig.json.Json;
97
import org.gvsig.json.JsonObjectBuilder;
98
import org.gvsig.tools.ToolsLocator;
99
import org.gvsig.tools.dispose.DisposeUtils;
100
import org.gvsig.tools.exception.BaseException;
101
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
102
import org.gvsig.tools.util.CachedValue;
103
import org.slf4j.Logger;
104
import org.slf4j.LoggerFactory;
105

    
106
@SuppressWarnings("UseSpecificCatch")
107
public class JDBCServerExplorerBase extends AbstractDBServerExplorer implements JDBCServerExplorer {
108

    
109
    private static final Logger LOG = LoggerFactory.getLogger(JDBCServerExplorerBase.class);
110
    private static final String CONFIG_NAME_CUSTOM_RESOURCES = "CUSTOM_RESOURCES";
111

    
112
    protected JDBCHelper helper = null;
113

    
114
    private Boolean canAdd;
115

    
116
    private static final Map<String, CachedTablesValue> CACHED_TABLES = Collections.synchronizedMap(new LRUMap(10));
117
    private static final Map<String, CachedValue<CustomResourcesConfig>> CACHED_CUSTOM_RESOURCES_CONFIG = Collections.synchronizedMap(new LRUMap(10));
118

    
119
    private static class CustomResourcesConfig {
120

    
121
        private static final String CUSTOM_RESOURCES_CACHETIME = "CacheTime";
122
        private static final String CUSTOM_RESOURCES_MAPPING = "Mapping";
123
        private static final String CUSTOM_RESOURCES_READONLY = "ResourcesReadonly";
124

    
125
        private int cacheTime;
126
        private Map<String, String> mapping;
127
        private Map<String, Boolean> resourcesReadonly;
128

    
129
        public CustomResourcesConfig(String jsonConfig) {
130
            this.cacheTime = 30 * 60 * 1000; // 30min
131
            this.mapping = new HashMap<>();
132
            this.resourcesReadonly = new HashMap<>();
133

    
134
            if (StringUtils.isNotBlank(jsonConfig)) {
135
                try {
136
                    JsonObject config = Json.createObject(jsonConfig);
137
                    this.cacheTime = config.getInt(CUSTOM_RESOURCES_CACHETIME, this.cacheTime);
138
                    if (config.containsKey(CUSTOM_RESOURCES_MAPPING)) {
139
                        JsonObject m = config.getJsonObject(CUSTOM_RESOURCES_MAPPING);
140
                        for (Map.Entry<String, JsonValue> entry : m.entrySet()) {
141
                            String key = entry.getKey();
142
                            JsonValue value = entry.getValue();
143
                            if (value instanceof JsonString) {
144
                                this.mapping.put(key, ((JsonString) value).getString());
145
                            }
146
                        }
147
                    }
148
                    if (config.containsKey(CUSTOM_RESOURCES_READONLY)) {
149
                        JsonObject resreadonly = config.getJsonObject(CUSTOM_RESOURCES_READONLY);
150
                        for (Map.Entry<String, JsonValue> entry : resreadonly.entrySet()) {
151
                            String key = entry.getKey();
152
                            JsonValue value = entry.getValue();
153
                            if (value == JsonValue.TRUE) {
154
                                this.resourcesReadonly.put(key, true);
155
                            } else if (value == JsonValue.FALSE) {
156
                                this.resourcesReadonly.put(key, false);
157
                            }
158
                        }
159
                    }
160
                } catch (Exception ex) {
161
                    LOG.debug("Can't parse json from " + CONFIG_NAME_CUSTOM_RESOURCES + " variable", ex);
162
                    // Do nothing.
163
                }
164
            }
165
        }
166

    
167
        public String toJsonString() {
168
            JsonObjectBuilder builder = Json.createObjectBuilder();
169
            builder.add(CUSTOM_RESOURCES_CACHETIME, this.cacheTime);
170
            JsonObjectBuilder m = Json.createObjectBuilder();
171
            for (Map.Entry<String, String> entry : this.mapping.entrySet()) {
172
                String key = entry.getKey();
173
                String value = entry.getValue();
174
                m.add(key, value);
175
            }
176
            builder.add(CUSTOM_RESOURCES_MAPPING, m);
177
            JsonObjectBuilder resreadonly = Json.createObjectBuilder();
178
            for (Map.Entry<String, Boolean> entry : this.resourcesReadonly.entrySet()) {
179
                String key = entry.getKey();
180
                Boolean readonly = entry.getValue();
181
                resreadonly.add(key, readonly);
182
            }
183
            builder.add(CUSTOM_RESOURCES_READONLY, resreadonly);
184
            return builder.build().toString();
185
        }
186

    
187
        public int getCacheExpireTimeInMillis() {
188
            return cacheTime;
189
        }
190

    
191
        public String getResourcesTablename(String tablename) {
192
            String resourceTablename = mapping.get(tablename);
193
//            LOG.info("Resource of table "+tablename+" = "+resourceTablename);
194
            return resourceTablename;
195
        }
196

    
197
        public void addResourceMapping(String tablename, String resourcesTablename) {
198
            this.mapping.put(tablename, resourcesTablename);
199
        }
200

    
201
        private boolean isInternalTable(String storeName) {
202
            if (DatabaseWorkspaceManager.isInternalTable(storeName)) {
203
                return true;
204
            }
205
            for (String resourcesTablename : this.mapping.values()) {
206
                if (StringUtils.equals(storeName, resourcesTablename)) {
207
                    return true;
208
                }
209
            }
210
            return false;
211
        }
212

    
213
        public void setResourcesReadOnly(String resourcesTableName, boolean readonly) {
214
            this.resourcesReadonly.put(resourcesTableName, readonly);
215
        }
216

    
217
        public boolean isResourcesReadOnly(String resourcesTableName) {
218
            return this.resourcesReadonly.getOrDefault(resourcesTableName, false);
219
        }
220
    }
221

    
222
    private static class CachedCustomResourcesConfig extends CachedValue<CustomResourcesConfig> {
223

    
224
        private final JDBCStoreParameters openParameters;
225

    
226
        private CachedCustomResourcesConfig(JDBCStoreParameters openParameters) {
227
            this.openParameters = openParameters;
228
            this.setExpireTime(30 * 60 * 1000); // 30min
229
        }
230

    
231
        @Override
232
        protected void reload() {
233
            String jsonConfig = getConfigValue(this.openParameters, CONFIG_NAME_CUSTOM_RESOURCES);
234
//            LOGGER.info("reload CustomResourcesConfig "+jsonConfig);
235
            CustomResourcesConfig config = new CustomResourcesConfig(jsonConfig);
236
            this.setExpireTime(config.getCacheExpireTimeInMillis());
237
            this.setValue(config);
238
        }
239

    
240
    }
241

    
242
    private static class CachedTablesValue extends CachedValue<List<JDBCStoreParameters>> {
243

    
244
        private final int mode;
245
        private final JDBCServerExplorerParameters serverParameters;
246
        private final boolean informationTables;
247
        private final int tablesOrViews;
248

    
249
        public CachedTablesValue(JDBCHelper helper, int mode, JDBCServerExplorerParameters serverParameters, boolean informationTables, int tablesOrViews) {
250
            this.mode = mode;
251
            this.serverParameters = serverParameters;
252
            this.informationTables = informationTables;
253
            this.tablesOrViews = tablesOrViews;
254
        }
255

    
256
        public CachedTablesValue(JDBCHelper helper, int mode, JDBCServerExplorerParameters serverParameters, boolean informationTables, long expireTime, int tablesOrViews) {
257
            this.mode = mode;
258
            this.setExpireTime(expireTime);
259
            this.serverParameters = serverParameters;
260
            this.informationTables = informationTables;
261
            this.tablesOrViews = tablesOrViews;
262
        }
263

    
264
        @Override
265
        protected void reload() {
266
            throw new UnsupportedOperationException("Use get(helper) instead.");
267
        }
268

    
269
        protected void reload(JDBCHelper helper) {
270
//            LOGGER.info("reload list of tables");
271
            List<JDBCStoreParameters> tables = null;
272
            if (helper == null) {
273
                this.setValue(tables);
274
                return;
275
            }
276
            OperationsFactory operations = helper.getOperations();
277
            if (operations == null) {
278
                this.setValue(null);
279
                LOG.debug("Sets tables to null to force reload tables from new ServerExplorar.");
280
                return;
281
            }
282
            try {
283
                ListTablesOperation listTables = operations.createListTables(
284
                        this.mode, serverParameters, informationTables, tablesOrViews
285
                );
286
                tables = (List<JDBCStoreParameters>) listTables.perform();
287
                this.setValue(tables);
288
            } catch (Exception ex) {
289
                LOG.debug("Can't reload cached list of tables.", ex);
290
                throw new RuntimeException("Can't load list of tables", ex);
291
            }
292
        }
293

    
294
        public List<JDBCStoreParameters> get(JDBCHelper helper) {
295
            if (isExpired()) {
296
                this.reload(helper);
297
            }
298
            this.resetAccess();
299
            return this.getValue();
300
        }
301
    }
302

    
303
    public JDBCServerExplorerBase(
304
            JDBCServerExplorerParameters parameters,
305
            DataServerExplorerProviderServices services,
306
            JDBCHelper helper
307
    ) throws InitializeException {
308
        super(parameters, services);
309
        this.helper = helper;
310
    }
311

    
312
    @Override
313
    public String getProviderName() {
314
        return this.getHelper().getProviderName();
315
    }
316

    
317
    @Override
318
    public String getStoreName() {
319
        return this.getHelper().getProviderName();
320
    }
321

    
322
    protected DataManagerProviderServices getManager() {
323
        return (DataManagerProviderServices) DALLocator.getDataManager();
324
    }
325

    
326
    @Override
327
    public JDBCServerExplorerParameters getParameters() {
328
        return (JDBCServerExplorerParameters) super.getParameters();
329
    }
330

    
331
    @Override
332
    public boolean closeResourceRequested(ResourceProvider resource) {
333
        this.getHelper().getResulSetControler().pack();
334
        return true;
335
    }
336

    
337
    @Override
338
    public void resourceChanged(ResourceProvider resource) {
339
        // Nothing to do
340
    }
341

    
342
    protected JDBCHelper getHelper() {
343
        return helper;
344
    }
345

    
346
    protected OperationsFactory getOperations() {
347
        return this.getHelper().getOperations();
348
    }
349

    
350
    @Override
351
    public DataStore open(DataStoreParameters params) throws DataException {
352
        checkIsMine(params);
353
        try {
354
            DataStore store = getManager().openStore(this.getTransaction(), params.getProviderName(), params);
355
            return store;
356
        } catch (ValidateDataParametersException e) {
357
            throw new InitializeException(e);
358
        }
359
    }
360

    
361
    @Override
362
    public DataStore open(String tableName) throws DataException {
363
        JDBCStoreParameters params = this.get(tableName);
364
        try {
365
            DataStore store = getManager().openStore(this.getTransaction(), params.getProviderName(), params);
366
            return store;
367
        } catch (ValidateDataParametersException e) {
368
            throw new InitializeException(e);
369
        }
370
    }
371

    
372
    @Override
373
    public List list(int mode) throws DataException {
374
        return list(mode, SHOW_TABLES_AND_VIEWS);
375
    }
376

    
377
    @Override
378
    public List list(int mode, int tablesOrViews) throws DataException {
379
        LocalTransaction trans = new LocalTransaction(null, this.getTransaction());
380
        try {
381
            trans.begin();
382
            trans.add(this);
383
            boolean informationTables = BooleanUtils.isTrue(
384
                    this.getParameters().getShowInformationDBTables()
385
            );
386

    
387
            JDBCServerExplorerParameters serverParams = this.getParameters();
388

    
389
            String key = buildKeyForCachedTables(mode, serverParams, informationTables, tablesOrViews);
390
            CachedTablesValue tablesValue = CACHED_TABLES.get(key);
391
            List<JDBCStoreParameters> tables = null;
392
            if (tablesValue != null) {
393
                tables = tablesValue.get(this.helper);
394
            }
395
            if (tables != null) {
396
                return tables;
397
            }
398
            tablesValue = new CachedTablesValue(this.helper, mode, serverParams, informationTables, 60000, tablesOrViews); //60"
399
            CACHED_TABLES.put(key, tablesValue);
400
            tables = tablesValue.get(this.helper);
401
            trans.commit();
402
            return tables;
403
        } catch (Exception ex) {
404
            trans.abortQuietly();
405
            throw ex;
406
        } finally {
407
            trans.closeQuietly();
408
        }
409
    }
410

    
411
    public String buildKeyForCachedTables(int mode, JDBCServerExplorerParameters params, boolean informationTables, int tablesOrViews) {
412
        JDBCServerExplorerParameters clonedParams = (JDBCServerExplorerParameters) params.getCopy();
413
        clonedParams.setSchema(null);
414
        clonedParams.setCatalog(null);
415

    
416
        StringBuilder builder = new StringBuilder();
417
        builder.append(String.valueOf(mode));
418
        builder.append(Hex.encodeHex(clonedParams.toByteArray()));
419
        builder.append(String.valueOf(informationTables));
420
        builder.append(String.valueOf(tablesOrViews));
421
        String key = builder.toString();
422
        return key;
423
    }
424

    
425
    @Override
426
    public void remove(DataStoreParameters theParams) throws RemoveException {
427
        LocalTransaction trans = new LocalTransaction(null, this.getTransaction());
428
        try {
429
            trans.begin();
430
            trans.add(this);
431
            JDBCStoreParameters params = (JDBCStoreParameters) theParams;
432
            DropTableOperation removeTable = this.getOperations().createDropTable(
433
                    this.getOperations().createTableReference(params)
434
            );
435
            if ((Boolean) removeTable.perform()) {
436
                this.dropCachedTables();
437
            }
438
            trans.commit();
439

    
440
        } catch (RemoveException ex) {
441
            trans.abortQuietly();
442
            throw ex;
443
        } catch (Exception ex) {
444
            trans.abortQuietly();
445
            throw new RemoveException("Can't remove "+Objects.toString(theParams), ex);
446
        } finally {
447
            trans.closeQuietly();
448
        }
449
            
450
    }
451

    
452
    @Override
453
    public JDBCStoreParameters getOpenParameters() throws DataException {
454
        JDBCStoreParameters params = this.helper.createOpenStoreParameters(this.getParameters());
455
        if (StringUtils.isBlank(params.getSchema())) {
456
            params.setSchema(this.createSQLBuilder().default_schema());
457
        }
458
        return params;
459
    }
460

    
461
    @Override
462
    public NewDataStoreParameters getAddParameters(String storeName)
463
            throws DataException {
464
        JDBCNewStoreParameters params = this.getAddParameters();
465
        params.setTable(storeName);
466
        return params;
467
    }
468

    
469
    @Override
470
    public JDBCNewStoreParameters getAddParameters() throws DataException {
471
        JDBCServerExplorerParameters parameters = getParameters();
472
        JDBCNewStoreParameters params = this.helper.createNewStoreParameters();
473
        params.setHost(parameters.getHost());
474
        params.setPort(parameters.getPort());
475
        params.setDBName(parameters.getDBName());
476
        params.setUser(parameters.getUser());
477
        params.setPassword(parameters.getPassword());
478
        params.setCatalog(parameters.getCatalog());
479
        params.setSchema(parameters.getSchema());
480
        params.setJDBCDriverClassName(parameters.getJDBCDriverClassName());
481
        params.setUrl(parameters.getUrl());
482
        if (parameters instanceof FilesystemStoreParameters) {
483
            File f = ((FilesystemStoreParameters) parameters).getFile();
484
            ((FilesystemStoreParameters) params).setFile(f);
485
        }
486

    
487
        params.setDefaultFeatureType(this.getServerExplorerProviderServices()
488
                .createNewFeatureType());
489

    
490
        return params;
491
    }
492

    
493
    protected void checkIsMine(DataStoreParameters dsp) {
494
        if (!(dsp instanceof JDBCConnectionParameters)) {
495
            throw new IllegalArgumentException(
496
                    "not instance of FilesystemStoreParameters");
497
        }
498
        JDBCServerExplorerParameters parameters = getParameters();
499

    
500
        JDBCConnectionParameters pgp = (JDBCConnectionParameters) dsp;
501
        if (!StringUtils.equals(pgp.getHost(), parameters.getHost())) {
502
            throw new IllegalArgumentException("wrong explorer: Host (mine: "
503
                    + parameters.getHost() + " other:" + pgp.getHost() + ")");
504
        }
505
        if (!ObjectUtils.equals(pgp.getPort(), parameters.getPort())) {
506
            throw new IllegalArgumentException("wrong explorer: Port (mine: "
507
                    + parameters.getPort() + " other:" + pgp.getPort() + ")");
508
        }
509
        if (!StringUtils.equals(pgp.getDBName(), parameters.getDBName())) {
510
            throw new IllegalArgumentException("wrong explorer: DBName (mine: "
511
                    + parameters.getDBName() + " other:" + pgp.getDBName()
512
                    + ")");
513
        }
514
        if (!StringUtils.isEmpty(parameters.getCatalog())) {
515
            if (!StringUtils.equals(pgp.getCatalog(), parameters.getCatalog())) {
516
                throw new IllegalArgumentException(
517
                        "wrong explorer: Catalog (mine: "
518
                        + parameters.getCatalog() + " other:"
519
                        + pgp.getCatalog() + ")");
520
            }
521
        }
522
        if (!StringUtils.isEmpty(parameters.getSchema())) {
523
            if (!StringUtils.equals(pgp.getSchema(), parameters.getSchema())) {
524
                throw new IllegalArgumentException(
525
                        "wrong explorer: Schema (mine: "
526
                        + parameters.getSchema() + " other:"
527
                        + pgp.getSchema() + ")");
528
            }
529
        }
530
    }
531

    
532
    @Override
533
    public void open() throws OpenException {
534

    
535
    }
536

    
537
    @Override
538
    public void close() throws CloseException {
539

    
540
    }
541

    
542
    @Override
543
    protected void doDispose() throws BaseException {
544
        synchronized (CACHED_TABLES) {
545
            List<String> toRemove = new ArrayList<>();
546
//            for (Map.Entry<String, CachedValue<List<JDBCStoreParameters>>> entry : CACHED_TABLES.entrySet()) {
547
//                CachedTablesValue value = (CachedTablesValue) entry.getValue();
548
//                if (value.getHelper() == this.helper) {
549
//                    toRemove.add(entry.getKey());
550
//                    value.dispose();
551
//                }
552
//            }
553
//            for (String key : toRemove) {
554
//                CACHED_TABLES.remove(key);
555
//            }
556
            helper.dispose();
557
            helper = null;
558
        }
559
    }
560

    
561
    @Override
562
    public boolean canAdd() {
563
        if (this.canAdd == null) {
564
            CanCreateTablesOperation canAdd_ = this.getOperations().createCanCreateTables();
565
            this.canAdd = (Boolean) canAdd_.perform();
566
        }
567
        return this.canAdd;
568
    }
569

    
570
    @Override
571
    public FeatureType getFeatureType(DataStoreParameters theParams)
572
            throws DataException {
573

    
574
        JDBCStoreParameters params = (JDBCStoreParameters) theParams;
575

    
576
        checkIsMine(params);
577

    
578
        EditableFeatureType fetureType
579
                = this.getServerExplorerProviderServices().createNewFeatureType();
580

    
581
        List<String> primaryKeys = null;
582
        if (params.getPkFields() != null) {
583
            primaryKeys = Arrays.asList(params.getPkFields());
584
        }
585

    
586
        FetchFeatureTypeOperation fetch = this.getOperations().createFetchFeatureType(
587
                fetureType,
588
                this.getOperations().createTableReference(params),
589
                primaryKeys,
590
                params.getDefaultGeometryField(),
591
                params.getCRS()
592
        );
593
        fetch.perform();
594
        return fetureType;
595
    }
596

    
597
    @Override
598
    public boolean add(String providerName, NewDataStoreParameters theParams, boolean overwrite)
599
            throws DataException {
600

    
601
        LocalTransaction trans = new LocalTransaction(null, this.getTransaction());
602
        try {
603
            trans.begin();
604
            trans.add(this);
605
            List<Pair<String, Privilege>> userAndPrivileges = new ArrayList<>();
606
            JDBCNewStoreParameters params = (JDBCNewStoreParameters) theParams;
607
            if (!StringUtils.isEmpty(params.getAllRole())) {
608
                userAndPrivileges.add(
609
                        new ImmutablePair<>(params.getAllRole(), Privilege.ALL)
610
                );
611
            }
612
            if (!StringUtils.isEmpty(params.getDeleteRole())) {
613
                userAndPrivileges.add(
614
                        new ImmutablePair<>(params.getDeleteRole(), Privilege.DELETE)
615
                );
616
            }
617
            if (!StringUtils.isEmpty(params.getInsertRole())) {
618
                userAndPrivileges.add(
619
                        new ImmutablePair<>(params.getInsertRole(), Privilege.INSERT)
620
                );
621
            }
622
            if (!StringUtils.isEmpty(params.getReferenceRole())) {
623
                userAndPrivileges.add(
624
                        new ImmutablePair<>(params.getReferenceRole(), Privilege.REFERENCE)
625
                );
626
            }
627
            if (!StringUtils.isEmpty(params.getSelectRole())) {
628
                userAndPrivileges.add(
629
                        new ImmutablePair<>(params.getSelectRole(), Privilege.SELECT)
630
                );
631
            }
632
            if (!StringUtils.isEmpty(params.getTriggerRole())) {
633
                userAndPrivileges.add(
634
                        new ImmutablePair<>(params.getTriggerRole(), Privilege.TRIGGER)
635
                );
636
            }
637
            if (!StringUtils.isEmpty(params.getTruncateRole())) {
638
                userAndPrivileges.add(
639
                        new ImmutablePair<>(params.getTruncateRole(), Privilege.TRUNCATE)
640
                );
641
            }
642
            if (!StringUtils.isEmpty(params.getUpdateRole())) {
643
                userAndPrivileges.add(
644
                        new ImmutablePair<>(params.getUpdateRole(), Privilege.UPDATE)
645
                );
646
            }
647
            List<String> additionalSQLs = new ArrayList<>();
648
            if (!StringUtils.isEmpty(params.getPostCreatingStatement())) {
649
                additionalSQLs.add(params.getPostCreatingStatement());
650
            }
651
            CreateTableOperation createTable = this.getOperations().createTable(
652
                    this.getOperations().createTableReference(params),
653
                    params.getDefaultFeatureType(),
654
                    userAndPrivileges,
655
                    additionalSQLs
656
            );
657

    
658
            boolean isOk = (boolean) createTable.perform();
659
            if (!isOk) {
660
                trans.commit();
661
                return false;
662
            }
663

    
664
            // We collect the featureType of the operation because 
665
            // the provider has been able to make changes to it
666
            params.setDefaultFeatureType(createTable.getType());
667

    
668
            if (theParams instanceof NewFeatureStoreParameters) {
669
                DataManager dataManager = DALLocator.getDataManager();
670
                ResourcesStorage resources = this.getResourcesStorage(theParams);
671
                dataManager.writeDALResource(resources, ((NewFeatureStoreParameters) theParams).getDefaultFeatureType());
672
            }
673
            this.dropCachedTables();
674
            trans.commit();
675
            return true;
676
        } catch (Exception ex) {
677
            trans.abortQuietly();
678
            throw ex;
679
        } finally {
680
            trans.closeQuietly();
681
        }
682
            
683
    }
684

    
685
    @Override
686
    public void dropCaches() {
687
        this.dropCachedTables();
688
    }
689
    
690
    private void dropCachedTables() {
691
        boolean informationTables = BooleanUtils.isTrue(
692
                this.getParameters().getShowInformationDBTables()
693
        );
694
        synchronized (CACHED_TABLES) {
695
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_ALL, this.getParameters(), informationTables, SHOW_TABLES_AND_VIEWS));
696
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_FEATURE, this.getParameters(), informationTables, SHOW_TABLES_AND_VIEWS));
697
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_GEOMETRY, this.getParameters(), informationTables, SHOW_TABLES_AND_VIEWS));
698
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_ALL, this.getParameters(), informationTables, SHOW_TABLES));
699
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_FEATURE, this.getParameters(), informationTables, SHOW_TABLES));
700
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_GEOMETRY, this.getParameters(), informationTables, SHOW_TABLES));
701
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_ALL, this.getParameters(), informationTables, SHOW_VIEWS));
702
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_FEATURE, this.getParameters(), informationTables, SHOW_VIEWS));
703
            CACHED_TABLES.remove(buildKeyForCachedTables(MODE_GEOMETRY, this.getParameters(), informationTables, SHOW_VIEWS));
704
        }
705
    }
706

    
707
    @Override
708
    public List getDataStoreProviderNames() {
709
        List x = new ArrayList(1);
710
        x.add(this.getProviderName());
711
        return x;
712
    }
713

    
714
    @Override
715
    public void updateTableStatistics(String database, String schema, String table) throws JDBCExecuteSQLException {
716
        UpdateTableStatisticsOperation updateStatistics = this.getOperations().createUpdateTableStatistics(
717
                this.getOperations().createTableReference(database, schema, table, null)
718
        );
719
        updateStatistics.perform();
720
    }
721

    
722
    @Override
723
    public Object execute(String sql) {
724
        LocalTransaction trans = new LocalTransaction(this.getManager(), getTransaction());
725
        try {
726
            trans.begin();
727
            trans.add(this);
728
            ExecuteOperation execute = this.getOperations().createExecute(sql);
729
            Object res = execute.perform();
730
            trans.commit();
731
            return res;
732
        } catch (RuntimeException ex) {
733
            trans.abortQuietly();
734
            throw ex;
735
        } catch (Exception ex) {
736
            trans.abortQuietly();
737
            throw new RuntimeException("Can't execute sql '"+sql+"'", ex);
738
        } finally {
739
            trans.closeQuietly();
740
        }
741
    }
742

    
743
    @Override
744
    public JDBCStoreParameters get(String name) throws DataException {
745
        JDBCStoreParameters params = this.getOpenParameters(name);
746
        return params;
747
    }
748

    
749
    @Override
750
    public SQLBuilder createSQLBuilder() {
751
        JDBCSQLBuilderBase builder = this.getHelper().createSQLBuilder();
752
        return builder;
753
    }
754

    
755
    private CustomResourcesConfig getCustomResourcesConfig() {
756
        JDBCServerExplorerParameters serverParams = this.getParameters();
757
        String key = buildKeyForCachedTables(MODE_ALL, serverParams, false, SHOW_TABLES_AND_VIEWS); //???
758
        CachedValue<CustomResourcesConfig> cachedConfig = CACHED_CUSTOM_RESOURCES_CONFIG.get(key);
759
        if (cachedConfig != null) {
760
//            LOG.info("Get CustomResourcesConfig from CACHE_1: "+!cachedConfig.isExpired());
761
            CustomResourcesConfig config = cachedConfig.get();
762
            return config;
763
        }
764
        JDBCStoreParameters params = this.helper.createOpenStoreParameters(this.getParameters());
765
        cachedConfig = new CachedCustomResourcesConfig(params);
766
        CACHED_CUSTOM_RESOURCES_CONFIG.put(key, cachedConfig);
767
//        LOG.info("Get CustomResourcesConfig from CACHE_2: "+!cachedConfig.isExpired());
768
        return cachedConfig.get();
769
    }
770

    
771
    private void refreshCustomResourcesConfig() {
772
        JDBCServerExplorerParameters serverParams = this.getParameters();
773
        String key = buildKeyForCachedTables(MODE_ALL, serverParams, false, SHOW_TABLES_AND_VIEWS); //???
774
        CachedValue<CustomResourcesConfig> cachedConfig = CACHED_CUSTOM_RESOURCES_CONFIG.get(key);
775
        if (cachedConfig != null) {
776
//            LOG.info("Force expire CustomResourcesConfig cache");
777
            cachedConfig.expired();
778
        }
779
    }
780

    
781
    private ResourcesStorage getResourcesStorage(DataStoreParameters parameters, String storeName) {
782
        if (DatabaseWorkspaceManager.isInternalTable(storeName)) {
783
            ResourcesStorage resourcesStorage = ResourcesStorage.EMPTY_RESOURCESSTORAGE;
784
            return resourcesStorage;
785
        }
786
        String resourcesTablename = null;
787
        try {
788
            ResourcesStorage alternateResourcesStorage = null;
789
            DataManager dataManager = DALLocator.getDataManager();
790
            DatabaseWorkspaceManager workspace = dataManager.getDatabaseWorkspace(parameters);
791
            if (workspace != null) {
792
                alternateResourcesStorage = workspace.getAlternativeResourcesStorage(storeName);
793
            }
794

    
795
            ResourcesStorage defaultResourcesStorage = null;
796
            ResourcesStorage customResourcesStorage = null;
797

    
798
            // TODO: Habria que ver de localizar los parametros sin tener que hacer un list.
799
            resourcesTablename = TABLE_RESOURCES_NAME;
800
            List<JDBCStoreParameters> tables = this.list();
801
            for (JDBCStoreParameters params : tables) {
802
                String theTableName = params.getTable();
803
                if (StringUtils.equals(theTableName, resourcesTablename)) {
804
                    defaultResourcesStorage = new JDBCResourcesStorage(
805
                            this.helper,
806
                            alternateResourcesStorage,
807
                            params,
808
                            storeName
809
                    );
810
                    break;
811
                }
812
            }
813
            CustomResourcesConfig config = getCustomResourcesConfig();
814
            if (config != null) {
815
                if (config.isInternalTable(storeName)) {
816
                    defaultResourcesStorage = ResourcesStorage.EMPTY_RESOURCESSTORAGE;
817
                } else {
818
                    resourcesTablename = config.getResourcesTablename(storeName);
819
                    if (StringUtils.isNotBlank(resourcesTablename)) {
820
                        JDBCStoreParameters params = this.getOpenParameters(resourcesTablename);
821
                        customResourcesStorage = new JDBCResourcesStorage(
822
                                this.helper,
823
                                alternateResourcesStorage,
824
                                params,
825
                                storeName,
826
                                config.isResourcesReadOnly(resourcesTablename)
827
                        );
828
                    }
829
                }
830
            }
831
            return new CompoundResourcesStorageWithSupportTransactions(defaultResourcesStorage, customResourcesStorage);
832
        } catch (Throwable ex) {
833
            LOG.warn("Can't retrieve reources storage for table '" + storeName + "' in '" + this.getParameters().getUrl() + " (" + resourcesTablename + ").", ex);
834
        }
835
        ResourcesStorage theResourcesStorage = ResourcesStorage.EMPTY_RESOURCESSTORAGE;
836
        return theResourcesStorage;
837
    }
838

    
839
    public ResourcesStorage getResourcesStorage(String name) {
840
        JDBCStoreParameters params;
841
        try {
842
            ResourcesStorage customResourcesStorage = null;
843
            CustomResourcesConfig config = getCustomResourcesConfig();
844
            if (config != null) {
845
                if (!config.isInternalTable(name)) {
846
                    String resourcesTablename = config.getResourcesTablename(name);
847
                    if (StringUtils.isNotBlank(resourcesTablename)) {
848
                        params = this.getOpenParameters(resourcesTablename);
849
                        customResourcesStorage = new JDBCResourcesStorage(
850
                                this.helper,
851
                                null,
852
                                params,
853
                                TABLENAME_SERVER_EXPLORER_MARK,
854
                                config.isResourcesReadOnly(resourcesTablename)
855
                        );
856
                    }
857
                }
858
            }
859
            params = this.getOpenParameters(DatabaseWorkspaceManager.TABLE_RESOURCES_NAME);
860
            JDBCResourcesStorage defaultResourcesStorage = new JDBCResourcesStorage(
861
                    this.helper,
862
                    null,
863
                    params,
864
                    TABLENAME_SERVER_EXPLORER_MARK
865
            );
866
            if (customResourcesStorage == null) {
867
                return defaultResourcesStorage;
868
            }
869
            return new CompoundResourcesStorageWithSupportTransactions(defaultResourcesStorage, customResourcesStorage);
870
        } catch (DataException ex) {
871
            return null;
872
        }
873
    }
874

    
875
    @Override
876
    public ResourcesStorage getResourcesStorage() {
877
        JDBCStoreParameters params;
878
        try {
879
            params = this.getOpenParameters(DatabaseWorkspaceManager.TABLE_RESOURCES_NAME);
880
//            params.setTable(DatabaseWorkspaceManager.TABLE_RESOURCES_NAME);
881
            JDBCResourcesStorage theResourcesStorage = new JDBCResourcesStorage(
882
                    this.helper,
883
                    null,
884
                    params,
885
                    TABLENAME_SERVER_EXPLORER_MARK
886
            );
887
            return theResourcesStorage;
888
        } catch (DataException ex) {
889
            return null;
890
        }
891
    }
892

    
893
    @Override
894
    public ResourcesStorage getResourcesStorage(DataStoreParameters parameters) {
895
        if (parameters == null) {
896
            throw new IllegalArgumentException("null is a valid value for parameters.");
897
        }
898
        String tableName;
899
        if (parameters instanceof JDBCNewStoreParameters) {
900
            tableName = ((JDBCNewStoreParameters) parameters).getTable();
901
        } else if (parameters instanceof JDBCStoreParameters) {
902
            tableName = ((JDBCStoreParameters) parameters).getTable();
903
        } else {
904
            throw new IllegalArgumentException("Required a JDBCStoreParameters or JDBCNewStoreParameters parameters, received " + parameters.getClass().getName() + ".");
905
        }
906
        return this.getResourcesStorage(parameters, tableName);
907
    }
908

    
909
    @Override
910
    public ResourcesStorage getResourcesStorage(DataStore dataStore) {
911
        return this.getResourcesStorage((JDBCStoreParameters) dataStore.getParameters(),
912
                dataStore.getName()
913
        );
914
    }
915

    
916
    @Override
917
    public boolean exists(DataStoreParameters parameters) throws DataException {
918
        JDBCStoreParameters params = (JDBCStoreParameters) parameters;
919
        JDBCSQLBuilderBase builder = this.getHelper().createSQLBuilder();
920
        SQLBuilder.TableNameBuilder searchTable = builder.createTableNameBuilder()
921
                .database(params.getDBName())
922
                .schema(params.getSchema())
923
                .name(params.getTable());
924
        SQLBuilder.TableNameBuilder table = builder.createTableNameBuilder();
925

    
926
        List<JDBCStoreParameters> l = this.list();
927
        for (JDBCStoreParameters current : l) {
928
            table.database(current.getDBName())
929
                    .schema(current.getSchema())
930
                    .name(current.getTable());
931
            if (table.equals(searchTable)) {
932
                return true;
933
            }
934
        }
935
        return false;
936
    }
937

    
938
    @Override
939
    public void setCustomResources(String tableName, String resourcesTableName) {
940
        this.setCustomResources(tableName, resourcesTableName, false);
941
    }
942

    
943
    @Override
944
    public void setCustomResources(String tableName, String resourcesTableName, boolean readonly) {
945
        CustomResourcesConfig config = getCustomResourcesConfig();
946
        if (config == null) {
947
            throw new RuntimeException("Can't retrieve alternative resources configuration");
948
        }
949
        config.addResourceMapping(tableName, resourcesTableName);
950
        config.setResourcesReadOnly(resourcesTableName, readonly);
951
        JDBCStoreParameters params = this.helper.createOpenStoreParameters(this.getParameters());
952
        if (!setConfigValue(params, CONFIG_NAME_CUSTOM_RESOURCES, config.toJsonString())) {
953
            throw new RuntimeException("Can't save custom resources configuration");
954
        }
955
        refreshCustomResourcesConfig();
956

    
957
        if (StringUtils.isNotBlank(resourcesTableName)) {
958
            try {
959
                params = this.getOpenParameters(resourcesTableName);
960
                JDBCResourcesStorage resourcesStorage = new JDBCResourcesStorage(
961
                        this.helper,
962
                        null,
963
                        params,
964
                        tableName,
965
                        config.isResourcesReadOnly(resourcesTableName)
966
                );
967
                resourcesStorage.clearCache();
968
            } catch (Exception ex) {
969
                LOG.debug("Can't remove local cache for table " + tableName, ex);
970
            }
971
        }
972

    
973
    }
974

    
975
    private static boolean setConfigValue(JDBCStoreParameters params, String name, String value) {
976
        FeatureStore store = null;
977
        try {
978
            DataManager dataManager = DALLocator.getDataManager();
979
            params.setTable(TABLE_CONFIGURATION_NAME);
980
            store = (FeatureStore) dataManager.openStore(
981
                    params.getProviderName(),
982
                    params
983
            );
984
        } catch (Exception ex) {
985
            LOG.trace("Can't read configuration value '" + name + "'", ex);
986
            // Do noting
987
//        } finally {
988
//            DisposeUtils.disposeQuietly(store);
989
        }
990
        if (store == null) {
991
            return false;
992
        }
993
        try {
994
            store.edit();
995
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
996
            String filter = builder.eq(
997
                    builder.column(FIELD_CONFIGURATION_NAME),
998
                    builder.constant(name)
999
            ).toString();
1000
            Feature feature = store.findFirst(filter);
1001
            EditableFeature efeature;
1002
            if (feature == null) {
1003
                efeature = store.createNewFeature();
1004
                efeature.set(FIELD_CONFIGURATION_NAME, name);
1005
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
1006
                store.insert(efeature);
1007
            } else {
1008
                efeature = feature.getEditable();
1009
                efeature.set(FIELD_CONFIGURATION_VALUE, value);
1010
                store.update(efeature);
1011
            }
1012
            store.finishEditing();
1013
            return true;
1014
        } catch (Exception ex) {
1015
            LOG.debug("Can't write configuration value for '" + name + "'", ex);
1016
            return false;
1017
        } finally {
1018
            DisposeUtils.disposeQuietly(store);
1019
        }
1020
    }
1021

    
1022
//    private static String getConfigValue_useStore(JDBCStoreParameters params, String name) {
1023
//        FeatureStore store = null;
1024
//        try {
1025
//            DataManager dataManager = DALLocator.getDataManager();
1026
//            params.setTable(TABLE_CONFIGURATION_NAME);
1027
//            store = (FeatureStore) dataManager.openStore(
1028
//                    params.getProviderName(), 
1029
//                    params
1030
//            );
1031
//        } catch (Exception ex) {
1032
//            LOG.trace("Can't read configuration value '"+name+"'", ex);
1033
//            // Do noting
1034
////        } finally {
1035
////            DisposeUtils.disposeQuietly(store);
1036
//        }
1037
//        if( store == null ) {
1038
//            return null;
1039
//        }
1040
//        try {
1041
//            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
1042
//            String filter = builder.eq(
1043
//                    builder.column(FIELD_CONFIGURATION_NAME),
1044
//                    builder.constant(name)
1045
//            ).toString();
1046
//            Feature feature = store.findFirst(filter);
1047
//            if( feature == null ) {
1048
//                return null;
1049
//            }
1050
//            String value = feature.getString(FIELD_CONFIGURATION_VALUE);
1051
//            return value;
1052
//        } catch (Exception ex) {
1053
//            LOG.debug("Can't read configuration value '"+name+"'", ex);
1054
//            return null;
1055
//        } finally {
1056
//            DisposeUtils.disposeQuietly(store);
1057
//        }
1058
//    }
1059
    private static String getConfigValue(JDBCStoreParameters params, String name) {
1060
        JDBCServerExplorerBase explorer = null;
1061
        DataManager dataManager = DALLocator.getDataManager();
1062
        LocalTransaction trans = new LocalTransaction(dataManager, null);
1063
        try {
1064
            trans.begin();
1065
            params.setTable(TABLE_CONFIGURATION_NAME);
1066
            JDBCServerExplorerParameters explorerParams = (JDBCServerExplorerParameters) dataManager.createServerExplorerParameters(params.getProviderName());
1067
            ToolsLocator.getDynObjectManager().copy(params, explorerParams);
1068

    
1069
            explorer = (JDBCServerExplorerBase) dataManager.openServerExplorer(explorerParams.getProviderName(), explorerParams);
1070
            trans.add(explorer);
1071
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
1072
            String filter = builder.eq(
1073
                    builder.column(FIELD_CONFIGURATION_NAME),
1074
                    builder.constant(name)
1075
            ).toString();
1076
            OperationsFactory operations = explorer.getOperations();
1077
            RetrieveValueOperation op = operations.createRetrieveValue(
1078
                    operations.createTableReference(params),
1079
                    filter,
1080
                    null, //order
1081
                    FIELD_CONFIGURATION_VALUE
1082
            );
1083
            Object value = op.perform();
1084
            trans.commit();
1085
            return Objects.toString(value, null);
1086
        } catch (Exception ex) {
1087
            LOG.debug("Can't read configuration value '" + name + "'", ex);
1088
            trans.abortQuietly();
1089
            return null;
1090
        } finally {
1091
            trans.closeQuietly();
1092
            DisposeUtils.disposeQuietly(explorer);
1093
        }
1094
    }
1095

    
1096
    @Override
1097
    public boolean exists() {
1098
        try {
1099
            JDBCServerExplorerParameters serverParameters = this.getParameters();
1100
            OperationsFactory operations = helper.getOperations();
1101
            ListTablesOperation listTables = operations.createListTables(
1102
                    MODE_ALL, serverParameters, false, SHOW_TABLES
1103
            );
1104
            List<JDBCStoreParameters> tables = (List<JDBCStoreParameters>) listTables.perform();
1105
            return true;
1106
        } catch (Throwable th) {
1107
            return false;
1108
        }
1109
    }
1110

    
1111
    @Override
1112
    public String getConnectionProviderStatus() {
1113
        return this.helper.getConnectionProviderStatus();
1114
    }
1115

    
1116
    public void setTransaction(DataTransaction transaction) {
1117
        if (this.helper != null) {
1118
            this.helper.setTransaction((DataTransactionServices) transaction);
1119
        }
1120
    }
1121

    
1122
    @Override
1123
    public DataTransaction getTransaction() {
1124
        if (this.helper == null) {
1125
            return null;
1126
        }
1127
        return this.helper.getTransaction();
1128
    }
1129

    
1130
    private JDBCStoreParameters getOpenParameters(String tableName) throws DataException {
1131
        //No esta claro si se debe hacer este bucle o no. NO BORRAR ALEGREMENTE
1132

    
1133
//        List<JDBCStoreParameters> tables = this.list();
1134
//        for (JDBCStoreParameters params : tables) {
1135
//            String theTableName = params.getTable();
1136
//            if (StringUtils.equals(theTableName, tableName)) {
1137
//                return params;
1138
//            }
1139
//        }
1140
        JDBCStoreParameters p = this.getOpenParameters();
1141
        p.setTable(tableName);
1142
        return p;
1143
    }
1144
    
1145
    
1146
}