Statistics
| Revision:

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

History | View | Annotate | Download (51.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

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

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

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

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

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

    
73
        private static Logger logger = null;
74

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

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

    
85
        public abstract boolean usesResources();
86

    
87
        public abstract boolean hasExplorer();
88

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

    
98
                return query;
99
        }
100

    
101

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

    
105

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

    
110

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

    
113

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

    
118

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

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

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

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

    
154
        }
155

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

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

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

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

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

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

    
224
                return true;
225
        }
226

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

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

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

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

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

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

    
293
                return true;
294
        }
295

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

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

    
314
        }
315

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

    
328
                return !iter2.hasNext();
329

    
330
        }
331

    
332

    
333

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

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

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

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

    
376

    
377

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

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

    
387
                }
388
                return true;
389

    
390
        }
391

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

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

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

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

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

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

    
444
                        return false;
445
                }
446

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

    
463
                return true;
464
        }
465

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

    
486
                return true;
487
        }
488

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

    
505
                return true;
506

    
507
        }
508

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

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

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

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

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

    
547
                        }
548
                        return true;
549

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

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

    
569
        }
570

    
571

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

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

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

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

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

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

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

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

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

    
642

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

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

    
649
                query.setFilter(new Evaluator(){
650

    
651
                        public Object evaluate(EvaluatorData data)
652
                                        throws EvaluatorException {
653
                                // TODO Auto-generated method stub
654
                                return Boolean.TRUE;
655
                        }
656

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

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

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

    
670
                        public EvaluatorFieldsInfo getFieldsInfo() {
671
                                // TODO Auto-generated method stub
672
                                return null;
673
                        }
674

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

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

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

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

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

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

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

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

    
711
        }
712

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

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

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

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

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

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

    
738
        }
739

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

    
746
                this.testSimpleIteration(store);
747

    
748
                store.dispose();
749

    
750
        }
751

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

    
758
                this.testIterationFastAndStandart(store);
759

    
760
                store.dispose();
761

    
762
        }
763

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

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

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

    
785
                store.dispose();
786

    
787
                explorer.dispose();
788
        }
789

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

    
793

    
794

    
795

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

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

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

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

    
821

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

    
828
        }
829

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

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

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

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

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

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

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

    
864
                set.dispose();
865

    
866
        }
867

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

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

    
875
                testCustomFTypeSet(store);
876

    
877
                store.dispose();
878
        }
879

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
955
                        set1.dispose();
956

    
957

    
958
                }
959

    
960

    
961

    
962
                set.dispose();
963

    
964
        }
965

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

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

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

    
997
                testSimpleIteration(store);
998

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

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

    
1005
                testSimpleIteration(store2);
1006

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

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

    
1012
        }
1013

    
1014

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

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

    
1022
                testSort(store);
1023

    
1024
                store.dispose();
1025

    
1026
        }
1027

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

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

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

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

    
1047

    
1048

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

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

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

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

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

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

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

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

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

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

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

    
1104
                }
1105

    
1106
        }
1107

    
1108

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

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

    
1120
                Iterator orderIter;
1121

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

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

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

    
1213
                return true;
1214
        }
1215

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

    
1222

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

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

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

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

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

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

    
1246

    
1247
                fullStoreIteratorTest(store);
1248

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

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

    
1277
                                        }
1278
                                        assertTrue(compareFeatureValue(v1, v2, attr));
1279
                                }
1280
                        }
1281
                        assertFalse(iter1.hasNext());
1282
                        iter.dispose();
1283
                        iter1.dispose();
1284
                }
1285

    
1286

    
1287
                set.dispose();
1288
                set1.dispose();
1289

    
1290

    
1291
                transform = new StringsToUpperTransform();
1292
                transform.setFeatureStore(store);
1293

    
1294
                store.getTransforms().add(transform);
1295

    
1296
                fullStoreIteratorTest(store);
