Statistics
| Revision:

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

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 junit.framework.TestCase;
41

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

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

    
73
        private static Logger logger = null;
74

    
75
        protected static DataManager dataManager = null;
76
        protected boolean baseTestInitialized = false;
77
        private static Random rnd;
78

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

    
86
        public abstract boolean usesResources();
87

    
88
        public abstract boolean hasExplorer();
89

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

    
99
                return query;
100
        }
101

    
102

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

    
106
        /*
107
         * (non-Javadoc)
108
         *
109
         * @see junit.framework.TestCase#setUp()
110
         */
111
        protected void setUp() throws Exception {
112
                super.setUp();
113

    
114
                if (baseTestInitialized) {
115
                        return;
116
                }
117
                
118
                new DefaultLibrariesInitializer().fullInitialize();
119
//                ToolsLibrary tools = new ToolsLibrary();
120
//                tools.initialize();
121
//                tools.postInitialize();
122
//
123
//                XMLPersistenceLibrary xmlPersistence = new XMLPersistenceLibrary();
124
//                xmlPersistence.initialize();
125
//                xmlPersistence.postInitialize();
126
//
127
//                DALLibrary lib = new DALLibrary();
128
//                lib.initialize();
129
//                lib.postInitialize();
130
//
131
//                DALDefaultImplLibrary libImpl = new DALDefaultImplLibrary();
132
//                libImpl.initialize();
133
//                libImpl.postInitialize();
134

    
135
                dataManager = DALLocator.getDataManager();
136
                baseTestInitialized = true;
137

    
138
        }
139

    
140

    
141

    
142
        //=================================================
143

    
144

    
145
        public void printFeature(Feature feature, int maxColSize) {
146
                printFeature(feature, true, maxColSize);
147
        }
148

    
149

    
150
        public void printFeature(Feature feature, boolean showColName,int maxColSize) {
151
                FeatureType fType = feature.getType();
152
                if (showColName){
153
                        this.printFeatureTypeColNames(feature.getType(), maxColSize);
154
                }
155
                StringBuffer row = new StringBuffer();
156
                Iterator iter = fType.iterator();
157
                FeatureAttributeDescriptor attr;
158

    
159
                while (iter.hasNext()) {
160
                        attr = (FeatureAttributeDescriptor) iter.next();
161
                        row.append(truncateOrFillString(feature.get(attr.getName()),
162
                                        maxColSize + 1, ' '));
163
                }
164
                System.out.println(row.toString());
165
        }
166

    
167
        public String truncateOrFillString(Object str, int max, char fillWith) {
168
                if (str == null) {
169
                        return truncateOrFillString("{null}", max, fillWith);
170
                }
171
                return truncateOrFillString(str.toString(), max, fillWith);
172
        }
173

    
174
        public String truncateOrFillString(String str, int max, char fillWith) {
175
                if (str.length() > max) {
176
                        return str.substring(0, max - 1) + " ";
177
                } else {
178
                        StringBuffer strB = new StringBuffer(str);
179
                        while (strB.length() < max) {
180
                                strB.append(fillWith);
181
                        }
182
                        return strB.toString();
183
                }
184

    
185
        }
186

    
187
        public void printFeatureTypeColNames(FeatureType fType, int maxColSize) {
188
                Iterator iter = fType.iterator();
189
                FeatureAttributeDescriptor attr;
190
                StringBuffer colNames = new StringBuffer();
191
                StringBuffer typeNames = new StringBuffer();
192
                StringBuffer sep = new StringBuffer();
193
                if (maxColSize < 1){
194
                        maxColSize = 15;
195
                }
196
                while (iter.hasNext()) {
197
                        attr = (FeatureAttributeDescriptor) iter.next();
198
                        colNames.append(truncateOrFillString(attr.getName(), maxColSize + 1, ' '));
199
                        typeNames.append(truncateOrFillString("(" + attr.getDataTypeName() + ")",
200
                                        maxColSize + 1, ' '));
201
                        sep.append(truncateOrFillString("", maxColSize, '='));
202
                        sep.append(' ');
203
                }
204

    
205
                System.out.println("");
206
                System.out.println("");
207
                System.out.println(colNames.toString());
208
                System.out.println(typeNames.toString());
209
                System.out.println(sep.toString());
210
        }
211

    
212
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
213
                        FeatureType ftype, int dataType) {
214
                return getFirstAttributeOfType(ftype, new int[] { dataType });
215
        }
216

    
217
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
218
                        FeatureType ftype, int[] dataTypes) {
219
                FeatureAttributeDescriptor attr;
220
                Iterator iter = ftype.iterator();
221
                int i;
222
                while (iter.hasNext()) {
223
                        attr = (FeatureAttributeDescriptor) iter.next();
224
                        for (i = 0; i < dataTypes.length; i++) {
225
                                if (attr.getDataType() == dataTypes[i]) {
226
                                        return attr;
227
                                }
228
                        }
229
                }
230
                return null;
231
        }
232

    
233
        protected boolean compareDynObject(DynObject obj1, DynObject obj2) {
234
                DynClass dynClass = obj1.getDynClass();
235
                if (!dynClass.getName().equals(obj2.getDynClass().getName())) {
236
                        return false;
237
                }
238

    
239
                DynField[] fields = dynClass.getDeclaredDynFields();
240
                String fieldName;
241
                Object v1, v2;
242
                for (int i = 0; i < fields.length; i++) {
243
                        fieldName = fields[i].getName();
244
                        v1 = obj1.getDynValue(fieldName);
245
                        v2 = obj2.getDynValue(fieldName);
246
                        if (v1 == v2) {
247
                                continue;
248
                        } else if (v1 != null) {
249
                                if (!v1.equals(v2)) {
250
                                        return false;
251
                                }
252
                        }
253
                }
254

    
255
                return true;
256
        }
257

    
258
        protected boolean compareStores(FeatureStore store1, FeatureStore store2)
259
                        throws DataException {
260
                if (store1.getParameters().getClass() != store2.getParameters()
261
                                .getClass()) {
262
                        return false;
263
                }
264
                if (!compareDynObject(store1.getParameters(), store2.getParameters())) {
265
                        return false;
266
                }
267

    
268
                if (store1.getEnvelope() != store2.getEnvelope()) {
269
                        if (store1.getEnvelope() != null) {
270
                                return store1.getEnvelope().equals(store2.getEnvelope());
271
                        } else {
272
                                return false;
273
                        }
274
                }
275

    
276
                if (!store1.getName().equals(store2.getName())) {
277
                        return false;
278
                }
279
                if (((FeatureSelection) store1.getSelection()).getSize() != ((FeatureSelection) store2
280
                                .getSelection()).getSize()) {
281
                        return false;
282
                }
283
                DisposableIterator iter1 = ((FeatureSelection) store1.getSelection())
284
                                .fastIterator();
285
                DisposableIterator iter2 = ((FeatureSelection) store2.getSelection())
286
                                .fastIterator();
287
                if (!compareFeatureIterators(iter1, iter2)) {
288
                        return false;
289
                }
290
                iter1.dispose();
291
                iter2.dispose();
292

    
293
                if (store1.getFeatureTypes().size() != store2.getFeatureTypes().size()) {
294
                        return false;
295
                }
296
                Iterator iterTypes1 = store1.getFeatureTypes().iterator();
297
                Iterator iterTypes2 = store2.getFeatureTypes().iterator();
298
                while (iterTypes1.hasNext()) {
299
                        if (!compareTypes((FeatureType) iterTypes1.next(),
300
                                        (FeatureType) iterTypes2
301
                                        .next())) {
302
                                return false;
303
                        }
304
                }
305
                if (!compareTypes(store1.getDefaultFeatureType(), store2
306
                                .getDefaultFeatureType())) {
307
                        return false;
308
                }
309

    
310
                if (store1.getLocks() != null) {
311
                        if (store1.getLocks().getLocksCount() != store2.getLocks()
312
                                        .getLocksCount()) {
313
                                return false;
314
                        }
315
                        if (!compareFeatureIterators(store1.getLocks().getLocks(), store2
316
                                        .getLocks().getLocks())) {
317
                                return false;
318
                        }
319

    
320
                } else if (store2.getLocks() != null) {
321
                        return false;
322
                }
323

    
324
                return true;
325
        }
326

    
327
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2) {
328
                Feature feature;
329
                Feature ffeature;
330
                while (iter1.hasNext()) {
331
                        feature = (Feature) iter1.next();
332
                        ffeature = (Feature) iter2.next();
333
                        if (!this.compareFeatures(feature, ffeature)) {
334
                                return false;
335
                        }
336
                }
337

    
338
                if (!iter2.hasNext()) {
339
                        return true;
340
                } else {
341
                        getLogger().warn("size !=");
342
                        return false;
343
                }
344

    
345
        }
