Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dal / src-test / org / gvsig / fmap / dal / feature / BaseTestFeatureStore.java @ 28840

History | View | Annotate | Download (49.8 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.DALLibrary;
43
import org.gvsig.fmap.dal.DALLocator;
44
import org.gvsig.fmap.dal.DataManager;
45
import org.gvsig.fmap.dal.DataServerExplorer;
46
import org.gvsig.fmap.dal.DataStoreParameters;
47
import org.gvsig.fmap.dal.DataTypes;
48
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
51
import org.gvsig.fmap.dal.feature.testmulithread.StoreTask;
52
import org.gvsig.fmap.geom.Geometry;
53
import org.gvsig.tools.ToolsLibrary;
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.persistence.PersistenceException;
62
import org.gvsig.tools.persistence.PersistentState;
63
import org.slf4j.Logger;
64
import org.slf4j.LoggerFactory;
65

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

    
72
        private static Logger logger = null;
73

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

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

    
85
        public abstract boolean usesResources();
86

    
87
        public abstract boolean hasExplorer();
88

    
89
        public FeatureQuery getDefaultQuery(FeatureStore store) {
90
                return store.createFeatureQuery();
91
        }
92

    
93

    
94
        public abstract DataStoreParameters getDefaultDataStoreParameters()
95
                        throws DataException;
96

    
97
        /*
98
         * (non-Javadoc)
99
         *
100
         * @see junit.framework.TestCase#setUp()
101
         */
102
        protected void setUp() throws Exception {
103
                super.setUp();
104

    
105
                if (baseTestInitialized) {
106
                        return;
107
                }
108
                ToolsLibrary tools = new ToolsLibrary();
109
                tools.initialize();
110
                tools.postInitialize();
111

    
112
                DALLibrary lib = new DALLibrary();
113
                lib.initialize();
114
                lib.postInitialize();
115

    
116
                dataManager = DALLocator.getDataManager();
117
                baseTestInitialized = true;
118

    
119
        }
120

    
121

    
122

    
123
        //=================================================
124

    
125

    
126
        public void printFeature(Feature feature, int maxColSize) {
127
                printFeature(feature, true, maxColSize);
128
        }
129

    
130

    
131
        public void printFeature(Feature feature, boolean showColName,int maxColSize) {
132
                FeatureType fType = feature.getType();
133
                if (showColName){
134
                        this.printFeatureTypeColNames(feature.getType(), maxColSize);
135
                }
136
                StringBuilder row = new StringBuilder();
137
                Iterator iter = fType.iterator();
138
                FeatureAttributeDescriptor attr;
139

    
140
                while (iter.hasNext()) {
141
                        attr = (FeatureAttributeDescriptor) iter.next();
142
                        row.append(truncateOrFillString(feature.get(attr.getName()),
143
                                        maxColSize + 1, ' '));
144
                }
145
                System.out.println(row.toString());
146
        }
147

    
148
        public String truncateOrFillString(Object str, int max, char fillWith) {
149
                if (str == null) {
150
                        return truncateOrFillString("{null}", max, fillWith);
151
                }
152
                return truncateOrFillString(str.toString(), max, fillWith);
153
        }
154

    
155
        public String truncateOrFillString(String str, int max, char fillWith) {
156
                if (str.length() > max) {
157
                        return str.substring(0, max - 1) + " ";
158
                } else {
159
                        StringBuilder strB = new StringBuilder(str);
160
                        while (strB.length() < max) {
161
                                strB.append(fillWith);
162
                        }
163
                        return strB.toString();
164
                }
165

    
166
        }
167

    
168
        public void printFeatureTypeColNames(FeatureType fType, int maxColSize) {
169
                Iterator iter = fType.iterator();
170
                FeatureAttributeDescriptor attr;
171
                StringBuilder colNames = new StringBuilder();
172
                StringBuilder typeNames = new StringBuilder();
173
                StringBuilder sep = new StringBuilder();
174
                if (maxColSize < 1){
175
                        maxColSize = 15;
176
                }
177
                while (iter.hasNext()) {
178
                        attr = (FeatureAttributeDescriptor) iter.next();
179
                        colNames.append(truncateOrFillString(attr.getName(), maxColSize + 1, ' '));
180
                        typeNames.append(truncateOrFillString("(" + attr.getDataTypeName() + ")",
181
                                        maxColSize + 1, ' '));
182
                        sep.append(truncateOrFillString("", maxColSize, '='));
183
                        sep.append(' ');
184
                }
185

    
186
                System.out.println("");
187
                System.out.println("");
188
                System.out.println(colNames.toString());
189
                System.out.println(typeNames.toString());
190
                System.out.println(sep.toString());
191
        }
192

    
193
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
194
                        FeatureType ftype, int dataType) {
195
                return getFirstAttributeOfType(ftype, new int[] { dataType });
196
        }
197

    
198
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
199
                        FeatureType ftype, int[] dataTypes) {
200
                FeatureAttributeDescriptor attr;
201
                Iterator iter = ftype.iterator();
202
                int i;
203
                while (iter.hasNext()) {
204
                        attr = (FeatureAttributeDescriptor) iter.next();
205
                        for (i = 0; i < dataTypes.length; i++) {
206
                                if (attr.getDataType() == dataTypes[i]) {
207
                                        return attr;
208
                                }
209
                        }
210
                }
211
                return null;
212
        }
213

    
214
        protected boolean compareDynObject(DynObject obj1, DynObject obj2) {
215
                DynClass dynClass = obj1.getDynClass();
216
                if (!dynClass.getName().equals(obj2.getDynClass().getName())) {
217
                        return false;
218
                }
219

    
220
                DynField[] fields = dynClass.getDeclaredDynFields();
221
                String fieldName;
222
                Object v1, v2;
223
                for (int i = 0; i < fields.length; i++) {
224
                        fieldName = fields[i].getName();
225
                        v1 = obj1.getDynValue(fieldName);
226
                        v2 = obj2.getDynValue(fieldName);
227
                        if (v1 == v2) {
228
                                continue;
229
                        } else if (v1 != null) {
230
                                if (!v1.equals(v2)) {
231
                                        return false;
232
                                }
233
                        }
234
                }
235

    
236
                return true;
237
        }
238

    
239
        protected boolean compareStores(FeatureStore store1, FeatureStore store2)
240
                        throws DataException {
241
                if (store1.getParameters().getClass() != store2.getParameters()
242
                                .getClass()) {
243
                        return false;
244
                }
245
                if (!compareDynObject(store1.getParameters(), store2.getParameters())) {
246
                        return false;
247
                }
248

    
249
                if (store1.getEnvelope() != store2.getEnvelope()) {
250
                        if (store1.getEnvelope() != null) {
251
                                return store1.getEnvelope().equals(store2.getEnvelope());
252
                        } else {
253
                                return false;
254
                        }
255
                }
256

    
257
                if (!store1.getName().equals(store2.getName())) {
258
                        return false;
259
                }
260
                if (((FeatureSelection) store1.getSelection()).getSize() != ((FeatureSelection) store2
261
                                .getSelection()).getSize()) {
262
                        return false;
263
                }
264
                DisposableIterator iter1 = ((FeatureSelection) store1.getSelection())
265
                                .fastIterator();
266
                DisposableIterator iter2 = ((FeatureSelection) store2.getSelection())
267
                                .fastIterator();
268
                if (!compareFeatureIterators(iter1, iter2)) {
269
                        return false;
270
                }
271
                iter1.dispose();
272
                iter2.dispose();
273

    
274
                if (store1.getFeatureTypes().size() != store2.getFeatureTypes().size()) {
275
                        return false;
276
                }
277
                Iterator iterTypes1 = store1.getFeatureTypes().iterator();
278
                Iterator iterTypes2 = store2.getFeatureTypes().iterator();
279
                while (iterTypes1.hasNext()) {
280
                        if (!compareTypes((FeatureType) iterTypes1.next(),
281
                                        (FeatureType) iterTypes2
282
                                        .next())) {
283
                                return false;
284
                        }
285
                }
286
                if (!compareTypes(store1.getDefaultFeatureType(), store2
287
                                .getDefaultFeatureType())) {
288
                        return false;
289
                }
290

    
291
                if (store1.getLocks() != null) {
292
                        if (store1.getLocks().getLocksCount() != store2.getLocks()
293
                                        .getLocksCount()) {
294
                                return false;
295
                        }
296
                        if (!compareFeatureIterators(store1.getLocks().getLocks(), store2
297
                                        .getLocks().getLocks())) {
298
                                return false;
299
                        }
300

    
301
                } else if (store2.getLocks() != null) {
302
                        return false;
303
                }
304

    
305
                return true;
306
        }