1297

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

    
1316
                                iterAttr = set.getDefaultFeatureType().iterator();
1317
                                while (iterAttr.hasNext()) {
1318
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1319
                                        v1 = feature.get(attr.getIndex());
1320
                                        v2 = feature1.get(attr.getIndex());
1321
                                        if (attr.getType() == DataTypes.STRING) {
1322
                                                if (v2 != null) {
1323
                                                        v2 = ((String) v2).toUpperCase();
1324
                                                }
1325

    
1326
                                        }
1327
                                        compareFeatureValue(v1, v2, attr);
1328
                                }
1329
                        }
1330
                        assertFalse(iter1.hasNext());
1331
                        iter.dispose();
1332
                        iter1.dispose();
1333
                }
1334
                set.dispose();
1335
                set1.dispose();
1336

    
1337

    
1338
                transform = new AddPrefixAttributeName("_");
1339
                transform.setFeatureStore(store);
1340

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

    
1343
                fullStoreIteratorTest(store);
1344

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

    
1363
                                iterAttr = set1.getDefaultFeatureType().iterator();
1364
                                while (iterAttr.hasNext()) {
1365
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1366
                                        v1 = feature.get("_" + attr.getName());
1367
                                        v2 = feature1.get(attr.getIndex());
1368
                                        if (attr.getType() == DataTypes.STRING) {
1369
                                                if (v2 != null) {
1370
                                                        v2 = ((String) v2).toUpperCase();
1371
                                                }
1372

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

    
1384
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1385
                transform.setFeatureStore(store);
1386

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

    
1389
                fullStoreIteratorTest(store);
1390

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

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

    
1419
                                        }
1420
                                        compareFeatureValue(v1, v2, attr);
1421
                                }
1422
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1423
                                                .getDefaultFeatureType().getAttributeDescriptor(
1424
                                                                "__new__"));
1425
                        }
1426
                        assertFalse(iter1.hasNext());
1427
                        iter.dispose();
1428
                        iter1.dispose();
1429
                }
1430
                set.dispose();
1431
                set1.dispose();
1432

    
1433

    
1434
                transform = new RemoveAttribute("__new__");
1435
                transform.setFeatureStore(store);
1436

    
1437
                store.getTransforms().add(transform);
1438

    
1439
                fullStoreIteratorTest(store);
1440

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

    
1459
                                iterAttr = set1.getDefaultFeatureType().iterator();
1460
                                while (iterAttr.hasNext()) {
1461
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1462
                                        v1 = feature.get("_" + attr.getName());
1463
                                        v2 = feature1.get(attr.getIndex());
1464
                                        if (attr.getType() == DataTypes.STRING) {
1465
                                                if (v2 != null) {
1466
                                                        v2 = ((String) v2).toUpperCase();
1467
                                                }
1468

    
1469
                                        }
1470
                                        compareFeatureValue(v1, v2, attr);
1471
                                }
1472
                                assertNull(feature.getType().getAttributeDescriptor("__new__"));
1473
                        }
1474
                        assertFalse(iter1.hasNext());
1475
                        iter.dispose();
1476
                        iter1.dispose();
1477
                }
1478
                set.dispose();
1479
                set1.dispose();
1480

    
1481
                store.getTransforms().clear();
1482

    
1483
                compareStores(store, store1);
1484

    
1485

    
1486
                store.dispose();
1487
                store1.dispose();
1488
        }
