Statistics
| Revision:

svn-gvsig-desktop / tags / dal_time_support_Build_1 / libraries / libFMap_dal / src-test / org / gvsig / fmap / dal / feature / BaseTestFeatureStore.java @ 36111

History | View | Annotate | Download (52.3 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.dispose.DisposableIterator;
53
import org.gvsig.tools.dynobject.DynClass;
54
import org.gvsig.tools.dynobject.DynField;
55
import org.gvsig.tools.dynobject.DynObject;
56
import org.gvsig.tools.evaluator.Evaluator;
57
import org.gvsig.tools.evaluator.EvaluatorData;
58
import org.gvsig.tools.evaluator.EvaluatorException;
59
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
60
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
61
import org.gvsig.tools.persistence.PersistentState;
62
import org.gvsig.tools.persistence.exception.PersistenceException;
63
import org.slf4j.Logger;
64
import org.slf4j.LoggerFactory;
65

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

    
73
        private static Logger logger = null;
74

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

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

    
85
        public abstract boolean usesResources();
86

    
87
        public abstract boolean hasExplorer();
88

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

    
98
                return query;
99
        }
100

    
101

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

    
105

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

    
110

    
111
        //=================================================
112

    
113

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

    
118

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

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

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

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

    
154
        }
155

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

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

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

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

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

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

    
224
                return true;
225
        }
226

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

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

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

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

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

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

    
293
                return true;
294
        }
295

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

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

    
314
        }
315

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

    
328
                return !iter2.hasNext();
329

    
330
        }
331

    
332

    
333

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

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

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

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

    
376

    
377

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

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

    
387
                }
388
                return true;
389

    
390
        }
391

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

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

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

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

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

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

    
444
                        return false;
445
                }
446

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

    
463
                return true;
464
        }
465

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

    
486
                return true;
487
        }
488

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

    
505
                return true;
506

    
507
        }
508

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

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

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

    
529
                }
530
                switch (attr.getType()) {
531
                case DataTypes.GEOMETRY:
532
                        Geometry geom1 = (Geometry) v1;
533
                        Geometry geom2 = (Geometry) v2;
534
                        if (!geom1.equals(geom2)) {
535
                                getLogger().warn(" v1 != v2 (Geom):" + attr.getName());
536
                                return false;
537

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

    
547
                        }
548
                        return true;
549

    
550
                case DataTypes.OBJECT:
551
                        if (!v1.equals(v2)) {
552
                                getLogger().warn(
553
                                                " v1 != v2 (object):" + attr.getName() + " [ignored]");
554
                                return false;
555
                        }
556
                        return true;
557

    
558
                default:
559
                        if (!v1.equals(v2)) {
560
                                getLogger()
561
                                                .warn(
562
                                                                " v1 != v2:" + attr.getName() + ": " + v1
563
                                                                                + " != " + v2);
564
                                return false;
565
                        }
566
                }
567
                return true;
568

    
569
        }
570

    
571

    
572
        //------------------------------------------------
573

    
574
        public void testSimpleIteration(FeatureStore store) {
575
                this.testSimpleIteration(store, null);
576
        }
577

    
578
        protected String[] getRandomAttibuteList(FeatureType fType) {
579
                String[] attrNames = new String[fType.size()];
580
                Iterator iter = fType.iterator();
581
                int i = 0;
582
                while (iter.hasNext()) {
583
                        attrNames[i] = ((FeatureAttributeDescriptor) iter.next()).getName();
584
                        i++;
585
                }
586
                return this.getRandomAttibuteList(attrNames);
587
        }
588

    
589
        protected Random getRandom(){
590
                if (rnd == null){
591
                        rnd = new Random();
592
                        rnd.setSeed(System.currentTimeMillis());
593
                }
594
                return rnd;
595
        }
596

    
597
        protected String[] getRandomAttibuteList(String[] attrNames) {
598
                int nAttributes = getRandom().nextInt(
599
                                attrNames.length + (attrNames.length / 2)) + 1;
600
                TreeSet set = new TreeSet();
601
                for (int i = 0; i < nAttributes; i++) {
602
                        set.add(attrNames[getRandom().nextInt(attrNames.length)]);
603
                }
604
                return (String[]) set.toArray(new String[0]);
605
        }
606

    
607
        public void testIterationFastAndStandart(FeatureStore store)
608
                        throws Exception {
609
                this.testIterationFastAndStandart(store, null);
610

    
611
                FeatureQuery query = this.getDefaultQuery(store);
612
                // Random Attribute list
613
                query.setAttributeNames(getRandomAttibuteList(store
614
                                .getDefaultFeatureType()));
615
                this.testIterationFastAndStandart(store, query);
616

    
617
                // Sorted
618
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(store
619
                                .getDefaultFeatureType(), new int[] { DataTypes.INT,
620
                                DataTypes.LONG, DataTypes.STRING, DataTypes.DOUBLE, DataTypes.FLOAT });
621
                {
622
                        // asure that attr is in query attributes
623
                        boolean attrFound = false;
624
                        String[] curAttrs = query.getAttributeNames();
625
                        for (int i = 0; i < curAttrs.length; i++) {
626
                                if (curAttrs[i].equals(attr.getName())) {
627
                                        attrFound = true;
628
                                        break;
629

    
630
                                }
631
                        }
632
                        if (!attrFound) {
633
                                String[] newAttrs = new String[curAttrs.length + 1];
634
                                for (int i = 0; i < curAttrs.length; i++) {
635
                                        newAttrs[i] = curAttrs[i];
636
                                }
637
                                newAttrs[curAttrs.length] = attr.getName();
638
                                query.setAttributeNames(newAttrs);
639
                        }
640
                }
641

    
642

    
643
                query.getOrder().add(attr.getName(), true);
644
                this.testIterationFastAndStandart(store, query);
645

    
646
                // Filter
647
                query = this.getDefaultQuery(store);
648

    
649
                query.setFilter(new Evaluator(){
650
                    private EvaluatorFieldsInfo evaluatorFieldsInfo = new EvaluatorFieldsInfo();
651
                    
652
                        public Object evaluate(EvaluatorData data)
653
                                        throws EvaluatorException {
654
                                // TODO Auto-generated method stub
655
                                return Boolean.TRUE;
656
                        }
657

    
658
                        public String getSQL() {
659
                                return "true = true";
660
                        }
661

    
662
                        public String getDescription() {
663
                                // TODO Auto-generated method stub
664
                                return null;
665
                        }
666

    
667
                        public String getName() {
668
                                return "AlwaysTrue";
669
                        }
670

    
671
                        public EvaluatorFieldsInfo getFieldsInfo() {                                
672
                                return evaluatorFieldsInfo;
673
                        }
674

    
675
                });
676
                this.testIterationFastAndStandart(store, query);
677

    
678
                // Filter + Sorted
679
                query.getOrder().add(attr.getName(), true);
680
                this.testIterationFastAndStandart(store, query);
681
        }
