Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dal / src-test / org / gvsig / fmap / dal / feature / BaseTestFeatureStore.java @ 30754

History | View | Annotate | Download (51.6 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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 2
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
 */
22

    
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2009 IVER T.I. S.A.   {{Task}}
26
*/
27

    
28
/**
29
 *
30
 */
31
package org.gvsig.fmap.dal.feature;
32

    
33
import java.util.ArrayList;
34
import java.util.Collections;
35
import java.util.Iterator;
36
import java.util.List;
37
import java.util.Random;
38
import java.util.TreeSet;
39

    
40
import org.gvsig.fmap.dal.DALLocator;
41
import org.gvsig.fmap.dal.DataManager;
42
import org.gvsig.fmap.dal.DataServerExplorer;
43
import org.gvsig.fmap.dal.DataStoreParameters;
44
import org.gvsig.fmap.dal.DataTypes;
45
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
46
import org.gvsig.fmap.dal.exception.DataException;
47
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
48
import org.gvsig.fmap.dal.feature.testmulithread.StoreTask;
49
import org.gvsig.fmap.dal.resource.ResourceManager;
50
import org.gvsig.fmap.geom.Geometry;
51
import org.gvsig.tools.ToolsLocator;
52
import org.gvsig.tools.dynobject.DynClass;
53
import org.gvsig.tools.dynobject.DynField;
54
import org.gvsig.tools.dynobject.DynObject;
55
import org.gvsig.tools.evaluator.Evaluator;
56
import org.gvsig.tools.evaluator.EvaluatorData;
57
import org.gvsig.tools.evaluator.EvaluatorException;
58
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
59
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
60
import org.gvsig.tools.persistence.PersistenceException;
61
import org.gvsig.tools.persistence.PersistentState;
62
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
64

    
65
/**
66
 * @author jmvivo
67
 *
68
 */
69
public abstract class BaseTestFeatureStore extends
70
                AbstractLibraryAutoInitTestCase {
71

    
72
        private static Logger logger = null;
73

    
74
        protected DataManager dataManager = null;
75
        private static Random rnd;
76

    
77
        public Logger getLogger() {
78
                if (logger == null) {
79
                        logger = LoggerFactory.getLogger(this.getClass());
80
                }
81
                return logger;
82
        }
83

    
84
        public abstract boolean usesResources();
85

    
86
        public abstract boolean hasExplorer();
87

    
88
        public FeatureQuery getDefaultQuery(FeatureStore store)
89
                        throws DataException {
90
                FeatureQuery query = store.createFeatureQuery();
91
                FeatureAttributeDescriptor[] key = store.getDefaultFeatureType()
92
                                .getPrimaryKey();
93
                for (int i = 0; i < key.length; i++) {
94
                        query.getOrder().add(key[i].getName(), true);
95
                }
96

    
97
                return query;
98
        }
99

    
100

    
101
        public abstract DataStoreParameters getDefaultDataStoreParameters()
102
                        throws DataException;
103

    
104

    
105
        protected void doSetUp() throws Exception {
106
                dataManager = DALLocator.getDataManager();
107
        }
108

    
109

    
110
        //=================================================
111

    
112

    
113
        public void printFeature(Feature feature, int maxColSize) {
114
                printFeature(feature, true, maxColSize);
115
        }
116

    
117

    
118
        public void printFeature(Feature feature, boolean showColName,int maxColSize) {
119
                FeatureType fType = feature.getType();
120
                if (showColName){
121
                        this.printFeatureTypeColNames(feature.getType(), maxColSize);
122
                }
123
                StringBuffer row = new StringBuffer();
124
                Iterator iter = fType.iterator();
125
                FeatureAttributeDescriptor attr;
126

    
127
                while (iter.hasNext()) {
128
                        attr = (FeatureAttributeDescriptor) iter.next();
129
                        row.append(truncateOrFillString(feature.get(attr.getName()),
130
                                        maxColSize + 1, ' '));
131
                }
132
                System.out.println(row.toString());
133
        }
134

    
135
        public String truncateOrFillString(Object str, int max, char fillWith) {
136
                if (str == null) {
137
                        return truncateOrFillString("{null}", max, fillWith);
138
                }
139
                return truncateOrFillString(str.toString(), max, fillWith);
140
        }
141

    
142
        public String truncateOrFillString(String str, int max, char fillWith) {
143
                if (str.length() > max) {
144
                        return str.substring(0, max - 1) + " ";
145
                } else {
146
                        StringBuffer strB = new StringBuffer(str);
147
                        while (strB.length() < max) {
148
                                strB.append(fillWith);
149
                        }
150
                        return strB.toString();
151
                }
152

    
153
        }
154

    
155
        public void printFeatureTypeColNames(FeatureType fType, int maxColSize) {
156
                Iterator iter = fType.iterator();
157
                FeatureAttributeDescriptor attr;
158
                StringBuffer colNames = new StringBuffer();
159
                StringBuffer typeNames = new StringBuffer();
160
                StringBuffer sep = new StringBuffer();
161
                if (maxColSize < 1){
162
                        maxColSize = 15;
163
                }
164
                while (iter.hasNext()) {
165
                        attr = (FeatureAttributeDescriptor) iter.next();
166
                        colNames.append(truncateOrFillString(attr.getName(), maxColSize + 1, ' '));
167
                        typeNames.append(truncateOrFillString("(" + attr.getDataTypeName() + ")",
168
                                        maxColSize + 1, ' '));
169
                        sep.append(truncateOrFillString("", maxColSize, '='));
170
                        sep.append(' ');
171
                }
172

    
173
                System.out.println("");
174
                System.out.println("");
175
                System.out.println(colNames.toString());
176
                System.out.println(typeNames.toString());
177
                System.out.println(sep.toString());
178
        }
179

    
180
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
181
                        FeatureType ftype, int dataType) {
182
                return getFirstAttributeOfType(ftype, new int[] { dataType });
183
        }
184

    
185
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
186
                        FeatureType ftype, int[] dataTypes) {
187
                FeatureAttributeDescriptor attr;
188
                Iterator iter = ftype.iterator();
189
                int i;
190
                while (iter.hasNext()) {
191
                        attr = (FeatureAttributeDescriptor) iter.next();
192
                        for (i = 0; i < dataTypes.length; i++) {
193
                                if (attr.getDataType() == dataTypes[i]) {
194
                                        return attr;
195
                                }
196
                        }
197
                }
198
                return null;
199
        }
200

    
201
        protected boolean compareDynObject(DynObject obj1, DynObject obj2) {
202
                DynClass dynClass = obj1.getDynClass();
203
                if (!dynClass.getName().equals(obj2.getDynClass().getName())) {
204
                        return false;
205
                }
206

    
207
                DynField[] fields = dynClass.getDeclaredDynFields();
208
                String fieldName;
209
                Object v1, v2;
210
                for (int i = 0; i < fields.length; i++) {
211
                        fieldName = fields[i].getName();
212
                        v1 = obj1.getDynValue(fieldName);
213
                        v2 = obj2.getDynValue(fieldName);
214
                        if (v1 == v2) {
215
                                continue;
216
                        } else if (v1 != null) {
217
                                if (!v1.equals(v2)) {
218
                                        return false;
219
                                }
220
                        }
221
                }
222

    
223
                return true;
224
        }
225

    
226
        protected boolean compareStores(FeatureStore store1, FeatureStore store2)
227
                        throws DataException {
228
                if (store1.getParameters().getClass() != store2.getParameters()
229
                                .getClass()) {
230
                        return false;
231
                }
232
                if (!compareDynObject(store1.getParameters(), store2.getParameters())) {
233
                        return false;
234
                }
235

    
236
                if (store1.getEnvelope() != store2.getEnvelope()) {
237
                        if (store1.getEnvelope() != null) {
238
                                return store1.getEnvelope().equals(store2.getEnvelope());
239
                        } else {
240
                                return false;
241
                        }
242
                }
243

    
244
                if (!store1.getName().equals(store2.getName())) {
245
                        return false;
246
                }
247
                if (((FeatureSelection) store1.getSelection()).getSize() != ((FeatureSelection) store2
248
                                .getSelection()).getSize()) {
249
                        return false;
250
                }
251
                DisposableIterator iter1 = ((FeatureSelection) store1.getSelection())
252
                                .fastIterator();
253
                DisposableIterator iter2 = ((FeatureSelection) store2.getSelection())
254
                                .fastIterator();
255
                if (!compareFeatureIterators(iter1, iter2)) {
256
                        return false;
257
                }
258
                iter1.dispose();
259
                iter2.dispose();
260

    
261
                if (store1.getFeatureTypes().size() != store2.getFeatureTypes().size()) {
262
                        return false;
263
                }
264
                Iterator iterTypes1 = store1.getFeatureTypes().iterator();
265
                Iterator iterTypes2 = store2.getFeatureTypes().iterator();
266
                while (iterTypes1.hasNext()) {
267
                        if (!compareTypes((FeatureType) iterTypes1.next(),
268
                                        (FeatureType) iterTypes2
269
                                        .next())) {
270
                                return false;
271
                        }
272
                }
273
                if (!compareTypes(store1.getDefaultFeatureType(), store2
274
                                .getDefaultFeatureType())) {
275
                        return false;
276
                }
277

    
278
                if (store1.getLocks() != null) {
279
                        if (store1.getLocks().getLocksCount() != store2.getLocks()
280
                                        .getLocksCount()) {
281
                                return false;
282
                        }
283
                        if (!compareFeatureIterators(store1.getLocks().getLocks(), store2
284
                                        .getLocks().getLocks())) {
285
                                return false;
286
                        }
287

    
288
                } else if (store2.getLocks() != null) {
289
                        return false;
290
                }
291

    
292
                return true;
293
        }