346

    
347
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2,
348
                        String[] attrNames) {
349
                Feature feature;
350
                Feature ffeature;
351
                while (iter1.hasNext()) {
352
                        feature = (Feature) iter1.next();
353
                        ffeature = (Feature) iter2.next();
354
                        if (!this.compareFeatures(feature, ffeature, attrNames)) {
355
                                return false;
356
                        }
357
                }
358

    
359
                return !iter2.hasNext();
360

    
361
        }
362

    
363

    
364

    
365
        protected boolean compareTypes(FeatureType ft1, FeatureType ft2) {
366
                if (ft1.size() != ft2.size()) {
367
                        getLogger().warn("size !=");
368
                        return false;
369
                }
370
                if (ft1.getDefaultGeometryAttributeIndex() != ft2
371
                                .getDefaultGeometryAttributeIndex()) {
372
                        getLogger().warn(
373
                                        "getDefaultGeometryAttributeIndex "
374
                                                        + ft1.getDefaultGeometryAttributeIndex() +
375
                                        " !="+ ft2.getDefaultGeometryAttributeIndex());
376
                        return false;
377
                }
378
                if (ft1.getDefaultGeometryAttributeIndex() > -1) {
379
                        if (ft1.getDefaultSRS() != null) {
380
                                if (!ft1.getDefaultSRS().equals(ft2.getDefaultSRS())) {
381
                                        getLogger().warn("getDefaultSRS !=");
382
                                        return false;
383
                                }
384

    
385
                        } else {
386
                                if (ft2.getDefaultSRS() != null) {
387
                                        getLogger().warn("getDefaultSRS !=");
388
                                        return false;
389
                                }
390
                        }
391
                }
392

    
393
                if (ft1.getDefaultGeometryAttributeName() != null) {
394
                        if (!ft1.getDefaultGeometryAttributeName().equals(
395
                                        ft2.getDefaultGeometryAttributeName())) {
396
                                getLogger().warn("getDefaultGeometryAttributeName !=");
397

    
398
                                return false;
399
                        }
400
                } else {
401
                        if (ft2.getDefaultGeometryAttributeName() != null) {
402
                                getLogger().warn("getDefaultGeometryAttributeName !=");
403
                                return false;
404
                        }
405
                }
406

    
407

    
408

    
409
                FeatureAttributeDescriptor attr1, attr2;
410
                for (int i = 0; i < ft1.size(); i++) {
411
                        attr1 = ft1.getAttributeDescriptor(i);
412
                        attr2 = ft2.getAttributeDescriptor(i);
413

    
414
                        if (!compareAttributes(attr1, attr2)) {
415
                                return false;
416
                        }
417

    
418
                }
419
                return true;
420

    
421
        }