1489

    
1490
        abstract class myTransform implements FeatureStoreTransform {
1491
                protected FeatureStore store;
1492
                protected FeatureType orgDefaultFType;
1493
                protected List orgFTypes;
1494

    
1495
                public void applyTransform(Feature source, EditableFeature target)
1496
                                throws DataException {
1497

    
1498
                        Iterator iter = target.getType().iterator();
1499
                        FeatureAttributeDescriptor attr;
1500
                        while (iter.hasNext()) {
1501
                                attr = (FeatureAttributeDescriptor) iter.next();
1502
                                this.setValue(source, target, attr);
1503
                        }
1504

    
1505
                }
1506

    
1507
                protected void setValue(Feature source, EditableFeature target,
1508
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1509
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1510
                }
1511

    
1512
                public void saveToState(PersistentState state)
1513
                throws PersistenceException {
1514
                        // TODO Auto-generated method stub
1515

    
1516
                }
1517

    
1518
                public void loadFromState(PersistentState state) throws PersistenceException {
1519
                        // TODO Auto-generated method stub
1520

    
1521
                }
1522

    
1523
                public FeatureType getDefaultFeatureType() throws DataException {
1524
                        return orgDefaultFType;
1525
                }
1526

    
1527
                public FeatureStore getFeatureStore() {
1528
                        return store;
1529
                }
1530

    
1531
                public List getFeatureTypes() throws DataException {
1532
                        return orgFTypes;
1533
                }
1534

    
1535
                public void setFeatureStore(FeatureStore featureStore) {
1536
                        this.store = featureStore;
1537
                        try {
1538
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1539
                                this.orgFTypes = this.store.getFeatureTypes();
1540

    
1541
                        } catch (DataException e) {
1542
                                throw new RuntimeException(e);
1543
                        }
1544

    
1545
                }
1546

    
1547
                public PersistentState getState() throws PersistenceException {
1548
                        // TODO Auto-generated method stub
1549
                        return null;
1550
                }
1551

    
1552
                public FeatureType getSourceFeatureTypeFrom(
1553
                                FeatureType targetFeatureType) {
1554

    
1555
                        return targetFeatureType;
1556
                }
1557

    
1558
        }
1559

    
1560
        abstract class TransformTypeTransform extends myTransform {
1561

    
1562
                private FeatureType myDefaultFeatureType = null;
1563
                private List myFeatureTypes = null;
1564

    
1565
                public FeatureType getDefaultFeatureType() throws DataException {
1566
                        if (this.myDefaultFeatureType == null) {
1567
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1568
                        }
1569

    
1570
                        return this.myDefaultFeatureType;
1571
                }
1572

    
1573
                protected abstract FeatureType transformType(FeatureType type);
1574

    
1575
                protected abstract FeatureType restoreType(FeatureType type);
1576

    
1577

    
1578
                public List getFeatureTypes() throws DataException {
1579
                        if (this.myFeatureTypes == null) {
1580
                                ArrayList list = new ArrayList();
1581
                                Iterator iter = orgFTypes.iterator();
1582
                                while (iter.hasNext()) {
1583
                                        FeatureType type = (FeatureType) iter.next();
1584
                                        if (type.getId().equals(
1585
                                                        this.getDefaultFeatureType().getId())) {
1586
                                                list.add(this.getDefaultFeatureType());
1587
                                        } else {
1588
                                                list.add(this.transformType(type));
1589
                                        }
1590
                                }
1591
                                this.myFeatureTypes = Collections.unmodifiableList(list);
1592
                        }
1593
                        return this.myFeatureTypes;
1594
                }
1595

    
1596
                public boolean isTransformsOriginalValues() {
1597
                        return false;
1598
                }
1599

    
1600
                public FeatureType getSourceFeatureTypeFrom(
1601
                                FeatureType targetFeatureType) {
1602
                        FeatureType org = null;
1603
                        FeatureType cur = null;
1604
                        Iterator iter = null;
1605
                        try {
1606
                                iter = this.getFeatureTypes().iterator();
1607
                        } catch (DataException e) {
1608
                                new RuntimeException(e);
1609
                        }
1610
                        while (iter.hasNext()) {
1611
                                cur = (FeatureType) iter.next();
1612
                                if (cur.getId().equals(targetFeatureType.getId())) {
1613
                                        org = cur;
1614
                                        break;
1615
                                }
1616
                        }
1617
                        if (org == null) {
1618
                                throw new RuntimeException();
1619
                        }
1620

    
1621
                        return this.restoreType(org);
1622
                }
1623

    
1624
        }