294

    
295
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2) {
296
                Feature feature;
297
                Feature ffeature;
298
                while (iter1.hasNext()) {
299
                        feature = (Feature) iter1.next();
300
                        ffeature = (Feature) iter2.next();
301
                        if (!this.compareFeatures(feature, ffeature)) {
302
                                return false;
303
                        }
304
                }
305

    
306
                if (!iter2.hasNext()) {
307
                        return true;
308
                } else {
309
                        getLogger().warn("size !=");
310
                        return false;
311
                }
312

    
313
        }
314

    
315
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2,
316
                        String[] attrNames) {
317
                Feature feature;
318
                Feature ffeature;
319
                while (iter1.hasNext()) {
320
                        feature = (Feature) iter1.next();
321
                        ffeature = (Feature) iter2.next();
322
                        if (!this.compareFeatures(feature, ffeature, attrNames)) {
323
                                return false;
324
                        }
325
                }
326

    
327
                return !iter2.hasNext();
328

    
329
        }
330

    
331

    
332

    
333
        protected boolean compareTypes(FeatureType ft1, FeatureType ft2) {
334
                if (ft1.size() != ft2.size()) {
335
                        getLogger().warn("size !=");
336
                        return false;
337
                }
338
                if (ft1.getDefaultGeometryAttributeIndex() != ft2
339
                                .getDefaultGeometryAttributeIndex()) {
340
                        getLogger().warn(
341
                                        "getDefaultGeometryAttributeIndex "
342
                                                        + ft1.getDefaultGeometryAttributeIndex() +
343
                                        " !="+ ft2.getDefaultGeometryAttributeIndex());
344
                        return false;
345
                }
346
                if (ft1.getDefaultGeometryAttributeIndex() > -1) {
347
                        if (ft1.getDefaultSRS() != null) {
348
                                if (!ft1.getDefaultSRS().equals(ft2.getDefaultSRS())) {
349
                                        getLogger().warn("getDefaultSRS !=");
350
                                        return false;
351
                                }
352

    
353
                        } else {
354
                                if (ft2.getDefaultSRS() != null) {
355
                                        getLogger().warn("getDefaultSRS !=");
356
                                        return false;
357
                                }
358
                        }
359
                }
360

    
361
                if (ft1.getDefaultGeometryAttributeName() != null) {
362
                        if (!ft1.getDefaultGeometryAttributeName().equals(
363
                                        ft2.getDefaultGeometryAttributeName())) {
364
                                getLogger().warn("getDefaultGeometryAttributeName !=");
365

    
366
                                return false;
367
                        }
368
                } else {
369
                        if (ft2.getDefaultGeometryAttributeName() != null) {
370
                                getLogger().warn("getDefaultGeometryAttributeName !=");
371
                                return false;
372
                        }
373
                }
374

    
375

    
376

    
377
                FeatureAttributeDescriptor attr1, attr2;
378
                for (int i = 0; i < ft1.size(); i++) {
379
                        attr1 = ft1.getAttributeDescriptor(i);
380
                        attr2 = ft2.getAttributeDescriptor(i);
381

    
382
                        if (!compareAttributes(attr1, attr2)) {
383
                                return false;
384
                        }
385

    
386
                }
387
                return true;
388

    
389
        }