422

    
423
        protected boolean compareAttributes(FeatureAttributeDescriptor attr1,
424
                        FeatureAttributeDescriptor attr2) {
425
                if (attr1 == null || attr2 == null) {
426
                        getLogger().warn("attr1 == null || attr2 == null");
427
                        return false;
428
                }
429
                if (!attr1.getName().equals(attr2.getName())) {
430
                        getLogger().warn(
431
                                        "name '" + attr1.getName() + "' != '" + attr2.getName()
432
                                                        + "'");
433
                        return false;
434
                }
435

    
436
                if (attr1.getDataType() != attr2.getDataType()) {
437
                        getLogger().warn(
438
                                        attr1.getName() + ":" +
439
                                        "dataType '" + attr1.getDataTypeName() + "'["
440
                                                        + attr1.getDataType() + "] != '"
441
                                                        + attr2.getDataTypeName() + "'["
442
                                                        + attr2.getDataType() + "]");
443
                        return false;
444
                }
445

    
446
                if (attr1.getSize() != attr2.getSize()) {
447
                        getLogger().warn(
448
                                        attr1.getName() + ":" +
449
                                        "size " + attr1.getSize() + " != " + attr2.getSize());
450
                        return false;
451
                }
452

    
453
                if (attr1.getPrecision() != attr2.getPrecision()) {
454
                        getLogger().warn(
455
                                        attr1.getName() + ":" +
456
                                        "precision " + attr1.getPrecision() + " != "
457
                                                        + attr1.getPrecision());
458
                        return false;
459
                }
460

    
461
                if (attr1.getGeometryType() != attr2.getGeometryType()) {
462
                        getLogger().warn(
463
                                        attr1.getName() + ":" +
464
                                        "GeometryType " + attr1.getGeometryType() + " != "
465
                                                        + attr2.getGeometryType());
466
                        return false;
467
                }
468

    
469
                if (attr1.getGeometrySubType() != attr2.getGeometrySubType()) {
470
                        getLogger().warn(
471
                                        attr1.getName() + ":" +
472
                                        "GeometrySubType " + attr1.getGeometrySubType() + " != "
473
                                                        + attr2.getGeometrySubType());
474

    
475
                        return false;
476
                }
477

    
478
                if (attr1.getSRS() != null) {
479
                        if (!attr1.getSRS().equals(attr2.getSRS())) {
480
                                getLogger().warn(
481
                                                attr1.getName() + ":" +
482
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
483
                                return false;
484
                        }
485
                } else {
486
                        if (attr2.getSRS() != null) {
487
                                getLogger().warn(
488
                                                attr1.getName() + ":" +
489
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
490
                                return false;
491
                        }
492
                }
493

    
494
                return true;
495
        }
496

    
497
        protected boolean compareFeatures(Feature f1, Feature f2,
498
                        String[] attrsNames) {
499
                FeatureAttributeDescriptor attr1;
500
                FeatureAttributeDescriptor attr2;
501
                Object v1, v2;
502
                for (int i = 0; i < attrsNames.length; i++) {
503
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
504
                        attr2 = f2.getType().getAttributeDescriptor(attrsNames[i]);
505
                        if (attr1 != attr2) {
506
                                if (!compareAttributes(attr1, attr1)) {
507
                                        return false;
508
                                }
509
                        }
510
                        v1 = f1.get(attr1.getName());
511
                        v2 = f2.get(attr2.getName());
512
                        if (!compareFeatureValue(v1, v2, attr1)) {
513
                                return false;
514
                        }
515
                }
516

    
517
                return true;
518
        }
519

    
520
        protected boolean compareFeatures(Feature f1, Feature f2) {
521
                if (!compareTypes(f1.getType(), f2.getType())) {
522
                        return false;
523
                }
524
                Iterator iter = f1.getType().iterator();
525
                FeatureAttributeDescriptor attr;
526
                Object v1, v2;
527
                while (iter.hasNext()) {
528
                        attr = (FeatureAttributeDescriptor) iter.next();
529
                        v1 = f1.get(attr.getName());
530
                        v2 = f2.get(attr.getName());
531
                        if (!compareFeatureValue(v1, v2, attr)) {
532
                                return false;
533
                        }
534
                }
535

    
536
                return true;
537

    
538
        }
539

    
540
        protected boolean compareFeatureValue(Object v1, Object v2,
541
                        FeatureAttributeDescriptor attr) {
542

    
543
                if ((v1 == null || v2 == null) &&  !attr.allowNull() ){
544
                        getLogger().warn("null and !allowNull:"
545
                                                        + attr.getName());
546
                        return false;
547
                }
548

    
549
                if (v1 == v2) {
550
                        return true;
551
                } else if (v1 == null) {
552
                        getLogger().warn(" v1 == null and v2 != null:"
553
                                                        + attr.getName());
554
                        return false;
555
                } else if (v2 == null) {
556
                        getLogger().warn("v2 == null and v1 != null:"
557
                                                        + attr.getName());
558
                        return false;
559

    
560
                }
561
                switch (attr.getDataType()) {
562
                case DataTypes.FEATURE:
563
                        return compareFeatures((Feature) v1, (Feature) v2);
564

    
565
                case DataTypes.GEOMETRY:
566
                        Geometry geom1 = (Geometry) v1;
567
                        Geometry geom2 = (Geometry) v2;
568
                        if (!geom1.equals(geom2)) {
569
                                getLogger().warn(" v1 != v2 (Geom):" + attr.getName());
570
                                return false;
571

    
572
                        }
573
                        return true;
574
                case DataTypes.DOUBLE:
575
                        double diff = ((Double) v1).doubleValue()
576
                                        - ((Double) v1).doubleValue();
577
                        if (!(Math.abs(diff) < 0.000001)) {
578
                                getLogger().warn(" v1 != v2 (Dobule):" + attr.getName());
579
                                return false;
580

    
581
                        }
582
                        return true;
583

    
584
//                case DataTypes.BYTEARRAY:
585
//                        byte[] bytes1 = (byte[]) v1;
586
//                        byte[] bytes2 = (byte[]) v2;
587
//                        if (bytes1.length != bytes2.length) {
588
//                                getLogger().warn(
589
//                                                "v1.length != v2.length (byte []):" + attr.getName());
590
//                                return false;
591
//                        }
592
//                        for (int i = 0; i < bytes1.length; i++) {
593
//                                if (bytes1[i] != bytes2[i]) {
594
//                                        getLogger().warn(
595
//                                                        " v1[" + i + "] != v2[" + i + "] (byte []):"
596
//                                                                        + attr.getName());
597
//                                        return false;
598
//                                }
599
//                        }
600
//                        return true;
601

    
602
                case DataTypes.OBJECT:
603
                        if (!v1.equals(v2)) {
604
                                getLogger().warn(
605
                                                " v1 != v2 (object):" + attr.getName() + " [ignored]");
606

    
607
                        }
608
                        return true;
609

    
610
                default:
611
                        if (!v1.equals(v2)) {
612
                                getLogger()
613
                                                .warn(
614
                                                                " v1 != v2:" + attr.getName() + ": " + v1
615
                                                                                + " != " + v2);
616
                                return false;
617
                        }
618
                }
619
                return true;
620

    
621
        }
622

    
623

    
624
        //------------------------------------------------
625

    
626
        public void testSimpleIteration(FeatureStore store) {
627
                this.testSimpleIteration(store, null);
628
        }
629

    
630
        protected String[] getRandomAttibuteList(FeatureType fType) {
631
                String[] attrNames = new String[fType.size()];
632
                Iterator iter = fType.iterator();
633
                int i = 0;
634
                while (iter.hasNext()) {
635
                        attrNames[i] = ((FeatureAttributeDescriptor) iter.next()).getName();
636
                        i++;
637
                }
638
                return this.getRandomAttibuteList(attrNames);
639
        }
640

    
641
        protected Random getRandom(){
642
                if (rnd == null){
643
                        rnd = new Random();
644
                        rnd.setSeed(System.currentTimeMillis());
645
                }
646
                return rnd;
647
        }
648

    
649
        protected String[] getRandomAttibuteList(String[] attrNames) {
650
                int nAttributes = getRandom().nextInt(
651
                                attrNames.length + (attrNames.length / 2)) + 1;
652
                TreeSet set = new TreeSet();
653
                for (int i = 0; i < nAttributes; i++) {
654
                        set.add(attrNames[getRandom().nextInt(attrNames.length)]);
655
                }
656
                return (String[]) set.toArray(new String[0]);
657
        }
658

    
659
        public void testIterationFastAndStandart(FeatureStore store)
660
                        throws Exception {
661
                this.testIterationFastAndStandart(store, null);
662

    
663
                FeatureQuery query = this.getDefaultQuery(store);
664
                // Random Attribute list
665
                query.setAttributeNames(getRandomAttibuteList(store
666
                                .getDefaultFeatureType()));
667
                this.testIterationFastAndStandart(store, query);
668

    
669
                // Sorted
670
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(store
671
                                .getDefaultFeatureType(), new int[] { DataTypes.INT,
672
                                DataTypes.LONG, DataTypes.STRING });
673
                {
674
                        // asure that attr is in query attributes
675
                        boolean attrFound = false;
676
                        String[] curAttrs = query.getAttributeNames();
677
                        for (int i = 0; i < curAttrs.length; i++) {
678
                                if (curAttrs[i].equals(attr.getName())) {
679
                                        attrFound = true;
680
                                        break;
681

    
682
                                }
683
                        }
684
                        if (!attrFound) {
685
                                String[] newAttrs = new String[curAttrs.length + 1];
686
                                for (int i = 0; i < curAttrs.length; i++) {
687
                                        newAttrs[i] = curAttrs[i];
688
                                }
689
                                newAttrs[curAttrs.length] = attr.getName();
690
                                query.setAttributeNames(newAttrs);
691
                        }
692
                }
693

    
694

    
695
                query.getOrder().add(attr.getName(), true);
696
                this.testIterationFastAndStandart(store, query);
697

    
698
                // Filter
699
                query = this.getDefaultQuery(store);
700

    
701
                query.setFilter(new Evaluator(){
702

    
703
                        public Object evaluate(EvaluatorData data)
704
                                        throws EvaluatorException {
705
                                // TODO Auto-generated method stub
706
                                return Boolean.TRUE;
707
                        }
708

    
709
                        public String getCQL() {
710
                                return "true = true";
711
                        }
712

    
713
                        public String getDescription() {
714
                                // TODO Auto-generated method stub
715
                                return null;
716
                        }
717

    
718
                        public String getName() {
719
                                return "AlwaysTrue";
720
                        }
721

    
722
                        public EvaluatorFieldsInfo getFieldsInfo() {
723
                                // TODO Auto-generated method stub
724
                                return null;
725
                        }
726

    
727
                });
728
                this.testIterationFastAndStandart(store, query);
729

    
730
                // Filter + Sorted
731
                query.getOrder().add(attr.getName(), true);
732
                this.testIterationFastAndStandart(store, query);
733
        }
734

    
735
        public void testSimpleIteration(FeatureStore store, FeatureQuery query) {
736
                FeatureSet set;
737
                try {
738

    
739
                        if (query == null) {
740
                                query = this.getDefaultQuery(store);
741
                        }
742
                        set = store.getFeatureSet(query);
743
                        FeatureType type = set.getDefaultFeatureType();
744

    
745
                        DisposableIterator it = set.iterator();
746
                        Feature feature;
747
                        printFeatureTypeColNames(type, 15);
748
                        while (it.hasNext()) {
749

    
750
                                feature = (Feature) it.next();
751
                                printFeature(feature, false, 15);
752
                        }
753

    
754
                        it.dispose();
755
                        set.dispose();
756

    
757
                } catch (DataException e3) {
758
                        e3.printStackTrace();
759
                        fail();
760
                        return;
761
                }
762

    
763
        }
764

    
765
        public void testIterationFastAndStandart(FeatureStore store,
766
                        FeatureQuery query) {
767
                FeatureSet set;
768
                try {
769

    
770
                        if (query == null) {
771
                                query = this.getDefaultQuery(store);
772
                        }
773
                        set = store.getFeatureSet(query);
774

    
775
                        DisposableIterator it = set.iterator();
776
                        DisposableIterator fit = set.fastIterator();
777

    
778
                        assertTrue(this.compareFeatureIterators(it, fit));
779

    
780
                        it.dispose();
781
                        fit.dispose();
782
                        set.dispose();
783

    
784
                } catch (DataException e3) {
785
                        e3.printStackTrace();
786
                        fail();
787
                        return;
788
                }
789

    
790
        }
791

    
792
        public void testSimpleIteration(DataStoreParameters parameters)
793
                        throws Exception {
794
                FeatureStore store = null;
795
                store = (FeatureStore) dataManager.createStore(parameters);
796

    
797
                this.testSimpleIteration(store);
798

    
799
                store.dispose();
800

    
801
        }
802

    
803
        public void testIterationFastAndStandart(DataStoreParameters parameters)
804
                        throws Exception {
805
                FeatureStore store = null;
806
                store = (FeatureStore) dataManager.createStore(parameters);
807

    
808
                this.testIterationFastAndStandart(store);
809

    
810
                store.dispose();
811

    
812
        }
813

    
814
        /**
815
         *
816
         * @param count
817
         *            if (< 0) list.size() >= 1 else list.size() == count
818
         * @throws Exception
819
         */
820
        public void testExplorerList(int count) throws Exception {
821
                FeatureStore store = null;
822
                store = (FeatureStore) dataManager.createStore(this
823
                                .getDefaultDataStoreParameters());
824

    
825
                DataServerExplorer explorer;
826
                explorer = store.getExplorer();
827

    
828
                if (count < 0) {
829
                        assertTrue(explorer.list().size() >= 1);
830
                } else {
831
                        assertTrue(explorer.list().size() == count);
832
                }
833

    
834
                store.dispose();
835

    
836
                explorer.dispose();
837
        }
838

    
839
        //=================================================
840
        //=================================================
841

    
842

    
843

    
844

    
845
        public void testIterationFastAndStandart() throws Exception {
846
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
847
        }
848

    
849
        public void testSimpleIteration() throws Exception {
850
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
851
        }
852

    
853
        public void testInitializeStore() throws Exception {
854
                FeatureStore store = (FeatureStore) dataManager.createStore(this
855
                                .getDefaultDataStoreParameters());
856

    
857
                assertNotNull(store.getMetadataID());
858
                assertNotNull(store.getName());
859
                assertEquals(store.getEnvelope(), store.getDynValue("Envelope"));
860
                assertTrue(store.getFeatureCount() > 0);
861
                if (store.isLocksSupported()) {
862
                        assertNotNull(store.getLocks());
863
                } else {
864
                        assertNull(store.getLocks());
865
                }
866
                store.dispose();
867
        }
868

    
869

    
870
        public void testExplorer() throws Exception {
871
                if (!this.hasExplorer()) {
872
                        return;
873
                }
874
                this.testExplorerList(-1);
875

    
876
        }
877

    
878
        public void testSelection() throws Exception {
879
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
880

    
881
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
882
                FeatureSet set = store.getFeatureSet();
883

    
884
                assertTrue(store.getFeatureSelection().isEmpty());
885
                store.setSelection(set);
886
                assertFalse(store.getFeatureSelection().isEmpty());
887

    
888
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
889

    
890
                DisposableIterator iter = set.iterator();
891
                while (iter.hasNext()) {
892
                        assertTrue(store.getFeatureSelection().isSelected(
893
                                        (Feature) iter.next()));
894
                }
895
                iter.dispose();
896

    
897
                store.getFeatureSelection().reverse();
898
                assertTrue(store.getFeatureSelection().isEmpty());
899
                assertEquals(0, store.getFeatureSelection().getSize());
900
                iter = set.iterator();
901
                while (iter.hasNext()) {
902
                        assertFalse(store.getFeatureSelection().isSelected(
903
                                        (Feature) iter.next()));
904
                }
905
                iter.dispose();
906

    
907
                store.getFeatureSelection().reverse();
908
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
909
                assertFalse(store.getFeatureSelection().isEmpty());
910

    
911
                set.dispose();
912

    
913
        }
914

    
915
        public void testCustomFTypeSet() throws Exception {
916
                DataStoreParameters dbfParameters = this
917
                                .getDefaultDataStoreParameters();
918

    
919
                FeatureStore store = (FeatureStore) dataManager
920
                                .createStore(dbfParameters);
921

    
922
                testCustomFTypeSet(store);
923

    
924
                store.dispose();
925
        }
926

    
927
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
928

    
929
                FeatureSet set, set1;
930
                FeatureQuery query;
931
                DisposableIterator iter, iter1;
932
                Iterator attrIter;
933
                FeatureAttributeDescriptor attr;
934

    
935
                set = store.getFeatureSet(this.getDefaultQuery(store));
936
                attrIter = store.getDefaultFeatureType().iterator();
937

    
938
                String[] names;
939
                while (attrIter.hasNext()) {
940
                        attr = (FeatureAttributeDescriptor) attrIter.next();
941
                        int fieldIndex = attr.getIndex();
942

    
943
                        query = this.getDefaultQuery(store);
944
                        String fieldName = store.getDefaultFeatureType()
945
                        .getAttributeDescriptor(fieldIndex).getName();
946

    
947
                        names = new String[] { fieldName };
948
                        query.setAttributeNames(names);
949
                        set1 = store.getFeatureSet(query);
950

    
951
                        if (getRandom().nextBoolean()) {
952
                                iter = set.fastIterator();
953
                        } else {
954
                                iter = set.iterator();
955
                        }
956
                        if (getRandom().nextBoolean()) {
957
                                iter1 = set1.fastIterator();
958
                        } else {
959
                                iter1 = set1.iterator();
960
                        }
961

    
962
                        assertTrue(compareFeatureIterators(iter, iter1, names));
963

    
964
                        iter.dispose();
965
                        iter1.dispose();
966
                        set1.dispose();
967
                }
968

    
969
                int ntimes = getRandom().nextInt(10) + 5;
970
                FeatureType type = store.getDefaultFeatureType();
971
                query = this.getDefaultQuery(store);
972
                for (int i = 0; i < ntimes; i++) {
973
                        names = getRandomAttibuteList(type);
974

    
975
                        query.setAttributeNames(names);
976
                        set1 = store.getFeatureSet(query);
977

    
978
                        if (getRandom().nextBoolean()) {
979
                                iter = set.fastIterator();
980
                        } else {
981
                                iter = set.iterator();
982
                        }
983
                        if (getRandom().nextBoolean()) {
984
                                iter1 = set1.fastIterator();
985
                        } else {
986
                                iter1 = set1.iterator();
987
                        }
988

    
989
                        assertTrue(compareFeatureIterators(iter, iter1, names));
990

    
991
                        iter.dispose();
992
                        iter1.dispose();
993

    
994
                        iter1 = set1.fastIterator();
995
                        assertTrue(checksAttributesPositions(iter1, names));
996
                        iter1.dispose();
997

    
998
                        iter1 = set1.iterator();
999
                        assertTrue(checksAttributesPositions(iter1, names));
1000
                        iter1.dispose();
1001

    
1002
                        set1.dispose();
1003

    
1004

    
1005
                }
1006

    
1007

    
1008

    
1009
                set.dispose();
1010

    
1011
        }
1012

    
1013
        protected boolean checksAttributesPositions(DisposableIterator iter,
1014
                        String[] names) {
1015
                Feature feature;
1016
                FeatureType type;
1017
                FeatureAttributeDescriptor attr;
1018
                while (iter.hasNext()) {
1019
                        feature = (Feature) iter.next();
1020
                        type = feature.getType();
1021
                        for (int i = 0; i < names.length; i++) {
1022
                                attr = type.getAttributeDescriptor(i);
1023
                                if (!names[i].equals(attr.getName())) {
1024
                                        getLogger().error(
1025
                                                        "Error in attribute {} (expected: '{}' have: '{}'",
1026
                                                        new Object[] { new Integer(i), names[i],
1027
                                                                        attr.getName() });
1028
                                        return false;
1029
                                }
1030
                        }
1031
                }
1032
                return true;
1033
        }
1034

    
1035
         public void testPersistence() throws Exception {
1036
                if (ToolsLocator.getPersistenceManager() == null) {
1037
                        fail("Default Persistence Manager not register");
1038
                }
1039
                DataStoreParameters params = this.getDefaultDataStoreParameters();
1040

    
1041
                FeatureStore store = (FeatureStore) dataManager.createStore(params);
1042

    
1043
                testSimpleIteration(store);
1044

    
1045
                PersistentState state = ToolsLocator.getPersistenceManager().getState(
1046
                                store);
1047

    
1048
                FeatureStore store2 = (FeatureStore) ToolsLocator
1049
                                .getPersistenceManager().create(state);
1050

    
1051
                testSimpleIteration(store2);
1052

    
1053
                assertTrue(compareStores(store, store2));
1054

    
1055
                store.dispose();
1056
                store2.dispose();
1057

    
1058
        }
1059

    
1060

    
1061
        public void testSort() throws Exception {
1062
                DataStoreParameters dbfParameters = this
1063
                                .getDefaultDataStoreParameters();
1064

    
1065
                FeatureStore store = (FeatureStore) dataManager
1066
                                .createStore(dbfParameters);
1067

    
1068
                testSort(store);
1069

    
1070
                store.dispose();
1071

    
1072
        }
1073

    
1074
        public void testSort(FeatureStore store) throws Exception{
1075
                FeatureSet set1;
1076
                FeatureQuery query;
1077
                DisposableIterator iter1;
1078
                Iterator attrIter;
1079
                FeatureAttributeDescriptor attr;
1080

    
1081
                attrIter = store.getDefaultFeatureType().iterator();
1082

    
1083
                String[] names;
1084
                while (attrIter.hasNext()) {
1085
                        attr = (FeatureAttributeDescriptor) attrIter.next();
1086

    
1087
                        if (attr.getDataType() == DataTypes.GEOMETRY) {
1088
                                continue;
1089
                        }
1090
                        query = this.getDefaultQuery(store);
1091
                        String fieldName = attr.getName();
1092

    
1093

    
1094

    
1095
                        names = new String[] { fieldName };
1096
                        query.setAttributeNames(names);
1097
                        query.getOrder().add(fieldName, getRandom().nextBoolean());
1098

    
1099
                        set1 = store.getFeatureSet(query);
1100
                        if (getRandom().nextBoolean()) {
1101
                                iter1 = set1.fastIterator();
1102
                        } else {
1103
                                iter1 = set1.iterator();
1104
                        }
1105

    
1106
                        assertTrue(checkSort(iter1, query));
1107

    
1108
                        iter1.dispose();
1109
                        set1.dispose();
1110
                }
1111

    
1112
                int ntimes = getRandom().nextInt(10) + 5;
1113
                FeatureType type = store.getDefaultFeatureType();
1114
                query = this.getDefaultQuery(store);
1115
                for (int i = 0; i < ntimes; i++) {
1116
                        names = getRandomAttibuteList(type);
1117

    
1118
                        int nShortFields = getRandom().nextInt(names.length) + 1;
1119
                        query.getOrder().clear();
1120
                        for (int j = 0; j < nShortFields; j++) {
1121
                                attr = store.getDefaultFeatureType().getAttributeDescriptor(names[getRandom().nextInt(names.length)]);
1122
                                if (attr.getDataType() == DataTypes.INT
1123
                                                || attr.getDataType() == DataTypes.LONG
1124
                                                || attr.getDataType() == DataTypes.DOUBLE
1125
                                                || attr.getDataType() == DataTypes.STRING
1126
                                                || attr.getDataType() == DataTypes.DATE
1127
                                                || attr.getDataType() == DataTypes.BOOLEAN
1128
                                                || attr.getDataType() == DataTypes.BYTE
1129
                                                || attr.getDataType() == DataTypes.FLOAT) {
1130

    
1131
                                        query.getOrder().add(attr.getName(),
1132
                                                        getRandom().nextBoolean());
1133
                                }
1134
                        }
1135

    
1136
                        query.setAttributeNames(names);
1137
                        set1 = store.getFeatureSet(query);
1138

    
1139
                        // if (getRandom().nextBoolean()) {
1140
                                iter1 = set1.fastIterator();
1141
                                // } else {
1142
                                // iter1 = set1.iterator();
1143
                                // }
1144

    
1145
                                assertTrue(checkSort(iter1, query));
1146

    
1147
                                iter1.dispose();
1148
                                set1.dispose();
1149

    
1150
                }
1151

    
1152
        }
1153

    
1154

    
1155
        public boolean checkSort(Iterator iter, FeatureQuery query) {
1156

    
1157
                FeatureQueryOrderMember order;
1158
                Feature prevFeature = null;
1159
                Feature currFeature = null;
1160
                boolean isFirst = true;
1161
                Comparable v1, v2;
1162
                Object o1, o2;
1163
                int v;
1164
                FeatureQueryOrder queryOrder = query.getOrder();
1165

    
1166
                Iterator orderIter;
1167

    
1168
                //for debug only
1169
                /*
1170
                System.out.println("\nCheck order:");
1171
                Iterator orderIter = queryOrder.iterator();
1172
                while (orderIter.hasNext()) {
1173
                        order = (FeatureQueryOrderMember) orderIter.next();
1174
                        System.out.print(order.getAttributeName() + " ");
1175
                        if (order.getAscending()) {
1176
                                System.out.print("Asc, ");
1177
                        } else {
1178
                                System.out.print("Desc, ");
1179
                        }
1180
                }
1181
                System.out.println(";");
1182
                */
1183

    
1184
                while (iter.hasNext()) {
1185
                        currFeature = (Feature) iter.next();
1186
                        if (isFirst) {
1187
                                prevFeature = currFeature.getCopy();
1188
                                // printFeature(prevFeature, true, 15);
1189
                                isFirst = false;
1190
                                continue;
1191
                        }
1192
                        // printFeature(currFeature, false, 15);
1193
                        orderIter = queryOrder.iterator();
1194
                        while (orderIter.hasNext()) {
1195
                                order = (FeatureQueryOrderMember) orderIter.next();
1196
                                if (order.hasEvaluator()) {
1197
                                        try {
1198
                                                o1 = order.getEvaluator().evaluate(
1199
                                                                (EvaluatorData) prevFeature);
1200
                                                o2 = order.getEvaluator().evaluate(
1201
                                                                (EvaluatorData) currFeature);
1202
                                        } catch (EvaluatorException e) {
1203
                                                throw new DataEvaluatorRuntimeException(e);
1204
                                        }
1205
                                } else {
1206

    
1207
                                        o1 = prevFeature.get(order.getAttributeName());
1208
                                        o2 = currFeature.get(order.getAttributeName());
1209
                                }
1210
                                if (o1 instanceof Comparable && o2 instanceof Comparable) {
1211
                                        v1 = (Comparable) o1;
1212
                                        v2 = (Comparable) o2;
1213
                                } else {
1214
                                        // uncomparable objets
1215
                                        break;
1216
                                }
1217
                                if (v1 == null) {
1218
                                        if (v2 == null) {
1219
                                                break;
1220
                                        } else {
1221
                                                v = 1;
1222
                                        }
1223
                                } else {
1224
                                        v = v1.compareTo(v2);
1225
                                }
1226
                                if (v != 0) {
1227
                                        if (!order.getAscending()) {
1228
                                                v = -v;
1229
                                        }
1230
                                }
1231
                                if (v < 0) {
1232
                                        break;
1233
                                } else if (v > 0) {
1234
                                        // Checks for ignore case short
1235
                                        if (v1 instanceof String && v2 instanceof String) {
1236
                                                v1 = ((String)v1).toLowerCase();
1237
                                                v2 = ((String)v2).toLowerCase();
1238
                                                v = v1.compareTo(v2);
1239
                                                if (v != 0) {
1240
                                                        if (!order.getAscending()) {
1241
                                                                v = -v;
1242
                                                        }
1243
                                                }
1244
                                                if (v < 0) {
1245
                                                        getLogger()
1246
                                                                        .warn("Short compartor String ok with ignore case");
1247
                                                        break;
1248
                                                } else if (v > 0) {
1249
                                                        return false;
1250
                                                }
1251
                                        } else {
1252
                                                return false;
1253
                                        }
1254
                                }
1255
                        }
1256
                        prevFeature = currFeature.getCopy();
1257
                }
1258

    
1259
                return true;
1260
        }
1261

    
1262
        protected void fullStoreIteratorTest(FeatureStore store) throws Exception{
1263
                testIterationFastAndStandart(store);
1264
                testCustomFTypeSet(store);
1265
                testSort(store);
1266
        }
1267

    
1268

    
1269
        public void testTransformsData() throws Exception {
1270
                DataStoreParameters dbfParameters = this
1271
                                .getDefaultDataStoreParameters();
1272

    
1273
                FeatureStore store = (FeatureStore) dataManager
1274
                                .createStore(dbfParameters);
1275

    
1276
                FeatureStore store1 = (FeatureStore) dataManager
1277
                                .createStore(dbfParameters);
1278

    
1279
                FeatureStoreTransform transform = new StringsToLowerTransform();
1280
                transform.setFeatureStore(store);
1281

    
1282
                store.getTransforms().add(transform);
1283

    
1284
                FeatureSet set, set1;
1285
                DisposableIterator iter, iter1;
1286
                Iterator iterAttr;
1287
                FeatureAttributeDescriptor attr;
1288
                Feature feature, feature1;
1289
                int i, ntimes;
1290
                Object v1, v2;
1291

    
1292

    
1293
                fullStoreIteratorTest(store);
1294

    
1295
                set = store.getFeatureSet();
1296
                set1 = store1.getFeatureSet();
1297
                ntimes = getRandom().nextInt(3) + 1;
1298
                for (i = 0; i < ntimes; i++) {
1299
                        if (getRandom().nextBoolean()) {
1300
                                iter = set.fastIterator();
1301
                        } else {
1302
                                iter = set.iterator();
1303
                        }
1304
                        if (getRandom().nextBoolean()) {
1305
                                iter1 = set1.fastIterator();
1306
                        } else {
1307
                                iter1 = set1.iterator();
1308
                        }
1309
                        while (iter.hasNext()) {
1310
                                feature = (Feature) iter.next();
1311
                                feature1 = (Feature) iter1.next();
1312

    
1313
                                iterAttr = set.getDefaultFeatureType().iterator();
1314
                                while (iterAttr.hasNext()) {
1315
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1316
                                        v1 = feature.get(attr.getIndex());
1317
                                        v2 = feature1.get(attr.getIndex());
1318
                                        if (attr.getDataType() == DataTypes.STRING) {
1319
                                                if (v2 != null) {
1320
                                                        v2 = ((String) v2).toLowerCase();
1321
                                                }
1322

    
1323
                                        }
1324
                                        assertTrue(compareFeatureValue(v1, v2, attr));
1325
                                }
1326
                        }
1327
                        assertFalse(iter1.hasNext());
1328
                        iter.dispose();
1329
                        iter1.dispose();
1330
                }
1331

    
1332

    
1333
                set.dispose();
1334
                set1.dispose();
1335

    
1336

    
1337
                transform = new StringsToUpperTransform();
1338
                transform.setFeatureStore(store);
1339

    
1340
                store.getTransforms().add(transform);
1341

    
1342
                fullStoreIteratorTest(store);
1343

    
1344
                set = store.getFeatureSet();
1345
                set1 = store1.getFeatureSet();
1346
                ntimes = getRandom().nextInt(3) + 1;
1347
                for (i = 0; i < ntimes; i++) {
1348
                        if (getRandom().nextBoolean()) {
1349
                                iter = set.fastIterator();
1350
                        } else {
1351
                                iter = set.iterator();
1352
                        }
1353
                        if (getRandom().nextBoolean()) {
1354
                                iter1 = set1.fastIterator();
1355
                        } else {
1356
                                iter1 = set1.iterator();
1357
                        }
1358
                        while (iter.hasNext()) {
1359
                                feature = (Feature) iter.next();
1360
                                feature1 = (Feature) iter1.next();
1361

    
1362
                                iterAttr = set.getDefaultFeatureType().iterator();
1363
                                while (iterAttr.hasNext()) {
1364
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1365
                                        v1 = feature.get(attr.getIndex());
1366
                                        v2 = feature1.get(attr.getIndex());
1367
                                        if (attr.getDataType() == DataTypes.STRING) {
1368
                                                if (v2 != null) {
1369
                                                        v2 = ((String) v2).toUpperCase();
1370
                                                }
1371

    
1372
                                        }
1373
                                        compareFeatureValue(v1, v2, attr);
1374
                                }
1375
                        }
1376
                        assertFalse(iter1.hasNext());
1377
                        iter.dispose();
1378
                        iter1.dispose();
1379
                }
1380
                set.dispose();
1381
                set1.dispose();
1382

    
1383

    
1384
                transform = new AddPrefixAttributeName("_");
1385
                transform.setFeatureStore(store);
1386

    
1387
                store.getTransforms().add(transform);
1388

    
1389
                fullStoreIteratorTest(store);
1390

    
1391
                set = store.getFeatureSet();
1392
                set1 = store1.getFeatureSet();
1393
                ntimes = getRandom().nextInt(3) + 1;
1394
                for (i = 0; i < ntimes; i++) {
1395
                        if (getRandom().nextBoolean()) {
1396
                                iter = set.fastIterator();
1397
                        } else {
1398
                                iter = set.iterator();
1399
                        }
1400
                        if (getRandom().nextBoolean()) {
1401
                                iter1 = set1.fastIterator();
1402
                        } else {
1403
                                iter1 = set1.iterator();
1404
                        }
1405
                        while (iter.hasNext()) {
1406
                                feature = (Feature) iter.next();
1407
                                feature1 = (Feature) iter1.next();
1408

    
1409
                                iterAttr = set1.getDefaultFeatureType().iterator();
1410
                                while (iterAttr.hasNext()) {
1411
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1412
                                        v1 = feature.get("_" + attr.getName());
1413
                                        v2 = feature1.get(attr.getIndex());
1414
                                        if (attr.getDataType() == DataTypes.STRING) {
1415
                                                if (v2 != null) {
1416
                                                        v2 = ((String) v2).toUpperCase();
1417
                                                }
1418

    
1419
                                        }
1420
                                        compareFeatureValue(v1, v2, attr);
1421
                                }
1422
                        }
1423
                        assertFalse(iter1.hasNext());
1424
                        iter.dispose();
1425
                        iter1.dispose();
1426
                }
1427
                set.dispose();
1428
                set1.dispose();
1429

    
1430
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1431
                transform.setFeatureStore(store);
1432

    
1433
                store.getTransforms().add(transform);
1434

    
1435
                fullStoreIteratorTest(store);
1436

    
1437
                set = store.getFeatureSet();
1438
                set1 = store1.getFeatureSet();
1439
                ntimes = getRandom().nextInt(3) + 1;
1440
                for (i = 0; i < ntimes; i++) {
1441
                        if (getRandom().nextBoolean()) {
1442
                                iter = set.fastIterator();
1443
                        } else {
1444
                                iter = set.iterator();
1445
                        }
1446
                        if (getRandom().nextBoolean()) {
1447
                                iter1 = set1.fastIterator();
1448
                        } else {
1449
                                iter1 = set1.iterator();
1450
                        }
1451
                        while (iter.hasNext()) {
1452
                                feature = (Feature) iter.next();
1453
                                feature1 = (Feature) iter1.next();
1454

    
1455
                                iterAttr = set1.getDefaultFeatureType().iterator();
1456
                                while (iterAttr.hasNext()) {
1457
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1458
                                        v1 = feature.get("_" + attr.getName());
1459
                                        v2 = feature1.get(attr.getIndex());
1460
                                        if (attr.getDataType() == DataTypes.STRING) {
1461
                                                if (v2 != null) {
1462
                                                        v2 = ((String) v2).toUpperCase();
1463
                                                }
1464

    
1465
                                        }
1466
                                        compareFeatureValue(v1, v2, attr);
1467
                                }
1468
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1469
                                                .getDefaultFeatureType().getAttributeDescriptor(
1470
                                                                "__new__"));
1471
                        }
1472
                        assertFalse(iter1.hasNext());
1473
                        iter.dispose();
1474
                        iter1.dispose();
1475
                }
1476
                set.dispose();
1477
                set1.dispose();
1478

    
1479

    
1480
                transform = new RemoveAttribute("__new__");
1481
                transform.setFeatureStore(store);
1482

    
1483
                store.getTransforms().add(transform);
1484

    
1485
                fullStoreIteratorTest(store);
1486

    
1487
                set = store.getFeatureSet();
1488
                set1 = store1.getFeatureSet();
1489
                ntimes = getRandom().nextInt(3) + 1;
1490
                for (i = 0; i < ntimes; i++) {
1491
                        if (getRandom().nextBoolean()) {
1492
                                iter = set.fastIterator();
1493
                        } else {
1494
                                iter = set.iterator();
1495
                        }
1496
                        if (getRandom().nextBoolean()) {
1497
                                iter1 = set1.fastIterator();
1498
                        } else {
1499
                                iter1 = set1.iterator();
1500
                        }
1501
                        while (iter.hasNext()) {
1502
                                feature = (Feature) iter.next();
1503
                                feature1 = (Feature) iter1.next();
1504

    
1505
                                iterAttr = set1.getDefaultFeatureType().iterator();
1506
                                while (iterAttr.hasNext()) {
1507
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1508
                                        v1 = feature.get("_" + attr.getName());
1509
                                        v2 = feature1.get(attr.getIndex());
1510
                                        if (attr.getDataType() == DataTypes.STRING) {
1511
                                                if (v2 != null) {
1512
                                                        v2 = ((String) v2).toUpperCase();
1513
                                                }
1514

    
1515
                                        }
1516
                                        compareFeatureValue(v1, v2, attr);
1517
                                }
1518
                                assertNull(feature.getType().getAttributeDescriptor("__new__"));
1519
                        }
1520
                        assertFalse(iter1.hasNext());
1521
                        iter.dispose();
1522
                        iter1.dispose();
1523
                }
1524
                set.dispose();
1525
                set1.dispose();
1526

    
1527
                store.getTransforms().clear();
1528

    
1529
                compareStores(store, store1);
1530

    
1531

    
1532
                store.dispose();
1533
                store1.dispose();
1534
        }