682

    
683
        public void testSimpleIteration(FeatureStore store, FeatureQuery query) {
684
                FeatureSet set;
685
                try {
686

    
687
                        if (query == null) {
688
                                query = this.getDefaultQuery(store);
689
                        }
690
                        set = store.getFeatureSet(query);
691
                        FeatureType type = set.getDefaultFeatureType();
692

    
693
                        DisposableIterator it = set.iterator();
694
                        Feature feature;
695
                        printFeatureTypeColNames(type, 15);
696
                        while (it.hasNext()) {
697

    
698
                                feature = (Feature) it.next();
699
                                printFeature(feature, false, 15);
700
                        }
701

    
702
                        it.dispose();
703
                        set.dispose();
704

    
705
                } catch (DataException e3) {
706
                        e3.printStackTrace();
707
                        fail();
708
                        return;
709
                }
710

    
711
        }
712

    
713
        public void testIterationFastAndStandart(FeatureStore store,
714
                        FeatureQuery query) {
715
                FeatureSet set;
716
                try {
717

    
718
                        if (query == null) {
719
                                query = this.getDefaultQuery(store);
720
                        }
721
                        set = store.getFeatureSet(query);
722

    
723
                        DisposableIterator it = set.iterator();
724
                        DisposableIterator fit = set.fastIterator();
725

    
726
                        assertTrue(this.compareFeatureIterators(it, fit));
727

    
728
                        it.dispose();
729
                        fit.dispose();
730
                        set.dispose();
731

    
732
                } catch (DataException e3) {
733
                        e3.printStackTrace();
734
                        fail();
735
                        return;
736
                }
737

    
738
        }
739

    
740
        public void testSimpleIteration(DataStoreParameters parameters)
741
                        throws Exception {
742
                FeatureStore store = null;
743
                store = (FeatureStore) dataManager.openStore(parameters
744
                                .getDataStoreName(), parameters);
745

    
746
                this.testSimpleIteration(store);
747

    
748
                store.dispose();
749

    
750
        }
751

    
752
        public void testIterationFastAndStandart(DataStoreParameters parameters)
753
                        throws Exception {
754
                FeatureStore store = null;
755
                store = (FeatureStore) dataManager.openStore(parameters
756
                                .getDataStoreName(), parameters);
757

    
758
                this.testIterationFastAndStandart(store);
759

    
760
                store.dispose();
761

    
762
        }
763

    
764
        /**
765
         *
766
         * @param count
767
         *            if (< 0) list.size() >= 1 else list.size() == count
768
         * @throws Exception
769
         */
770
        public void testExplorerList(int count) throws Exception {
771
                FeatureStore store = null;
772
                DataStoreParameters params = getDefaultDataStoreParameters();
773
                store = (FeatureStore) dataManager.openStore(params.getDataStoreName(),
774
                                params);
775

    
776
                DataServerExplorer explorer;
777
                explorer = store.getExplorer();
778

    
779
                if (count < 0) {
780
                        assertTrue(explorer.list().size() >= 1);
781
                } else {
782
                        assertTrue(explorer.list().size() == count);
783
                }
784

    
785
                store.dispose();
786

    
787
                explorer.dispose();
788
        }
789

    
790
        //=================================================
791
        //=================================================
792

    
793

    
794

    
795

    
796
        public void testIterationFastAndStandart() throws Exception {
797
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
798
        }
799

    
800
        public void testSimpleIteration() throws Exception {
801
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
802
        }
803

    
804
        public void testInitializeStore() throws Exception {
805
                DataStoreParameters params = getDefaultDataStoreParameters();
806
                FeatureStore store = (FeatureStore) dataManager.openStore(params
807
                                .getDataStoreName(), params);
808

    
809
                assertNotNull(store.getMetadataID());
810
                assertNotNull(store.getName());
811
                assertEquals(store.getEnvelope(), store.getDynValue("Envelope"));
812
                assertTrue("Feature count not > 0", store.getFeatureCount() > 0);
813
                if (store.isLocksSupported()) {
814
                        assertNotNull(store.getLocks());
815
                } else {
816
                        assertNull(store.getLocks());
817
                }
818
                store.dispose();
819
        }
820

    
821

    
822
        public void testExplorer() throws Exception {
823
                if (!this.hasExplorer()) {
824
                        return;
825
                }
826
                this.testExplorerList(-1);
827

    
828
        }
829

    
830
        public void testSelection() throws Exception {
831
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
832

    
833
                FeatureStore store = (FeatureStore) dataManager.openStore(parameters
834
                                .getDataStoreName(), parameters);
835
                FeatureSet set = store.getFeatureSet();
836

    
837
                assertTrue(store.getFeatureSelection().isEmpty());
838
                store.setSelection(set);
839
                assertFalse(store.getFeatureSelection().isEmpty());
840

    
841
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
842

    
843
                DisposableIterator iter = set.iterator();
844
                while (iter.hasNext()) {
845
                        assertTrue(store.getFeatureSelection().isSelected(
846
                                        (Feature) iter.next()));
847
                }
848
                iter.dispose();
849

    
850
                store.getFeatureSelection().reverse();
851
                assertTrue(store.getFeatureSelection().isEmpty());
852
                assertEquals(0, store.getFeatureSelection().getSize());
853
                iter = set.iterator();
854
                while (iter.hasNext()) {
855
                        assertFalse(store.getFeatureSelection().isSelected(
856
                                        (Feature) iter.next()));
857
                }
858
                iter.dispose();
859

    
860
                store.getFeatureSelection().reverse();
861
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
862
                assertFalse(store.getFeatureSelection().isEmpty());
863

    
864
                set.dispose();
865

    
866
        }
867

    
868
        public void testCustomFTypeSet() throws Exception {
869
                DataStoreParameters dbfParameters = this
870
                                .getDefaultDataStoreParameters();
871

    
872
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
873
                                .getDataStoreName(), dbfParameters);
874

    
875
                testCustomFTypeSet(store);
876

    
877
                store.dispose();
878
        }
879

    
880
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
881

    
882
                FeatureSet set, set1;
883
                FeatureQuery query;
884
                DisposableIterator iter, iter1;
885
                Iterator attrIter;
886
                FeatureAttributeDescriptor attr;