390

    
391
        protected boolean compareAttributes(FeatureAttributeDescriptor attr1,
392
                        FeatureAttributeDescriptor attr2) {
393
                if (attr1 == null || attr2 == null) {
394
                        getLogger().warn("attr1 == null || attr2 == null");
395
                        return false;
396
                }
397
                if (!attr1.getName().equals(attr2.getName())) {
398
                        getLogger().warn(
399
                                        "name '" + attr1.getName() + "' != '" + attr2.getName()
400
                                                        + "'");
401
                        return false;
402
                }
403

    
404
                if (attr1.getDataType() != attr2.getDataType()) {
405
                        getLogger().warn(
406
                                        attr1.getName() + ":" +
407
                                        "dataType '" + attr1.getDataTypeName() + "'["
408
                                                        + attr1.getDataType() + "] != '"
409
                                                        + attr2.getDataTypeName() + "'["
410
                                                        + attr2.getDataType() + "]");
411
                        return false;
412
                }
413

    
414
                if (attr1.getSize() != attr2.getSize()) {
415
                        getLogger().warn(
416
                                        attr1.getName() + ":" +
417
                                        "size " + attr1.getSize() + " != " + attr2.getSize());
418
                        return false;
419
                }
420

    
421
                if (attr1.getPrecision() != attr2.getPrecision()) {
422
                        getLogger().warn(
423
                                        attr1.getName() + ":" +
424
                                        "precision " + attr1.getPrecision() + " != "
425
                                                        + attr1.getPrecision());
426
                        return false;
427
                }
428

    
429
                if (attr1.getGeometryType() != attr2.getGeometryType()) {
430
                        getLogger().warn(
431
                                        attr1.getName() + ":" +
432
                                        "GeometryType " + attr1.getGeometryType() + " != "
433
                                                        + attr2.getGeometryType());
434
                        return false;
435
                }
436

    
437
                if (attr1.getGeometrySubType() != attr2.getGeometrySubType()) {
438
                        getLogger().warn(
439
                                        attr1.getName() + ":" +
440
                                        "GeometrySubType " + attr1.getGeometrySubType() + " != "
441
                                                        + attr2.getGeometrySubType());
442

    
443
                        return false;
444
                }
445

    
446
                if (attr1.getSRS() != null) {
447
                        if (!attr1.getSRS().equals(attr2.getSRS())) {
448
                                getLogger().warn(
449
                                                attr1.getName() + ":" +
450
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
451
                                return false;
452
                        }
453
                } else {
454
                        if (attr2.getSRS() != null) {
455
                                getLogger().warn(
456
                                                attr1.getName() + ":" +
457
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
458
                                return false;
459
                        }
460
                }
461

    
462
                return true;
463
        }
464

    
465
        protected boolean compareFeatures(Feature f1, Feature f2,
466
                        String[] attrsNames) {
467
                FeatureAttributeDescriptor attr1;
468
                FeatureAttributeDescriptor attr2;
469
                Object v1, v2;
470
                for (int i = 0; i < attrsNames.length; i++) {
471
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
472
                        attr2 = f2.getType().getAttributeDescriptor(attrsNames[i]);
473
                        if (attr1 != attr2) {
474
                                if (!compareAttributes(attr1, attr1)) {
475
                                        return false;
476
                                }
477
                        }
478
                        v1 = f1.get(attr1.getName());
479
                        v2 = f2.get(attr2.getName());
480
                        if (!compareFeatureValue(v1, v2, attr1)) {
481
                                return false;
482
                        }
483
                }
484

    
485
                return true;
486
        }
487

    
488
        protected boolean compareFeatures(Feature f1, Feature f2) {
489
                if (!compareTypes(f1.getType(), f2.getType())) {
490
                        return false;
491
                }
492
                Iterator iter = f1.getType().iterator();
493
                FeatureAttributeDescriptor attr;
494
                Object v1, v2;
495
                while (iter.hasNext()) {
496
                        attr = (FeatureAttributeDescriptor) iter.next();
497
                        v1 = f1.get(attr.getName());
498
                        v2 = f2.get(attr.getName());
499
                        if (!compareFeatureValue(v1, v2, attr)) {
500
                                return false;
501
                        }
502
                }
503

    
504
                return true;
505

    
506
        }
507

    
508
        protected boolean compareFeatureValue(Object v1, Object v2,
509
                        FeatureAttributeDescriptor attr) {
510

    
511
                if ((v1 == null || v2 == null) &&  !attr.allowNull() ){
512
                        getLogger().warn("null and !allowNull:"
513
                                                        + attr.getName());
514
                        return false;
515
                }
516

    
517
                if (v1 == v2) {
518
                        return true;
519
                } else if (v1 == null) {
520
                        getLogger().warn(" v1 == null and v2 != null:"
521
                                                        + attr.getName());
522
                        return false;
523
                } else if (v2 == null) {
524
                        getLogger().warn("v2 == null and v1 != null:"
525
                                                        + attr.getName());
526
                        return false;
527

    
528
                }
529
                switch (attr.getDataType()) {
530
                case DataTypes.FEATURE:
531
                        return compareFeatures((Feature) v1, (Feature) v2);
532

    
533
                case DataTypes.GEOMETRY:
534
                        Geometry geom1 = (Geometry) v1;
535
                        Geometry geom2 = (Geometry) v2;
536
                        if (!geom1.equals(geom2)) {
537
                                getLogger().warn(" v1 != v2 (Geom):" + attr.getName());
538
                                return false;
539

    
540
                        }
541
                        return true;
542
                case DataTypes.DOUBLE:
543
                        double diff = ((Double) v1).doubleValue()
544
                                        - ((Double) v1).doubleValue();
545
                        if (!(Math.abs(diff) < 0.000001)) {
546
                                getLogger().warn(" v1 != v2 (Dobule):" + attr.getName());
547
                                return false;
548

    
549
                        }
550
                        return true;
551

    
552
//                case DataTypes.BYTEARRAY:
553
//                        byte[] bytes1 = (byte[]) v1;
554
//                        byte[] bytes2 = (byte[]) v2;
555
//                        if (bytes1.length != bytes2.length) {
556
//                                getLogger().warn(
557
//                                                "v1.length != v2.length (byte []):" + attr.getName());
558
//                                return false;
559
//                        }
560
//                        for (int i = 0; i < bytes1.length; i++) {
561
//                                if (bytes1[i] != bytes2[i]) {
562
//                                        getLogger().warn(
563
//                                                        " v1[" + i + "] != v2[" + i + "] (byte []):"
564
//                                                                        + attr.getName());
565
//                                        return false;
566
//                                }
567
//                        }
568
//                        return true;
569

    
570
                case DataTypes.OBJECT:
571
                        if (!v1.equals(v2)) {
572
                                getLogger().warn(
573
                                                " v1 != v2 (object):" + attr.getName() + " [ignored]");
574

    
575
                        }
576
                        return true;
577

    
578
                default:
579
                        if (!v1.equals(v2)) {
580
                                getLogger()
581
                                                .warn(
582
                                                                " v1 != v2:" + attr.getName() + ": " + v1
583
                                                                                + " != " + v2);
584
                                return false;
585
                        }
586
                }
587
                return true;
588

    
589
        }
590

    
591

    
592
        //------------------------------------------------
593

    
594
        public void testSimpleIteration(FeatureStore store) {
595
                this.testSimpleIteration(store, null);
596
        }
597

    
598
        protected String[] getRandomAttibuteList(FeatureType fType) {
599
                String[] attrNames = new String[fType.size()];
600
                Iterator iter = fType.iterator();
601
                int i = 0;
602
                while (iter.hasNext()) {
603
                        attrNames[i] = ((FeatureAttributeDescriptor) iter.next()).getName();
604
                        i++;
605
                }
606
                return this.getRandomAttibuteList(attrNames);
607
        }
608

    
609
        protected Random getRandom(){
610
                if (rnd == null){
611
                        rnd = new Random();
612
                        rnd.setSeed(System.currentTimeMillis());
613
                }
614
                return rnd;
615
        }
616

    
617
        protected String[] getRandomAttibuteList(String[] attrNames) {
618
                int nAttributes = getRandom().nextInt(
619
                                attrNames.length + (attrNames.length / 2)) + 1;
620
                TreeSet set = new TreeSet();
621
                for (int i = 0; i < nAttributes; i++) {
622
                        set.add(attrNames[getRandom().nextInt(attrNames.length)]);
623
                }
624
                return (String[]) set.toArray(new String[0]);
625
        }
626

    
627
        public void testIterationFastAndStandart(FeatureStore store)
628
                        throws Exception {
629
                this.testIterationFastAndStandart(store, null);
630

    
631
                FeatureQuery query = this.getDefaultQuery(store);
632
                // Random Attribute list
633
                query.setAttributeNames(getRandomAttibuteList(store
634
                                .getDefaultFeatureType()));
635
                this.testIterationFastAndStandart(store, query);
636

    
637
                // Sorted
638
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(store
639
                                .getDefaultFeatureType(), new int[] { DataTypes.INT,
640
                                DataTypes.LONG, DataTypes.STRING });
641
                {
642
                        // asure that attr is in query attributes
643
                        boolean attrFound = false;
644
                        String[] curAttrs = query.getAttributeNames();
645
                        for (int i = 0; i < curAttrs.length; i++) {
646
                                if (curAttrs[i].equals(attr.getName())) {
647
                                        attrFound = true;
648
                                        break;
649

    
650
                                }
651
                        }
652
                        if (!attrFound) {
653
                                String[] newAttrs = new String[curAttrs.length + 1];
654
                                for (int i = 0; i < curAttrs.length; i++) {
655
                                        newAttrs[i] = curAttrs[i];
656
                                }
657
                                newAttrs[curAttrs.length] = attr.getName();
658
                                query.setAttributeNames(newAttrs);
659
                        }
660
                }
661

    
662

    
663
                query.getOrder().add(attr.getName(), true);
664
                this.testIterationFastAndStandart(store, query);
665

    
666
                // Filter
667
                query = this.getDefaultQuery(store);
668

    
669
                query.setFilter(new Evaluator(){
670

    
671
                        public Object evaluate(EvaluatorData data)
672
                                        throws EvaluatorException {
673
                                // TODO Auto-generated method stub
674
                                return Boolean.TRUE;
675
                        }
676

    
677
                        public String getCQL() {
678
                                return "true = true";
679
                        }
680

    
681
                        public String getDescription() {
682
                                // TODO Auto-generated method stub
683
                                return null;
684
                        }
685

    
686
                        public String getName() {
687
                                return "AlwaysTrue";
688
                        }
689

    
690
                        public EvaluatorFieldsInfo getFieldsInfo() {
691
                                // TODO Auto-generated method stub
692
                                return null;
693
                        }
694

    
695
                });
696
                this.testIterationFastAndStandart(store, query);
697

    
698
                // Filter + Sorted
699
                query.getOrder().add(attr.getName(), true);
700
                this.testIterationFastAndStandart(store, query);
701
        }
702

    
703
        public void testSimpleIteration(FeatureStore store, FeatureQuery query) {
704
                FeatureSet set;
705
                try {
706

    
707
                        if (query == null) {
708
                                query = this.getDefaultQuery(store);
709
                        }
710
                        set = store.getFeatureSet(query);
711
                        FeatureType type = set.getDefaultFeatureType();
712

    
713
                        DisposableIterator it = set.iterator();
714
                        Feature feature;
715
                        printFeatureTypeColNames(type, 15);
716
                        while (it.hasNext()) {
717

    
718
                                feature = (Feature) it.next();
719
                                printFeature(feature, false, 15);
720
                        }
721

    
722
                        it.dispose();
723
                        set.dispose();
724

    
725
                } catch (DataException e3) {
726
                        e3.printStackTrace();
727
                        fail();
728
                        return;
729
                }
730

    
731
        }
732

    
733
        public void testIterationFastAndStandart(FeatureStore store,
734
                        FeatureQuery query) {
735
                FeatureSet set;
736
                try {
737

    
738
                        if (query == null) {
739
                                query = this.getDefaultQuery(store);
740
                        }
741
                        set = store.getFeatureSet(query);
742

    
743
                        DisposableIterator it = set.iterator();
744
                        DisposableIterator fit = set.fastIterator();
745

    
746
                        assertTrue(this.compareFeatureIterators(it, fit));
747

    
748
                        it.dispose();
749
                        fit.dispose();
750
                        set.dispose();
751

    
752
                } catch (DataException e3) {
753
                        e3.printStackTrace();
754
                        fail();
755
                        return;
756
                }
757

    
758
        }
759

    
760
        public void testSimpleIteration(DataStoreParameters parameters)
761
                        throws Exception {
762
                FeatureStore store = null;
763
                store = (FeatureStore) dataManager.createStore(parameters);
764

    
765
                this.testSimpleIteration(store);
766

    
767
                store.dispose();
768

    
769
        }
770

    
771
        public void testIterationFastAndStandart(DataStoreParameters parameters)
772
                        throws Exception {
773
                FeatureStore store = null;
774
                store = (FeatureStore) dataManager.createStore(parameters);
775

    
776
                this.testIterationFastAndStandart(store);
777

    
778
                store.dispose();
779

    
780
        }
781

    
782
        /**
783
         *
784
         * @param count
785
         *            if (< 0) list.size() >= 1 else list.size() == count
786
         * @throws Exception
787
         */
788
        public void testExplorerList(int count) throws Exception {
789
                FeatureStore store = null;
790
                store = (FeatureStore) dataManager.createStore(this
791
                                .getDefaultDataStoreParameters());
792

    
793
                DataServerExplorer explorer;
794
                explorer = store.getExplorer();
795

    
796
                if (count < 0) {
797
                        assertTrue(explorer.list().size() >= 1);
798
                } else {
799
                        assertTrue(explorer.list().size() == count);
800
                }
801

    
802
                store.dispose();
803

    
804
                explorer.dispose();
805
        }
806

    
807
        //=================================================
808
        //=================================================
809

    
810

    
811

    
812

    
813
        public void testIterationFastAndStandart() throws Exception {
814
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
815
        }
816

    
817
        public void testSimpleIteration() throws Exception {
818
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
819
        }
820

    
821
        public void testInitializeStore() throws Exception {
822
                FeatureStore store = (FeatureStore) dataManager.createStore(this
823
                                .getDefaultDataStoreParameters());
824

    
825
                assertNotNull(store.getMetadataID());
826
                assertNotNull(store.getName());
827
                assertEquals(store.getEnvelope(), store.getDynValue("Envelope"));
828
                assertTrue(store.getFeatureCount() > 0);
829
                if (store.isLocksSupported()) {
830
                        assertNotNull(store.getLocks());
831
                } else {
832
                        assertNull(store.getLocks());
833
                }
834
                store.dispose();
835
        }
836

    
837

    
838
        public void testExplorer() throws Exception {
839
                if (!this.hasExplorer()) {
840
                        return;
841
                }
842
                this.testExplorerList(-1);
843

    
844
        }
845

    
846
        public void testSelection() throws Exception {
847
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
848

    
849
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
850
                FeatureSet set = store.getFeatureSet();
851

    
852
                assertTrue(store.getFeatureSelection().isEmpty());
853
                store.setSelection(set);
854
                assertFalse(store.getFeatureSelection().isEmpty());
855

    
856
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
857

    
858
                DisposableIterator iter = set.iterator();
859
                while (iter.hasNext()) {
860
                        assertTrue(store.getFeatureSelection().isSelected(
861
                                        (Feature) iter.next()));
862
                }
863
                iter.dispose();
864

    
865
                store.getFeatureSelection().reverse();
866
                assertTrue(store.getFeatureSelection().isEmpty());
867
                assertEquals(0, store.getFeatureSelection().getSize());
868
                iter = set.iterator();
869
                while (iter.hasNext()) {
870
                        assertFalse(store.getFeatureSelection().isSelected(
871
                                        (Feature) iter.next()));
872
                }
873
                iter.dispose();
874

    
875
                store.getFeatureSelection().reverse();
876
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
877
                assertFalse(store.getFeatureSelection().isEmpty());
878

    
879
                set.dispose();
880

    
881
        }
882

    
883
        public void testCustomFTypeSet() throws Exception {
884
                DataStoreParameters dbfParameters = this
885
                                .getDefaultDataStoreParameters();
886

    
887
                FeatureStore store = (FeatureStore) dataManager
888
                                .createStore(dbfParameters);
889

    
890
                testCustomFTypeSet(store);
891

    
892
                store.dispose();
893
        }
894

    
895
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
896

    
897
                FeatureSet set, set1;
898
                FeatureQuery query;
899
                DisposableIterator iter, iter1;
900
                Iterator attrIter;
901
                FeatureAttributeDescriptor attr;
902

    
903
                set = store.getFeatureSet(this.getDefaultQuery(store));
904
                attrIter = store.getDefaultFeatureType().iterator();
905

    
906
                String[] names;
907
                while (attrIter.hasNext()) {
908
                        attr = (FeatureAttributeDescriptor) attrIter.next();
909
                        int fieldIndex = attr.getIndex();
910

    
911
                        query = this.getDefaultQuery(store);
912
                        String fieldName = store.getDefaultFeatureType()
913
                        .getAttributeDescriptor(fieldIndex).getName();
914

    
915
                        names = new String[] { fieldName };
916
                        query.setAttributeNames(names);
917
                        set1 = store.getFeatureSet(query);
918

    
919
                        if (getRandom().nextBoolean()) {
920
                                iter = set.fastIterator();
921
                        } else {
922
                                iter = set.iterator();
923
                        }
924
                        if (getRandom().nextBoolean()) {
925
                                iter1 = set1.fastIterator();
926
                        } else {
927
                                iter1 = set1.iterator();
928
                        }
929

    
930
                        assertTrue(compareFeatureIterators(iter, iter1, names));
931

    
932
                        iter.dispose();
933
                        iter1.dispose();
934
                        set1.dispose();
935
                }
936

    
937
                int ntimes = getRandom().nextInt(10) + 5;
938
                FeatureType type = store.getDefaultFeatureType();
939
                query = this.getDefaultQuery(store);
940
                for (int i = 0; i < ntimes; i++) {
941
                        names = getRandomAttibuteList(type);
942

    
943
                        query.setAttributeNames(names);
944
                        set1 = store.getFeatureSet(query);
945

    
946
                        if (getRandom().nextBoolean()) {
947
                                iter = set.fastIterator();
948
                        } else {
949
                                iter = set.iterator();
950
                        }
951
                        if (getRandom().nextBoolean()) {
952
                                iter1 = set1.fastIterator();
953
                        } else {
954
                                iter1 = set1.iterator();
955
                        }
956

    
957
                        assertTrue(compareFeatureIterators(iter, iter1, names));
958

    
959
                        iter.dispose();
960
                        iter1.dispose();
961

    
962
                        iter1 = set1.fastIterator();
963
                        assertTrue(checksAttributesPositions(iter1, names));
964
                        iter1.dispose();
965

    
966
                        iter1 = set1.iterator();
967
                        assertTrue(checksAttributesPositions(iter1, names));
968
                        iter1.dispose();
969

    
970
                        set1.dispose();
971

    
972

    
973
                }
974

    
975

    
976

    
977
                set.dispose();
978

    
979
        }
980

    
981
        protected boolean checksAttributesPositions(DisposableIterator iter,
982
                        String[] names) {
983
                Feature feature;
984
                FeatureType type;
985
                FeatureAttributeDescriptor attr;
986
                while (iter.hasNext()) {
987
                        feature = (Feature) iter.next();
988
                        type = feature.getType();
989
                        for (int i = 0; i < names.length; i++) {
990
                                attr = type.getAttributeDescriptor(i);
991
                                if (!names[i].equals(attr.getName())) {
992
                                        getLogger().error(
993
                                                        "Error in attribute {} (expected: '{}' have: '{}'",
994
                                                        new Object[] { new Integer(i), names[i],
995
                                                                        attr.getName() });
996
                                        return false;
997
                                }
998
                        }
999
                }
1000
                return true;
1001
        }
1002

    
1003
         public void testPersistence() throws Exception {
1004
                if (ToolsLocator.getPersistenceManager() == null) {
1005
                        fail("Default Persistence Manager not register");
1006
                }
1007
                DataStoreParameters params = this.getDefaultDataStoreParameters();
1008

    
1009
                FeatureStore store = (FeatureStore) dataManager.createStore(params);
1010

    
1011
                testSimpleIteration(store);
1012

    
1013
                PersistentState state = ToolsLocator.getPersistenceManager().getState(
1014
                                store);
1015

    
1016
                FeatureStore store2 = (FeatureStore) ToolsLocator
1017
                                .getPersistenceManager().create(state);
1018

    
1019
                testSimpleIteration(store2);
1020

    
1021
                assertTrue(compareStores(store, store2));
1022

    
1023
                store.dispose();
1024
                store2.dispose();
1025

    
1026
        }
1027

    
1028

    
1029
        public void testSort() throws Exception {
1030
                DataStoreParameters dbfParameters = this
1031
                                .getDefaultDataStoreParameters();
1032

    
1033
                FeatureStore store = (FeatureStore) dataManager
1034
                                .createStore(dbfParameters);
1035

    
1036
                testSort(store);
1037

    
1038
                store.dispose();
1039

    
1040
        }
1041

    
1042
        public void testSort(FeatureStore store) throws Exception{
1043
                FeatureSet set1;
1044
                FeatureQuery query;
1045
                DisposableIterator iter1;
1046
                Iterator attrIter;
1047
                FeatureAttributeDescriptor attr;
1048

    
1049
                attrIter = store.getDefaultFeatureType().iterator();
1050

    
1051
                String[] names;
1052
                while (attrIter.hasNext()) {
1053
                        attr = (FeatureAttributeDescriptor) attrIter.next();
1054

    
1055
                        if (attr.getDataType() == DataTypes.GEOMETRY) {
1056
                                continue;
1057
                        }
1058
                        query = this.getDefaultQuery(store);
1059
                        String fieldName = attr.getName();
1060

    
1061

    
1062

    
1063
                        names = new String[] { fieldName };
1064
                        query.setAttributeNames(names);
1065
                        query.getOrder().add(fieldName, getRandom().nextBoolean());
1066

    
1067
                        set1 = store.getFeatureSet(query);
1068
                        if (getRandom().nextBoolean()) {
1069
                                iter1 = set1.fastIterator();
1070
                        } else {
1071
                                iter1 = set1.iterator();
1072
                        }
1073

    
1074
                        assertTrue(checkSort(iter1, query));
1075

    
1076
                        iter1.dispose();
1077
                        set1.dispose();
1078
                }
1079

    
1080
                int ntimes = getRandom().nextInt(10) + 5;
1081
                FeatureType type = store.getDefaultFeatureType();
1082
                query = this.getDefaultQuery(store);
1083
                for (int i = 0; i < ntimes; i++) {
1084
                        names = getRandomAttibuteList(type);
1085

    
1086
                        int nShortFields = getRandom().nextInt(names.length) + 1;
1087
                        query.getOrder().clear();
1088
                        for (int j = 0; j < nShortFields; j++) {
1089
                                attr = store.getDefaultFeatureType().getAttributeDescriptor(names[getRandom().nextInt(names.length)]);
1090
                                if (attr.getDataType() == DataTypes.INT
1091
                                                || attr.getDataType() == DataTypes.LONG
1092
                                                || attr.getDataType() == DataTypes.DOUBLE
1093
                                                || attr.getDataType() == DataTypes.STRING
1094
                                                || attr.getDataType() == DataTypes.DATE
1095
                                                || attr.getDataType() == DataTypes.BOOLEAN
1096
                                                || attr.getDataType() == DataTypes.BYTE
1097
                                                || attr.getDataType() == DataTypes.FLOAT) {
1098

    
1099
                                        query.getOrder().add(attr.getName(),
1100
                                                        getRandom().nextBoolean());
1101
                                }
1102
                        }
1103

    
1104
                        query.setAttributeNames(names);
1105
                        set1 = store.getFeatureSet(query);
1106

    
1107
                        // if (getRandom().nextBoolean()) {
1108
                                iter1 = set1.fastIterator();
1109
                                // } else {
1110
                                // iter1 = set1.iterator();
1111
                                // }
1112

    
1113
                                assertTrue(checkSort(iter1, query));
1114

    
1115
                                iter1.dispose();
1116
                                set1.dispose();
1117

    
1118
                }
1119

    
1120
        }
1121

    
1122

    
1123
        public boolean checkSort(Iterator iter, FeatureQuery query) {
1124

    
1125
                FeatureQueryOrderMember order;
1126
                Feature prevFeature = null;
1127
                Feature currFeature = null;
1128
                boolean isFirst = true;
1129
                Comparable v1, v2;
1130
                Object o1, o2;
1131
                int v;
1132
                FeatureQueryOrder queryOrder = query.getOrder();
1133

    
1134
                Iterator orderIter;
1135

    
1136
                //for debug only
1137
                /*
1138
                System.out.println("\nCheck order:");
1139
                Iterator orderIter = queryOrder.iterator();
1140
                while (orderIter.hasNext()) {
1141
                        order = (FeatureQueryOrderMember) orderIter.next();
1142
                        System.out.print(order.getAttributeName() + " ");
1143
                        if (order.getAscending()) {
1144
                                System.out.print("Asc, ");
1145
                        } else {
1146
                                System.out.print("Desc, ");
1147
                        }
1148
                }
1149
                System.out.println(";");
1150
                */
1151

    
1152
                while (iter.hasNext()) {
1153
                        currFeature = (Feature) iter.next();
1154
                        if (isFirst) {
1155
                                prevFeature = currFeature.getCopy();
1156
                                // printFeature(prevFeature, true, 15);
1157
                                isFirst = false;
1158
                                continue;
1159
                        }
1160
                        // printFeature(currFeature, false, 15);
1161
                        orderIter = queryOrder.iterator();
1162
                        while (orderIter.hasNext()) {
1163
                                order = (FeatureQueryOrderMember) orderIter.next();
1164
                                if (order.hasEvaluator()) {
1165
                                        try {
1166
                                                o1 = order.getEvaluator().evaluate(
1167
                                                                (EvaluatorData) prevFeature);
1168
                                                o2 = order.getEvaluator().evaluate(
1169
                                                                (EvaluatorData) currFeature);
1170
                                        } catch (EvaluatorException e) {
1171
                                                throw new DataEvaluatorRuntimeException(e);
1172
                                        }
1173
                                } else {
1174

    
1175
                                        o1 = prevFeature.get(order.getAttributeName());
1176
                                        o2 = currFeature.get(order.getAttributeName());
1177
                                }
1178
                                if (o1 instanceof Comparable && o2 instanceof Comparable) {
1179
                                        v1 = (Comparable) o1;
1180
                                        v2 = (Comparable) o2;
1181
                                } else {
1182
                                        // uncomparable objets
1183
                                        break;
1184
                                }
1185
                                if (v1 == null) {
1186
                                        if (v2 == null) {
1187
                                                break;
1188
                                        } else {
1189
                                                v = 1;
1190
                                        }
1191
                                } else {
1192
                                        v = v1.compareTo(v2);
1193
                                }
1194
                                if (v != 0) {
1195
                                        if (!order.getAscending()) {
1196
                                                v = -v;
1197
                                        }
1198
                                }
1199
                                if (v < 0) {
1200
                                        break;
1201
                                } else if (v > 0) {
1202
                                        // Checks for ignore case short
1203
                                        if (v1 instanceof String && v2 instanceof String) {
1204
                                                v1 = ((String)v1).toLowerCase();
1205
                                                v2 = ((String)v2).toLowerCase();
1206
                                                v = v1.compareTo(v2);
1207
                                                if (v != 0) {
1208
                                                        if (!order.getAscending()) {
1209
                                                                v = -v;
1210
                                                        }
1211
                                                }
1212
                                                if (v < 0) {
1213
                                                        getLogger()
1214
                                                                        .warn("Short compartor String ok with ignore case");
1215
                                                        break;
1216
                                                } else if (v > 0) {
1217
                                                        return false;
1218
                                                }
1219
                                        } else {
1220
                                                return false;
1221
                                        }
1222
                                }
1223
                        }
1224
                        prevFeature = currFeature.getCopy();
1225
                }
1226

    
1227
                return true;
1228
        }
1229

    
1230
        protected void fullStoreIteratorTest(FeatureStore store) throws Exception{
1231
                testIterationFastAndStandart(store);
1232
                testCustomFTypeSet(store);
1233
                testSort(store);
1234
        }
1235

    
1236

    
1237
        public void testTransformsData() throws Exception {
1238
                DataStoreParameters dbfParameters = this
1239
                                .getDefaultDataStoreParameters();
1240

    
1241
                FeatureStore store = (FeatureStore) dataManager
1242
                                .createStore(dbfParameters);
1243

    
1244
                FeatureStore store1 = (FeatureStore) dataManager
1245
                                .createStore(dbfParameters);
1246

    
1247
                FeatureStoreTransform transform = new StringsToLowerTransform();
1248
                transform.setFeatureStore(store);
1249

    
1250
                store.getTransforms().add(transform);
1251

    
1252
                FeatureSet set, set1;
1253
                DisposableIterator iter, iter1;
1254
                Iterator iterAttr;
1255
                FeatureAttributeDescriptor attr;
1256
                Feature feature, feature1;
1257
                int i, ntimes;
1258
                Object v1, v2;
1259

    
1260

    
1261
                fullStoreIteratorTest(store);
1262

    
1263
                set = store.getFeatureSet();
1264
                set1 = store1.getFeatureSet();
1265
                ntimes = getRandom().nextInt(3) + 1;
1266
                for (i = 0; i < ntimes; i++) {
1267
                        if (getRandom().nextBoolean()) {
1268
                                iter = set.fastIterator();
1269
                        } else {
1270
                                iter = set.iterator();
1271
                        }
1272
                        if (getRandom().nextBoolean()) {
1273
                                iter1 = set1.fastIterator();
1274
                        } else {
1275
                                iter1 = set1.iterator();
1276
                        }
1277
                        while (iter.hasNext()) {
1278
                                feature = (Feature) iter.next();
1279
                                feature1 = (Feature) iter1.next();
1280

    
1281
                                iterAttr = set.getDefaultFeatureType().iterator();
1282
                                while (iterAttr.hasNext()) {
1283
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1284
                                        v1 = feature.get(attr.getIndex());
1285
                                        v2 = feature1.get(attr.getIndex());
1286
                                        if (attr.getDataType() == DataTypes.STRING) {
1287
                                                if (v2 != null) {
1288
                                                        v2 = ((String) v2).toLowerCase();
1289
                                                }
1290

    
1291
                                        }
1292
                                        assertTrue(compareFeatureValue(v1, v2, attr));
1293
                                }
1294
                        }
1295
                        assertFalse(iter1.hasNext());
1296
                        iter.dispose();
1297
                        iter1.dispose();
1298
                }
1299

    
1300

    
1301
                set.dispose();
1302
                set1.dispose();
1303

    
1304

    
1305
                transform = new StringsToUpperTransform();
1306
                transform.setFeatureStore(store);
1307

    
1308
                store.getTransforms().add(transform);
1309

    
1310
                fullStoreIteratorTest(store);
1311

    
1312
                set = store.getFeatureSet();
1313
                set1 = store1.getFeatureSet();
1314
                ntimes = getRandom().nextInt(3) + 1;
1315
                for (i = 0; i < ntimes; i++) {
1316
                        if (getRandom().nextBoolean()) {
1317
                                iter = set.fastIterator();
1318
                        } else {
1319
                                iter = set.iterator();
1320
                        }
1321
                        if (getRandom().nextBoolean()) {
1322
                                iter1 = set1.fastIterator();
1323
                        } else {
1324
                                iter1 = set1.iterator();
1325
                        }
1326
                        while (iter.hasNext()) {
1327
                                feature = (Feature) iter.next();
1328
                                feature1 = (Feature) iter1.next();
1329

    
1330
                                iterAttr = set.getDefaultFeatureType().iterator();
1331
                                while (iterAttr.hasNext()) {
1332
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1333
                                        v1 = feature.get(attr.getIndex());
1334
                                        v2 = feature1.get(attr.getIndex());
1335
                                        if (attr.getDataType() == DataTypes.STRING) {
1336
                                                if (v2 != null) {
1337
                                                        v2 = ((String) v2).toUpperCase();
1338
                                                }
1339

    
1340
                                        }
1341
                                        compareFeatureValue(v1, v2, attr);
1342
                                }
1343
                        }
1344
                        assertFalse(iter1.hasNext());
1345
                        iter.dispose();
1346
                        iter1.dispose();
1347
                }
1348
                set.dispose();
1349
                set1.dispose();
1350

    
1351

    
1352
                transform = new AddPrefixAttributeName("_");
1353
                transform.setFeatureStore(store);
1354

    
1355
                store.getTransforms().add(transform);
1356

    
1357
                fullStoreIteratorTest(store);
1358

    
1359
                set = store.getFeatureSet();
1360
                set1 = store1.getFeatureSet();
1361
                ntimes = getRandom().nextInt(3) + 1;
1362
                for (i = 0; i < ntimes; i++) {
1363
                        if (getRandom().nextBoolean()) {
1364
                                iter = set.fastIterator();
1365
                        } else {
1366
                                iter = set.iterator();
1367
                        }
1368
                        if (getRandom().nextBoolean()) {
1369
                                iter1 = set1.fastIterator();
1370
                        } else {
1371
                                iter1 = set1.iterator();
1372
                        }
1373
                        while (iter.hasNext()) {
1374
                                feature = (Feature) iter.next();
1375
                                feature1 = (Feature) iter1.next();
1376

    
1377
                                iterAttr = set1.getDefaultFeatureType().iterator();
1378
                                while (iterAttr.hasNext()) {
1379
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1380
                                        v1 = feature.get("_" + attr.getName());
1381
                                        v2 = feature1.get(attr.getIndex());
1382
                                        if (attr.getDataType() == DataTypes.STRING) {
1383
                                                if (v2 != null) {
1384
                                                        v2 = ((String) v2).toUpperCase();
1385
                                                }
1386

    
1387
                                        }
1388
                                        compareFeatureValue(v1, v2, attr);
1389
                                }
1390
                        }
1391
                        assertFalse(iter1.hasNext());
1392
                        iter.dispose();
1393
                        iter1.dispose();
1394
                }
1395
                set.dispose();
1396
                set1.dispose();
1397

    
1398
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1399
                transform.setFeatureStore(store);
1400

    
1401
                store.getTransforms().add(transform);
1402

    
1403
                fullStoreIteratorTest(store);
1404

    
1405
                set = store.getFeatureSet();
1406
                set1 = store1.getFeatureSet();
1407
                ntimes = getRandom().nextInt(3) + 1;
1408
                for (i = 0; i < ntimes; i++) {
1409
                        if (getRandom().nextBoolean()) {
1410
                                iter = set.fastIterator();
1411
                        } else {
1412
                                iter = set.iterator();
1413
                        }
1414
                        if (getRandom().nextBoolean()) {
1415
                                iter1 = set1.fastIterator();
1416
                        } else {
1417
                                iter1 = set1.iterator();
1418
                        }
1419
                        while (iter.hasNext()) {
1420
                                feature = (Feature) iter.next();
1421
                                feature1 = (Feature) iter1.next();
1422

    
1423
                                iterAttr = set1.getDefaultFeatureType().iterator();
1424
                                while (iterAttr.hasNext()) {
1425
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1426
                                        v1 = feature.get("_" + attr.getName());
1427
                                        v2 = feature1.get(attr.getIndex());
1428
                                        if (attr.getDataType() == DataTypes.STRING) {
1429
                                                if (v2 != null) {
1430
                                                        v2 = ((String) v2).toUpperCase();
1431
                                                }
1432

    
1433
                                        }
1434
                                        compareFeatureValue(v1, v2, attr);
1435
                                }
1436
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1437
                                                .getDefaultFeatureType().getAttributeDescriptor(
1438
                                                                "__new__"));
1439
                        }
1440
                        assertFalse(iter1.hasNext());
1441
                        iter.dispose();
1442
                        iter1.dispose();
1443
                }
1444
                set.dispose();
1445
                set1.dispose();
1446

    
1447

    
1448
                transform = new RemoveAttribute("__new__");
1449
                transform.setFeatureStore(store);
1450

    
1451
                store.getTransforms().add(transform);
1452

    
1453
                fullStoreIteratorTest(store);
1454

    
1455
                set = store.getFeatureSet();
1456
                set1 = store1.getFeatureSet();
1457
                ntimes = getRandom().nextInt(3) + 1;
1458
                for (i = 0; i < ntimes; i++) {
1459
                        if (getRandom().nextBoolean()) {
1460
                                iter = set.fastIterator();
1461
                        } else {
1462
                                iter = set.iterator();
1463
                        }
1464
                        if (getRandom().nextBoolean()) {
1465
                                iter1 = set1.fastIterator();
1466
                        } else {
1467
                                iter1 = set1.iterator();
1468
                        }
1469
                        while (iter.hasNext()) {
1470
                                feature = (Feature) iter.next();
1471
                                feature1 = (Feature) iter1.next();
1472

    
1473
                                iterAttr = set1.getDefaultFeatureType().iterator();
1474
                                while (iterAttr.hasNext()) {
1475
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1476
                                        v1 = feature.get("_" + attr.getName());
1477
                                        v2 = feature1.get(attr.getIndex());
1478
                                        if (attr.getDataType() == DataTypes.STRING) {
1479
                                                if (v2 != null) {
1480
                                                        v2 = ((String) v2).toUpperCase();
1481
                                                }
1482

    
1483
                                        }
1484
                                        compareFeatureValue(v1, v2, attr);
1485
                                }
1486
                                assertNull(feature.getType().getAttributeDescriptor("__new__"));
1487
                        }
1488
                        assertFalse(iter1.hasNext());
1489
                        iter.dispose();
1490
                        iter1.dispose();
1491
                }
1492
                set.dispose();
1493
                set1.dispose();
1494

    
1495
                store.getTransforms().clear();
1496

    
1497
                compareStores(store, store1);
1498

    
1499

    
1500
                store.dispose();
1501
                store1.dispose();
1502
        }