1625

    
1626
        abstract class TransformAttributeNameTransform extends
1627
                        TransformTypeTransform {
1628

    
1629
                protected void setValue(Feature source, EditableFeature target,
1630
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1631
                        target.set(attrTarget.getIndex(), source.get(this
1632
                                        .restoreAttributeName(attrTarget.getName())));
1633
                }
1634

    
1635

    
1636
                protected FeatureType transformType(FeatureType type) {
1637
                        EditableFeatureType result = type.getEditable();
1638
                        Iterator iter = result.iterator();
1639
                        EditableFeatureAttributeDescriptor attr;
1640
                        while (iter.hasNext()) {
1641
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1642
                                attr.setName(transformAttributeName(attr.getName()));
1643
                        }
1644
                        return result.getNotEditableCopy();
1645
                }
1646

    
1647
                protected abstract String transformAttributeName(String source);
1648

    
1649
                protected abstract String restoreAttributeName(String target);
1650

    
1651
                protected FeatureType restoreType(FeatureType type) {
1652
                        EditableFeatureType result;
1653
                        if (type instanceof EditableFeatureType) {
1654
                                result = (EditableFeatureType) type.getCopy();
1655
                        } else {
1656
                                result = type.getEditable();
1657
                        }
1658
                        Iterator iter = result.iterator();
1659
                        EditableFeatureAttributeDescriptor attr;
1660
                        while (iter.hasNext()) {
1661
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1662

    
1663
                                attr.setName(restoreAttributeName(attr.getName()));
1664
                        }
1665
                        return result.getNotEditableCopy();
1666
                }
1667

    
1668
                public FeatureType getSourceFeatureTypeFrom(
1669
                                FeatureType targetFeatureType) {
1670
                        FeatureType org = null;
1671
                        FeatureType cur = null;
1672
                        Iterator iter = null;
1673
                        iter = this.orgFTypes.iterator();
1674
                        while (iter.hasNext()) {
1675
                                cur = (FeatureType) iter.next();
1676
                                if (cur.getId().equals(targetFeatureType.getId())) {
1677
                                        org = cur;
1678
                                        break;
1679
                                }
1680
                        }
1681
                        if (cur == null) {
1682
                                throw new RuntimeException();
1683
                        }
1684
                        EditableFeatureType r = org.getEditable();
1685
                        iter = r.iterator();
1686
                        FeatureAttributeDescriptor attr;
1687
                        while (iter.hasNext()) {
1688
                                attr = (FeatureAttributeDescriptor) iter.next();
1689
                                if (targetFeatureType.getIndex(transformAttributeName(attr
1690
                                                .getName())) == -1) {
1691
                                        iter.remove();
1692
                                }
1693
                        }
1694
                        return r.getNotEditableCopy();
1695
                }
1696

    
1697
        }
1698

    
1699

    
1700
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1701

    
1702
                private String prefix;
1703

    
1704
                AddPrefixAttributeName(String prefix) {
1705
                        this.prefix = prefix;
1706
                }
1707

    
1708
                protected String restoreAttributeName(String target) {
1709
                        return target.substring(getPrefix().length(), target.length());
1710
                }
1711

    
1712
                private String getPrefix() {
1713
                        return prefix;
1714
                }
1715

    
1716
                protected String transformAttributeName(String source) {
1717
                        return getPrefix() + source;
1718
                }
1719

    
1720
        }