887

    
888
                set = store.getFeatureSet(this.getDefaultQuery(store));
889
                attrIter = store.getDefaultFeatureType().iterator();
890

    
891
                String[] names;
892
                while (attrIter.hasNext()) {
893
                        attr = (FeatureAttributeDescriptor) attrIter.next();
894
                        int fieldIndex = attr.getIndex();
895

    
896
                        query = this.getDefaultQuery(store);
897
                        String fieldName = store.getDefaultFeatureType()
898
                        .getAttributeDescriptor(fieldIndex).getName();
899

    
900
                        names = new String[] { fieldName };
901
                        query.setAttributeNames(names);
902
                        set1 = store.getFeatureSet(query);
903

    
904
                        if (getRandom().nextBoolean()) {
905
                                iter = set.fastIterator();
906
                        } else {
907
                                iter = set.iterator();
908
                        }
909
                        if (getRandom().nextBoolean()) {
910
                                iter1 = set1.fastIterator();
911
                        } else {
912
                                iter1 = set1.iterator();
913
                        }
914

    
915
                        assertTrue(compareFeatureIterators(iter, iter1, names));
916

    
917
                        iter.dispose();
918
                        iter1.dispose();
919
                        set1.dispose();
920
                }
921

    
922
                int ntimes = getRandom().nextInt(10) + 5;
923
                FeatureType type = store.getDefaultFeatureType();
924
                query = this.getDefaultQuery(store);
925
                for (int i = 0; i < ntimes; i++) {
926
                        names = getRandomAttibuteList(type);
927

    
928
                        query.setAttributeNames(names);
929
                        set1 = store.getFeatureSet(query);
930

    
931
                        if (getRandom().nextBoolean()) {
932
                                iter = set.fastIterator();
933
                        } else {
934
                                iter = set.iterator();
935
                        }
936
                        if (getRandom().nextBoolean()) {
937
                                iter1 = set1.fastIterator();
938
                        } else {
939
                                iter1 = set1.iterator();
940
                        }
941

    
942
                        assertTrue(compareFeatureIterators(iter, iter1, names));
943

    
944
                        iter.dispose();
945
                        iter1.dispose();
946

    
947
                        iter1 = set1.fastIterator();
948
                        assertTrue(checksAttributesPositions(iter1, names));
949
                        iter1.dispose();
950

    
951
                        iter1 = set1.iterator();
952
                        assertTrue(checksAttributesPositions(iter1, names));
953
                        iter1.dispose();
954

    
955
                        set1.dispose();
956

    
957

    
958
                }
959

    
960

    
961

    
962
                set.dispose();
963

    
964
        }
965

    
966
        protected boolean checksAttributesPositions(DisposableIterator iter,
967
                        String[] names) {
968
                Feature feature;
969
                FeatureType type;
970
                FeatureAttributeDescriptor attr;
971
                while (iter.hasNext()) {
972
                        feature = (Feature) iter.next();
973
                        type = feature.getType();
974
                        for (int i = 0; i < names.length; i++) {
975
                                attr = type.getAttributeDescriptor(i);
976
                                if (!names[i].equals(attr.getName())) {
977
                                        getLogger().error(
978
                                                        "Error in attribute {} (expected: '{}' have: '{}'",
979
                                                        new Object[] { new Integer(i), names[i],
980
                                                                        attr.getName() });
981
                                        return false;
982
                                }
983
                        }
984
                }
985
                return true;
986
        }
987

    
988
         public void testPersistence() throws Exception {
989
                if (ToolsLocator.getPersistenceManager() == null) {
990
                        fail("Default Persistence Manager not register");
991
                }
992
                DataStoreParameters params = this.getDefaultDataStoreParameters();
993

    
994
                FeatureStore store = (FeatureStore) dataManager.openStore(params
995
                                .getDataStoreName(), params);
996

    
997
                testSimpleIteration(store);
998

    
999
                PersistentState state = ToolsLocator.getPersistenceManager().getState(
1000
                                store);
1001

    
1002
                FeatureStore store2 = (FeatureStore) ToolsLocator
1003
                                .getPersistenceManager().create(state);
1004

    
1005
                testSimpleIteration(store2);
1006

    
1007
                assertTrue(compareStores(store, store2));
1008

    
1009
                store.dispose();
1010
                store2.dispose();
1011

    
1012
        }
1013

    
1014

    
1015
        public void testSort() throws Exception {
1016
                DataStoreParameters dbfParameters = this
1017
                                .getDefaultDataStoreParameters();
1018

    
1019
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1020
                                .getDataStoreName(), dbfParameters);
1021

    
1022
                testSort(store);
1023

    
1024
                store.dispose();
1025

    
1026
        }
1027

    
1028
        public void testSort(FeatureStore store) throws Exception{
1029
                FeatureSet set1;
1030
                FeatureQuery query;
1031
                DisposableIterator iter1;
1032
                Iterator attrIter;
1033
                FeatureAttributeDescriptor attr;
1034

    
1035
                attrIter = store.getDefaultFeatureType().iterator();
1036

    
1037
                String[] names;
1038
                while (attrIter.hasNext()) {
1039
                        attr = (FeatureAttributeDescriptor) attrIter.next();
1040

    
1041
                        if (attr.getType() == DataTypes.GEOMETRY) {
1042
                                continue;
1043
                        }
1044
                        query = this.getDefaultQuery(store);
1045
                        String fieldName = attr.getName();
1046

    
1047

    
1048

    
1049
                        names = new String[] { fieldName };
1050
                        query.setAttributeNames(names);
1051
                        query.getOrder().add(fieldName, getRandom().nextBoolean());
1052

    
1053
                        set1 = store.getFeatureSet(query);
1054
                        if (getRandom().nextBoolean()) {
1055
                                iter1 = set1.fastIterator();
1056
                        } else {
1057
                                iter1 = set1.iterator();
1058
                        }
1059

    
1060
                        assertTrue(checkSort(iter1, query));
1061

    
1062
                        iter1.dispose();
1063
                        set1.dispose();
1064
                }
1065

    
1066
                int ntimes = getRandom().nextInt(10) + 5;
1067
                FeatureType type = store.getDefaultFeatureType();
1068
                query = this.getDefaultQuery(store);
1069
                for (int i = 0; i < ntimes; i++) {
1070
                        names = getRandomAttibuteList(type);
1071

    
1072
                        int nShortFields = getRandom().nextInt(names.length) + 1;
1073
                        query.getOrder().clear();
1074
                        for (int j = 0; j < nShortFields; j++) {
1075
                                attr = store.getDefaultFeatureType().getAttributeDescriptor(names[getRandom().nextInt(names.length)]);
1076
                                if (attr.getType() == DataTypes.INT
1077
                                                || attr.getType() == DataTypes.LONG
1078
                                                || attr.getType() == DataTypes.DOUBLE
1079
                                                || attr.getType() == DataTypes.STRING
1080
                                                || attr.getType() == DataTypes.DATE
1081
                                                || attr.getType() == DataTypes.BOOLEAN
1082
                                                || attr.getType() == DataTypes.BYTE
1083
                                                || attr.getType() == DataTypes.FLOAT) {
1084

    
1085
                                        query.getOrder().add(attr.getName(),
1086
                                                        getRandom().nextBoolean());
1087
                                }
1088
                        }
1089

    
1090
                        query.setAttributeNames(names);
1091
                        set1 = store.getFeatureSet(query);
1092

    
1093
                        // if (getRandom().nextBoolean()) {
1094
                                iter1 = set1.fastIterator();
1095
                                // } else {
1096
                                // iter1 = set1.iterator();
1097
                                // }
1098

    
1099
                                assertTrue(checkSort(iter1, query));
1100

    
1101
                                iter1.dispose();
1102
                                set1.dispose();
1103

    
1104
                }
1105

    
1106
        }