1503

    
1504
        abstract class myTransform implements FeatureStoreTransform {
1505
                protected FeatureStore store;
1506
                protected FeatureType orgDefaultFType;
1507
                protected List orgFTypes;
1508

    
1509
                public void applyTransform(Feature source, EditableFeature target)
1510
                                throws DataException {
1511

    
1512
                        Iterator iter = target.getType().iterator();
1513
                        FeatureAttributeDescriptor attr;
1514
                        while (iter.hasNext()) {
1515
                                attr = (FeatureAttributeDescriptor) iter.next();
1516
                                this.setValue(source, target, attr);
1517
                        }
1518

    
1519
                }
1520

    
1521
                protected void setValue(Feature source, EditableFeature target,
1522
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1523
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1524
                }
1525

    
1526
                public void saveToState(PersistentState state)
1527
                throws PersistenceException {
1528
                        // TODO Auto-generated method stub
1529

    
1530
                }
1531

    
1532
                public void loadFromState(PersistentState state) throws PersistenceException {
1533
                        // TODO Auto-generated method stub
1534

    
1535
                }
1536

    
1537
                public FeatureType getDefaultFeatureType() throws DataException {
1538
                        return orgDefaultFType;
1539
                }
1540

    
1541
                public FeatureStore getFeatureStore() {
1542
                        return store;
1543
                }
1544

    
1545
                public List getFeatureTypes() throws DataException {
1546
                        return orgFTypes;
1547
                }
1548

    
1549
                public void setFeatureStore(FeatureStore featureStore) {
1550
                        this.store = featureStore;
1551
                        try {
1552
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1553
                                this.orgFTypes = this.store.getFeatureTypes();
1554

    
1555
                        } catch (DataException e) {
1556
                                throw new RuntimeException(e);
1557
                        }
1558

    
1559
                }
1560

    
1561
                public PersistentState getState() throws PersistenceException {
1562
                        // TODO Auto-generated method stub
1563
                        return null;
1564
                }
1565

    
1566
                public FeatureType getSourceFeatureTypeFrom(
1567
                                FeatureType targetFeatureType) {
1568

    
1569
                        return targetFeatureType;
1570
                }
1571

    
1572
        }