307

    
308
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2) {
309
                Feature feature;
310
                Feature ffeature;
311
                while (iter1.hasNext()) {
312
                        feature = (Feature) iter1.next();
313
                        ffeature = (Feature) iter2.next();
314
                        if (!this.compareFeatures(feature, ffeature)) {
315
                                return false;
316
                        }
317
                }
318

    
319
                if (!iter2.hasNext()) {
320
                        return true;
321
                } else {
322
                        getLogger().warn("size !=");
323
                        return false;
324
                }
325

    
326
        }
327

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

    
340
                return !iter2.hasNext();
341

    
342
        }
343

    
344
        protected boolean compareTypes(FeatureType ft1, FeatureType ft2) {
345
                if (ft1.size() != ft2.size()) {
346
                        getLogger().warn("size !=");
347
                        return false;
348
                }
349
                if (ft1.getDefaultGeometryAttributeIndex() != ft2
350
                                .getDefaultGeometryAttributeIndex()) {
351
                        getLogger().warn("getDefaultGeometryAttributeIndex !=");
352
                        return false;
353
                }
354
                if (ft1.getDefaultGeometryAttributeIndex() > -1) {
355
                        if (ft1.getDefaultSRS() != null) {
356
                                if (!ft1.getDefaultSRS().equals(ft2.getDefaultSRS())) {
357
                                        getLogger().warn("getDefaultSRS !=");
358
                                        return false;
359
                                }
360

    
361
                        } else {
362
                                if (ft2.getDefaultSRS() != null) {
363
                                        getLogger().warn("getDefaultSRS !=");
364
                                        return false;
365
                                }
366
                        }
367
                }
368

    
369
                if (ft1.getDefaultGeometryAttributeName() != null) {
370
                        if (!ft1.getDefaultGeometryAttributeName().equals(
371
                                        ft2.getDefaultGeometryAttributeName())) {
372
                                getLogger().warn("getDefaultGeometryAttributeName !=");
373

    
374
                                return false;
375
                        }
376
                } else {
377
                        if (ft2.getDefaultGeometryAttributeName() != null) {
378
                                getLogger().warn("getDefaultGeometryAttributeName !=");
379
                                return false;
380
                        }
381
                }
382

    
383

    
384

    
385
                FeatureAttributeDescriptor attr1, attr2;
386
                for (int i = 0; i < ft1.size(); i++) {
387
                        attr1 = ft1.getAttributeDescriptor(i);
388
                        attr2 = ft2.getAttributeDescriptor(i);
389

    
390
                        if (!compareAttributes(attr1, attr2)) {
391
                                return false;
392
                        }
393

    
394
                }
395
                return true;
396

    
397
        }
398

    
399
        protected boolean compareAttributes(FeatureAttributeDescriptor attr1,
400
                        FeatureAttributeDescriptor attr2) {
401
                if (attr1 == null || attr2 == null) {
402
                        getLogger().warn("attr1 == null || attr2 == null");
403
                        return false;
404
                }
405
                if (!attr1.getName().equals(attr2.getName())) {
406
                        getLogger().warn("name != ");
407
                        return false;
408
                }
409

    
410
                if (attr1.getDataType() != attr2.getDataType()) {
411
                        getLogger().warn("dataType != ");
412
                        return false;
413
                }
414

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

    
420
                if (attr1.getPrecision() != attr2.getPrecision()) {
421
                        getLogger().warn("precision != ");
422
                        return false;
423
                }
424

    
425
                if (attr1.getGeometryType() != attr2.getGeometryType()) {
426
                        getLogger().warn("GeometryType != ");
427
                        return false;
428
                }
429

    
430
                if (attr1.getGeometrySubType() != attr2.getGeometrySubType()) {
431
                        getLogger().warn("GeometrySubType != ");
432
                        return false;
433
                }
434

    
435
                if (attr1.getSRS() != null) {
436
                        if (!attr1.getSRS().equals(attr2.getSRS())) {
437
                                getLogger().warn("srs != ");
438
                                return false;
439
                        }
440
                } else {
441
                        if (attr2.getSRS() != null) {
442
                                getLogger().warn("srs != ");
443
                                return false;
444
                        }
445
                }
446

    
447
                return true;
448
        }
449

    
450
        protected boolean compareFeatures(Feature f1, Feature f2,
451
                        String[] attrsNames) {
452
                FeatureAttributeDescriptor attr1;
453
                FeatureAttributeDescriptor attr2;
454
                Object v1, v2;
455
                for (int i = 0; i < attrsNames.length; i++) {
456
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
457
                        attr2 = f2.getType().getAttributeDescriptor(attrsNames[i]);
458
                        if (attr1 != attr2) {
459
                                if (!compareAttributes(attr1, attr1)) {
460
                                        return false;
461
                                }
462
                        }
463
                        v1 = f1.get(attr1.getName());
464
                        v2 = f2.get(attr2.getName());
465
                        if (!compareFeatureValue(v1, v2, attr1)) {
466
                                return false;
467
                        }
468
                }
469

    
470
                return true;
471
        }
472

    
473
        protected boolean compareFeatures(Feature f1, Feature f2) {
474
                if (!compareTypes(f1.getType(), f2.getType())) {
475
                        return false;
476
                }
477
                Iterator iter = f1.getType().iterator();
478
                FeatureAttributeDescriptor attr;
479
                Object v1, v2;
480
                while (iter.hasNext()) {
481
                        attr = (FeatureAttributeDescriptor) iter.next();
482
                        v1 = f1.get(attr.getName());
483
                        v2 = f2.get(attr.getName());
484
                        if (!compareFeatureValue(v1, v2, attr)) {
485
                                return false;
486
                        }
487
                }
488

    
489
                return true;
490

    
491
        }