1535

    
1536
        abstract class myTransform implements FeatureStoreTransform {
1537
                protected FeatureStore store;
1538
                protected FeatureType orgDefaultFType;
1539
                protected List orgFTypes;
1540

    
1541
                public void applyTransform(Feature source, EditableFeature target)
1542
                                throws DataException {
1543

    
1544
                        Iterator iter = target.getType().iterator();
1545
                        FeatureAttributeDescriptor attr;
1546
                        while (iter.hasNext()) {
1547
                                attr = (FeatureAttributeDescriptor) iter.next();
1548
                                this.setValue(source, target, attr);
1549
                        }
1550

    
1551
                }
1552

    
1553
                protected void setValue(Feature source, EditableFeature target,
1554
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1555
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1556
                }
1557

    
1558
                public void saveToState(PersistentState state)
1559
                throws PersistenceException {
1560
                        // TODO Auto-generated method stub
1561

    
1562
                }
1563

    
1564
                public void loadFromState(PersistentState state) throws PersistenceException {
1565
                        // TODO Auto-generated method stub
1566

    
1567
                }
1568

    
1569
                public FeatureType getDefaultFeatureType() throws DataException {
1570
                        return orgDefaultFType;
1571
                }
1572

    
1573
                public FeatureStore getFeatureStore() {
1574
                        return store;
1575
                }
1576

    
1577
                public List getFeatureTypes() throws DataException {
1578
                        return orgFTypes;
1579
                }
1580

    
1581
                public void setFeatureStore(FeatureStore featureStore) {
1582
                        this.store = featureStore;
1583
                        try {
1584
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1585
                                this.orgFTypes = this.store.getFeatureTypes();
1586

    
1587
                        } catch (DataException e) {
1588
                                throw new RuntimeException(e);
1589
                        }
1590

    
1591
                }
1592

    
1593
                public PersistentState getState() throws PersistenceException {
1594
                        // TODO Auto-generated method stub
1595
                        return null;
1596
                }
1597

    
1598
                public FeatureType getSourceFeatureTypeFrom(
1599
                                FeatureType targetFeatureType) {
1600

    
1601
                        return targetFeatureType;
1602
                }
1603

    
1604
        }