1573

    
1574
        abstract class TransformTypeTransform extends myTransform {
1575

    
1576
                private FeatureType myDefaultFeatureType = null;
1577
                private List myFeatureTypes = null;
1578

    
1579
                public FeatureType getDefaultFeatureType() throws DataException {
1580
                        if (this.myDefaultFeatureType == null) {
1581
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1582
                        }
1583

    
1584
                        return this.myDefaultFeatureType;
1585
                }
1586

    
1587
                protected abstract FeatureType transformType(FeatureType type);
1588

    
1589
                protected abstract FeatureType restoreType(FeatureType type);
1590

    
1591

    
1592
                public List getFeatureTypes() throws DataException {
1593
                        if (this.myFeatureTypes == null) {
1594
                                ArrayList list = new ArrayList();
1595
                                Iterator iter = orgFTypes.iterator();
1596
                                while (iter.hasNext()) {
1597
                                        FeatureType type = (FeatureType) iter.next();
1598
                                        if (type.getId().equals(
1599
                                                        this.getDefaultFeatureType().getId())) {
1600
                                                list.add(this.getDefaultFeatureType());
1601
                                        } else {
1602
                                                list.add(this.transformType(type));
1603
                                        }
1604
                                }
1605
                                this.myFeatureTypes = Collections.unmodifiableList(list);
1606
                        }
1607
                        return this.myFeatureTypes;
1608
                }
1609

    
1610
                public boolean isTransformsOriginalValues() {
1611
                        return false;
1612
                }
1613

    
1614
                public FeatureType getSourceFeatureTypeFrom(
1615
                                FeatureType targetFeatureType) {
1616
                        FeatureType org = null;
1617
                        FeatureType cur = null;
1618
                        Iterator iter = null;
1619
                        try {
1620
                                iter = this.getFeatureTypes().iterator();
1621
                        } catch (DataException e) {
1622
                                new RuntimeException(e);
1623
                        }
1624
                        while (iter.hasNext()) {
1625
                                cur = (FeatureType) iter.next();
1626
                                if (cur.getId().equals(targetFeatureType.getId())) {
1627
                                        org = cur;
1628
                                        break;
1629
                                }
1630
                        }
1631
                        if (org == null) {
1632
                                throw new RuntimeException();
1633
                        }
1634

    
1635
                        return this.restoreType(org);
1636
                }
1637

    
1638
        }