492

    
493
        protected boolean compareFeatureValue(Object v1, Object v2,
494
                        FeatureAttributeDescriptor attr) {
495

    
496
                if ((v1 == null || v2 == null) &&  !attr.allowNull() ){
497
                        getLogger().warn("null and !allowNull:"
498
                                                        + attr.getName());
499
                        return false;
500
                }
501

    
502
                if (v1 == v2) {
503
                        return true;
504
                } else if (v1 == null) {
505
                        getLogger().warn(" v1 == null and v2 != null:"
506
                                                        + attr.getName());
507
                        return false;
508
                } else if (v2 == null) {
509
                        getLogger().warn("v2 == null and v1 != null:"
510
                                                        + attr.getName());
511
                        return false;
512

    
513
                }
514
                switch (attr.getDataType()) {
515
                case DataTypes.FEATURE:
516
                        return compareFeatures((Feature) v1, (Feature) v2);
517

    
518
                case DataTypes.GEOMETRY:
519
                        Geometry geom1 = (Geometry) v1;
520
                        Geometry geom2 = (Geometry) v2;
521
                        if (!geom1.equals(geom2)) {
522
                                getLogger().warn(" v1 != v2 (Geom):" + attr.getName());
523
                                return false;
524

    
525
                        }
526
                        return true;
527
                case DataTypes.DOUBLE:
528
                        double diff = ((Double) v1).doubleValue()
529
                                        - ((Double) v1).doubleValue();
530
                        if (!(Math.abs(diff) < 0.000001)) {
531
                                getLogger().warn(" v1 != v2 (Dobule):" + attr.getName());
532
                                return false;
533

    
534
                        }
535
                        return true;
536

    
537
                case DataTypes.BYTEARRAY:
538
                        byte[] bytes1 = (byte[]) v1;
539
                        byte[] bytes2 = (byte[]) v2;
540
                        if (bytes1.length != bytes2.length) {
541
                                getLogger().warn(
542
                                                "v1.length != v2.length (byte []):" + attr.getName());
543
                                return false;
544
                        }
545
                        for (int i = 0; i < bytes1.length; i++) {
546
                                if (bytes1[i] != bytes2[i]) {
547
                                        getLogger().warn(
548
                                                        " v1[" + i + "] != v2[" + i + "] (byte []):"
549
                                                                        + attr.getName());
550
                                        return false;
551
                                }
552
                        }
553
                        return true;
554

    
555
                case DataTypes.OBJECT:
556
                        if (!v1.equals(v2)) {
557
                                getLogger().warn(
558
                                                " v1 != v2 (object):" + attr.getName() + " [ignored]");
559

    
560
                        }
561
                        return true;
562

    
563
                default:
564
                        if (!v1.equals(v2)) {
565
                                getLogger()
566
                                                .warn(
567
                                                                " v1 != v2:" + attr.getName() + ": " + v1
568
                                                                                + " != " + v2);
569
                                return false;
570
                        }
571
                }
572
                return true;
573

    
574
        }
575

    
576

    
577
        //------------------------------------------------
578

    
579
        public void testSimpleIteration(FeatureStore store) {
580
                this.testSimpleIteration(store, null);
581
        }
582

    
583
        protected String[] getRandomAttibuteList(FeatureType fType) {
584
                String[] attrNames = new String[fType.size()];
585
                Iterator iter = fType.iterator();
586
                int i = 0;
587
                while (iter.hasNext()) {
588
                        attrNames[i] = ((FeatureAttributeDescriptor) iter.next()).getName();
589
                        i++;
590
                }
591
                return this.getRandomAttibuteList(attrNames);
592
        }
593

    
594
        protected Random getRandom(){
595
                if (rnd == null){
596
                        rnd = new Random();
597
                        rnd.setSeed(System.currentTimeMillis());
598
                }
599
                return rnd;
600
        }
601

    
602
        protected String[] getRandomAttibuteList(String[] attrNames) {
603
                int nAttributes = getRandom().nextInt(
604
                                attrNames.length + (attrNames.length / 2)) + 1;
605
                TreeSet set = new TreeSet();
606
                for (int i = 0; i < nAttributes; i++) {
607
                        set.add(attrNames[getRandom().nextInt(attrNames.length)]);
608
                }
609
                return (String[]) set.toArray(new String[0]);
610
        }
611

    
612
        public void testIterationFastAndStandart(FeatureStore store)
613
                        throws Exception {
614
                this.testIterationFastAndStandart(store, null);
615

    
616
                FeatureQuery query = this.getDefaultQuery(store);
617
                // Random Attribute list
618
                query.setAttributeNames(getRandomAttibuteList(store
619
                                .getDefaultFeatureType()));
620
                this.testIterationFastAndStandart(store, query);
621

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

    
635
                                }
636
                        }
637
                        if (!attrFound) {
638
                                String[] newAttrs = new String[curAttrs.length + 1];
639
                                for (int i = 0; i < curAttrs.length; i++) {
640
                                        newAttrs[i] = curAttrs[i];
641
                                }
642
                                newAttrs[curAttrs.length] = attr.getName();
643
                                query.setAttributeNames(newAttrs);
644
                        }
645
                }
646

    
647

    
648
                query.getOrder().add(attr.getName(), true);
649
                this.testIterationFastAndStandart(store, query);
650

    
651
                // Filter
652
                query = this.getDefaultQuery(store);
653

    
654
                query.setFilter(new Evaluator(){
655

    
656
                        public Object evaluate(EvaluatorData data)
657
                                        throws EvaluatorException {
658
                                // TODO Auto-generated method stub
659
                                return Boolean.TRUE;
660
                        }
661

    
662
                        public String getCQL() {
663
                                return "true = true";
664
                        }
665

    
666
                        public String getDescription() {
667
                                // TODO Auto-generated method stub
668
                                return null;
669
                        }
670

    
671
                        public String getName() {
672
                                return "AlwaysTrue";
673
                        }
674

    
675
                        public EvaluatorFieldsInfo getFieldsInfo() {
676
                                // TODO Auto-generated method stub
677
                                return null;
678
                        }
679

    
680
                });
681
                this.testIterationFastAndStandart(store, query);
682

    
683
                // Filter + Sorted
684
                query.getOrder().add(attr.getName(), true);
685
                this.testIterationFastAndStandart(store, query);
686
        }
687

    
688
        public void testSimpleIteration(FeatureStore store, FeatureQuery query) {
689
                FeatureSet set;
690
                try {
691

    
692
                        if (query == null) {
693
                                query = this.getDefaultQuery(store);
694
                        }
695
                        set = store.getFeatureSet(query);
696
                        FeatureType type = set.getDefaultFeatureType();
697

    
698
                        DisposableIterator it = set.iterator();
699
                        Feature feature;
700
                        printFeatureTypeColNames(type, 15);
701
                        while (it.hasNext()) {
702

    
703
                                feature = (Feature) it.next();
704
                                printFeature(feature, false, 15);
705
                        }
706

    
707
                        it.dispose();
708
                        set.dispose();
709

    
710
                } catch (DataException e3) {
711
                        e3.printStackTrace();
712
                        fail();
713
                        return;
714
                }
715

    
716
        }
717

    
718
        public void testIterationFastAndStandart(FeatureStore store,
719
                        FeatureQuery query) {
720
                FeatureSet set;
721
                try {
722

    
723
                        if (query == null) {
724
                                query = this.getDefaultQuery(store);
725
                        }
726
                        set = store.getFeatureSet(query);
727

    
728
                        DisposableIterator it = set.iterator();
729
                        DisposableIterator fit = set.fastIterator();
730

    
731
                        assertTrue(this.compareFeatureIterators(it, fit));
732

    
733
                        it.dispose();
734
                        fit.dispose();
735
                        set.dispose();
736

    
737
                } catch (DataException e3) {
738
                        e3.printStackTrace();
739
                        fail();
740
                        return;
741
                }
742

    
743
        }
744

    
745
        public void testSimpleIteration(DataStoreParameters parameters)
746
                        throws Exception {
747
                FeatureStore store = null;
748
                store = (FeatureStore) dataManager.createStore(parameters);
749

    
750
                this.testSimpleIteration(store);
751

    
752
                store.dispose();
753

    
754
        }
755

    
756
        public void testIterationFastAndStandart(DataStoreParameters parameters)
757
                        throws Exception {
758
                FeatureStore store = null;
759
                store = (FeatureStore) dataManager.createStore(parameters);
760

    
761
                this.testIterationFastAndStandart(store);
762

    
763
                store.dispose();
764

    
765
        }