1605

    
1606
        abstract class TransformTypeTransform extends myTransform {
1607

    
1608
                private FeatureType myDefaultFeatureType = null;
1609
                private List myFeatureTypes = null;
1610

    
1611
                public FeatureType getDefaultFeatureType() throws DataException {
1612
                        if (this.myDefaultFeatureType == null) {
1613
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1614
                        }
1615

    
1616
                        return this.myDefaultFeatureType;
1617
                }
1618

    
1619
                protected abstract FeatureType transformType(FeatureType type);
1620

    
1621
                protected abstract FeatureType restoreType(FeatureType type);
1622

    
1623

    
1624
                public List getFeatureTypes() throws DataException {
1625
                        if (this.myFeatureTypes == null) {
1626
                                ArrayList list = new ArrayList();
1627
                                Iterator iter = orgFTypes.iterator();
1628
                                while (iter.hasNext()) {
1629
                                        FeatureType type = (FeatureType) iter.next();
1630
                                        if (type.getId().equals(
1631
                                                        this.getDefaultFeatureType().getId())) {
1632
                                                list.add(this.getDefaultFeatureType());
1633
                                        } else {
1634
                                                list.add(this.transformType(type));
1635
                                        }
1636
                                }
1637
                                this.myFeatureTypes = Collections.unmodifiableList(list);
1638
                        }
1639
                        return this.myFeatureTypes;
1640
                }
1641

    
1642
                public boolean isTransformsOriginalValues() {
1643
                        return false;
1644
                }
1645

    
1646
                public FeatureType getSourceFeatureTypeFrom(
1647
                                FeatureType targetFeatureType) {
1648
                        FeatureType org = null;
1649
                        FeatureType cur = null;
1650
                        Iterator iter = null;
1651
                        try {
1652
                                iter = this.getFeatureTypes().iterator();
1653
                        } catch (DataException e) {
1654
                                new RuntimeException(e);
1655
                        }
1656
                        while (iter.hasNext()) {
1657
                                cur = (FeatureType) iter.next();
1658
                                if (cur.getId().equals(targetFeatureType.getId())) {
1659
                                        org = cur;
1660
                                        break;
1661
                                }
1662
                        }
1663
                        if (org == null) {
1664
                                throw new RuntimeException();
1665
                        }
1666

    
1667
                        return this.restoreType(org);
1668
                }
1669

    
1670
        }