1639

    
1640
        abstract class TransformAttributeNameTransform extends
1641
                        TransformTypeTransform {
1642

    
1643
                protected void setValue(Feature source, EditableFeature target,
1644
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1645
                        target.set(attrTarget.getIndex(), source.get(this
1646
                                        .restoreAttributeName(attrTarget.getName())));
1647
                }
1648

    
1649

    
1650
                protected FeatureType transformType(FeatureType type) {
1651
                        EditableFeatureType result = type.getEditable();
1652
                        Iterator iter = result.iterator();
1653
                        EditableFeatureAttributeDescriptor attr;
1654
                        while (iter.hasNext()) {
1655
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1656
                                attr.setName(transformAttributeName(attr.getName()));
1657
                        }
1658
                        return result.getNotEditableCopy();
1659
                }
1660

    
1661
                protected abstract String transformAttributeName(String source);
1662

    
1663
                protected abstract String restoreAttributeName(String target);
1664

    
1665
                protected FeatureType restoreType(FeatureType type) {
1666
                        EditableFeatureType result;
1667
                        if (type instanceof EditableFeatureType) {
1668
                                result = (EditableFeatureType) type.getCopy();
1669
                        } else {
1670
                                result = type.getEditable();
1671
                        }
1672
                        Iterator iter = result.iterator();
1673
                        EditableFeatureAttributeDescriptor attr;
1674
                        while (iter.hasNext()) {
1675
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1676

    
1677
                                attr.setName(restoreAttributeName(attr.getName()));
1678
                        }
1679
                        return result.getNotEditableCopy();
1680
                }
1681

    
1682
                public FeatureType getSourceFeatureTypeFrom(
1683
                                FeatureType targetFeatureType) {
1684
                        FeatureType org = null;
1685
                        FeatureType cur = null;
1686
                        Iterator iter = null;
1687
                        iter = this.orgFTypes.iterator();
1688
                        while (iter.hasNext()) {
1689
                                cur = (FeatureType) iter.next();
1690
                                if (cur.getId().equals(targetFeatureType.getId())) {
1691
                                        org = cur;
1692
                                        break;
1693
                                }
1694
                        }
1695
                        if (cur == null) {
1696
                                throw new RuntimeException();
1697
                        }
1698
                        EditableFeatureType r = org.getEditable();
1699
                        iter = r.iterator();
1700
                        FeatureAttributeDescriptor attr;
1701
                        while (iter.hasNext()) {
1702
                                attr = (FeatureAttributeDescriptor) iter.next();
1703
                                if (targetFeatureType.getIndex(transformAttributeName(attr
1704
                                                .getName())) == -1) {
1705
                                        iter.remove();
1706
                                }
1707
                        }
1708
                        return r.getNotEditableCopy();
1709
                }
1710

    
1711
        }