1721

    
1722
        class AddAttribute extends TransformTypeTransform {
1723

    
1724
                private String name;
1725
                private int type;
1726
                private Object defValue;
1727
                private int size;
1728
                private Evaluator eval;
1729

    
1730
                AddAttribute(String name) {
1731
                        this(name, DataTypes.STRING, null, 15);
1732
                }
1733

    
1734
                AddAttribute(String name, int type) {
1735
                        this(name, type, null, 15);
1736
                }
1737

    
1738
                AddAttribute(String name, int type, Object defValue) {
1739
                        this(name, type, defValue, 15);
1740
                }
1741

    
1742
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1743
                        this.name = name;
1744
                        this.type = type;
1745
                        this.defValue = null;
1746
                        this.size = size;
1747
                        this.eval = evaluator;
1748
                }
1749

    
1750
                AddAttribute(String name, int type, Object defValue, int size) {
1751
                        this.name = name;
1752
                        this.type = type;
1753
                        this.defValue = defValue;
1754
                        this.size = size;
1755
                        this.eval = null;
1756
                }
1757

    
1758

    
1759

    
1760
                protected FeatureType restoreType(FeatureType type) {
1761
                        EditableFeatureType result;
1762
                        if (type instanceof EditableFeatureType) {
1763
                                result = (EditableFeatureType) type.getCopy();
1764
                        } else {
1765
                                result = type.getEditable();
1766
                        }
1767
                        result.remove(this.name);
1768
                        return result.getNotEditableCopy();
1769
                }
1770

    
1771
                protected FeatureType transformType(FeatureType type) {
1772
                        EditableFeatureType result = type.getEditable();
1773

    
1774
                        EditableFeatureAttributeDescriptor att;
1775
                        if (this.eval == null) {
1776
                                att = result.add(name, this.type)
1777
                                                .setDefaultValue(this.defValue);
1778
                        } else {
1779
                                att = result.add(name, this.type, this.eval);
1780
                        }
1781
                        att.setSize(size);
1782

    
1783

    
1784
                        return result.getNotEditableCopy();
1785
                }
1786

    
1787
                protected void setValue(Feature source, EditableFeature target,
1788
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1789
                        if (attrTarget.getName().equals(this.name)) {
1790
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1791
                        } else {
1792
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1793
                                                .getName()));
1794
                        }
1795
                }
1796
        }
1797

    
1798

    
1799
        class RemoveAttribute extends TransformTypeTransform {
1800

    
1801
                private String attributeName;
1802
                private String fTypeIdToRemoveAttribute = null;
1803
                private FeatureAttributeDescriptor attr;
1804

    
1805
                RemoveAttribute(String attributeName) {
1806
                        this.attributeName = attributeName;
1807
                }
1808

    
1809
                RemoveAttribute(String attributeName, FeatureType fType) {
1810
                        this.attributeName = attributeName;
1811
                }
1812

    
1813
                protected FeatureType restoreType(FeatureType type) {
1814
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1815
                                return type;
1816
                        }
1817
                        EditableFeatureType result = type.getEditable();
1818

    
1819
                        EditableFeatureAttributeDescriptor att;
1820
                        if (this.attr.getEvaluator() == null) {
1821
                                att = result.add(attributeName, this.attr.getType())
1822
                                                .setDefaultValue(this.attr.getDefaultValue());
1823
                        } else {
1824
                                att = result.add(attributeName, this.attr.getType(),
1825
                                                this.attr.getEvaluator());
1826
                        }
1827
                        att.setSize(this.attr.getSize());
1828
                        att.setAllowNull(this.attr.allowNull());
1829
                        att.setGeometryType(this.attr.getGeometryType());
1830
                        att.setSRS(this.attr.getSRS());
1831
                        att.setPrecision(this.attr.getPrecision());
1832
                        // TODO
1833

    
1834

    
1835
                        return result.getNotEditableCopy();
1836
                }
1837

    
1838
                protected FeatureType transformType(FeatureType type) {
1839
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1840
                                return type;
1841
                        }
1842

    
1843
                        EditableFeatureType result;