1671

    
1672
        abstract class TransformAttributeNameTransform extends
1673
                        TransformTypeTransform {
1674

    
1675
                protected void setValue(Feature source, EditableFeature target,
1676
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1677
                        target.set(attrTarget.getIndex(), source.get(this
1678
                                        .restoreAttributeName(attrTarget.getName())));
1679
                }
1680

    
1681

    
1682
                protected FeatureType transformType(FeatureType type) {
1683
                        EditableFeatureType result = type.getEditable();
1684
                        Iterator iter = result.iterator();
1685
                        EditableFeatureAttributeDescriptor attr;
1686
                        while (iter.hasNext()) {
1687
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1688
                                attr.setName(transformAttributeName(attr.getName()));
1689
                        }
1690
                        return result.getNotEditableCopy();
1691
                }
1692

    
1693
                protected abstract String transformAttributeName(String source);
1694

    
1695
                protected abstract String restoreAttributeName(String target);
1696

    
1697
                protected FeatureType restoreType(FeatureType type) {
1698
                        EditableFeatureType result;
1699
                        if (type instanceof EditableFeatureType) {
1700
                                result = (EditableFeatureType) type.getCopy();
1701
                        } else {
1702
                                result = type.getEditable();
1703
                        }
1704
                        Iterator iter = result.iterator();
1705
                        EditableFeatureAttributeDescriptor attr;
1706
                        while (iter.hasNext()) {
1707
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1708

    
1709
                                attr.setName(restoreAttributeName(attr.getName()));
1710
                        }
1711
                        return result.getNotEditableCopy();
1712
                }
1713

    
1714
                public FeatureType getSourceFeatureTypeFrom(
1715
                                FeatureType targetFeatureType) {
1716
                        FeatureType org = null;
1717
                        FeatureType cur = null;
1718
                        Iterator iter = null;
1719
                        iter = this.orgFTypes.iterator();
1720
                        while (iter.hasNext()) {
1721
                                cur = (FeatureType) iter.next();
1722
                                if (cur.getId().equals(targetFeatureType.getId())) {
1723
                                        org = cur;
1724
                                        break;
1725
                                }
1726
                        }
1727
                        if (cur == null) {
1728
                                throw new RuntimeException();
1729
                        }
1730
                        EditableFeatureType r = org.getEditable();
1731
                        iter = r.iterator();
1732
                        FeatureAttributeDescriptor attr;
1733
                        while (iter.hasNext()) {
1734
                                attr = (FeatureAttributeDescriptor) iter.next();
1735
                                if (targetFeatureType.getIndex(transformAttributeName(attr
1736
                                                .getName())) == -1) {
1737
                                        iter.remove();
1738
                                }
1739
                        }
1740
                        return r.getNotEditableCopy();
1741
                }
1742

    
1743
        }