766

    
767
        /**
768
         *
769
         * @param count
770
         *            if (< 0) list.size() >= 1 else list.size() == count
771
         * @throws Exception
772
         */
773
        public void testExplorerList(int count) throws Exception {
774
                FeatureStore store = null;
775
                store = (FeatureStore) dataManager.createStore(this
776
                                .getDefaultDataStoreParameters());
777

    
778
                DataServerExplorer explorer;
779
                explorer = store.getExplorer();
780

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

    
787
                store.dispose();
788

    
789
                explorer.dispose();
790
        }
791

    
792
        //=================================================
793
        //=================================================
794

    
795

    
796

    
797

    
798
        public void testIterationFastAndStandart() throws Exception {
799
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
800
        }
801

    
802
        public void testSimpleIteration() throws Exception {
803
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
804
        }
805

    
806
        public void testInitializeStore() throws Exception {
807
                FeatureStore store = (FeatureStore) dataManager.createStore(this
808
                                .getDefaultDataStoreParameters());
809
                store.dispose();
810
        }
811

    
812

    
813
        public void testExplorer() throws Exception {
814
                if (!this.hasExplorer()) {
815
                        return;
816
                }
817
                this.testExplorerList(-1);
818

    
819
        }
820

    
821
        public void testSelection() throws Exception {
822
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
823

    
824
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
825
                FeatureSet set = store.getFeatureSet();
826

    
827
                assertTrue(store.getFeatureSelection().isEmpty());
828
                store.setSelection(set);
829
                assertFalse(store.getFeatureSelection().isEmpty());
830

    
831
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
832

    
833
                DisposableIterator iter = set.iterator();
834
                while (iter.hasNext()) {
835
                        assertTrue(store.getFeatureSelection().isSelected(
836
                                        (Feature) iter.next()));
837
                }
838
                iter.dispose();
839

    
840
                store.getFeatureSelection().reverse();
841
                assertTrue(store.getFeatureSelection().isEmpty());
842
                assertEquals(0, store.getFeatureSelection().getSize());
843
                iter = set.iterator();
844
                while (iter.hasNext()) {
845
                        assertFalse(store.getFeatureSelection().isSelected(
846
                                        (Feature) iter.next()));
847
                }
848
                iter.dispose();
849

    
850
                store.getFeatureSelection().reverse();
851
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
852
                assertFalse(store.getFeatureSelection().isEmpty());
853

    
854
                set.dispose();
855

    
856
        }
857

    
858
        public void testCustomFTypeSet() throws Exception {
859
                DataStoreParameters dbfParameters = this
860
                                .getDefaultDataStoreParameters();
861

    
862
                FeatureStore store = (FeatureStore) dataManager
863
                                .createStore(dbfParameters);
864

    
865
                testCustomFTypeSet(store);
866

    
867
                store.dispose();
868
        }
869

    
870
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
871

    
872
                FeatureSet set, set1;
873
                FeatureQuery query;
874
                DisposableIterator iter, iter1;
875
                Iterator attrIter;
876
                FeatureAttributeDescriptor attr;
877

    
878
                set = store.getFeatureSet();
879
                attrIter = store.getDefaultFeatureType().iterator();
880

    
881
                String[] names;
882
                while (attrIter.hasNext()) {
883
                        attr = (FeatureAttributeDescriptor) attrIter.next();
884
                        int fieldIndex = attr.getIndex();
885

    
886
                        query = this.getDefaultQuery(store);
887
                        String fieldName = store.getDefaultFeatureType()
888
                        .getAttributeDescriptor(fieldIndex).getName();
889

    
890
                        names = new String[] { fieldName };
891
                        query.setAttributeNames(names);
892
                        set1 = store.getFeatureSet(query);
893

    
894
                        if (getRandom().nextBoolean()) {
895
                                iter = set.fastIterator();
896
                        } else {
897
                                iter = set.iterator();
898
                        }
899
                        if (getRandom().nextBoolean()) {
900
                                iter1 = set1.fastIterator();
901
                        } else {
902
                                iter1 = set1.iterator();
903
                        }
904

    
905
                        assertTrue(compareFeatureIterators(iter, iter1, names));
906

    
907
                        iter.dispose();
908
                        iter1.dispose();
909
                        set1.dispose();
910
                }
911

    
912
                int ntimes = getRandom().nextInt(10) + 5;
913
                FeatureType type = store.getDefaultFeatureType();
914
                query = this.getDefaultQuery(store);
915
                for (int i = 0; i < ntimes; i++) {
916
                        names = getRandomAttibuteList(type);
917

    
918
                        query.setAttributeNames(names);
919
                        set1 = store.getFeatureSet(query);
920

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

    
932
                        assertTrue(compareFeatureIterators(iter, iter1, names));
933

    
934
                        iter.dispose();
935
                        iter1.dispose();
936
                        set1.dispose();
937

    
938

    
939
                }
940

    
941

    
942

    
943
                set.dispose();
944

    
945
        }
946

    
947
        // TODO: Corregir este test
948
    // public void testPersistence() throws Exception {
949
    // if (ToolsLocator.getPersistenceManager() == null) {
950
    // fail("Default Persistence Manager not register");
951
    // }
952
    // DataStoreParameters params = this.getDefaultDataStoreParameters();
953
    //
954
    //
955
    // FeatureStore store = (FeatureStore) dataManager.createStore(params);
956
    //
957
    // testSimpleIteration(store);
958
    //
959
    // PersistentState state = store.getState();
960
    //
961
    // FeatureStore store2 = (FeatureStore) ToolsLocator
962
    // .getPersistenceManager().create(state);
963
    //
964
    // testSimpleIteration(store2);
965
    //
966
    // assertTrue(compareStores(store, store2));
967
    //
968
    // // TODO Compare states
969
    // // XMLEntityState state2 = (XMLEntityState) store.getState();
970
    // //
971
    // // assertEquals(state.getXMLEntity().toString(), state2.getXMLEntity()
972
    // // .toString());
973
    // //
974
    // store.dispose();
975
    // store2.dispose();
976
    //
977
    //
978
    // }
979

    
980

    
981
        public void testShort() throws Exception {
982
                DataStoreParameters dbfParameters = this
983
                                .getDefaultDataStoreParameters();
984

    
985
                FeatureStore store = (FeatureStore) dataManager
986
                                .createStore(dbfParameters);
987

    
988
                testShort(store);
989

    
990
                store.dispose();
991

    
992
        }