1107

    
1108

    
1109
        public boolean checkSort(Iterator iter, FeatureQuery query) {
1110

    
1111
                FeatureQueryOrderMember order;
1112
                Feature prevFeature = null;
1113
                Feature currFeature = null;
1114
                boolean isFirst = true;
1115
                Comparable v1, v2;
1116
                Object o1, o2;
1117
                int v;
1118
                FeatureQueryOrder queryOrder = query.getOrder();
1119

    
1120
                Iterator orderIter;
1121

    
1122
                //for debug only
1123
                /*
1124
                System.out.println("\nCheck order:");
1125
                Iterator orderIter = queryOrder.iterator();
1126
                while (orderIter.hasNext()) {
1127
                        order = (FeatureQueryOrderMember) orderIter.next();
1128
                        System.out.print(order.getAttributeName() + " ");
1129
                        if (order.getAscending()) {
1130
                                System.out.print("Asc, ");
1131
                        } else {
1132
                                System.out.print("Desc, ");
1133
                        }
1134
                }
1135
                System.out.println(";");
1136
                */
1137

    
1138
                while (iter.hasNext()) {
1139
                        currFeature = (Feature) iter.next();
1140
                        if (isFirst) {
1141
                                prevFeature = currFeature.getCopy();
1142
                                // printFeature(prevFeature, true, 15);
1143
                                isFirst = false;
1144
                                continue;
1145
                        }
1146
                        // printFeature(currFeature, false, 15);
1147
                        orderIter = queryOrder.iterator();
1148
                        while (orderIter.hasNext()) {
1149
                                order = (FeatureQueryOrderMember) orderIter.next();
1150
                                if (order.hasEvaluator()) {
1151
                                        try {
1152
                                                o1 = order.getEvaluator().evaluate(
1153
                                                                (EvaluatorData) prevFeature);
1154
                                                o2 = order.getEvaluator().evaluate(
1155
                                                                (EvaluatorData) currFeature);
1156
                                        } catch (EvaluatorException e) {
1157
                                                throw new DataEvaluatorRuntimeException(e);
1158
                                        }
1159
                                } else {
1160

    
1161
                                        o1 = prevFeature.get(order.getAttributeName());
1162
                                        o2 = currFeature.get(order.getAttributeName());
1163
                                }
1164
                                if (o1 instanceof Comparable && o2 instanceof Comparable) {
1165
                                        v1 = (Comparable) o1;
1166
                                        v2 = (Comparable) o2;
1167
                                } else {
1168
                                        // uncomparable objets
1169
                                        break;
1170
                                }
1171
                                if (v1 == null) {
1172
                                        if (v2 == null) {
1173
                                                break;
1174
                                        } else {
1175
                                                v = 1;
1176
                                        }
1177
                                } else {
1178
                                        v = v1.compareTo(v2);
1179
                                }
1180
                                if (v != 0) {
1181
                                        if (!order.getAscending()) {
1182
                                                v = -v;
1183
                                        }
1184
                                }
1185
                                if (v < 0) {
1186
                                        break;
1187
                                } else if (v > 0) {
1188
                                        // Checks for ignore case short
1189
                                        if (v1 instanceof String && v2 instanceof String) {
1190
                                                v1 = ((String)v1).toLowerCase();
1191
                                                v2 = ((String)v2).toLowerCase();
1192
                                                v = v1.compareTo(v2);
1193
                                                if (v != 0) {
1194
                                                        if (!order.getAscending()) {
1195
                                                                v = -v;
1196
                                                        }
1197
                                                }
1198
                                                if (v < 0) {
1199
                                                        getLogger()
1200
                                                                        .warn("Short compartor String ok with ignore case");
1201
                                                        break;
1202
                                                } else if (v > 0) {
1203
                                                        return false;
1204
                                                }
1205
                                        } else {
1206
                                                return false;
1207
                                        }
1208
                                }
1209
                        }
1210
                        prevFeature = currFeature.getCopy();
1211
                }
1212

    
1213
                return true;
1214
        }
1215

    
1216
        protected void fullStoreIteratorTest(FeatureStore store) throws Exception{
1217
                testIterationFastAndStandart(store);
1218
                testCustomFTypeSet(store);
1219
                testSort(store);
1220
        }
1221

    
1222

    
1223
        public void testTransformsData() throws Exception {
1224
                DataStoreParameters dbfParameters = this
1225
                                .getDefaultDataStoreParameters();
1226

    
1227
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1228
                                .getDataStoreName(), dbfParameters);
1229

    
1230
                FeatureStore store1 = (FeatureStore) dataManager.openStore(
1231
                                dbfParameters.getDataStoreName(), dbfParameters);
1232

    
1233
                FeatureStoreTransform transform = new StringsToLowerTransform();
1234
                transform.setFeatureStore(store);
1235

    
1236
                store.getTransforms().add(transform);
1237

    
1238
                FeatureSet set, set1;
1239
                DisposableIterator iter, iter1;
1240
                Iterator iterAttr;
1241
                FeatureAttributeDescriptor attr;
1242
                Feature feature, feature1;
1243
                int i, ntimes;
1244
                Object v1, v2;
1245

    
1246

    
1247
                fullStoreIteratorTest(store);
1248

    
1249
                set = store.getFeatureSet();
1250
                set1 = store1.getFeatureSet();