1712

    
1713

    
1714
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1715

    
1716
                private String prefix;
1717

    
1718
                AddPrefixAttributeName(String prefix) {
1719
                        this.prefix = prefix;
1720
                }
1721

    
1722
                protected String restoreAttributeName(String target) {
1723
                        return target.substring(getPrefix().length(), target.length());
1724
                }
1725

    
1726
                private String getPrefix() {
1727
                        return prefix;
1728
                }
1729

    
1730
                protected String transformAttributeName(String source) {
1731
                        return getPrefix() + source;
1732
                }
1733

    
1734
        }
1735

    
1736
        class AddAttribute extends TransformTypeTransform {
1737

    
1738
                private String name;
1739
                private int type;
1740
                private Object defValue;
1741
                private int size;
1742
                private Evaluator eval;
1743

    
1744
                AddAttribute(String name) {
1745
                        this(name, DataTypes.STRING, null, 15);
1746
                }
1747

    
1748
                AddAttribute(String name, int type) {
1749
                        this(name, type, null, 15);
1750
                }
1751

    
1752
                AddAttribute(String name, int type, Object defValue) {
1753
                        this(name, type, defValue, 15);
1754
                }
1755

    
1756
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1757
                        this.name = name;
1758
                        this.type = type;
1759
                        this.defValue = null;
1760
                        this.size = size;
1761
                        this.eval = evaluator;
1762
                }
1763

    
1764
                AddAttribute(String name, int type, Object defValue, int size) {
1765
                        this.name = name;
1766
                        this.type = type;
1767
                        this.defValue = defValue;
1768
                        this.size = size;
1769
                        this.eval = null;
1770
                }
1771

    
1772

    
1773

    
1774
                protected FeatureType restoreType(FeatureType type) {
1775
                        EditableFeatureType result;
1776
                        if (type instanceof EditableFeatureType) {
1777
                                result = (EditableFeatureType) type.getCopy();
1778
                        } else {
1779
                                result = type.getEditable();
1780
                        }
1781
                        result.remove(this.name);
1782
                        return result.getNotEditableCopy();
1783
                }
1784

    
1785
                protected FeatureType transformType(FeatureType type) {
1786
                        EditableFeatureType result = type.getEditable();
1787

    
1788
                        EditableFeatureAttributeDescriptor att;
1789
                        if (this.eval == null) {
1790
                                att = result.add(name, this.type)
1791
                                                .setDefaultValue(this.defValue);
1792
                        } else {
1793
                                att = result.add(name, this.type, this.eval);
1794
                        }
1795
                        att.setSize(size);
1796

    
1797

    
1798
                        return result.getNotEditableCopy();
1799
                }
1800

    
1801
                protected void setValue(Feature source, EditableFeature target,
1802
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1803
                        if (attrTarget.getName().equals(this.name)) {
1804
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1805
                        } else {
1806
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1807
                                                .getName()));
1808
                        }
1809
                }
1810
        }
1811

    
1812

    
1813
        class RemoveAttribute extends TransformTypeTransform {
1814

    
1815
                private String attributeName;
1816
                private String fTypeIdToRemoveAttribute = null;
1817
                private FeatureAttributeDescriptor attr;
1818

    
1819
                RemoveAttribute(String attributeName) {
1820
                        this.attributeName = attributeName;
1821
                }
1822

    
1823
                RemoveAttribute(String attributeName, FeatureType fType) {
1824
                        this.attributeName = attributeName;
1825
                }
1826

    
1827
                protected FeatureType restoreType(FeatureType type) {
1828
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1829
                                return type;
1830
                        }
1831
                        EditableFeatureType result = type.getEditable();
1832

    
1833
                        EditableFeatureAttributeDescriptor att;
1834
                        if (this.attr.getEvaluator() == null) {
1835
                                att = result.add(attributeName, this.attr.getDataType())
1836
                                                .setDefaultValue(this.attr.getDefaultValue());
1837
                        } else {
1838
                                att = result.add(attributeName, this.attr.getDataType(),
1839
                                                this.attr.getEvaluator());
1840
                        }
1841
                        att.setSize(this.attr.getSize());
1842
                        att.setAllowNull(this.attr.allowNull());
1843
                        att.setGeometryType(this.attr.getGeometryType());
1844
                        att.setSRS(this.attr.getSRS());
1845
                        att.setPrecision(this.attr.getPrecision());
1846
                        // TODO
1847

    
1848

    
1849
                        return result.getNotEditableCopy();
1850
                }
