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 / test / java / org / gvsig / fmap / dal / store / jdbc2 / AbstractTestUtils.java @ 46112

History | View | Annotate | Download (18.9 KB)

1 46101 jjdelcerro
package org.gvsig.fmap.dal.store.jdbc2;
2 45472 jjdelcerro
3
import java.io.File;
4
import java.net.URL;
5
import java.util.ArrayList;
6 46101 jjdelcerro
import java.util.HashMap;
7 45472 jjdelcerro
import java.util.List;
8 46101 jjdelcerro
import java.util.Map;
9
import java.util.Properties;
10
import org.apache.commons.collections4.CollectionUtils;
11 45472 jjdelcerro
import org.apache.commons.io.FileUtils;
12 46101 jjdelcerro
import org.apache.commons.io.FilenameUtils;
13
import org.apache.commons.io.IOUtils;
14
import org.apache.commons.lang3.BooleanUtils;
15 45472 jjdelcerro
import org.apache.commons.lang3.StringUtils;
16 46101 jjdelcerro
import org.apache.commons.lang3.math.NumberUtils;
17 45472 jjdelcerro
import org.gvsig.fmap.dal.DALLocator;
18
import org.gvsig.fmap.dal.DataManager;
19
import org.gvsig.fmap.dal.DataStore;
20 46101 jjdelcerro
import static org.gvsig.fmap.dal.DataStore.H2SPATIAL_PROVIDER_NAME;
21 45472 jjdelcerro
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
22 46101 jjdelcerro
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
23
import org.gvsig.fmap.dal.feature.EditableFeature;
24
import org.gvsig.fmap.dal.feature.EditableFeatureType;
25 45472 jjdelcerro
import org.gvsig.fmap.dal.feature.Feature;
26
import org.gvsig.fmap.dal.feature.FeatureStore;
27 46101 jjdelcerro
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
28 45472 jjdelcerro
import org.gvsig.fmap.dal.feature.impl.DefaultFeature;
29
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
30 46101 jjdelcerro
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
31
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
32
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
33
import org.gvsig.tools.util.HasAFile;
34 45472 jjdelcerro
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36
37 46101 jjdelcerro
public abstract class AbstractTestUtils {
38 45472 jjdelcerro
39 46101 jjdelcerro
    public static final Logger LOGGER = LoggerFactory.getLogger(AbstractTestUtils.class);
40 45472 jjdelcerro
41 46101 jjdelcerro
    protected static int dbcounter = 1;
42
43
    protected Properties properties = null;
44
45
    public AbstractTestUtils() {
46
47
    }
48
49
    public File getTargetFolder() throws Exception {
50 46112 omartinez
        URL url = this.getClass().getResource("/");
51
        if (url == null) {
52
            url = AbstractTestUtils.class.getResource("/");
53
        }
54 46101 jjdelcerro
        File x = new File(url.toURI());
55
        File target = x.getParentFile();
56
        return target;
57
    }
58
59
    public File getResource(String name) throws Exception {
60
        File x = new File(getTargetFolder(), name);
61
        return x;
62
    }
63
64
    public File getResourceAsFile(String pathname) throws Exception {
65 46112 omartinez
        URL url = this.getClass().getResource(pathname);
66
        if (url == null) {
67
            url = AbstractTestUtils.class.getResource(pathname);
68
        }
69 46101 jjdelcerro
        if( StringUtils.equalsIgnoreCase(url.getProtocol(),"file") ) {
70
            File x = new File(url.toURI());
71
            return x;
72
        }
73
        File tmp = new File( this.getTargetFolder(), FilenameUtils.getName(pathname));
74
        IOUtils.copy(url, tmp);
75
        return tmp;
76
    }
77
78
    public File getFile(File name) throws Exception {
79
        File f = this.getResource(String.format(
80
                "%s-%d-%03d",
81
                name.getPath(),
82
                System.currentTimeMillis(),
83
                dbcounter++
84
        )
85
        );
86
        FileUtils.forceMkdir(f.getParentFile());
87
        return f;
88
    }
89
90
    public File getFolder(File name) throws Exception {
91
        File f = this.getResource(String.format(
92
                "%s-%d-%03d",
93
                name.getPath(),
94
                System.currentTimeMillis(),
95
                dbcounter++
96
        )
97
        );
98
        FileUtils.forceMkdir(f);
99
        return f;
100
    }
101
102
    public JDBCServerExplorerParameters getH2SpatialServerExplorerParameters(String dbname) throws Exception {
103 45472 jjdelcerro
        DataManager dataManager = DALLocator.getDataManager();
104 46101 jjdelcerro
        JDBCServerExplorerParameters conn = (JDBCServerExplorerParameters) dataManager.createServerExplorerParameters(H2SPATIAL_PROVIDER_NAME);
105 45472 jjdelcerro
106 46101 jjdelcerro
        File dbfile = this.getResource(String.format(
107 45472 jjdelcerro
                "test-dbs/%s-%d-%03d",
108
                dbname,
109 46101 jjdelcerro
                System.currentTimeMillis(),
110 45472 jjdelcerro
                dbcounter++
111 46101 jjdelcerro
        )
112 45472 jjdelcerro
        );
113
//        System.out.println("#### dbfile: " + dbfile.getAbsolutePath());
114
        FileUtils.forceMkdir(dbfile.getParentFile());
115 46101 jjdelcerro
        ((HasAFile) conn).setFile(dbfile);
116 45472 jjdelcerro
        return conn;
117
    }
118 46101 jjdelcerro
119
    public FeatureProvider getFeatureProvider(Feature feature) {
120
        return ((DefaultFeature) feature).getData();
121
    }
122
123
    public Expecteds getExpecteds(String name) throws Exception {
124
        Expecteds x = new Expecteds();
125
        x.normaliceSpaces = false;
126
        x.removeNL = true;
127
        x.stripStart = true;
128
        File f = getResourceAsFile(getExpectedsPath() + "/" + name);
129
        x.parse(f);
130
        return x;
131
    }
132
133
    public static class Expecteds {
134
135
        private Map<String, List<String>> expecteds = new HashMap<>();
136
137
        public boolean normaliceSpaces = false;
138
        public boolean stripStart = false;
139
        public boolean removeNL = false;
140
141 46106 jjdelcerro
        public String startLineComment = "-- ";
142
143 46101 jjdelcerro
        private static class CommandLine {
144
145
            private final String[] cmd;
146
147
            private CommandLine(String line, String prefix) {
148
                line = StringUtils.substring(line, prefix.length());
149
                line = StringUtils.normalizeSpace(line);
150
                this.cmd = StringUtils.split(line);
151
            }
152
153
            public boolean isTrue(int argn, boolean defaultValue) {
154
                if (argn >= this.cmd.length) {
155
                    return defaultValue;
156
                }
157
                return BooleanUtils.toBoolean(this.cmd[argn]);
158
            }
159
160
            public String get(int argn) {
161
                return this.cmd[argn];
162
            }
163
164
            public int size() {
165
                return this.cmd.length;
166
            }
167
        }
168
169
        public Expecteds() throws Exception {
170
171
        }
172
173
        public void parse(File f) throws Exception {
174
            final int SEARCHING_ITEM = 0;
175
            final int READING_ITEM = 1;
176
            boolean localNormaliceSpaces = false;
177
            boolean localStripStart = false;
178
            boolean localRemoveNL = false;
179
            String name = f.getName();
180
181
            List<String> lines = FileUtils.readLines(f);
182
183
            StringBuilder sb = null;
184
            String currentItem = null;
185
            int lineno = 1;
186
            int state = SEARCHING_ITEM;
187
            for (String line : lines) {
188
                line = line + "\n";
189
                switch (state) {
190
                    case SEARCHING_ITEM:
191
                        if (line.toLowerCase().startsWith(startLineComment + "normalize-spaces")) {
192
                            CommandLine cmd = new CommandLine(line, startLineComment);
193
                            normaliceSpaces = cmd.isTrue(1, true);
194
                        } else if (line.toLowerCase().startsWith(startLineComment + "strip-start")) {
195
                            CommandLine cmd = new CommandLine(line, startLineComment);
196
                            stripStart = cmd.isTrue(1, true);
197
                        } else if (line.toLowerCase().startsWith(startLineComment + "remove-nl")) {
198
                            CommandLine cmd = new CommandLine(line, startLineComment);
199
                            removeNL = cmd.isTrue(1, true);
200
                        } else if (line.toLowerCase().startsWith(startLineComment + "begin ")) {
201
                            CommandLine cmd = new CommandLine(line, startLineComment);
202
                            currentItem = cmd.get(1);
203
                            sb = new StringBuilder();
204
                            state = READING_ITEM;
205
                            localNormaliceSpaces = normaliceSpaces;
206
                            localStripStart = stripStart;
207
                            localRemoveNL = removeNL;
208
                        } else if (line.toLowerCase().startsWith(startLineComment + "rem ")) {
209
                            // do nothing skip comment
210
                        } else if (!StringUtils.isBlank(line)) {
211
                            throw new IllegalStateException("Syntax error at '" + name + "', line " + lineno + ".");
212
                        }
213
                        break;
214
                    case READING_ITEM:
215
                        if (line.toLowerCase().startsWith(startLineComment + "normalize-spaces")) {
216
                            CommandLine cmd = new CommandLine(line, startLineComment);
217
                            localNormaliceSpaces = cmd.isTrue(1, true);
218
                        } else if (line.toLowerCase().startsWith(startLineComment + "strip-start")) {
219
                            CommandLine cmd = new CommandLine(line, startLineComment);
220
                            localStripStart = cmd.isTrue(1, true);
221
                        } else if (line.toLowerCase().startsWith(startLineComment + "remove-nl")) {
222
                            CommandLine cmd = new CommandLine(line, startLineComment);
223
                            localRemoveNL = cmd.isTrue(1, true);
224
                        } else if (line.toLowerCase().startsWith(startLineComment + "end ")) {
225
                            CommandLine cmd = new CommandLine(line, startLineComment);
226
                            if (!StringUtils.equals(currentItem, cmd.get(1)) )  {
227
                                throw new IllegalStateException("Syntax error at '" + name + "', line " + lineno + ", expected '" + startLineComment + "end " + currentItem + "', and found " + line + ".");
228
                            }
229
                            String s = sb.toString();
230
                            if (s.endsWith("\n")) {
231
                                s = s.substring(0, s.length() - 1);
232
                            }
233
                            if (localNormaliceSpaces) {
234
                                s = StringUtils.normalizeSpace(s);
235
                            }
236
237
                            List<String> value = expecteds.get(currentItem);
238
                            if( value == null ) {
239
                                value = new ArrayList<>();
240
                                expecteds.put(currentItem, value);
241
                            }
242
                            value.add(s);
243
                            state = SEARCHING_ITEM;
244
245
                        } else if (line.toLowerCase().startsWith(startLineComment + "rem ")) {
246
                            // do nothing skip comment
247
                        } else {
248
                            if (localStripStart) {
249
                                line = StringUtils.stripStart(line, null);
250
                            }
251
                            if (localRemoveNL) {
252
                                line = StringUtils.remove(line, "\n");
253
                                line = StringUtils.remove(line, "\r");
254
                            }
255
                            sb.append(line);
256
                        }
257
                        break;
258
                }
259
                lineno++;
260
            }
261
            if (state != SEARCHING_ITEM) {
262
                throw new IllegalStateException("Syntax error at '" + name + "', expected '" + startLineComment + "end " + currentItem + "' and found EOF .");
263
            }
264
        }
265
266
        public String get(String name) {
267
            List<String> value = this.expecteds.get(name);
268
            if( CollectionUtils.isEmpty(value) ) {
269
                return null;
270
            }
271
            return value.get(0);
272
        }
273
274
        public String get(String name, int index) {
275
            List<String> value = this.expecteds.get(name);
276
            if( CollectionUtils.isEmpty(value) ) {
277
                return null;
278
            }
279
            return value.get(index);
280
        }
281
282
        public int size(String name) {
283
            List<String> value = this.expecteds.get(name);
284
            if( CollectionUtils.isEmpty(value) ) {
285
                return 0;
286
            }
287
            return value.size();
288
        }
289
    }
290
291
    public void removeResource(JDBCServerExplorer explorer, String storeName, String resourceName) throws Exception {
292
        JDBCStoreParameters storeParams = explorer.get(storeName);
293
        ResourcesStorage resourcesStorage = explorer.getResourcesStorage(storeParams);
294 46106 jjdelcerro
        if( resourcesStorage.allowRemove() ) {
295
            resourcesStorage.remove(resourceName);
296
        }
297 46101 jjdelcerro
    }
298
299
    public void info_h2sql(String label, File file) {
300
        System.out.println("");
301
        System.out.println("#h2console "+label+": "+file.getName());
302
        System.out.println("cd '"+file.getParent()+"'; h2sql -d '"+file.getName()+"' -user SA");
303
        System.out.println("jdbc:h2:"+file.getAbsolutePath()+";MODE=PostgreSQL;SCHEMA=PUBLIC;ALLOW_LITERALS=ALL");
304
        System.out.println("jdbc:h2:tcp://127.0.1.1:9123/"+file.getAbsolutePath()+";MODE=PostgreSQL;SCHEMA=PUBLIC;ALLOW_LITERALS=ALL");
305
        System.out.println("");
306
    }
307 45472 jjdelcerro
308 46101 jjdelcerro
    public void info_jdbc(String label, JDBCServerExplorerParameters parameters) {
309
        if( StringUtils.equalsIgnoreCase(parameters.getProviderName(), FeatureStore.H2SPATIAL_PROVIDER_NAME) ) {
310
            info_h2sql(label, ((HasAFile)parameters).getFile());
311
            return;
312
        }
313
        System.out.println("");
314
        System.out.println("# Connection "+label);
315
        System.out.println(parameters.getUrl());
316
        System.out.println("");
317 45472 jjdelcerro
    }
318
319 46101 jjdelcerro
    public void info_jdbc(String label, JDBCServerExplorer explorer) {
320
        info_jdbc(label, explorer.getParameters());
321 45472 jjdelcerro
    }
322
323 46101 jjdelcerro
    public void info_jdbc(JDBCServerExplorer explorer) {
324
        JDBCServerExplorerParameters params = explorer.getParameters();
325
        info_jdbc(params.getDBName(), params);
326 45472 jjdelcerro
    }
327
328 46101 jjdelcerro
    protected boolean getPropertyBoolean(String name) {
329
        Properties props = this.getProperties();
330
        return BooleanUtils.toBoolean(props.getProperty(name));
331 45472 jjdelcerro
    }
332 46101 jjdelcerro
333
    protected int getPropertyInt(String name, int defaultValue) {
334
        Properties props = this.getProperties();
335
        return NumberUtils.toInt(props.getProperty(name), defaultValue);
336
    }
337
338
    protected String getProperty(String name) {
339
        Properties props = this.getProperties();
340
        return props.getProperty(name);
341
    }
342
343
    protected Properties getProperties() {
344
        if( this.properties == null ) {
345
            try {
346
                Properties props = new Properties();
347
                this.properties = props;
348
            } catch(Exception ex) {
349
                throw new RuntimeException(ex);
350
            }
351
        }
352
        return this.properties;
353
    }
354 45472 jjdelcerro
355 46101 jjdelcerro
    public boolean isTheDatabaseAvailable() {
356
        return true;
357 45472 jjdelcerro
    }
358
359 46101 jjdelcerro
    public FeatureStore openCSVStore(String pathname) throws Exception {
360 45472 jjdelcerro
        DataManager dataManager = DALLocator.getDataManager();
361 46101 jjdelcerro
        File f = getResourceAsFile(pathname);
362 45472 jjdelcerro
        FeatureStore store = (FeatureStore) dataManager.openStore(
363
                DataStore.CSV_PROVIDER_NAME,
364
                "file=",f,
365
                "automaticTypesDetection=", false,
366
                "locale=","en"
367
        );
368
        return store;
369
    }
370 46050 omartinez
371 46101 jjdelcerro
    public FeatureStore openSourceStore1() throws Exception {
372
        return this.openCSVStore("/org/gvsig/fmap/dal/store/jdbc2/testCreateSource1.csv");
373
    }
374
375
    public FeatureStore openSourceStore2() throws Exception {
376
        return this.openCSVStore("/org/gvsig/fmap/dal/store/jdbc2/testCreateSource2.csv");
377
    }
378
379
    public FeatureStore openStore(JDBCServerExplorer explorer, String name) throws Exception {
380
        JDBCStoreParameters params = explorer.get(name);
381
382 46050 omartinez
        DataManager dataManager = DALLocator.getDataManager();
383 46101 jjdelcerro
        FeatureStore store;
384
        try {
385
            store = (FeatureStore) dataManager.openStore(
386
                    getProviderName(),
387
                    params
388
            );
389
        } catch(ValidateDataParametersException ex) {
390
            LOGGER.warn(ex.getLocalizedMessageStack());
391
            throw ex;
392
        }
393 46050 omartinez
        return store;
394
    }
395 45472 jjdelcerro
396 46101 jjdelcerro
    public void create_table_from(JDBCServerExplorer targetExplorer, String targetName, FeatureStore sourceStore) throws Exception {
397
        NewFeatureStoreParameters params = (NewFeatureStoreParameters) targetExplorer.getAddParameters(
398
                targetName
399
        );
400
        EditableFeatureType ft = params.getDefaultFeatureType();
401
        ft.addAll(sourceStore.getDefaultFeatureType());
402
        targetExplorer.add(getProviderName(), params, true);
403
    }
404
405
    public void insert_into_from(JDBCServerExplorer targetExplorer, String targetName, FeatureStore sourceStore, int mode) throws Exception {
406
        FeatureStore targetStore = openStore(targetExplorer, targetName);
407
        targetStore.edit(mode);
408
        try {
409
            for (Feature sourceFeature : sourceStore.getFeatureSet()) {
410
                EditableFeature targetFeature = targetStore.createNewFeature(sourceFeature);
411
                targetStore.insert(targetFeature);
412
            }
413
        } finally {
414
            targetStore.finishEditing();
415 45472 jjdelcerro
        }
416
    }
417
418 46101 jjdelcerro
    public JDBCServerExplorer openServerExplorer(String dbname) throws Exception {
419
        DataManager dataManager = DALLocator.getDataManager();
420
        JDBCServerExplorerParameters params = this.getServerExplorerParameters(dbname);
421
        JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
422
                this.getProviderName(),
423
                params
424
        );
425
        return explorer;
426 45472 jjdelcerro
    }