1251
                ntimes = getRandom().nextInt(3) + 1;
1252
                for (i = 0; i < ntimes; i++) {
1253
                        if (getRandom().nextBoolean()) {
1254
                                iter = set.fastIterator();
1255
                        } else {
1256
                                iter = set.iterator();
1257
                        }
1258
                        if (getRandom().nextBoolean()) {
1259
                                iter1 = set1.fastIterator();
1260
                        } else {
1261
                                iter1 = set1.iterator();
1262
                        }
1263
                        while (iter.hasNext()) {
1264
                                feature = (Feature) iter.next();
1265
                                feature1 = (Feature) iter1.next();
1266

    
1267
                                iterAttr = set.getDefaultFeatureType().iterator();
1268
                                while (iterAttr.hasNext()) {
1269
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1270
                                        v1 = feature.get(attr.getIndex());
1271
                                        v2 = feature1.get(attr.getIndex());
1272
                                        if (attr.getType() == DataTypes.STRING) {
1273
                                                if (v2 != null) {
1274
                                                        v2 = ((String) v2).toLowerCase();
1275
                                                }
1276

    
1277
                                        }
1278
                                        if (!v1.equals(v2)){
1279
                                            v1 = feature.get(attr.getIndex());
1280
                                            v2 = feature1.get(attr.getIndex());
1281
                                            int type1 = attr.getType();
1282
                                            int type2 = feature1.getType().getAttributeDescriptor(22).getType();
1283
                                            
1284
                                            System.out.println(v1.toString() + " - " + v2.toString());
1285
                                        }
1286
                                        assertTrue(compareFeatureValue(v1, v2, attr));
1287
                                }
1288
                        }
1289
                        assertFalse(iter1.hasNext());
1290
                        iter.dispose();
1291
                        iter1.dispose();
1292
                }
1293

    
1294

    
1295
                set.dispose();
1296
                set1.dispose();
1297

    
1298

    
1299
                transform = new StringsToUpperTransform();
1300
                transform.setFeatureStore(store);
1301

    
1302
                store.getTransforms().add(transform);
1303

    
1304
                fullStoreIteratorTest(store);
1305

    
1306
                set = store.getFeatureSet();
1307
                set1 = store1.getFeatureSet();
1308
                ntimes = getRandom().nextInt(3) + 1;
1309
                for (i = 0; i < ntimes; i++) {
1310
                        if (getRandom().nextBoolean()) {
1311
                                iter = set.fastIterator();
1312
                        } else {
1313
                                iter = set.iterator();
1314
                        }
1315
                        if (getRandom().nextBoolean()) {
1316
                                iter1 = set1.fastIterator();
1317
                        } else {
1318
                                iter1 = set1.iterator();
1319
                        }
1320
                        while (iter.hasNext()) {
1321
                                feature = (Feature) iter.next();
1322
                                feature1 = (Feature) iter1.next();
1323

    
1324
                                iterAttr = set.getDefaultFeatureType().iterator();
1325
                                while (iterAttr.hasNext()) {
1326
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1327
                                        v1 = feature.get(attr.getIndex());
1328
                                        v2 = feature1.get(attr.getIndex());
1329
                                        if (attr.getType() == DataTypes.STRING) {
1330
                                                if (v2 != null) {
1331
                                                        v2 = ((String) v2).toUpperCase();
1332
                                                }
1333

    
1334
                                        }
1335
                                        compareFeatureValue(v1, v2, attr);
1336
                                }
1337
                        }
1338
                        assertFalse(iter1.hasNext());
1339
                        iter.dispose();
1340
                        iter1.dispose();
1341
                }
1342
                set.dispose();
1343
                set1.dispose();
1344

    
1345

    
1346
                transform = new AddPrefixAttributeName("_");
1347
                transform.setFeatureStore(store);
1348

    
1349
                store.getTransforms().add(transform);
1350

    
1351
                fullStoreIteratorTest(store);
1352

    
1353
                set = store.getFeatureSet();
1354
                set1 = store1.getFeatureSet();
1355
                ntimes = getRandom().nextInt(3) + 1;
1356
                for (i = 0; i < ntimes; i++) {
1357
                        if (getRandom().nextBoolean()) {
1358
                                iter = set.fastIterator();
1359
                        } else {
1360
                                iter = set.iterator();
1361
                        }
1362
                        if (getRandom().nextBoolean()) {
1363
                                iter1 = set1.fastIterator();
1364
                        } else {
1365
                                iter1 = set1.iterator();
1366
                        }
1367
                        while (iter.hasNext()) {
1368
                                feature = (Feature) iter.next();
1369
                                feature1 = (Feature) iter1.next();
1370

    
1371
                                iterAttr = set1.getDefaultFeatureType().iterator();
1372
                                while (iterAttr.hasNext()) {
1373
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1374
                                        v1 = feature.get("_" + attr.getName());
1375
                                        v2 = feature1.get(attr.getIndex());
1376
                                        if (attr.getType() == DataTypes.STRING) {
1377
                                                if (v2 != null) {
1378
                                                        v2 = ((String) v2).toUpperCase();
1379
                                                }
1380

    
1381
                                        }
1382
                                        compareFeatureValue(v1, v2, attr);
1383
                                }
1384
                        }
1385
                        assertFalse(iter1.hasNext());
1386
                        iter.dispose();
1387
                        iter1.dispose();
1388
                }
1389
                set.dispose();
1390
                set1.dispose();
1391

    
1392
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1393
                transform.setFeatureStore(store);
1394

    
1395
                store.getTransforms().add(transform);
1396

    
1397
                fullStoreIteratorTest(store);
1398

    
1399
                set = store.getFeatureSet();
1400
                set1 = store1.getFeatureSet();
1401
                ntimes = getRandom().nextInt(3) + 1;
1402
                for (i = 0; i < ntimes; i++) {
1403
                        if (getRandom().nextBoolean()) {
1404
                                iter = set.fastIterator();
1405
                        } else {
1406
                                iter = set.iterator();
1407
                        }
1408
                        if (getRandom().nextBoolean()) {
1409
                                iter1 = set1.fastIterator();
1410
                        } else {
1411
                                iter1 = set1.iterator();
1412
                        }
1413
                        while (iter.hasNext()) {
1414
                                feature = (Feature) iter.next();
1415
                                feature1 = (Feature) iter1.next();
1416

    
1417
                                iterAttr = set1.getDefaultFeatureType().iterator();
1418
                                while (iterAttr.hasNext()) {
1419
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1420
                                        v1 = feature.get("_" + attr.getName());
1421
                                        v2 = feature1.get(attr.getIndex());
1422
                                        if (attr.getType() == DataTypes.STRING) {
1423
                                                if (v2 != null) {
1424
                                                        v2 = ((String) v2).toUpperCase();
1425
                                                }
1426

    
1427
                                        }
1428
                                        compareFeatureValue(v1, v2, attr);
1429
                                }
1430
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1431
                                                .getDefaultFeatureType().getAttributeDescriptor(
1432
                                                                "__new__"));
1433
                        }