1851

    
1852
                protected FeatureType transformType(FeatureType type) {
1853
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1854
                                return type;
1855
                        }
1856

    
1857
                        EditableFeatureType result;
1858
                        if (type instanceof EditableFeatureType) {
1859
                                result = (EditableFeatureType) type.getCopy();
1860
                        } else {
1861
                                result = type.getEditable();
1862
                        }
1863
                        result.remove(this.attributeName);
1864
                        return result.getNotEditableCopy();
1865

    
1866
                }
1867

    
1868
                public void setFeatureStore(FeatureStore featureStore) {
1869
                        Iterator iter;
1870
                        try {
1871
                                iter = featureStore.getFeatureTypes().iterator();
1872
                        } catch (DataException e) {
1873
                                throw new RuntimeException(e);
1874
                        }
1875
                        FeatureType type;
1876
                        FeatureAttributeDescriptor attrTmp;
1877
                        while (iter.hasNext()) {
1878
                                type = (FeatureType) iter.next();
1879
                                attrTmp = type.getAttributeDescriptor(this.attributeName);
1880
                                if (attrTmp != null) {
1881
                                        this.fTypeIdToRemoveAttribute = type.getId();
1882
                                        this.attr = attrTmp;
1883
                                        break;
1884
                                }
1885
                        }
1886
                        super.setFeatureStore(featureStore);
1887
                }
1888

    
1889
                public void applyTransform(Feature source, EditableFeature target)
1890
                                throws DataException {
1891
                        // TODO Auto-generated method stub
1892
                        super.applyTransform(source, target);
1893
                }
1894

    
1895

    
1896

    
1897
        }
1898

    
1899

    
1900
        public class StringsToLowerTransform extends myTransform {
1901

    
1902
                public boolean isTransformsOriginalValues() {
1903
                        return true;
1904
                }
1905

    
1906
                protected void setValue(Feature source, EditableFeature target,
1907
                                FeatureAttributeDescriptor attr) throws DataException {
1908
                        if (attr.getDataType() == DataTypes.STRING) {
1909
                                String v = ((String) source.get(attr.getName()));
1910
                                if (v != null){
1911
                                        v = v.toLowerCase();
1912
                                } else if (!attr.allowNull()) {
1913
                                        v = (String) attr.getDefaultValue();
1914
                                        v = v.toLowerCase();
1915
                                }
1916
                                target.set(attr.getName(), v);
1917
                        } else {
1918
                                target.set(attr.getName(), source.get(attr.getName()));
1919
                        }
1920
                }
1921

    
1922
        }
1923

    
1924
        class StringsToUpperTransform extends StringsToLowerTransform {
1925
                protected void setValue(Feature source, EditableFeature target,
1926
                                FeatureAttributeDescriptor attr) throws DataException {
1927
                        if (attr.getDataType() == DataTypes.STRING) {
1928
                                String v = ((String) source.get(attr.getName()));
1929
                                if (v != null) {
1930
                                        v = v.toUpperCase();
1931
                                } else if (!attr.allowNull()) {
1932
                                        v = (String) attr.getDefaultValue();
1933
                                        v.toUpperCase();
1934
                                }
1935
                                target.set(attr.getName(), v);
1936
                        } else {
1937
                                target.set(attr.getName(), source.get(attr.getName()));
1938
                        }
1939
                }
1940

    
1941
        }
1942

    
1943

    
1944
        public void testFeatureReference() throws Exception {
1945
                DataStoreParameters dbfParameters = this
1946
                                .getDefaultDataStoreParameters();
1947

    
1948
                FeatureStore store = (FeatureStore) dataManager
1949
                                .createStore(dbfParameters);
1950

    
1951
                Feature feature, refered;
1952
                FeatureSet set;
1953
                int nTimes2 = getRandom().nextInt(2) + 1;
1954

    
1955
                for (int j = 0; j < nTimes2; j++) {
1956
                        set = store.getFeatureSet();
1957
                        DisposableIterator iter;
1958

    
1959
                        int nTimes = getRandom().nextInt(2) + 3;
1960
                        for (int i = 0; i < nTimes; i++) {
1961
                                if (getRandom().nextBoolean()) {
1962
                                        iter = set.fastIterator();
1963
                                } else {
1964
                                        iter = set.fastIterator();
1965
                                }
1966
                                while (iter.hasNext()) {
1967
                                        feature = (Feature) iter.next();
1968
                                        refered = feature.getReference().getFeature();
1969
                                        compareFeatures(feature, refered);
1970
                                }
1971
                                iter.dispose();
1972
                        }
1973

    
1974
                        set.dispose();
1975
                }
1976

    
1977
                nTimes2 = getRandom().nextInt(5) + 2;
1978
                FeatureQuery query = store.createFeatureQuery();
1979

    
1980
                for (int j = 0; j < nTimes2; j++) {
1981
                        DisposableIterator iter;
1982

    
1983
                        query.setAttributeNames(getRandomAttibuteList(store
1984
                                        .getDefaultFeatureType()));
1985
                        set = store.getFeatureSet(query);
1986

    
1987
                        int nTimes = getRandom().nextInt(3) + 3;
1988
                        for (int i = 0; i < nTimes; i++) {
1989
                                if (getRandom().nextBoolean()) {
1990
                                        iter = set.fastIterator();
1991
                                } else {
1992
                                        iter = set.fastIterator();
1993
                                }
1994
                                while (iter.hasNext()) {
1995
                                        feature = (Feature) iter.next();
1996
                                        refered = feature.getReference().getFeature(
1997
                                                        set.getDefaultFeatureType());
1998
                                        compareFeatures(feature, refered);
1999
                                }
2000
                                iter.dispose();
2001
                        }
2002

    
2003
                        set.dispose();
2004
                }
2005

    
2006

    
2007

    
2008
                store.dispose();
2009

    
2010
        }
2011

    
2012
        public void testResourcesLocks() throws Exception {
2013

    
2014
                if (!this.usesResources()) {
2015
                        return;
2016
                }
2017

    
2018
                DataStoreParameters dbfParameters = this
2019
                                .getDefaultDataStoreParameters();
2020

    
2021
                FeatureStore store = (FeatureStore) dataManager
2022
                                .createStore(dbfParameters);
2023

    
2024
                int nThreads = getRandom().nextInt(4) + 2;
2025
                List threads = new ArrayList();
2026
                TaskTestIterators task;
2027
                for (int i = 0; i < nThreads; i++) {
2028
                        task = new TaskTestIterators(this, "" + i, store);
2029
                        threads.add(task);
2030
                        task.start();
2031
                }
2032

    
2033
                Iterator iter;
2034
                List stillAlives = new ArrayList();
2035
                stillAlives.addAll(threads);
2036

    
2037
                while (!stillAlives.isEmpty()) {
2038
                        iter = stillAlives.iterator();
2039
                        while (iter.hasNext()) {
2040
                                task = (TaskTestIterators) iter.next();
2041
                                if (!task.isAlive()) {
2042
                                        iter.remove();
2043
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
2044
                                        iter.remove();
2045
                                        getLogger().error("task {} outOfDate", task.getName());
2046
                                } else {
2047
                                        Thread.yield();
2048
                                        Thread.sleep(100);
2049
                                }
2050
                        }
2051
                }
2052

    
2053
                store.dispose();
2054

    
2055
                iter = threads.iterator();
2056
                while (iter.hasNext()) {
2057
                        task = (TaskTestIterators) iter.next();
2058
                        assertTrue(task.isFinishedOk());
2059
                }
2060
        }
2061

    
2062
        class TaskTestIterators extends StoreTask {
2063
                private BaseTestFeatureStore testInstance;
2064

    
2065
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2066
                                String name, FeatureStore store) {
2067
                        super(name, store);
2068
                        this.testInstance = testInstance;
2069
                }
2070

    
2071
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2072
                                String name, FeatureStore store, int timeToWait) {
2073
                        super(name, store, timeToWait);
2074
                        this.testInstance = testInstance;
2075
                }
2076

    
2077
                public void run() {
2078
                        if (!this.startProcess()) {
2079
                                return;
2080
                        }
2081
                        try {
2082
                                this.testInstance.fullStoreIteratorTest(store);
2083

    
2084
                                finishedOk();
2085
                        } catch (Throwable e) {
2086
                                finishedError(e);
2087
                                return;
2088
                        }
2089
                }
2090

    
2091

    
2092
        }
2093

    
2094

    
2095
        protected void tearDown() throws Exception {
2096
                super.tearDown();
2097
                if (!usesResources()) {
2098
                        return;
2099
                }
2100

    
2101
                ResourceManager resMan = DALLocator.getResourceManager();
2102
                resMan.closeResources();
2103
        }
2104

    
2105

    
2106

    
2107
}