993

    
994
        public void testShort(FeatureStore store) throws Exception{
995
                FeatureSet set1;
996
                FeatureQuery query;
997
                DisposableIterator iter1;
998
                Iterator attrIter;
999
                FeatureAttributeDescriptor attr;
1000

    
1001
                attrIter = store.getDefaultFeatureType().iterator();
1002

    
1003
                String[] names;
1004
                while (attrIter.hasNext()) {
1005
                        attr = (FeatureAttributeDescriptor) attrIter.next();
1006

    
1007
                        if (attr.getDataType() == DataTypes.GEOMETRY) {
1008
                                continue;
1009
                        }
1010
                        query = this.getDefaultQuery(store);
1011
                        String fieldName = attr.getName();
1012

    
1013

    
1014

    
1015
                        names = new String[] { fieldName };
1016
                        query.setAttributeNames(names);
1017
                        query.getOrder().add(fieldName, getRandom().nextBoolean());
1018

    
1019
                        set1 = store.getFeatureSet(query);
1020
                        if (getRandom().nextBoolean()) {
1021
                                iter1 = set1.fastIterator();
1022
                        } else {
1023
                                iter1 = set1.iterator();
1024
                        }
1025

    
1026
                        assertTrue(checkSort(iter1, query));
1027

    
1028
                        iter1.dispose();
1029
                        set1.dispose();
1030
                }
1031

    
1032
                int ntimes = getRandom().nextInt(10) + 5;
1033
                FeatureType type = store.getDefaultFeatureType();
1034
                query = this.getDefaultQuery(store);
1035
                for (int i = 0; i < ntimes; i++) {
1036
                        names = getRandomAttibuteList(type);
1037

    
1038
                        int nShortFields = getRandom().nextInt(names.length) + 1;
1039
                        query.getOrder().clear();
1040
                        for (int j = 0; j < nShortFields; j++) {
1041
                                attr = store.getDefaultFeatureType().getAttributeDescriptor(names[getRandom().nextInt(names.length)]);
1042
                                if (attr.getDataType() == DataTypes.INT
1043
                                                || attr.getDataType() == DataTypes.LONG
1044
                                                || attr.getDataType() == DataTypes.DOUBLE
1045
                                                || attr.getDataType() == DataTypes.STRING
1046
                                                || attr.getDataType() == DataTypes.DATE
1047
                                                || attr.getDataType() == DataTypes.BOOLEAN
1048
                                                || attr.getDataType() == DataTypes.BYTE
1049
                                                || attr.getDataType() == DataTypes.FLOAT) {
1050

    
1051
                                        query.getOrder().add(attr.getName(),
1052
                                                        getRandom().nextBoolean());
1053
                                }
1054
                        }
1055

    
1056
                        query.setAttributeNames(names);
1057
                        set1 = store.getFeatureSet(query);
1058

    
1059
                        // if (getRandom().nextBoolean()) {
1060
                                iter1 = set1.fastIterator();
1061
                                // } else {
1062
                                // iter1 = set1.iterator();
1063
                                // }
1064

    
1065
                                assertTrue(checkSort(iter1, query));
1066

    
1067
                                iter1.dispose();
1068
                                set1.dispose();
1069

    
1070
                }
1071

    
1072
        }
1073

    
1074

    
1075
        public boolean checkSort(Iterator iter, FeatureQuery query) {
1076

    
1077
                FeatureQueryOrderMember order;
1078
                Feature prevFeature = null;
1079
                Feature currFeature = null;
1080
                boolean isFirst = true;
1081
                Comparable v1, v2;
1082
                Object o1, o2;
1083
                int v;
1084
                FeatureQueryOrder queryOrder = query.getOrder();
1085

    
1086
                Iterator orderIter;
1087

    
1088
                //for debug only
1089
                /*
1090
                System.out.println("\nCheck order:");
1091
                Iterator orderIter = queryOrder.iterator();
1092
                while (orderIter.hasNext()) {
1093
                        order = (FeatureQueryOrderMember) orderIter.next();
1094
                        System.out.print(order.getAttributeName() + " ");
1095
                        if (order.getAscending()) {
1096
                                System.out.print("Asc, ");
1097
                        } else {
1098
                                System.out.print("Desc, ");
1099
                        }
1100
                }
1101
                System.out.println(";");
1102
                */
1103

    
1104
                while (iter.hasNext()) {
1105
                        currFeature = (Feature) iter.next();
1106
                        if (isFirst) {
1107
                                prevFeature = currFeature.getCopy();
1108
                                // printFeature(prevFeature, true, 15);
1109
                                isFirst = false;
1110
                                continue;
1111
                        }
1112
                        // printFeature(currFeature, false, 15);
1113
                        orderIter = queryOrder.iterator();
1114
                        while (orderIter.hasNext()) {
1115
                                order = (FeatureQueryOrderMember) orderIter.next();
1116
                                if (order.hasEvaluator()) {
1117
                                        try {
1118
                                                o1 = order.getEvaluator().evaluate(
1119
                                                                (EvaluatorData) prevFeature);
1120
                                                o2 = order.getEvaluator().evaluate(
1121
                                                                (EvaluatorData) currFeature);
1122
                                        } catch (EvaluatorException e) {
1123
                                                throw new DataEvaluatorRuntimeException(e);
1124
                                        }
1125
                                } else {
1126

    
1127
                                        o1 = prevFeature.get(order.getAttributeName());
1128
                                        o2 = currFeature.get(order.getAttributeName());
1129
                                }
1130
                                if (o1 instanceof Comparable && o2 instanceof Comparable) {
1131
                                        v1 = (Comparable) o1;
1132
                                        v2 = (Comparable) o2;
1133
                                } else {
1134
                                        // uncomparable objets
1135
                                        break;
1136
                                }
1137
                                if (v1 == null) {
1138
                                        if (v2 == null) {
1139
                                                break;
1140
                                        } else {
1141
                                                v = 1;
1142
                                        }
1143
                                } else {
1144
                                        v = v1.compareTo(v2);
1145
                                }
1146
                                if (v != 0) {
1147
                                        if (!order.getAscending()) {
1148
                                                v = -v;
1149
                                        }
1150
                                }
1151
                                if (v < 0) {
1152
                                        break;
1153
                                } else if (v > 0) {
1154
                                        // Checks for ignore case short
1155
                                        if (v1 instanceof String && v2 instanceof String) {
1156
                                                v1 = ((String)v1).toLowerCase();
1157
                                                v2 = ((String)v2).toLowerCase();
1158
                                                v = v1.compareTo(v2);
1159
                                                if (v != 0) {
1160
                                                        if (!order.getAscending()) {
1161
                                                                v = -v;
1162
                                                        }
1163
                                                }
1164
                                                if (v < 0) {
1165
                                                        getLogger()
1166
                                                                        .warn("Short compartor String ok with ignore case");
1167
                                                        break;
1168
                                                } else if (v > 0) {
1169
                                                        return false;
1170
                                                }
1171
                                        } else {
1172
                                                return false;
1173
                                        }
1174
                                }
1175
                        }
1176
                        prevFeature = currFeature.getCopy();
1177
                }
1178

    
1179
                return true;
1180
        }
1181

    
1182
        protected void fullStoreIteratorTest(FeatureStore store) throws Exception{
1183
                testIterationFastAndStandart(store);
1184
                testCustomFTypeSet(store);
1185
                testShort(store);
1186
        }
1187

    
1188

    
1189
        public void testTransformsData() throws Exception {
1190
                DataStoreParameters dbfParameters = this
1191
                                .getDefaultDataStoreParameters();
1192

    
1193
                FeatureStore store = (FeatureStore) dataManager
1194
                                .createStore(dbfParameters);
1195

    
1196
                FeatureStore store1 = (FeatureStore) dataManager
1197
                                .createStore(dbfParameters);
1198

    
1199
                FeatureStoreTransform transform = new StringsToLowerTransform();
1200
                transform.setFeatureStore(store);
1201

    
1202
                store.getTransforms().add(transform);
1203

    
1204
                FeatureSet set, set1;
1205
                DisposableIterator iter, iter1;
1206
                Iterator iterAttr;
1207
                FeatureAttributeDescriptor attr;
1208
                Feature feature, feature1;
1209
                int i, ntimes;
1210
                Object v1, v2;
1211

    
1212

    
1213
                fullStoreIteratorTest(store);
1214

    
1215
                set = store.getFeatureSet();
1216
                set1 = store1.getFeatureSet();
1217
                ntimes = getRandom().nextInt(3) + 1;
1218
                for (i = 0; i < ntimes; i++) {
1219
                        if (getRandom().nextBoolean()) {
1220
                                iter = set.fastIterator();
1221
                        } else {
1222
                                iter = set.iterator();
1223
                        }
1224
                        if (getRandom().nextBoolean()) {
1225
                                iter1 = set1.fastIterator();
1226
                        } else {
1227
                                iter1 = set1.iterator();
1228
                        }
1229
                        while (iter.hasNext()) {
1230
                                feature = (Feature) iter.next();
1231
                                feature1 = (Feature) iter1.next();
1232

    
1233
                                iterAttr = set.getDefaultFeatureType().iterator();
1234
                                while (iterAttr.hasNext()) {
1235
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1236
                                        v1 = feature.get(attr.getIndex());
1237
                                        v2 = feature1.get(attr.getIndex());
1238
                                        if (attr.getDataType() == DataTypes.STRING) {
1239
                                                if (v2 != null) {
1240
                                                        v2 = ((String) v2).toLowerCase();
1241
                                                }
1242

    
1243
                                        }
1244
                                        assertTrue(compareFeatureValue(v1, v2, attr));
1245
                                }
1246
                        }
1247
                        assertFalse(iter1.hasNext());
1248
                        iter.dispose();
1249
                        iter1.dispose();
1250
                }
1251

    
1252

    
1253
                set.dispose();
1254
                set1.dispose();
1255

    
1256

    
1257
                transform = new StringsToUpperTransform();
1258
                transform.setFeatureStore(store);
1259

    
1260
                store.getTransforms().add(transform);
1261

    
1262
                fullStoreIteratorTest(store);
1263

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

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

    
1292
                                        }