1434
                        assertFalse(iter1.hasNext());
1435
                        iter.dispose();
1436
                        iter1.dispose();
1437
                }
1438
                set.dispose();
1439
                set1.dispose();
1440

    
1441

    
1442
                transform = new RemoveAttribute("__new__");
1443
                transform.setFeatureStore(store);
1444

    
1445
                store.getTransforms().add(transform);
1446

    
1447
                fullStoreIteratorTest(store);
1448

    
1449
                set = store.getFeatureSet();
1450
                set1 = store1.getFeatureSet();
1451
                ntimes = getRandom().nextInt(3) + 1;
1452
                for (i = 0; i < ntimes; i++) {
1453
                        if (getRandom().nextBoolean()) {
1454
                                iter = set.fastIterator();
1455
                        } else {
1456
                                iter = set.iterator();
1457
                        }
1458
                        if (getRandom().nextBoolean()) {
1459
                                iter1 = set1.fastIterator();
1460
                        } else {
1461
                                iter1 = set1.iterator();
1462
                        }
1463
                        while (iter.hasNext()) {
1464
                                feature = (Feature) iter.next();
1465
                                feature1 = (Feature) iter1.next();
1466

    
1467
                                iterAttr = set1.getDefaultFeatureType().iterator();
1468
                                while (iterAttr.hasNext()) {
1469
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1470
                                        v1 = feature.get("_" + attr.getName());
1471
                                        v2 = feature1.get(attr.getIndex());
1472
                                        if (attr.getType() == DataTypes.STRING) {
1473
                                                if (v2 != null) {
1474
                                                        v2 = ((String) v2).toUpperCase();
1475
                                                }
1476

    
1477
                                        }
1478
                                        compareFeatureValue(v1, v2, attr);
1479
                                }
1480
                                assertNull(feature.getType().getAttributeDescriptor("__new__"));
1481
                        }
1482
                        assertFalse(iter1.hasNext());
1483
                        iter.dispose();
1484
                        iter1.dispose();
1485
                }
1486
                set.dispose();
1487
                set1.dispose();
1488

    
1489
                store.getTransforms().clear();
1490

    
1491
                compareStores(store, store1);
1492

    
1493

    
1494
                store.dispose();
1495
                store1.dispose();
1496
        }
1497

    
1498
        abstract class myTransform implements FeatureStoreTransform {
1499
                protected FeatureStore store;
1500
                protected FeatureType orgDefaultFType;
1501
                protected List orgFTypes;
1502

    
1503
                public void applyTransform(Feature source, EditableFeature target)
1504
                                throws DataException {
1505

    
1506
                        Iterator iter = target.getType().iterator();
1507
                        FeatureAttributeDescriptor attr;
1508
                        while (iter.hasNext()) {
1509
                                attr = (FeatureAttributeDescriptor) iter.next();
1510
                                this.setValue(source, target, attr);
1511
                        }
1512

    
1513
                }
1514

    
1515
                protected void setValue(Feature source, EditableFeature target,
1516
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1517
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1518
                }
1519

    
1520
                public void saveToState(PersistentState state)
1521
                throws PersistenceException {
1522
                        // TODO Auto-generated method stub
1523

    
1524
                }
1525

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

    
1529
                }
1530

    
1531
                public FeatureType getDefaultFeatureType() throws DataException {
1532
                        return orgDefaultFType;
1533
                }
1534

    
1535
                public FeatureStore getFeatureStore() {
1536
                        return store;
1537
                }
1538

    
1539
                public List getFeatureTypes() throws DataException {
1540
                        return orgFTypes;
1541
                }
1542

    
1543
                public void setFeatureStore(FeatureStore featureStore) {
1544
                        this.store = featureStore;
1545
                        try {
1546
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1547
                                this.orgFTypes = this.store.getFeatureTypes();
1548

    
1549
                        } catch (DataException e) {
1550
                                throw new RuntimeException(e);
1551
                        }
1552

    
1553
                }
1554

    
1555
                public PersistentState getState() throws PersistenceException {
1556
                        // TODO Auto-generated method stub
1557
                        return null;
1558
                }
1559

    
1560
                public FeatureType getSourceFeatureTypeFrom(
1561
                                FeatureType targetFeatureType) {
1562

    
1563
                        return targetFeatureType;
1564
                }
1565
                
1566
        public String getName() {
1567
            System.out
1568
                .println("\nmyFeatureStore.getname(): " + store.getName());
1569
            return store.getName();
1570
        }
1571

    
1572
        public String getDescription() {
1573
            System.out.println("\nmyFeatureStore.getDescription(getfullname): "
1574
                + store.getFullName());
1575
            return store.getFullName();
1576
        }
1577

    
1578
        }
1579

    
1580
        abstract class TransformTypeTransform extends myTransform {
1581

    
1582
                private FeatureType myDefaultFeatureType = null;
1583
                private List myFeatureTypes = null;
1584

    
1585
                public FeatureType getDefaultFeatureType() throws DataException {
1586
                        if (this.myDefaultFeatureType == null) {
1587
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1588
                        }
1589

    
1590
                        return this.myDefaultFeatureType;
1591
                }
1592

    
1593
                protected abstract FeatureType transformType(FeatureType type);
1594

    
1595
                protected abstract FeatureType restoreType(FeatureType type);
1596

    
1597

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

    
1616
                public boolean isTransformsOriginalValues() {
1617
                        return false;
1618
                }
1619

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

    
1641
                        return this.restoreType(org);
1642
                }
1643

    
1644
        }
1645

    
1646
        abstract class TransformAttributeNameTransform extends