1844
                        if (type instanceof EditableFeatureType) {
1845
                                result = (EditableFeatureType) type.getCopy();
1846
                        } else {
1847
                                result = type.getEditable();
1848
                        }
1849
                        result.remove(this.attributeName);
1850
                        return result.getNotEditableCopy();
1851

    
1852
                }
1853

    
1854
                public void setFeatureStore(FeatureStore featureStore) {
1855
                        Iterator iter;
1856
                        try {
1857
                                iter = featureStore.getFeatureTypes().iterator();
1858
                        } catch (DataException e) {
1859
                                throw new RuntimeException(e);
1860
                        }
1861
                        FeatureType type;
1862
                        FeatureAttributeDescriptor attrTmp;
1863
                        while (iter.hasNext()) {
1864
                                type = (FeatureType) iter.next();
1865
                                attrTmp = type.getAttributeDescriptor(this.attributeName);
1866
                                if (attrTmp != null) {
1867
                                        this.fTypeIdToRemoveAttribute = type.getId();
1868
                                        this.attr = attrTmp;
1869
                                        break;
1870
                                }
1871
                        }
1872
                        super.setFeatureStore(featureStore);
1873
                }
1874

    
1875
                public void applyTransform(Feature source, EditableFeature target)
1876
                                throws DataException {
1877
                        // TODO Auto-generated method stub
1878
                        super.applyTransform(source, target);
1879
                }
1880

    
1881

    
1882

    
1883
        }
1884

    
1885

    
1886
        public class StringsToLowerTransform extends myTransform {
1887

    
1888
                public boolean isTransformsOriginalValues() {
1889
                        return true;
1890
                }
1891

    
1892
                protected void setValue(Feature source, EditableFeature target,
1893
                                FeatureAttributeDescriptor attr) throws DataException {
1894
                        if (attr.getType() == DataTypes.STRING) {
1895
                                String v = ((String) source.get(attr.getName()));
1896
                                if (v != null){
1897
                                        v = v.toLowerCase();
1898
                                } else if (!attr.allowNull()) {
1899
                                        v = (String) attr.getDefaultValue();
1900
                                        v = v.toLowerCase();
1901
                                }
1902
                                target.set(attr.getName(), v);
1903
                        } else {
1904
                                target.set(attr.getName(), source.get(attr.getName()));
1905
                        }
1906
                }
1907

    
1908
        }
1909

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

    
1927
        }
1928

    
1929

    
1930
        public void testFeatureReference() throws Exception {
1931
                DataStoreParameters dbfParameters = this
1932
                                .getDefaultDataStoreParameters();
1933

    
1934
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1935
                                .getDataStoreName(), dbfParameters);
1936

    
1937
                Feature feature, refered;
1938
                FeatureSet set;
1939
                int nTimes2 = getRandom().nextInt(2) + 1;
1940

    
1941
                for (int j = 0; j < nTimes2; j++) {
1942
                        set = store.getFeatureSet();
1943
                        DisposableIterator iter;
1944

    
1945
                        int nTimes = getRandom().nextInt(2) + 3;
1946
                        for (int i = 0; i < nTimes; i++) {
1947
                                if (getRandom().nextBoolean()) {
1948
                                        iter = set.fastIterator();
1949
                                } else {
1950
                                        iter = set.fastIterator();
1951
                                }
1952
                                while (iter.hasNext()) {
1953
                                        feature = (Feature) iter.next();
1954
                                        refered = feature.getReference().getFeature();
1955
                                        compareFeatures(feature, refered);
1956
                                }
1957
                                iter.dispose();
1958
                        }
1959

    
1960
                        set.dispose();
1961
                }
1962

    
1963
                nTimes2 = getRandom().nextInt(5) + 2;
1964
                FeatureQuery query = store.createFeatureQuery();