1293
                                        compareFeatureValue(v1, v2, attr);
1294
                                }
1295
                        }
1296
                        assertFalse(iter1.hasNext());
1297
                        iter.dispose();
1298
                        iter1.dispose();
1299
                }
1300
                set.dispose();
1301
                set1.dispose();
1302

    
1303

    
1304
                transform = new AddPrefixAttributeName("_");
1305
                transform.setFeatureStore(store);
1306

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

    
1309
                fullStoreIteratorTest(store);
1310

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

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

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

    
1350
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1351
                transform.setFeatureStore(store);
1352

    
1353
                store.getTransforms().add(transform);
1354

    
1355
                fullStoreIteratorTest(store);
1356

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

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

    
1385
                                        }
1386
                                        compareFeatureValue(v1, v2, attr);
1387
                                }
1388
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1389
                                                .getDefaultFeatureType().getAttributeDescriptor(
1390
                                                                "__new__"));
1391
                        }
1392
                        assertFalse(iter1.hasNext());
1393
                        iter.dispose();
1394
                        iter1.dispose();
1395
                }
1396
                set.dispose();
1397
                set1.dispose();
1398

    
1399

    
1400
                transform = new RemoveAttribute("__new__");
1401
                transform.setFeatureStore(store);
1402

    
1403
                store.getTransforms().add(transform);
1404

    
1405
                fullStoreIteratorTest(store);
1406

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

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

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

    
1447
                store.getTransforms().clear();
1448

    
1449
                compareStores(store, store1);
1450

    
1451

    
1452
                store.dispose();
1453
                store1.dispose();
1454
        }
1455

    
1456
        abstract class myTransform implements FeatureStoreTransform {
1457
                protected FeatureStore store;
1458
                protected FeatureType orgDefaultFType;
1459
                protected List orgFTypes;
1460

    
1461
                public void applyTransform(Feature source, EditableFeature target)
1462
                                throws DataException {
1463

    
1464
                        Iterator iter = target.getType().iterator();
1465
                        FeatureAttributeDescriptor attr;
1466
                        while (iter.hasNext()) {
1467
                                attr = (FeatureAttributeDescriptor) iter.next();
1468
                                this.setValue(source, target, attr);
1469
                        }
1470

    
1471
                }
1472

    
1473
                protected void setValue(Feature source, EditableFeature target,
1474
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1475
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1476
                }
1477

    
1478
                public void saveToState(PersistentState state)
1479
                throws PersistenceException {
1480
                        // TODO Auto-generated method stub
1481

    
1482
                }
1483

    
1484
                public void loadFromState(PersistentState state) throws PersistenceException {
1485
                        // TODO Auto-generated method stub
1486

    
1487
                }
1488

    
1489
                public FeatureType getDefaultFeatureType() throws DataException {
1490
                        return orgDefaultFType;
1491
                }
1492

    
1493
                public FeatureStore getFeatureStore() {
1494
                        return store;
1495
                }
1496

    
1497
                public List getFeatureTypes() throws DataException {
1498
                        return orgFTypes;
1499
                }
1500

    
1501
                public void setFeatureStore(FeatureStore featureStore) {
1502
                        this.store = featureStore;
1503
                        try {
1504
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1505
                                this.orgFTypes = this.store.getFeatureTypes();
1506

    
1507
                        } catch (DataException e) {
1508
                                throw new RuntimeException(e);
1509
                        }
1510

    
1511
                }
1512

    
1513
                public PersistentState getState() throws PersistenceException {
1514
                        // TODO Auto-generated method stub
1515
                        return null;
1516
                }
1517

    
1518
                public FeatureType getSourceFeatureTypeFrom(
1519
                                FeatureType targetFeatureType) {
1520

    
1521
                        return targetFeatureType;
1522
                }
1523

    
1524
        }
1525

    
1526
        abstract class TransformTypeTransform extends myTransform {
1527

    
1528
                private FeatureType myDefaultFeatureType = null;
1529
                private List myFeatureTypes = null;
1530

    
1531
                public FeatureType getDefaultFeatureType() throws DataException {
1532
                        if (this.myDefaultFeatureType == null) {
1533
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1534
                        }
1535

    
1536
                        return this.myDefaultFeatureType;
1537
                }
1538

    
1539
                protected abstract FeatureType transformType(FeatureType type);
1540

    
1541
                protected abstract FeatureType restoreType(FeatureType type);
1542

    
1543

    
1544
                public List getFeatureTypes() throws DataException {
1545
                        if (this.myFeatureTypes == null) {
1546
                                ArrayList list = new ArrayList();
1547
                                Iterator iter = orgFTypes.iterator();
1548
                                while (iter.hasNext()) {
1549
                                        FeatureType type = (FeatureType) iter.next();
1550
                                        if (type.getId().equals(
1551
                                                        this.getDefaultFeatureType().getId())) {
1552
                                                list.add(this.getDefaultFeatureType());
1553
                                        } else {
1554
                                                list.add(this.transformType(type));
1555
                                        }
1556
                                }
1557
                                this.myFeatureTypes = Collections.unmodifiableList(list);
1558
                        }
1559
                        return this.myFeatureTypes;
1560
                }
1561

    
1562
                public boolean isTransformsOriginalValues() {
1563
                        return false;
1564
                }
1565

    
1566
                public FeatureType getSourceFeatureTypeFrom(
1567
                                FeatureType targetFeatureType) {
1568
                        FeatureType org = null;
1569
                        FeatureType cur = null;
1570
                        Iterator iter = null;
1571
                        try {
1572
                                iter = this.getFeatureTypes().iterator();
1573
                        } catch (DataException e) {
1574
                                new RuntimeException(e);
1575
                        }
1576
                        while (iter.hasNext()) {
1577
                                cur = (FeatureType) iter.next();
1578
                                if (cur.getId().equals(targetFeatureType.getId())) {
1579
                                        org = cur;
1580
                                        break;
1581
                                }
1582
                        }
1583
                        if (org == null) {
1584
                                throw new RuntimeException();
1585
                        }
1586

    
1587
                        return this.restoreType(org);
1588
                }
1589

    
1590
        }
1591

    
1592
        abstract class TransformAttributeNameTransform extends