1647
                        TransformTypeTransform {
1648

    
1649
                protected void setValue(Feature source, EditableFeature target,
1650
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1651
                        target.set(attrTarget.getIndex(), source.get(this
1652
                                        .restoreAttributeName(attrTarget.getName())));
1653
                }
1654

    
1655

    
1656
                protected FeatureType transformType(FeatureType type) {
1657
                        EditableFeatureType result = type.getEditable();
1658
                        Iterator iter = result.iterator();
1659
                        EditableFeatureAttributeDescriptor attr;
1660
                        while (iter.hasNext()) {
1661
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1662
                                attr.setName(transformAttributeName(attr.getName()));
1663
                        }
1664
                        return result.getNotEditableCopy();
1665
                }
1666

    
1667
                protected abstract String transformAttributeName(String source);
1668

    
1669
                protected abstract String restoreAttributeName(String target);
1670

    
1671
                protected FeatureType restoreType(FeatureType type) {
1672
                        EditableFeatureType result;
1673
                        if (type instanceof EditableFeatureType) {
1674
                                result = (EditableFeatureType) type.getCopy();
1675
                        } else {
1676
                                result = type.getEditable();
1677
                        }
1678
                        Iterator iter = result.iterator();
1679
                        EditableFeatureAttributeDescriptor attr;
1680
                        while (iter.hasNext()) {
1681
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1682

    
1683
                                attr.setName(restoreAttributeName(attr.getName()));
1684
                        }
1685
                        return result.getNotEditableCopy();
1686
                }
1687

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

    
1717
        }
1718

    
1719

    
1720
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1721

    
1722
                private String prefix;
1723

    
1724
                AddPrefixAttributeName(String prefix) {
1725
                        this.prefix = prefix;
1726
                }
1727

    
1728
                protected String restoreAttributeName(String target) {
1729
                        return target.substring(getPrefix().length(), target.length());
1730
                }
1731

    
1732
                private String getPrefix() {
1733
                        return prefix;
1734
                }
1735

    
1736
                protected String transformAttributeName(String source) {
1737
                        return getPrefix() + source;
1738
                }
1739

    
1740
        }
1741

    
1742
        class AddAttribute extends TransformTypeTransform {
1743

    
1744
                private String name;
1745
                private int type;
1746
                private Object defValue;
1747
                private int size;
1748
                private Evaluator eval;
1749

    
1750
                AddAttribute(String name) {
1751
                        this(name, DataTypes.STRING, null, 15);
1752
                }
1753

    
1754
                AddAttribute(String name, int type) {
1755
                        this(name, type, null, 15);
1756
                }
1757

    
1758
                AddAttribute(String name, int type, Object defValue) {
1759
                        this(name, type, defValue, 15);
1760
                }
1761

    
1762
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1763
                        this.name = name;
1764
                        this.type = type;
1765
                        this.defValue = null;
1766
                        this.size = size;
1767
                        this.eval = evaluator;
1768
                }
1769

    
1770
                AddAttribute(String name, int type, Object defValue, int size) {
1771
                        this.name = name;
1772
                        this.type = type;
1773
                        this.defValue = defValue;
1774
                        this.size = size;
1775
                        this.eval = null;
1776
                }
1777

    
1778

    
1779

    
1780
                protected FeatureType restoreType(FeatureType type) {
1781
                        EditableFeatureType result;
1782
                        if (type instanceof EditableFeatureType) {
1783
                                result = (EditableFeatureType) type.getCopy();
1784
                        } else {
1785
                                result = type.getEditable();
1786
                        }
1787
                        result.remove(this.name);
1788
                        return result.getNotEditableCopy();
1789
                }
1790

    
1791
                protected FeatureType transformType(FeatureType type) {
1792
                        EditableFeatureType result = type.getEditable();
1793

    
1794
                        EditableFeatureAttributeDescriptor att;
1795
                        if (this.eval == null) {
1796
                                att = result.add(name, this.type)
1797
                                                .setDefaultValue(this.defValue);
1798
                        } else {
1799
                                att = result.add(name, this.type, this.eval);
1800
                        }
1801
                        att.setSize(size);
1802

    
1803

    
1804
                        return result.getNotEditableCopy();
1805
                }
1806

    
1807
                protected void setValue(Feature source, EditableFeature target,
1808
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1809
                        if (attrTarget.getName().equals(this.name)) {
1810
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1811
                        } else {
1812
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1813
                                                .getName()));
1814
                        }
1815
                }
1816
        }
1817

    
1818

    
1819
        class RemoveAttribute extends TransformTypeTransform {
1820

    
1821
                private String attributeName;
1822
                private String fTypeIdToRemoveAttribute = null;
1823
                private FeatureAttributeDescriptor attr;
1824

    
1825
                RemoveAttribute(String attributeName) {
1826
                        this.attributeName = attributeName;
1827
                }
1828

    
1829
                RemoveAttribute(String attributeName, FeatureType fType) {
1830
                        this.attributeName = attributeName;
1831
                }
1832

    
1833
                protected FeatureType restoreType(FeatureType type) {
1834
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1835
                                return type;
1836
                        }
1837
                        EditableFeatureType result = type.getEditable();
1838

    
1839
                        EditableFeatureAttributeDescriptor att;
1840
                        if (this.attr.getEvaluator() == null) {
1841
                                att = result.add(attributeName, this.attr.getType())
1842
                                                .setDefaultValue(this.attr.getDefaultValue());
1843
                        } else {
1844
                                att = result.add(attributeName, this.attr.getType(),
1845
                                                this.attr.getEvaluator());
1846
                        }
1847
                        att.setSize(this.attr.getSize());
1848
                        att.setAllowNull(this.attr.allowNull());
1849
                        att.setGeometryType(this.attr.getGeometryType());
1850
                        att.setSRS(this.attr.getSRS());
1851
                        att.setPrecision(this.attr.getPrecision());
1852
                        // TODO
1853

    
1854

    
1855
                        return result.getNotEditableCopy();
1856
                }
1857

    
1858
                protected FeatureType transformType(FeatureType type) {
1859
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1860
                                return type;
1861
                        }
1862

    
1863
                        EditableFeatureType result;
1864
                        if (type instanceof EditableFeatureType) {
1865
                                result = (EditableFeatureType) type.getCopy();
1866
                        } else {
1867
                                result = type.getEditable();
1868
                        }
1869
                        result.remove(this.attributeName);
1870
                        return result.getNotEditableCopy();
1871

    
1872
                }
1873

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

    
1895
                public void applyTransform(Feature source, EditableFeature target)
1896
                                throws DataException {
1897
                        // TODO Auto-generated method stub
1898
                        super.applyTransform(source, target);
1899
                }
1900

    
1901

    
1902

    
1903
        }