1744

    
1745

    
1746
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1747

    
1748
                private String prefix;
1749

    
1750
                AddPrefixAttributeName(String prefix) {
1751
                        this.prefix = prefix;
1752
                }
1753

    
1754
                protected String restoreAttributeName(String target) {
1755
                        return target.substring(getPrefix().length(), target.length());
1756
                }
1757

    
1758
                private String getPrefix() {
1759
                        return prefix;
1760
                }
1761

    
1762
                protected String transformAttributeName(String source) {
1763
                        return getPrefix() + source;
1764
                }
1765

    
1766
        }
1767

    
1768
        class AddAttribute extends TransformTypeTransform {
1769

    
1770
                private String name;
1771
                private int type;
1772
                private Object defValue;
1773
                private int size;
1774
                private Evaluator eval;
1775

    
1776
                AddAttribute(String name) {
1777
                        this(name, DataTypes.STRING, null, 15);
1778
                }
1779

    
1780
                AddAttribute(String name, int type) {
1781
                        this(name, type, null, 15);
1782
                }
1783

    
1784
                AddAttribute(String name, int type, Object defValue) {
1785
                        this(name, type, defValue, 15);
1786
                }
1787

    
1788
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1789
                        this.name = name;
1790
                        this.type = type;
1791
                        this.defValue = null;
1792
                        this.size = size;
1793
                        this.eval = evaluator;
1794
                }
1795

    
1796
                AddAttribute(String name, int type, Object defValue, int size) {
1797
                        this.name = name;
1798
                        this.type = type;
1799
                        this.defValue = defValue;
1800
                        this.size = size;
1801
                        this.eval = null;
1802
                }
1803

    
1804

    
1805

    
1806
                protected FeatureType restoreType(FeatureType type) {
1807
                        EditableFeatureType result;
1808
                        if (type instanceof EditableFeatureType) {
1809
                                result = (EditableFeatureType) type.getCopy();
1810
                        } else {
1811
                                result = type.getEditable();
1812
                        }
1813
                        result.remove(this.name);
1814
                        return result.getNotEditableCopy();
1815
                }
1816

    
1817
                protected FeatureType transformType(FeatureType type) {
1818
                        EditableFeatureType result = type.getEditable();
1819

    
1820
                        EditableFeatureAttributeDescriptor att;
1821
                        if (this.eval == null) {
1822
                                att = result.add(name, this.type)
1823
                                                .setDefaultValue(this.defValue);
1824
                        } else {
1825
                                att = result.add(name, this.type, this.eval);
1826
                        }
1827
                        att.setSize(size);
1828

    
1829

    
1830
                        return result.getNotEditableCopy();
1831
                }
1832

    
1833
                protected void setValue(Feature source, EditableFeature target,
1834
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1835
                        if (attrTarget.getName().equals(this.name)) {
1836
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1837
                        } else {
1838
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1839
                                                .getName()));
1840
                        }
1841
                }
1842
        }
1843

    
1844

    
1845
        class RemoveAttribute extends TransformTypeTransform {
1846

    
1847
                private String attributeName;
1848
                private String fTypeIdToRemoveAttribute = null;
1849
                private FeatureAttributeDescriptor attr;
1850

    
1851
                RemoveAttribute(String attributeName) {
1852
                        this.attributeName = attributeName;
1853
                }
1854

    
1855
                RemoveAttribute(String attributeName, FeatureType fType) {
1856
                        this.attributeName = attributeName;
1857
                }
1858

    
1859
                protected FeatureType restoreType(FeatureType type) {
1860
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1861
                                return type;
1862
                        }
1863
                        EditableFeatureType result = type.getEditable();
1864

    
1865
                        EditableFeatureAttributeDescriptor att;
1866
                        if (this.attr.getEvaluator() == null) {
1867
                                att = result.add(attributeName, this.attr.getDataType())
1868
                                                .setDefaultValue(this.attr.getDefaultValue());
1869
                        } else {
1870
                                att = result.add(attributeName, this.attr.getDataType(),
1871
                                                this.attr.getEvaluator());
1872
                        }
1873
                        att.setSize(this.attr.getSize());
1874
                        att.setAllowNull(this.attr.allowNull());
1875
                        att.setGeometryType(this.attr.getGeometryType());
1876
                        att.setSRS(this.attr.getSRS());
1877
                        att.setPrecision(this.attr.getPrecision());
1878
                        // TODO
1879

    
1880

    
1881
                        return result.getNotEditableCopy();
1882
                }