1593
                        TransformTypeTransform {
1594

    
1595
                protected void setValue(Feature source, EditableFeature target,
1596
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1597
                        target.set(attrTarget.getIndex(), source.get(this
1598
                                        .restoreAttributeName(attrTarget.getName())));
1599
                }
1600

    
1601

    
1602
                protected FeatureType transformType(FeatureType type) {
1603
                        EditableFeatureType result = type.getEditable();
1604
                        Iterator iter = result.iterator();
1605
                        EditableFeatureAttributeDescriptor attr;
1606
                        while (iter.hasNext()) {
1607
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1608
                                attr.setName(transformAttributeName(attr.getName()));
1609
                        }
1610
                        return result.getNotEditableCopy();
1611
                }
1612

    
1613
                protected abstract String transformAttributeName(String source);
1614

    
1615
                protected abstract String restoreAttributeName(String target);
1616

    
1617
                protected FeatureType restoreType(FeatureType type) {
1618
                        EditableFeatureType result;
1619
                        if (type instanceof EditableFeatureType) {
1620
                                result = (EditableFeatureType) type.getCopy();
1621
                        } else {
1622
                                result = type.getEditable();
1623
                        }
1624
                        Iterator iter = result.iterator();
1625
                        EditableFeatureAttributeDescriptor attr;
1626
                        while (iter.hasNext()) {
1627
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1628

    
1629
                                attr.setName(restoreAttributeName(attr.getName()));
1630
                        }
1631
                        return result.getNotEditableCopy();
1632
                }
1633

    
1634
                public FeatureType getSourceFeatureTypeFrom(
1635
                                FeatureType targetFeatureType) {
1636
                        FeatureType org = null;
1637
                        FeatureType cur = null;
1638
                        Iterator iter = null;
1639
                        iter = this.orgFTypes.iterator();
1640
                        while (iter.hasNext()) {
1641
                                cur = (FeatureType) iter.next();
1642
                                if (cur.getId().equals(targetFeatureType.getId())) {
1643
                                        org = cur;
1644
                                        break;
1645
                                }
1646
                        }
1647
                        if (cur == null) {
1648
                                throw new RuntimeException();
1649
                        }
1650
                        EditableFeatureType r = org.getEditable();
1651
                        iter = r.iterator();
1652
                        FeatureAttributeDescriptor attr;
1653
                        while (iter.hasNext()) {
1654
                                attr = (FeatureAttributeDescriptor) iter.next();
1655
                                if (targetFeatureType.getIndex(transformAttributeName(attr
1656
                                                .getName())) == -1) {
1657
                                        iter.remove();
1658
                                }
1659
                        }
1660
                        return r.getNotEditableCopy();
1661
                }
1662

    
1663
        }
1664

    
1665

    
1666
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1667

    
1668
                private String prefix;
1669

    
1670
                AddPrefixAttributeName(String prefix) {
1671
                        this.prefix = prefix;
1672
                }
1673

    
1674
                protected String restoreAttributeName(String target) {
1675
                        return target.substring(getPrefix().length(), target.length());
1676
                }
1677

    
1678
                private String getPrefix() {
1679
                        return prefix;
1680
                }
1681

    
1682
                protected String transformAttributeName(String source) {
1683
                        return getPrefix() + source;
1684
                }
1685

    
1686
        }
1687

    
1688
        class AddAttribute extends TransformTypeTransform {
1689

    
1690
                private String name;
1691
                private int type;
1692
                private Object defValue;
1693
                private int size;
1694
                private Evaluator eval;
1695

    
1696
                AddAttribute(String name) {
1697
                        this(name, DataTypes.STRING, null, 15);
1698
                }
1699

    
1700
                AddAttribute(String name, int type) {
1701
                        this(name, type, null, 15);
1702
                }
1703

    
1704
                AddAttribute(String name, int type, Object defValue) {
1705
                        this(name, type, defValue, 15);
1706
                }
1707

    
1708
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1709
                        this.name = name;
1710
                        this.type = type;
1711
                        this.defValue = null;
1712
                        this.size = size;
1713
                        this.eval = evaluator;
1714
                }
1715

    
1716
                AddAttribute(String name, int type, Object defValue, int size) {
1717
                        this.name = name;
1718
                        this.type = type;
1719
                        this.defValue = defValue;
1720
                        this.size = size;
1721
                        this.eval = null;
1722
                }
1723

    
1724

    
1725

    
1726
                protected FeatureType restoreType(FeatureType type) {
1727
                        EditableFeatureType result;
1728
                        if (type instanceof EditableFeatureType) {
1729
                                result = (EditableFeatureType) type.getCopy();
1730
                        } else {
1731
                                result = type.getEditable();
1732
                        }
1733
                        result.remove(this.name);
1734
                        return result.getNotEditableCopy();
1735
                }
1736

    
1737
                protected FeatureType transformType(FeatureType type) {
1738
                        EditableFeatureType result = type.getEditable();
1739

    
1740
                        EditableFeatureAttributeDescriptor att;
1741
                        if (this.eval == null) {
1742
                                att = result.add(name, this.type)
1743
                                                .setDefaultValue(this.defValue);
1744
                        } else {
1745
                                att = result.add(name, this.type, this.eval);
1746
                        }
1747
                        att.setSize(size);
1748

    
1749

    
1750
                        return result.getNotEditableCopy();
1751
                }
1752

    
1753
                protected void setValue(Feature source, EditableFeature target,
1754
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1755
                        if (attrTarget.getName().equals(this.name)) {
1756
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1757
                        } else {
1758
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1759
                                                .getName()));
1760
                        }
1761
                }
1762
        }
1763

    
1764

    
1765
        class RemoveAttribute extends TransformTypeTransform {
1766

    
1767
                private String attributeName;
1768
                private String fTypeIdToRemoveAttribute = null;
1769
                private FeatureAttributeDescriptor attr;
1770

    
1771
                RemoveAttribute(String attributeName) {
1772
                        this.attributeName = attributeName;
1773
                }
1774

    
1775
                RemoveAttribute(String attributeName, FeatureType fType) {
1776
                        this.attributeName = attributeName;
1777
                }
1778

    
1779
                protected FeatureType restoreType(FeatureType type) {
1780
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1781
                                return type;
1782
                        }
1783
                        EditableFeatureType result = type.getEditable();
1784

    
1785
                        EditableFeatureAttributeDescriptor att;
1786
                        if (this.attr.getEvaluator() == null) {
1787
                                att = result.add(attributeName, this.attr.getDataType())
1788
                                                .setDefaultValue(this.attr.getDefaultValue());
1789
                        } else {
1790
                                att = result.add(attributeName, this.attr.getDataType(),
1791
                                                this.attr.getEvaluator());
1792
                        }
1793
                        att.setSize(this.attr.getSize());
1794
                        att.setAllowNull(this.attr.allowNull());
1795
                        att.setGeometryType(this.attr.getGeometryType());
1796
                        att.setSRS(this.attr.getSRS());
1797
                        att.setPrecision(this.attr.getPrecision());
1798
                        // TODO
1799

    
1800

    
1801
                        return result.getNotEditableCopy();
1802
                }
1803

    
1804
                protected FeatureType transformType(FeatureType type) {
1805
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1806
                                return type;
1807
                        }
1808

    
1809
                        EditableFeatureType result;
1810
                        if (type instanceof EditableFeatureType) {
1811
                                result = (EditableFeatureType) type.getCopy();
1812
                        } else {
1813
                                result = type.getEditable();
1814
                        }
1815
                        result.remove(this.attributeName);
1816
                        return result.getNotEditableCopy();
1817

    
1818
                }