1904

    
1905

    
1906
        public class StringsToLowerTransform extends myTransform {
1907

    
1908
                public boolean isTransformsOriginalValues() {
1909
                        return true;
1910
                }
1911

    
1912
                protected void setValue(Feature source, EditableFeature target,
1913
                                FeatureAttributeDescriptor attr) throws DataException {
1914
                        if (attr.getType() == DataTypes.STRING) {
1915
                                String v = ((String) source.get(attr.getName()));
1916
                                if (v != null){
1917
                                        v = v.toLowerCase();
1918
                                } else if (!attr.allowNull()) {
1919
                                        v = (String) attr.getDefaultValue();
1920
                                        v = v.toLowerCase();
1921
                                }
1922
                                target.set(attr.getName(), v);
1923
                        } else {
1924
                                target.set(attr.getName(), source.get(attr.getName()));
1925
                        }
1926
                }
1927

    
1928
        }
1929

    
1930
        class StringsToUpperTransform extends StringsToLowerTransform {
1931
                protected void setValue(Feature source, EditableFeature target,
1932
                                FeatureAttributeDescriptor attr) throws DataException {
1933
                        if (attr.getType() == DataTypes.STRING) {
1934
                                String v = ((String) source.get(attr.getName()));
1935
                                if (v != null) {
1936
                                        v = v.toUpperCase();
1937
                                } else if (!attr.allowNull()) {
1938
                                        v = (String) attr.getDefaultValue();
1939
                                        v.toUpperCase();
1940
                                }
1941
                                target.set(attr.getName(), v);
1942
                        } else {
1943
                                target.set(attr.getName(), source.get(attr.getName()));
1944
                        }
1945
                }
1946

    
1947
        }
1948

    
1949

    
1950
        public void testFeatureReference() throws Exception {
1951
                DataStoreParameters dbfParameters = this
1952
                                .getDefaultDataStoreParameters();
1953

    
1954
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1955
                                .getDataStoreName(), dbfParameters);
1956

    
1957
                Feature feature, refered;
1958
                FeatureSet set;
1959
                int nTimes2 = getRandom().nextInt(2) + 1;
1960

    
1961
                for (int j = 0; j < nTimes2; j++) {
1962
                        set = store.getFeatureSet();
1963
                        DisposableIterator iter;
1964

    
1965
                        int nTimes = getRandom().nextInt(2) + 3;
1966
                        for (int i = 0; i < nTimes; i++) {
1967
                                if (getRandom().nextBoolean()) {
1968
                                        iter = set.fastIterator();
1969
                                } else {
1970
                                        iter = set.fastIterator();
1971
                                }
1972
                                while (iter.hasNext()) {
1973
                                        feature = (Feature) iter.next();
1974
                                        refered = feature.getReference().getFeature();
1975
                                        compareFeatures(feature, refered);
1976
                                }
1977
                                iter.dispose();
1978
                        }
1979

    
1980
                        set.dispose();
1981
                }
1982

    
1983
                nTimes2 = getRandom().nextInt(5) + 2;
1984
                FeatureQuery query = store.createFeatureQuery();
1985

    
1986
                for (int j = 0; j < nTimes2; j++) {
1987
                        DisposableIterator iter;
1988

    
1989
                        query.setAttributeNames(getRandomAttibuteList(store
1990
                                        .getDefaultFeatureType()));
1991
                        set = store.getFeatureSet(query);
1992

    
1993
                        int nTimes = getRandom().nextInt(3) + 3;
1994
                        for (int i = 0; i < nTimes; i++) {
1995
                                if (getRandom().nextBoolean()) {
1996
                                        iter = set.fastIterator();
1997
                                } else {
1998
                                        iter = set.fastIterator();
1999
                                }
2000
                                while (iter.hasNext()) {
2001
                                        feature = (Feature) iter.next();
2002
                                        refered = feature.getReference().getFeature(
2003
                                                        set.getDefaultFeatureType());
2004
                                        compareFeatures(feature, refered);
2005
                                }
2006
                                iter.dispose();
2007
                        }
2008

    
2009
                        set.dispose();
2010
                }
2011

    
2012

    
2013

    
2014
                store.dispose();
2015

    
2016
        }
2017

    
2018
        public void testResourcesLocks() throws Exception {
2019

    
2020
                if (!this.usesResources()) {
2021
                        return;
2022
                }
2023

    
2024
                DataStoreParameters dbfParameters = this
2025
                                .getDefaultDataStoreParameters();
2026

    
2027
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
2028
                                .getDataStoreName(), dbfParameters);
2029

    
2030
                int nThreads = getRandom().nextInt(4) + 2;
2031
                List threads = new ArrayList();
2032
                TaskTestIterators task;
2033
                for (int i = 0; i < nThreads; i++) {
2034
                        task = new TaskTestIterators(this, "" + i, store);
2035
                        threads.add(task);
2036
                        task.start();
2037
                }
2038

    
2039
                Iterator iter;
2040
                List stillAlives = new ArrayList();
2041
                stillAlives.addAll(threads);
2042

    
2043
                while (!stillAlives.isEmpty()) {
2044
                        iter = stillAlives.iterator();
2045
                        while (iter.hasNext()) {
2046
                                task = (TaskTestIterators) iter.next();
2047
                                if (!task.isAlive()) {
2048
                                        iter.remove();
2049
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
2050
                                        iter.remove();
2051
                                        getLogger().error("task {} outOfDate", task.getName());
2052
                                } else {
2053
                                        Thread.yield();
2054
                                        Thread.sleep(100);
2055
                                }
2056
                        }
2057
                }
2058

    
2059
                store.dispose();
2060

    
2061
                iter = threads.iterator();
2062
                while (iter.hasNext()) {
2063
                        task = (TaskTestIterators) iter.next();
2064
                        assertTrue(task.isFinishedOk());
2065
                }
2066
        }
2067

    
2068
        class TaskTestIterators extends StoreTask {
2069
                private BaseTestFeatureStore testInstance;
2070

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

    
2077
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2078
                                String name, FeatureStore store, int timeToWait) {
2079
                        super(name, store, timeToWait);
2080
                        this.testInstance = testInstance;
2081
                }
2082

    
2083
                public void run() {
2084
                        if (!this.startProcess()) {
2085
                                return;
2086
                        }
2087
                        try {
2088
                                this.testInstance.fullStoreIteratorTest(store);
2089

    
2090
                                finishedOk();
2091
                        } catch (Throwable e) {
2092
                                finishedError(e);
2093
                                return;
2094
                        }
2095
                }
2096

    
2097

    
2098
        }
2099

    
2100

    
2101
        protected void tearDown() throws Exception {
2102
                super.tearDown();
2103
                if (!usesResources()) {
2104
                        return;
2105
                }
2106

    
2107
                ResourceManager resMan = DALLocator.getResourceManager();
2108
                resMan.closeResources();
2109
        }
2110

    
2111

    
2112

    
2113
}