1883

    
1884
                protected FeatureType transformType(FeatureType type) {
1885
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1886
                                return type;
1887
                        }
1888

    
1889
                        EditableFeatureType result;
1890
                        if (type instanceof EditableFeatureType) {
1891
                                result = (EditableFeatureType) type.getCopy();
1892
                        } else {
1893
                                result = type.getEditable();
1894
                        }
1895
                        result.remove(this.attributeName);
1896
                        return result.getNotEditableCopy();
1897

    
1898
                }
1899

    
1900
                public void setFeatureStore(FeatureStore featureStore) {
1901
                        Iterator iter;
1902
                        try {
1903
                                iter = featureStore.getFeatureTypes().iterator();
1904
                        } catch (DataException e) {
1905
                                throw new RuntimeException(e);
1906
                        }
1907
                        FeatureType type;
1908
                        FeatureAttributeDescriptor attrTmp;
1909
                        while (iter.hasNext()) {
1910
                                type = (FeatureType) iter.next();
1911
                                attrTmp = type.getAttributeDescriptor(this.attributeName);
1912
                                if (attrTmp != null) {
1913
                                        this.fTypeIdToRemoveAttribute = type.getId();
1914
                                        this.attr = attrTmp;
1915
                                        break;
1916
                                }
1917
                        }
1918
                        super.setFeatureStore(featureStore);
1919
                }
1920

    
1921
                public void applyTransform(Feature source, EditableFeature target)
1922
                                throws DataException {
1923
                        // TODO Auto-generated method stub
1924
                        super.applyTransform(source, target);
1925
                }
1926

    
1927

    
1928

    
1929
        }
1930

    
1931

    
1932
        public class StringsToLowerTransform extends myTransform {
1933

    
1934
                public boolean isTransformsOriginalValues() {
1935
                        return true;
1936
                }
1937

    
1938
                protected void setValue(Feature source, EditableFeature target,
1939
                                FeatureAttributeDescriptor attr) throws DataException {
1940
                        if (attr.getDataType() == DataTypes.STRING) {
1941
                                String v = ((String) source.get(attr.getName()));
1942
                                if (v != null){
1943
                                        v = v.toLowerCase();
1944
                                } else if (!attr.allowNull()) {
1945
                                        v = (String) attr.getDefaultValue();
1946
                                        v = v.toLowerCase();
1947
                                }
1948
                                target.set(attr.getName(), v);
1949
                        } else {
1950
                                target.set(attr.getName(), source.get(attr.getName()));
1951
                        }
1952
                }
1953

    
1954
        }
1955

    
1956
        class StringsToUpperTransform extends StringsToLowerTransform {
1957
                protected void setValue(Feature source, EditableFeature target,
1958
                                FeatureAttributeDescriptor attr) throws DataException {
1959
                        if (attr.getDataType() == DataTypes.STRING) {
1960
                                String v = ((String) source.get(attr.getName()));
1961
                                if (v != null) {
1962
                                        v = v.toUpperCase();
1963
                                } else if (!attr.allowNull()) {
1964
                                        v = (String) attr.getDefaultValue();
1965
                                        v.toUpperCase();
1966
                                }
1967
                                target.set(attr.getName(), v);
1968
                        } else {
1969
                                target.set(attr.getName(), source.get(attr.getName()));
1970
                        }
1971
                }
1972

    
1973
        }
1974

    
1975

    
1976
        public void testFeatureReference() throws Exception {
1977
                DataStoreParameters dbfParameters = this
1978
                                .getDefaultDataStoreParameters();
1979

    
1980
                FeatureStore store = (FeatureStore) dataManager
1981
                                .createStore(dbfParameters);
1982

    
1983
                Feature feature, refered;
1984
                FeatureSet set;
1985
                int nTimes2 = getRandom().nextInt(2) + 1;
1986

    
1987
                for (int j = 0; j < nTimes2; j++) {
1988
                        set = store.getFeatureSet();
1989
                        DisposableIterator iter;
1990

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

    
2006
                        set.dispose();
2007
                }
2008

    
2009
                nTimes2 = getRandom().nextInt(5) + 2;
2010
                FeatureQuery query = store.createFeatureQuery();
2011

    
2012
                for (int j = 0; j < nTimes2; j++) {
2013
                        DisposableIterator iter;
2014

    
2015
                        query.setAttributeNames(getRandomAttibuteList(store
2016
                                        .getDefaultFeatureType()));
2017
                        set = store.getFeatureSet(query);
2018

    
2019
                        int nTimes = getRandom().nextInt(3) + 3;
2020
                        for (int i = 0; i < nTimes; i++) {
2021
                                if (getRandom().nextBoolean()) {
2022
                                        iter = set.fastIterator();
2023
                                } else {
2024
                                        iter = set.fastIterator();
2025
                                }
2026
                                while (iter.hasNext()) {
2027
                                        feature = (Feature) iter.next();
2028
                                        refered = feature.getReference().getFeature(
2029
                                                        set.getDefaultFeatureType());
2030
                                        compareFeatures(feature, refered);
2031
                                }
2032
                                iter.dispose();
2033
                        }
2034

    
2035
                        set.dispose();
2036
                }
2037

    
2038

    
2039

    
2040
                store.dispose();
2041

    
2042
        }
2043

    
2044
        public void testResourcesLocks() throws Exception {
2045

    
2046
                if (!this.usesResources()) {
2047
                        return;
2048
                }
2049

    
2050
                DataStoreParameters dbfParameters = this
2051
                                .getDefaultDataStoreParameters();
2052

    
2053
                FeatureStore store = (FeatureStore) dataManager
2054
                                .createStore(dbfParameters);
2055

    
2056
                int nThreads = getRandom().nextInt(4) + 2;
2057
                List threads = new ArrayList();
2058
                TaskTestIterators task;
2059
                for (int i = 0; i < nThreads; i++) {
2060
                        task = new TaskTestIterators(this, "" + i, store);
2061
                        threads.add(task);
2062
                        task.start();
2063
                }
2064

    
2065
                Iterator iter;
2066
                List stillAlives = new ArrayList();
2067
                stillAlives.addAll(threads);
2068

    
2069
                while (!stillAlives.isEmpty()) {
2070
                        iter = stillAlives.iterator();
2071
                        while (iter.hasNext()) {
2072
                                task = (TaskTestIterators) iter.next();
2073
                                if (!task.isAlive()) {
2074
                                        iter.remove();
2075
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
2076
                                        iter.remove();
2077
                                        getLogger().error("task {} outOfDate", task.getName());
2078
                                } else {
2079
                                        Thread.yield();
2080
                                        Thread.sleep(100);
2081
                                }
2082
                        }
2083
                }
2084

    
2085
                store.dispose();
2086

    
2087
                iter = threads.iterator();
2088
                while (iter.hasNext()) {
2089
                        task = (TaskTestIterators) iter.next();
2090
                        assertTrue(task.isFinishedOk());
2091
                }
2092
        }
2093

    
2094
        class TaskTestIterators extends StoreTask {
2095
                private BaseTestFeatureStore testInstance;
2096

    
2097
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2098
                                String name, FeatureStore store) {
2099
                        super(name, store);
2100
                        this.testInstance = testInstance;
2101
                }
2102

    
2103
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2104
                                String name, FeatureStore store, int timeToWait) {
2105
                        super(name, store, timeToWait);
2106
                        this.testInstance = testInstance;
2107
                }
2108

    
2109
                public void run() {
2110
                        if (!this.startProcess()) {
2111
                                return;
2112
                        }
2113
                        try {
2114
                                this.testInstance.fullStoreIteratorTest(store);
2115

    
2116
                                finishedOk();
2117
                        } catch (Throwable e) {
2118
                                finishedError(e);
2119
                                return;
2120
                        }
2121
                }
2122

    
2123

    
2124
        }
2125

    
2126

    
2127
        protected void tearDown() throws Exception {
2128
                super.tearDown();
2129
                if (!usesResources()) {
2130
                        return;
2131
                }
2132

    
2133
                ResourceManager resMan = DALLocator.getResourceManager();
2134
                resMan.closeResources();
2135
        }
2136

    
2137

    
2138

    
2139
}