1819

    
1820
                public void setFeatureStore(FeatureStore featureStore) {
1821
                        Iterator iter;
1822
                        try {
1823
                                iter = featureStore.getFeatureTypes().iterator();
1824
                        } catch (DataException e) {
1825
                                throw new RuntimeException(e);
1826
                        }
1827
                        FeatureType type;
1828
                        FeatureAttributeDescriptor attrTmp;
1829
                        while (iter.hasNext()) {
1830
                                type = (FeatureType) iter.next();
1831
                                attrTmp = type.getAttributeDescriptor(this.attributeName);
1832
                                if (attrTmp != null) {
1833
                                        this.fTypeIdToRemoveAttribute = type.getId();
1834
                                        this.attr = attrTmp;
1835
                                        break;
1836
                                }
1837
                        }
1838
                        super.setFeatureStore(featureStore);
1839
                }
1840

    
1841
                public void applyTransform(Feature source, EditableFeature target)
1842
                                throws DataException {
1843
                        // TODO Auto-generated method stub
1844
                        super.applyTransform(source, target);
1845
                }
1846

    
1847

    
1848

    
1849
        }
1850

    
1851

    
1852
        public class StringsToLowerTransform extends myTransform {
1853

    
1854
                public boolean isTransformsOriginalValues() {
1855
                        return true;
1856
                }
1857

    
1858
                protected void setValue(Feature source, EditableFeature target,
1859
                                FeatureAttributeDescriptor attr) throws DataException {
1860
                        if (attr.getDataType() == DataTypes.STRING) {
1861
                                String v = ((String) source.get(attr.getName()));
1862
                                if (v != null){
1863
                                        v = v.toLowerCase();
1864
                                } else if (!attr.allowNull()) {
1865
                                        v = (String) attr.getDefaultValue();
1866
                                        v = v.toLowerCase();
1867
                                }
1868
                                target.set(attr.getName(), v);
1869
                        } else {
1870
                                target.set(attr.getName(), source.get(attr.getName()));
1871
                        }
1872
                }
1873

    
1874
        }
1875

    
1876
        class StringsToUpperTransform extends StringsToLowerTransform {
1877
                protected void setValue(Feature source, EditableFeature target,
1878
                                FeatureAttributeDescriptor attr) throws DataException {
1879
                        if (attr.getDataType() == DataTypes.STRING) {
1880
                                String v = ((String) source.get(attr.getName()));
1881
                                if (v != null) {
1882
                                        v = v.toUpperCase();
1883
                                } else if (!attr.allowNull()) {
1884
                                        v = (String) attr.getDefaultValue();
1885
                                        v.toUpperCase();
1886
                                }
1887
                                target.set(attr.getName(), v);
1888
                        } else {
1889
                                target.set(attr.getName(), source.get(attr.getName()));
1890
                        }
1891
                }
1892

    
1893
        }
1894

    
1895

    
1896
        public void testFeatureReference() throws Exception {
1897
                DataStoreParameters dbfParameters = this
1898
                                .getDefaultDataStoreParameters();
1899

    
1900
                FeatureStore store = (FeatureStore) dataManager
1901
                                .createStore(dbfParameters);
1902

    
1903
                Feature feature, refered;
1904
                FeatureSet set;
1905
                int nTimes2 = getRandom().nextInt(2) + 1;
1906

    
1907
                for (int j = 0; j < nTimes2; j++) {
1908
                        set = store.getFeatureSet();
1909
                        DisposableIterator iter;
1910

    
1911
                        int nTimes = getRandom().nextInt(2) + 3;
1912
                        for (int i = 0; i < nTimes; i++) {
1913
                                if (getRandom().nextBoolean()) {
1914
                                        iter = set.fastIterator();
1915
                                } else {
1916
                                        iter = set.fastIterator();
1917
                                }
1918
                                while (iter.hasNext()) {
1919
                                        feature = (Feature) iter.next();
1920
                                        refered = feature.getReference().getFeature();
1921
                                        compareFeatures(feature, refered);
1922
                                }
1923
                                iter.dispose();
1924
                        }
1925

    
1926
                        set.dispose();
1927
                }
1928

    
1929
                nTimes2 = getRandom().nextInt(5) + 2;
1930
                FeatureQuery query = store.createFeatureQuery();
1931

    
1932
                for (int j = 0; j < nTimes2; j++) {
1933
                        DisposableIterator iter;
1934

    
1935
                        query.setAttributeNames(getRandomAttibuteList(store
1936
                                        .getDefaultFeatureType()));
1937
                        set = store.getFeatureSet(query);
1938

    
1939
                        int nTimes = getRandom().nextInt(3) + 3;
1940
                        for (int i = 0; i < nTimes; i++) {
1941
                                if (getRandom().nextBoolean()) {
1942
                                        iter = set.fastIterator();
1943
                                } else {
1944
                                        iter = set.fastIterator();
1945
                                }
1946
                                while (iter.hasNext()) {
1947
                                        feature = (Feature) iter.next();
1948
                                        refered = feature.getReference().getFeature(
1949
                                                        set.getDefaultFeatureType());
1950
                                        compareFeatures(feature, refered);
1951
                                }
1952
                                iter.dispose();
1953
                        }
1954

    
1955
                        set.dispose();
1956
                }
1957

    
1958

    
1959

    
1960
                store.dispose();
1961

    
1962
        }
1963

    
1964
        public void testResourcesLocks() throws Exception {
1965

    
1966
                if (!this.usesResources()) {
1967
                        return;
1968
                }
1969

    
1970
                DataStoreParameters dbfParameters = this
1971
                                .getDefaultDataStoreParameters();
1972

    
1973
                FeatureStore store = (FeatureStore) dataManager
1974
                                .createStore(dbfParameters);
1975

    
1976
                int nThreads = getRandom().nextInt(4) + 2;
1977
                List threads = new ArrayList();
1978
                TaskTestIterators task;
1979
                for (int i = 0; i < nThreads; i++) {
1980
                        task = new TaskTestIterators(this, "" + i, store);
1981
                        threads.add(task);
1982
                        task.start();
1983
                }
1984

    
1985
                Iterator iter;
1986
                List stillAlives = new ArrayList();
1987
                stillAlives.addAll(threads);
1988

    
1989
                while (!stillAlives.isEmpty()) {
1990
                        iter = stillAlives.iterator();
1991
                        while (iter.hasNext()) {
1992
                                task = (TaskTestIterators) iter.next();
1993
                                if (!task.isAlive()) {
1994
                                        iter.remove();
1995
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
1996
                                        iter.remove();
1997
                                        getLogger().error("task {} outOfDate", task.getName());
1998
                                } else {
1999
                                        Thread.yield();
2000
                                        Thread.sleep(100);
2001
                                }
2002
                        }
2003
                }
2004

    
2005
                store.dispose();
2006

    
2007
                iter = threads.iterator();
2008
                while (iter.hasNext()) {
2009
                        task = (TaskTestIterators) iter.next();
2010
                        assertTrue(task.isFinishedOk());
2011
                }
2012
        }
2013

    
2014
        class TaskTestIterators extends StoreTask {
2015
                private BaseTestFeatureStore testInstance;
2016

    
2017
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2018
                                String name, FeatureStore store) {
2019
                        super(name, store);
2020
                        this.testInstance = testInstance;
2021
                }
2022

    
2023
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2024
                                String name, FeatureStore store, int timeToWait) {
2025
                        super(name, store, timeToWait);
2026
                        this.testInstance = testInstance;
2027
                }
2028

    
2029
                public void run() {
2030
                        if (!this.startProcess()) {
2031
                                return;
2032
                        }
2033
                        try {
2034
                                this.testInstance.fullStoreIteratorTest(store);
2035

    
2036
                                finishedOk();
2037
                        } catch (Throwable e) {
2038
                                finishedError(e);
2039
                                return;
2040
                        }
2041
                }
2042

    
2043

    
2044
        }
2045

    
2046
}