427
428 46105 omartinez
    public void drop_tables(JDBCServerExplorer explorer, String...tables) throws Exception {
429 46101 jjdelcerro
        for (String table : tables) {
430
            String sql = "DROP TABLE IF EXISTS \""+table+"\"";
431
            explorer.execute(sql);
432 46105 omartinez
            removeResource(explorer, table, "dal");
433 46101 jjdelcerro
        }
434 45472 jjdelcerro
    }
435
436 46105 omartinez
    public void initWorkspace(String name) throws Exception {
437
        JDBCServerExplorer explorer = this.openServerExplorer(name);
438
        DataManager manager = DALLocator.getDataManager();
439
        DatabaseWorkspaceManager ws = manager.createDatabaseWorkspaceManager(explorer.getParameters());
440
        ws.connect();
441
        if (!ws.existsTable(DatabaseWorkspaceManager.TABLE_CONFIGURATION)) {
442
            ws.createTable(DatabaseWorkspaceManager.TABLE_CONFIGURATION);
443
        }
444
        if (!ws.existsTable(DatabaseWorkspaceManager.TABLE_RESOURCES)) {
445
            ws.createTable(DatabaseWorkspaceManager.TABLE_RESOURCES);
446
        }
447
    }
448
449 46112 omartinez
    public List<String> getExpectedSQLs(String name) throws Exception {
450
        File f = getResourceAsFile(getExpectedsPath() + "/" + name);
451
        List<String> SQLs = new ArrayList<>();
452
        List<String> lines = FileUtils.readLines(f);
453
        StringBuilder sb = new StringBuilder();
454
        for (String line : lines) {
455
            line = StringUtils.stripStart(line, null);
456
            if (line.startsWith("--")) {
457
                continue;
458
            }
459
            if (line.endsWith(";")) {
460
                sb.append(line.substring(0, line.length() - 1));
461
                SQLs.add(sb.toString());
462
                sb.setLength(0);
463
            } else {
464
                sb.append(line);
465
            }
466
        }
467
        return SQLs;
468
    }
469
470
471 46101 jjdelcerro
//    public abstract String getExpectedResourcesPrefix(); // Ex. "h2spatial"
472 45472 jjdelcerro
473 46101 jjdelcerro
    public abstract String getExpectedsPath();
474
475
    public abstract JDBCHelper createJDBCHelper() throws Exception;
476
477
    public abstract String getProviderName();
478
479
    public abstract JDBCServerExplorerParameters getServerExplorerParameters(String dbname) throws Exception;
480 45472 jjdelcerro
}