1965

    
1966
                for (int j = 0; j < nTimes2; j++) {
1967
                        DisposableIterator iter;
1968

    
1969
                        query.setAttributeNames(getRandomAttibuteList(store
1970
                                        .getDefaultFeatureType()));
1971
                        set = store.getFeatureSet(query);
1972

    
1973
                        int nTimes = getRandom().nextInt(3) + 3;
1974
                        for (int i = 0; i < nTimes; i++) {
1975
                                if (getRandom().nextBoolean()) {
1976
                                        iter = set.fastIterator();
1977
                                } else {
1978
                                        iter = set.fastIterator();
1979
                                }
1980
                                while (iter.hasNext()) {
1981
                                        feature = (Feature) iter.next();
1982
                                        refered = feature.getReference().getFeature(
1983
                                                        set.getDefaultFeatureType());
1984
                                        compareFeatures(feature, refered);
1985
                                }
1986
                                iter.dispose();
1987
                        }
1988

    
1989
                        set.dispose();
1990
                }
1991

    
1992

    
1993

    
1994
                store.dispose();
1995

    
1996
        }
1997

    
1998
        public void testResourcesLocks() throws Exception {
1999

    
2000
                if (!this.usesResources()) {
2001
                        return;
2002
                }
2003

    
2004
                DataStoreParameters dbfParameters = this
2005
                                .getDefaultDataStoreParameters();
2006

    
2007
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
2008
                                .getDataStoreName(), dbfParameters);
2009

    
2010
                int nThreads = getRandom().nextInt(4) + 2;
2011
                List threads = new ArrayList();
2012
                TaskTestIterators task;
2013
                for (int i = 0; i < nThreads; i++) {
2014
                        task = new TaskTestIterators(this, "" + i, store);
2015
                        threads.add(task);
2016
                        task.start();
2017
                }
2018

    
2019
                Iterator iter;
2020
                List stillAlives = new ArrayList();
2021
                stillAlives.addAll(threads);
2022

    
2023
                while (!stillAlives.isEmpty()) {
2024
                        iter = stillAlives.iterator();
2025
                        while (iter.hasNext()) {
2026
                                task = (TaskTestIterators) iter.next();
2027
                                if (!task.isAlive()) {
2028
                                        iter.remove();
2029
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
2030
                                        iter.remove();
2031
                                        getLogger().error("task {} outOfDate", task.getName());
2032
                                } else {
2033
                                        Thread.yield();
2034
                                        Thread.sleep(100);
2035
                                }
2036
                        }
2037
                }
2038

    
2039
                store.dispose();
2040

    
2041
                iter = threads.iterator();
2042
                while (iter.hasNext()) {
2043
                        task = (TaskTestIterators) iter.next();
2044
                        assertTrue(task.isFinishedOk());
2045
                }
2046
        }
2047

    
2048
        class TaskTestIterators extends StoreTask {
2049
                private BaseTestFeatureStore testInstance;
2050

    
2051
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2052
                                String name, FeatureStore store) {
2053
                        super(name, store);
2054
                        this.testInstance = testInstance;
2055
                }
2056

    
2057
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2058
                                String name, FeatureStore store, int timeToWait) {
2059
                        super(name, store, timeToWait);
2060
                        this.testInstance = testInstance;
2061
                }
2062

    
2063
                public void run() {
2064
                        if (!this.startProcess()) {
2065
                                return;
2066
                        }
2067
                        try {
2068
                                this.testInstance.fullStoreIteratorTest(store);
2069

    
2070
                                finishedOk();
2071
                        } catch (Throwable e) {
2072
                                finishedError(e);
2073
                                return;
2074
                        }
2075
                }
2076

    
2077

    
2078
        }
2079

    
2080

    
2081
        protected void tearDown() throws Exception {
2082
                super.tearDown();
2083
                if (!usesResources()) {
2084
                        return;
2085
                }
2086

    
2087
                ResourceManager resMan = DALLocator.getResourceManager();
2088
                resMan.closeResources();
2089
        }
2090

    
2091

    
2092

    
2093
}