Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / test / java / org / gvsig / fmap / dal / feature / BaseTestFeatureStore.java @ 43020

History | View | Annotate | Download (51.5 KB)

1 40559 jjdelcerro
/**
2
 * gvSIG. Desktop Geographic Information System.
3 40435 jjdelcerro
 *
4 40559 jjdelcerro
 * Copyright (C) 2007-2013 gvSIG Association.
5 40435 jjdelcerro
 *
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 40559 jjdelcerro
 * as published by the Free Software Foundation; either version 3
9 40435 jjdelcerro
 * 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 40559 jjdelcerro
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23 40435 jjdelcerro
 */
24
package org.gvsig.fmap.dal.feature;
25
26
import java.util.ArrayList;
27
import java.util.Collections;
28
import java.util.Iterator;
29
import java.util.List;
30
import java.util.Random;
31
import java.util.TreeSet;
32
33
import org.gvsig.fmap.dal.DALLocator;
34
import org.gvsig.fmap.dal.DataManager;
35
import org.gvsig.fmap.dal.DataServerExplorer;
36
import org.gvsig.fmap.dal.DataStoreParameters;
37
import org.gvsig.fmap.dal.DataTypes;
38
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
39
import org.gvsig.fmap.dal.exception.DataException;
40
import org.gvsig.fmap.dal.feature.testmulithread.StoreTask;
41
import org.gvsig.fmap.dal.resource.ResourceManager;
42
import org.gvsig.fmap.geom.Geometry;
43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.dispose.DisposableIterator;
45
import org.gvsig.tools.dynobject.DynClass;
46
import org.gvsig.tools.dynobject.DynField;
47
import org.gvsig.tools.dynobject.DynObject;
48
import org.gvsig.tools.evaluator.Evaluator;
49
import org.gvsig.tools.evaluator.EvaluatorData;
50
import org.gvsig.tools.evaluator.EvaluatorException;
51
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
52
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
53
import org.gvsig.tools.persistence.PersistentState;
54
import org.slf4j.Logger;
55
import org.slf4j.LoggerFactory;
56
57
/**
58
 * @author jmvivo
59
 *
60
 */
61
public abstract class BaseTestFeatureStore extends
62
                AbstractLibraryAutoInitTestCase {
63
64
        private static Logger logger = null;
65
66
        protected DataManager dataManager = null;
67
        private static Random rnd;
68
69
        public Logger getLogger() {
70
                if (logger == null) {
71
                        logger = LoggerFactory.getLogger(this.getClass());
72
                }
73
                return logger;
74
        }
75
76
        public abstract boolean usesResources();
77
78
        public abstract boolean hasExplorer();
79
80
        public FeatureQuery getDefaultQuery(FeatureStore store)
81
                        throws DataException {
82
                FeatureQuery query = store.createFeatureQuery();
83
                FeatureAttributeDescriptor[] key = store.getDefaultFeatureType()
84
                                .getPrimaryKey();
85
                for (int i = 0; i < key.length; i++) {
86
                        query.getOrder().add(key[i].getName(), true);
87
                }
88
89
                return query;
90
        }
91
92
93
        public abstract DataStoreParameters getDefaultDataStoreParameters()
94
                        throws DataException;
95
96
97
        protected void doSetUp() throws Exception {
98
                dataManager = DALLocator.getDataManager();
99
        }
100
101
102
        //=================================================
103
104
105
        public void printFeature(Feature feature, int maxColSize) {
106
                printFeature(feature, true, maxColSize);
107
        }
108
109
110
        public void printFeature(Feature feature, boolean showColName,int maxColSize) {
111
                FeatureType fType = feature.getType();
112
                if (showColName){
113
                        this.printFeatureTypeColNames(feature.getType(), maxColSize);
114
                }
115
                StringBuffer row = new StringBuffer();
116
                Iterator iter = fType.iterator();
117
                FeatureAttributeDescriptor attr;
118
119
                while (iter.hasNext()) {
120
                        attr = (FeatureAttributeDescriptor) iter.next();
121
                        row.append(truncateOrFillString(feature.get(attr.getName()),
122
                                        maxColSize + 1, ' '));
123
                }
124
                System.out.println(row.toString());
125
        }
126
127
        public String truncateOrFillString(Object str, int max, char fillWith) {
128
                if (str == null) {
129
                        return truncateOrFillString("{null}", max, fillWith);
130
                }
131
                return truncateOrFillString(str.toString(), max, fillWith);
132
        }
133
134
        public String truncateOrFillString(String str, int max, char fillWith) {
135
                if (str.length() > max) {
136
                        return str.substring(0, max - 1) + " ";
137
                } else {
138
                        StringBuffer strB = new StringBuffer(str);
139
                        while (strB.length() < max) {
140
                                strB.append(fillWith);
141
                        }
142
                        return strB.toString();
143
                }
144
145
        }
146
147
        public void printFeatureTypeColNames(FeatureType fType, int maxColSize) {
148
                Iterator iter = fType.iterator();
149
                FeatureAttributeDescriptor attr;
150
                StringBuffer colNames = new StringBuffer();
151
                StringBuffer typeNames = new StringBuffer();
152
                StringBuffer sep = new StringBuffer();
153
                if (maxColSize < 1){
154
                        maxColSize = 15;
155
                }
156
                while (iter.hasNext()) {
157
                        attr = (FeatureAttributeDescriptor) iter.next();
158
                        colNames.append(truncateOrFillString(attr.getName(), maxColSize + 1, ' '));
159
                        typeNames.append(truncateOrFillString("(" + attr.getDataTypeName() + ")",
160
                                        maxColSize + 1, ' '));
161
                        sep.append(truncateOrFillString("", maxColSize, '='));
162
                        sep.append(' ');
163
                }
164
165
                System.out.println("");
166
                System.out.println("");
167
                System.out.println(colNames.toString());
168
                System.out.println(typeNames.toString());
169
                System.out.println(sep.toString());
170
        }
171
172
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
173
                        FeatureType ftype, int dataType) {
174
                return getFirstAttributeOfType(ftype, new int[] { dataType });
175
        }
176
177
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
178
                        FeatureType ftype, int[] dataTypes) {
179
                FeatureAttributeDescriptor attr;
180
                Iterator iter = ftype.iterator();
181
                int i;
182
                while (iter.hasNext()) {
183
                        attr = (FeatureAttributeDescriptor) iter.next();
184
                        for (i = 0; i < dataTypes.length; i++) {
185
                                if (attr.getType() == dataTypes[i]) {
186
                                        return attr;
187
                                }
188
                        }
189
                }
190
                return null;
191
        }
192
193
        protected boolean compareDynObject(DynObject obj1, DynObject obj2) {
194
                DynClass dynClass = obj1.getDynClass();
195
                if (!dynClass.getName().equals(obj2.getDynClass().getName())) {
196
                        return false;
197
                }
198
199
                DynField[] fields = dynClass.getDeclaredDynFields();
200
                String fieldName;
201
                Object v1, v2;
202
                for (int i = 0; i < fields.length; i++) {
203
                        fieldName = fields[i].getName();
204
                        v1 = obj1.getDynValue(fieldName);
205
                        v2 = obj2.getDynValue(fieldName);
206
                        if (v1 == v2) {
207
                                continue;
208
                        } else if (v1 != null) {
209
                                if (!v1.equals(v2)) {
210
                                        return false;
211
                                }
212
                        }
213
                }
214
215
                return true;
216
        }
217
218
        protected boolean compareStores(FeatureStore store1, FeatureStore store2)
219
                        throws DataException {
220
                if (store1.getParameters().getClass() != store2.getParameters()
221
                                .getClass()) {
222
                        return false;
223
                }
224
                if (!compareDynObject(store1.getParameters(), store2.getParameters())) {
225
                        return false;
226
                }
227
228
                if (store1.getEnvelope() != store2.getEnvelope()) {
229
                        if (store1.getEnvelope() != null) {
230
                                return store1.getEnvelope().equals(store2.getEnvelope());
231
                        } else {
232
                                return false;
233
                        }
234
                }
235
236
                if (!store1.getName().equals(store2.getName())) {
237
                        return false;
238
                }
239
                if (((FeatureSelection) store1.getSelection()).getSize() != ((FeatureSelection) store2
240
                                .getSelection()).getSize()) {
241
                        return false;
242
                }
243
                DisposableIterator iter1 = ((FeatureSelection) store1.getSelection())
244
                                .fastIterator();
245
                DisposableIterator iter2 = ((FeatureSelection) store2.getSelection())
246
                                .fastIterator();
247
                if (!compareFeatureIterators(iter1, iter2)) {
248
                        return false;
249
                }
250
                iter1.dispose();
251
                iter2.dispose();
252
253
                if (store1.getFeatureTypes().size() != store2.getFeatureTypes().size()) {
254
                        return false;
255
                }
256
                Iterator iterTypes1 = store1.getFeatureTypes().iterator();
257
                Iterator iterTypes2 = store2.getFeatureTypes().iterator();
258
                while (iterTypes1.hasNext()) {
259
                        if (!compareTypes((FeatureType) iterTypes1.next(),
260
                                        (FeatureType) iterTypes2
261
                                        .next())) {
262
                                return false;
263
                        }
264
                }
265
                if (!compareTypes(store1.getDefaultFeatureType(), store2
266
                                .getDefaultFeatureType())) {
267
                        return false;
268
                }
269
270
                if (store1.getLocks() != null) {
271
                        if (store1.getLocks().getLocksCount() != store2.getLocks()
272
                                        .getLocksCount()) {
273
                                return false;
274
                        }
275
                        if (!compareFeatureIterators(store1.getLocks().getLocks(), store2
276
                                        .getLocks().getLocks())) {
277
                                return false;
278
                        }
279
280
                } else if (store2.getLocks() != null) {
281
                        return false;
282
                }
283
284
                return true;
285
        }
286
287
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2) {
288
                Feature feature;
289
                Feature ffeature;
290
                while (iter1.hasNext()) {
291
                        feature = (Feature) iter1.next();
292
                        ffeature = (Feature) iter2.next();
293
                        if (!this.compareFeatures(feature, ffeature)) {
294
                                return false;
295
                        }
296
                }
297
298
                if (!iter2.hasNext()) {
299
                        return true;
300
                } else {
301
                        getLogger().warn("size !=");
302
                        return false;
303
                }
304
305
        }
306
307
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2,
308
                        String[] attrNames) {
309
                Feature feature;
310
                Feature ffeature;
311
                while (iter1.hasNext()) {
312
                        feature = (Feature) iter1.next();
313
                        ffeature = (Feature) iter2.next();
314
                        if (!this.compareFeatures(feature, ffeature, attrNames)) {
315
                                return false;
316
                        }
317
                }
318
319
                return !iter2.hasNext();
320
321
        }
322
323
324
325
        protected boolean compareTypes(FeatureType ft1, FeatureType ft2) {
326
                if (ft1.size() != ft2.size()) {
327
                        getLogger().warn("size !=");
328
                        return false;
329
                }
330
                if (ft1.getDefaultGeometryAttributeIndex() != ft2
331
                                .getDefaultGeometryAttributeIndex()) {
332
                        getLogger().warn(
333
                                        "getDefaultGeometryAttributeIndex "
334
                                                        + ft1.getDefaultGeometryAttributeIndex() +
335
                                        " !="+ ft2.getDefaultGeometryAttributeIndex());
336
                        return false;
337
                }
338
                if (ft1.getDefaultGeometryAttributeIndex() > -1) {
339
                        if (ft1.getDefaultSRS() != null) {
340
                                if (!ft1.getDefaultSRS().equals(ft2.getDefaultSRS())) {
341
                                        getLogger().warn("getDefaultSRS !=");
342
                                        return false;
343
                                }
344
345
                        } else {
346
                                if (ft2.getDefaultSRS() != null) {
347
                                        getLogger().warn("getDefaultSRS !=");
348
                                        return false;
349
                                }
350
                        }
351
                }
352
353
                if (ft1.getDefaultGeometryAttributeName() != null) {
354
                        if (!ft1.getDefaultGeometryAttributeName().equals(
355
                                        ft2.getDefaultGeometryAttributeName())) {
356
                                getLogger().warn("getDefaultGeometryAttributeName !=");
357
358
                                return false;
359
                        }
360
                } else {
361
                        if (ft2.getDefaultGeometryAttributeName() != null) {
362
                                getLogger().warn("getDefaultGeometryAttributeName !=");
363
                                return false;
364
                        }
365
                }
366
367
368
369
                FeatureAttributeDescriptor attr1, attr2;
370
                for (int i = 0; i < ft1.size(); i++) {
371
                        attr1 = ft1.getAttributeDescriptor(i);
372
                        attr2 = ft2.getAttributeDescriptor(i);
373
374
                        if (!compareAttributes(attr1, attr2)) {
375
                                return false;
376
                        }
377
378
                }
379
                return true;
380
381
        }
382
383
        protected boolean compareAttributes(FeatureAttributeDescriptor attr1,
384
                        FeatureAttributeDescriptor attr2) {
385
                if (attr1 == null || attr2 == null) {
386
                        getLogger().warn("attr1 == null || attr2 == null");
387
                        return false;
388
                }
389
                if (!attr1.getName().equals(attr2.getName())) {
390
                        getLogger().warn(
391
                                        "name '" + attr1.getName() + "' != '" + attr2.getName()
392
                                                        + "'");
393
                        return false;
394
                }
395
396
                if (attr1.getDataType() != attr2.getDataType()) {
397
                        getLogger().warn(
398
                                        attr1.getName() + ":" +
399
                                        "dataType '" + attr1.getDataTypeName() + "'["
400
                                                        + attr1.getDataType() + "] != '"
401
                                                        + attr2.getDataTypeName() + "'["
402
                                                        + attr2.getDataType() + "]");
403
                        return false;
404
                }
405
406
                if (attr1.getSize() != attr2.getSize()) {
407
                        getLogger().warn(
408
                                        attr1.getName() + ":" +
409
                                        "size " + attr1.getSize() + " != " + attr2.getSize());
410
                        return false;
411
                }
412
413
                if (attr1.getPrecision() != attr2.getPrecision()) {
414
                        getLogger().warn(
415
                                        attr1.getName() + ":" +
416
                                        "precision " + attr1.getPrecision() + " != "
417
                                                        + attr1.getPrecision());
418
                        return false;
419
                }
420
421
                if (attr1.getGeometryType() != attr2.getGeometryType()) {
422
                        getLogger().warn(
423
                                        attr1.getName() + ":" +
424
                                        "GeometryType " + attr1.getGeometryType() + " != "
425
                                                        + attr2.getGeometryType());
426
                        return false;
427
                }
428
429
                if (attr1.getGeometrySubType() != attr2.getGeometrySubType()) {
430
                        getLogger().warn(
431
                                        attr1.getName() + ":" +
432
                                        "GeometrySubType " + attr1.getGeometrySubType() + " != "
433
                                                        + attr2.getGeometrySubType());
434
435
                        return false;
436
                }
437
438
                if (attr1.getSRS() != null) {
439
                        if (!attr1.getSRS().equals(attr2.getSRS())) {
440
                                getLogger().warn(
441
                                                attr1.getName() + ":" +
442
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
443
                                return false;
444
                        }
445
                } else {
446
                        if (attr2.getSRS() != null) {
447
                                getLogger().warn(
448
                                                attr1.getName() + ":" +
449
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
450
                                return false;
451
                        }
452
                }
453
454
                return true;
455
        }
456
457
        protected boolean compareFeatures(Feature f1, Feature f2,
458
                        String[] attrsNames) {
459
                FeatureAttributeDescriptor attr1;
460
                FeatureAttributeDescriptor attr2;
461
                Object v1, v2;
462
                for (int i = 0; i < attrsNames.length; i++) {
463
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
464
                        attr2 = f2.getType().getAttributeDescriptor(attrsNames[i]);
465
                        if (attr1 != attr2) {
466
                                if (!compareAttributes(attr1, attr1)) {
467
                                        return false;
468
                                }
469
                        }
470
                        v1 = f1.get(attr1.getName());
471
                        v2 = f2.get(attr2.getName());
472
                        if (!compareFeatureValue(v1, v2, attr1)) {
473
                                return false;
474
                        }
475
                }
476
477
                return true;
478
        }
479
480
        protected boolean compareFeatures(Feature f1, Feature f2) {
481
                if (!compareTypes(f1.getType(), f2.getType())) {
482
                        return false;
483
                }
484
                Iterator iter = f1.getType().iterator();
485
                FeatureAttributeDescriptor attr;
486
                Object v1, v2;
487
                while (iter.hasNext()) {
488
                        attr = (FeatureAttributeDescriptor) iter.next();
489
                        v1 = f1.get(attr.getName());
490
                        v2 = f2.get(attr.getName());
491
                        if (!compareFeatureValue(v1, v2, attr)) {
492
                                return false;
493
                        }
494
                }
495
496
                return true;
497
498
        }
499
500
        protected boolean compareFeatureValue(Object v1, Object v2,
501
                        FeatureAttributeDescriptor attr) {
502
503
                if ((v1 == null || v2 == null) &&  !attr.allowNull() ){
504
                        getLogger().warn("null and !allowNull:"
505
                                                        + attr.getName());
506
                        return false;
507
                }
508
509
                if (v1 == v2) {
510
                        return true;
511
                } else if (v1 == null) {
512
                        getLogger().warn(" v1 == null and v2 != null:"
513
                                                        + attr.getName());
514
                        return false;
515
                } else if (v2 == null) {
516
                        getLogger().warn("v2 == null and v1 != null:"
517
                                                        + attr.getName());
518
                        return false;
519
520
                }
521
                switch (attr.getType()) {
522
                case DataTypes.GEOMETRY:
523
                        Geometry geom1 = (Geometry) v1;
524
                        Geometry geom2 = (Geometry) v2;
525
                        if (!geom1.equals(geom2)) {
526
                                getLogger().warn(" v1 != v2 (Geom):" + attr.getName());
527
                                return false;
528
529
                        }
530
                        return true;
531
                case DataTypes.DOUBLE:
532
                        double diff = ((Double) v1).doubleValue()
533
                                        - ((Double) v1).doubleValue();
534
                        if (!(Math.abs(diff) < 0.000001)) {
535
                                getLogger().warn(" v1 != v2 (Dobule):" + attr.getName());
536
                                return false;
537
538
                        }
539
                        return true;
540
541
                case DataTypes.OBJECT:
542
                        if (!v1.equals(v2)) {
543
                                getLogger().warn(
544
                                                " v1 != v2 (object):" + attr.getName() + " [ignored]");
545
                                return false;
546
                        }
547
                        return true;
548
549
                default:
550
                        if (!v1.equals(v2)) {
551
                                getLogger()
552
                                                .warn(
553
                                                                " v1 != v2:" + attr.getName() + ": " + v1
554
                                                                                + " != " + v2);
555
                                return false;
556
                        }
557
                }
558
                return true;
559
560
        }
561
562
563
        //------------------------------------------------
564
565
        public void testSimpleIteration(FeatureStore store) {
566
                this.testSimpleIteration(store, null);
567
        }
568
569
        protected String[] getRandomAttibuteList(FeatureType fType) {
570
                String[] attrNames = new String[fType.size()];
571
                Iterator iter = fType.iterator();
572
                int i = 0;
573
                while (iter.hasNext()) {
574
                        attrNames[i] = ((FeatureAttributeDescriptor) iter.next()).getName();
575
                        i++;
576
                }
577
                return this.getRandomAttibuteList(attrNames);
578
        }
579
580
        protected Random getRandom(){
581
                if (rnd == null){
582
                        rnd = new Random();
583
                        rnd.setSeed(System.currentTimeMillis());
584
                }
585
                return rnd;
586
        }
587
588
        protected String[] getRandomAttibuteList(String[] attrNames) {
589
                int nAttributes = getRandom().nextInt(
590
                                attrNames.length + (attrNames.length / 2)) + 1;
591
                TreeSet set = new TreeSet();
592
                for (int i = 0; i < nAttributes; i++) {
593
                        set.add(attrNames[getRandom().nextInt(attrNames.length)]);
594
                }
595
                return (String[]) set.toArray(new String[0]);
596
        }
597
598
        public void testIterationFastAndStandart(FeatureStore store)
599
                        throws Exception {
600
                this.testIterationFastAndStandart(store, null);
601
602
                FeatureQuery query = this.getDefaultQuery(store);
603
                // Random Attribute list
604
                query.setAttributeNames(getRandomAttibuteList(store
605
                                .getDefaultFeatureType()));
606
                this.testIterationFastAndStandart(store, query);
607
608
                // Sorted
609
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(store
610
                                .getDefaultFeatureType(), new int[] { DataTypes.INT,
611
                                DataTypes.LONG, DataTypes.STRING, DataTypes.DOUBLE, DataTypes.FLOAT });
612
                {
613
                        // asure that attr is in query attributes
614
                        boolean attrFound = false;
615
                        String[] curAttrs = query.getAttributeNames();
616
                        for (int i = 0; i < curAttrs.length; i++) {
617
                                if (curAttrs[i].equals(attr.getName())) {
618
                                        attrFound = true;
619
                                        break;
620
621
                                }
622
                        }
623
                        if (!attrFound) {
624
                                String[] newAttrs = new String[curAttrs.length + 1];
625
                                for (int i = 0; i < curAttrs.length; i++) {
626
                                        newAttrs[i] = curAttrs[i];
627
                                }
628
                                newAttrs[curAttrs.length] = attr.getName();
629
                                query.setAttributeNames(newAttrs);
630
                        }
631
                }
632
633
634
                query.getOrder().add(attr.getName(), true);
635
                this.testIterationFastAndStandart(store, query);
636
637
                // Filter
638
                query = this.getDefaultQuery(store);
639
640
                query.setFilter(new Evaluator(){
641
                    private EvaluatorFieldsInfo evaluatorFieldsInfo = new EvaluatorFieldsInfo();
642
643
                        public Object evaluate(EvaluatorData data)
644
                                        throws EvaluatorException {
645
                                // TODO Auto-generated method stub
646
                                return Boolean.TRUE;
647
                        }
648
649
                        public String getSQL() {
650
                                return "true = true";
651
                        }
652
653
                        public String getDescription() {
654
                                // TODO Auto-generated method stub
655
                                return null;
656
                        }
657
658
                        public String getName() {
659
                                return "AlwaysTrue";
660
                        }
661
662
                        public EvaluatorFieldsInfo getFieldsInfo() {
663
                                return evaluatorFieldsInfo;
664
                        }
665
666
                });
667
                this.testIterationFastAndStandart(store, query);
668
669
                // Filter + Sorted
670
                query.getOrder().add(attr.getName(), true);
671
                this.testIterationFastAndStandart(store, query);
672
        }
673
674
        public void testSimpleIteration(FeatureStore store, FeatureQuery query) {
675
                FeatureSet set;
676
                try {
677
678
                        if (query == null) {
679
                                query = this.getDefaultQuery(store);
680
                        }
681
                        set = store.getFeatureSet(query);
682
                        FeatureType type = set.getDefaultFeatureType();
683
684 42488 jjdelcerro
                        DisposableIterator it = set.fastIterator();
685 40435 jjdelcerro
                        Feature feature;
686
                        printFeatureTypeColNames(type, 15);
687
                        while (it.hasNext()) {
688
689
                                feature = (Feature) it.next();
690
                                printFeature(feature, false, 15);
691
                        }
692
693
                        it.dispose();
694
                        set.dispose();
695
696
                } catch (DataException e3) {
697
                        e3.printStackTrace();
698
                        fail();
699
                        return;
700
                }
701
702
        }
703
704
        public void testIterationFastAndStandart(FeatureStore store,
705
                        FeatureQuery query) {
706
                FeatureSet set;
707
                try {
708
709
                        if (query == null) {
710
                                query = this.getDefaultQuery(store);
711
                        }
712
                        set = store.getFeatureSet(query);
713
714 42488 jjdelcerro
                        DisposableIterator it = set.fastIterator();
715 40435 jjdelcerro
                        DisposableIterator fit = set.fastIterator();
716
717
                        assertTrue(this.compareFeatureIterators(it, fit));
718
719
                        it.dispose();
720
                        fit.dispose();
721
                        set.dispose();
722
723
                } catch (DataException e3) {
724
                        e3.printStackTrace();
725
                        fail();
726
                        return;
727
                }
728
729
        }
730
731
        public void testSimpleIteration(DataStoreParameters parameters)
732
                        throws Exception {
733
                FeatureStore store = null;
734
                store = (FeatureStore) dataManager.openStore(parameters
735
                                .getDataStoreName(), parameters);
736
737
                this.testSimpleIteration(store);
738
739
                store.dispose();
740
741
        }
742
743
        public void testIterationFastAndStandart(DataStoreParameters parameters)
744
                        throws Exception {
745
                FeatureStore store = null;
746
                store = (FeatureStore) dataManager.openStore(parameters
747
                                .getDataStoreName(), parameters);
748
749
                this.testIterationFastAndStandart(store);
750
751
                store.dispose();
752
753
        }
754
755
        /**
756
         *
757
         * @param count
758
         *            if (< 0) list.size() >= 1 else list.size() == count
759
         * @throws Exception
760
         */
761
        public void testExplorerList(int count) throws Exception {
762
                FeatureStore store = null;
763
                DataStoreParameters params = getDefaultDataStoreParameters();
764
                store = (FeatureStore) dataManager.openStore(params.getDataStoreName(),
765
                                params);
766
767
                DataServerExplorer explorer;
768
                explorer = store.getExplorer();
769
770
                if (count < 0) {
771
                        assertTrue(explorer.list().size() >= 1);
772
                } else {
773
                        assertTrue(explorer.list().size() == count);
774
                }
775
776
                store.dispose();
777
778
                explorer.dispose();
779
        }
780
781
        //=================================================
782
        //=================================================
783
784
785
786
787
        public void testIterationFastAndStandart() throws Exception {
788
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
789
        }
790
791
        public void testSimpleIteration() throws Exception {
792
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
793
        }
794
795
        public void testInitializeStore() throws Exception {
796
                DataStoreParameters params = getDefaultDataStoreParameters();
797
                FeatureStore store = (FeatureStore) dataManager.openStore(params
798
                                .getDataStoreName(), params);
799
800
                assertNotNull(store.getMetadataID());
801
                assertNotNull(store.getName());
802
                assertEquals(store.getEnvelope(), store.getDynValue("Envelope"));
803
                assertTrue("Feature count not > 0", store.getFeatureCount() > 0);
804
                if (store.isLocksSupported()) {
805
                        assertNotNull(store.getLocks());
806
                } else {
807
                        assertNull(store.getLocks());
808
                }
809
                store.dispose();
810
        }
811
812
813
        public void testExplorer() throws Exception {
814
                if (!this.hasExplorer()) {
815
                        return;
816
                }
817
                this.testExplorerList(-1);
818
819
        }
820
821
        public void testSelection() throws Exception {
822
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
823
824
                FeatureStore store = (FeatureStore) dataManager.openStore(parameters
825
                                .getDataStoreName(), parameters);
826
                FeatureSet set = store.getFeatureSet();
827
828
                assertTrue(store.getFeatureSelection().isEmpty());
829
                store.setSelection(set);
830
                assertFalse(store.getFeatureSelection().isEmpty());
831
832
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
833
834 42488 jjdelcerro
                DisposableIterator iter = set.fastIterator();
835 40435 jjdelcerro
                while (iter.hasNext()) {
836
                        assertTrue(store.getFeatureSelection().isSelected(
837
                                        (Feature) iter.next()));
838
                }
839
                iter.dispose();
840
841
                store.getFeatureSelection().reverse();
842
                assertTrue(store.getFeatureSelection().isEmpty());
843
                assertEquals(0, store.getFeatureSelection().getSize());
844 42488 jjdelcerro
                iter = set.fastIterator();
845 40435 jjdelcerro
                while (iter.hasNext()) {
846
                        assertFalse(store.getFeatureSelection().isSelected(
847
                                        (Feature) iter.next()));
848
                }
849
                iter.dispose();
850
851
                store.getFeatureSelection().reverse();
852
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
853
                assertFalse(store.getFeatureSelection().isEmpty());
854
855
                set.dispose();
856
857
        }
858
859
        public void testCustomFTypeSet() throws Exception {
860
                DataStoreParameters dbfParameters = this
861
                                .getDefaultDataStoreParameters();
862
863
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
864
                                .getDataStoreName(), dbfParameters);
865
866
                testCustomFTypeSet(store);
867
868
                store.dispose();
869
        }
870
871
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
872
873
                FeatureSet set, set1;
874
                FeatureQuery query;
875
                DisposableIterator iter, iter1;
876
                Iterator attrIter;
877
                FeatureAttributeDescriptor attr;
878
879
                set = store.getFeatureSet(this.getDefaultQuery(store));
880
                attrIter = store.getDefaultFeatureType().iterator();
881
882
                String[] names;
883
                while (attrIter.hasNext()) {
884
                        attr = (FeatureAttributeDescriptor) attrIter.next();
885
                        int fieldIndex = attr.getIndex();
886
887
                        query = this.getDefaultQuery(store);
888
                        String fieldName = store.getDefaultFeatureType()
889
                        .getAttributeDescriptor(fieldIndex).getName();
890
891
                        names = new String[] { fieldName };
892
                        query.setAttributeNames(names);
893
                        set1 = store.getFeatureSet(query);
894
895
                        if (getRandom().nextBoolean()) {
896
                                iter = set.fastIterator();
897
                        } else {
898 42488 jjdelcerro
                                iter = set.fastIterator();
899 40435 jjdelcerro
                        }
900
                        if (getRandom().nextBoolean()) {
901
                                iter1 = set1.fastIterator();
902
                        } else {
903 42488 jjdelcerro
                                iter1 = set1.fastIterator();
904 40435 jjdelcerro
                        }
905
906
                        assertTrue(compareFeatureIterators(iter, iter1, names));
907
908
                        iter.dispose();
909
                        iter1.dispose();
910
                        set1.dispose();
911
                }
912
913
                int ntimes = getRandom().nextInt(10) + 5;
914
                FeatureType type = store.getDefaultFeatureType();
915
                query = this.getDefaultQuery(store);
916
                for (int i = 0; i < ntimes; i++) {
917
                        names = getRandomAttibuteList(type);
918
919
                        query.setAttributeNames(names);
920
                        set1 = store.getFeatureSet(query);
921
922
                        if (getRandom().nextBoolean()) {
923
                                iter = set.fastIterator();
924
                        } else {
925 42488 jjdelcerro
                                iter = set.fastIterator();
926 40435 jjdelcerro
                        }
927
                        if (getRandom().nextBoolean()) {
928
                                iter1 = set1.fastIterator();
929
                        } else {
930 42488 jjdelcerro
                                iter1 = set1.fastIterator();
931 40435 jjdelcerro
                        }
932
933
                        assertTrue(compareFeatureIterators(iter, iter1, names));
934
935
                        iter.dispose();
936
                        iter1.dispose();
937
938
                        iter1 = set1.fastIterator();
939
                        assertTrue(checksAttributesPositions(iter1, names));
940
                        iter1.dispose();
941
942 42488 jjdelcerro
                        iter1 = set1.fastIterator();
943 40435 jjdelcerro
                        assertTrue(checksAttributesPositions(iter1, names));
944
                        iter1.dispose();
945
946
                        set1.dispose();
947
948
949
                }
950
951
952
953
                set.dispose();
954
955
        }
956
957
        protected boolean checksAttributesPositions(DisposableIterator iter,
958
                        String[] names) {
959
                Feature feature;
960
                FeatureType type;
961
                FeatureAttributeDescriptor attr;
962
                while (iter.hasNext()) {
963
                        feature = (Feature) iter.next();
964
                        type = feature.getType();
965
                        for (int i = 0; i < names.length; i++) {
966
                                attr = type.getAttributeDescriptor(i);
967
                                if (!names[i].equals(attr.getName())) {
968
                                        getLogger().error(
969
                                                        "Error in attribute {} (expected: '{}' have: '{}'",
970
                                                        new Object[] { new Integer(i), names[i],
971
                                                                        attr.getName() });
972
                                        return false;
973
                                }
974
                        }
975
                }
976
                return true;
977
        }
978
979
         public void testPersistence() throws Exception {
980
                if (ToolsLocator.getPersistenceManager() == null) {
981
                        fail("Default Persistence Manager not register");
982
                }
983
                DataStoreParameters params = this.getDefaultDataStoreParameters();
984
985
                FeatureStore store = (FeatureStore) dataManager.openStore(params
986
                                .getDataStoreName(), params);
987
988
                testSimpleIteration(store);
989
990
                PersistentState state = ToolsLocator.getPersistenceManager().getState(
991
                                store);
992
993
                FeatureStore store2 = (FeatureStore) ToolsLocator
994
                                .getPersistenceManager().create(state);
995
996
                testSimpleIteration(store2);
997
998
                assertTrue(compareStores(store, store2));
999
1000
                store.dispose();
1001
                store2.dispose();
1002
1003
        }
1004
1005
1006
        public void testSort() throws Exception {
1007
                DataStoreParameters dbfParameters = this
1008
                                .getDefaultDataStoreParameters();
1009
1010
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1011
                                .getDataStoreName(), dbfParameters);
1012
1013
                testSort(store);
1014
1015
                store.dispose();
1016
1017
        }
1018
1019
        public void testSort(FeatureStore store) throws Exception{
1020
                FeatureSet set1;
1021
                FeatureQuery query;
1022
                DisposableIterator iter1;
1023
                Iterator attrIter;
1024
                FeatureAttributeDescriptor attr;
1025
1026
                attrIter = store.getDefaultFeatureType().iterator();
1027
1028
                String[] names;
1029
                while (attrIter.hasNext()) {
1030
                        attr = (FeatureAttributeDescriptor) attrIter.next();
1031
1032
                        if (attr.getType() == DataTypes.GEOMETRY) {
1033
                                continue;
1034
                        }
1035
                        query = this.getDefaultQuery(store);
1036
                        String fieldName = attr.getName();
1037
1038
1039
1040
                        names = new String[] { fieldName };
1041
                        query.setAttributeNames(names);
1042
                        query.getOrder().add(fieldName, getRandom().nextBoolean());
1043
1044
                        set1 = store.getFeatureSet(query);
1045
                        if (getRandom().nextBoolean()) {
1046
                                iter1 = set1.fastIterator();
1047
                        } else {
1048 42488 jjdelcerro
                                iter1 = set1.fastIterator();
1049 40435 jjdelcerro
                        }
1050
1051
                        assertTrue(checkSort(iter1, query));
1052
1053
                        iter1.dispose();
1054
                        set1.dispose();
1055
                }
1056
1057
                int ntimes = getRandom().nextInt(10) + 5;
1058
                FeatureType type = store.getDefaultFeatureType();
1059
                query = this.getDefaultQuery(store);
1060
                for (int i = 0; i < ntimes; i++) {
1061
                        names = getRandomAttibuteList(type);
1062
1063
                        int nShortFields = getRandom().nextInt(names.length) + 1;
1064
                        query.getOrder().clear();
1065
                        for (int j = 0; j < nShortFields; j++) {
1066
                                attr = store.getDefaultFeatureType().getAttributeDescriptor(names[getRandom().nextInt(names.length)]);
1067
                                if (attr.getType() == DataTypes.INT
1068
                                                || attr.getType() == DataTypes.LONG
1069
                                                || attr.getType() == DataTypes.DOUBLE
1070
                                                || attr.getType() == DataTypes.STRING
1071
                                                || attr.getType() == DataTypes.DATE
1072
                                                || attr.getType() == DataTypes.BOOLEAN
1073
                                                || attr.getType() == DataTypes.BYTE
1074
                                                || attr.getType() == DataTypes.FLOAT) {
1075
1076
                                        query.getOrder().add(attr.getName(),
1077
                                                        getRandom().nextBoolean());
1078
                                }
1079
                        }
1080
1081
                        query.setAttributeNames(names);
1082
                        set1 = store.getFeatureSet(query);
1083
1084
                        // if (getRandom().nextBoolean()) {
1085
                                iter1 = set1.fastIterator();
1086
                                // } else {
1087
                                // iter1 = set1.iterator();
1088
                                // }
1089
1090
                                assertTrue(checkSort(iter1, query));
1091
1092
                                iter1.dispose();
1093
                                set1.dispose();
1094
1095
                }
1096
1097
        }
1098
1099
1100
        public boolean checkSort(Iterator iter, FeatureQuery query) {
1101
1102
                FeatureQueryOrderMember order;
1103
                Feature prevFeature = null;
1104
                Feature currFeature = null;
1105
                boolean isFirst = true;
1106
                Comparable v1, v2;
1107
                Object o1, o2;
1108
                int v;
1109
                FeatureQueryOrder queryOrder = query.getOrder();
1110
1111
                Iterator orderIter;
1112
1113
                //for debug only
1114
                /*
1115
                System.out.println("\nCheck order:");
1116
                Iterator orderIter = queryOrder.iterator();
1117
                while (orderIter.hasNext()) {
1118
                        order = (FeatureQueryOrderMember) orderIter.next();
1119
                        System.out.print(order.getAttributeName() + " ");
1120
                        if (order.getAscending()) {
1121
                                System.out.print("Asc, ");
1122
                        } else {
1123
                                System.out.print("Desc, ");
1124
                        }
1125
                }
1126
                System.out.println(";");
1127
                */
1128
1129
                while (iter.hasNext()) {
1130
                        currFeature = (Feature) iter.next();
1131
                        if (isFirst) {
1132
                                prevFeature = currFeature.getCopy();
1133
                                // printFeature(prevFeature, true, 15);
1134
                                isFirst = false;
1135
                                continue;
1136
                        }
1137
                        // printFeature(currFeature, false, 15);
1138
                        orderIter = queryOrder.iterator();
1139
                        while (orderIter.hasNext()) {
1140
                                order = (FeatureQueryOrderMember) orderIter.next();
1141
                                if (order.hasEvaluator()) {
1142
                                        try {
1143
                                                o1 = order.getEvaluator().evaluate(
1144
                                                                (EvaluatorData) prevFeature);
1145
                                                o2 = order.getEvaluator().evaluate(
1146
                                                                (EvaluatorData) currFeature);
1147
                                        } catch (EvaluatorException e) {
1148
                                                throw new DataEvaluatorRuntimeException(e);
1149
                                        }
1150
                                } else {
1151
1152
                                        o1 = prevFeature.get(order.getAttributeName());
1153
                                        o2 = currFeature.get(order.getAttributeName());
1154
                                }
1155
                                if (o1 instanceof Comparable && o2 instanceof Comparable) {
1156
                                        v1 = (Comparable) o1;
1157
                                        v2 = (Comparable) o2;
1158
                                } else {
1159
                                        // uncomparable objets
1160
                                        break;
1161
                                }
1162
                                if (v1 == null) {
1163
                                        if (v2 == null) {
1164
                                                break;
1165
                                        } else {
1166
                                                v = 1;
1167
                                        }
1168
                                } else {
1169
                                        v = v1.compareTo(v2);
1170
                                }
1171
                                if (v != 0) {
1172
                                        if (!order.getAscending()) {
1173
                                                v = -v;
1174
                                        }
1175
                                }
1176
                                if (v < 0) {
1177
                                        break;
1178
                                } else if (v > 0) {
1179
                                        // Checks for ignore case short
1180
                                        if (v1 instanceof String && v2 instanceof String) {
1181
                                                v1 = ((String)v1).toLowerCase();
1182
                                                v2 = ((String)v2).toLowerCase();
1183
                                                v = v1.compareTo(v2);
1184
                                                if (v != 0) {
1185
                                                        if (!order.getAscending()) {
1186
                                                                v = -v;
1187
                                                        }
1188
                                                }
1189
                                                if (v < 0) {
1190
                                                        getLogger()
1191
                                                                        .warn("Short compartor String ok with ignore case");
1192
                                                        break;
1193
                                                } else if (v > 0) {
1194
                                                        return false;
1195
                                                }
1196
                                        } else {
1197
                                                return false;
1198
                                        }
1199
                                }
1200
                        }
1201
                        prevFeature = currFeature.getCopy();
1202
                }
1203
1204
                return true;
1205
        }
1206
1207
        protected void fullStoreIteratorTest(FeatureStore store) throws Exception{
1208
                testIterationFastAndStandart(store);
1209
                testCustomFTypeSet(store);
1210
                testSort(store);
1211
        }
1212
1213
1214
        public void testTransformsData() throws Exception {
1215
                DataStoreParameters dbfParameters = this
1216
                                .getDefaultDataStoreParameters();
1217
1218
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1219
                                .getDataStoreName(), dbfParameters);
1220
1221
                FeatureStore store1 = (FeatureStore) dataManager.openStore(
1222
                                dbfParameters.getDataStoreName(), dbfParameters);
1223
1224
                FeatureStoreTransform transform = new StringsToLowerTransform();
1225
                transform.setFeatureStore(store);
1226
1227
                store.getTransforms().add(transform);
1228
1229
                FeatureSet set, set1;
1230
                DisposableIterator iter, iter1;
1231
                Iterator iterAttr;
1232
                FeatureAttributeDescriptor attr;
1233
                Feature feature, feature1;
1234
                int i, ntimes;
1235
                Object v1, v2;
1236
1237
1238
                fullStoreIteratorTest(store);
1239
1240
                set = store.getFeatureSet();
1241
                set1 = store1.getFeatureSet();
1242
                ntimes = getRandom().nextInt(3) + 1;
1243
                for (i = 0; i < ntimes; i++) {
1244
                        if (getRandom().nextBoolean()) {
1245
                                iter = set.fastIterator();
1246
                        } else {
1247 42488 jjdelcerro
                                iter = set.fastIterator();
1248 40435 jjdelcerro
                        }
1249
                        if (getRandom().nextBoolean()) {
1250
                                iter1 = set1.fastIterator();
1251
                        } else {
1252 42488 jjdelcerro
                                iter1 = set1.fastIterator();
1253 40435 jjdelcerro
                        }
1254
                        while (iter.hasNext()) {
1255
                                feature = (Feature) iter.next();
1256
                                feature1 = (Feature) iter1.next();
1257
1258
                                iterAttr = set.getDefaultFeatureType().iterator();
1259
                                while (iterAttr.hasNext()) {
1260
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1261
                                        v1 = feature.get(attr.getIndex());
1262
                                        v2 = feature1.get(attr.getIndex());
1263
                                        if (attr.getType() == DataTypes.STRING) {
1264
                                                if (v2 != null) {
1265
                                                        v2 = ((String) v2).toLowerCase();
1266
                                                }
1267
1268
                                        }
1269
                                        assertTrue(compareFeatureValue(v1, v2, attr));
1270
                                }
1271
                        }
1272
                        assertFalse(iter1.hasNext());
1273
                        iter.dispose();
1274
                        iter1.dispose();
1275
                }
1276
1277
1278
                set.dispose();
1279
                set1.dispose();
1280
1281
1282
                transform = new StringsToUpperTransform();
1283
                transform.setFeatureStore(store);
1284
1285
                store.getTransforms().add(transform);
1286
1287
                fullStoreIteratorTest(store);
1288
1289
                set = store.getFeatureSet();
1290
                set1 = store1.getFeatureSet();
1291
                ntimes = getRandom().nextInt(3) + 1;
1292
                for (i = 0; i < ntimes; i++) {
1293
                        if (getRandom().nextBoolean()) {
1294
                                iter = set.fastIterator();
1295
                        } else {
1296 42488 jjdelcerro
                                iter = set.fastIterator();
1297 40435 jjdelcerro
                        }
1298
                        if (getRandom().nextBoolean()) {
1299
                                iter1 = set1.fastIterator();
1300
                        } else {
1301 42488 jjdelcerro
                                iter1 = set1.fastIterator();
1302 40435 jjdelcerro
                        }
1303
                        while (iter.hasNext()) {
1304
                                feature = (Feature) iter.next();
1305
                                feature1 = (Feature) iter1.next();
1306
1307
                                iterAttr = set.getDefaultFeatureType().iterator();
1308
                                while (iterAttr.hasNext()) {
1309
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1310
                                        v1 = feature.get(attr.getIndex());
1311
                                        v2 = feature1.get(attr.getIndex());
1312
                                        if (attr.getType() == DataTypes.STRING) {
1313
                                                if (v2 != null) {
1314
                                                        v2 = ((String) v2).toUpperCase();
1315
                                                }
1316
1317
                                        }
1318
                                        compareFeatureValue(v1, v2, attr);
1319
                                }
1320
                        }
1321
                        assertFalse(iter1.hasNext());
1322
                        iter.dispose();
1323
                        iter1.dispose();
1324
                }
1325
                set.dispose();
1326
                set1.dispose();
1327
1328
1329
                transform = new AddPrefixAttributeName("_");
1330
                transform.setFeatureStore(store);
1331
1332
                store.getTransforms().add(transform);
1333
1334
                fullStoreIteratorTest(store);
1335
1336
                set = store.getFeatureSet();
1337
                set1 = store1.getFeatureSet();
1338
                ntimes = getRandom().nextInt(3) + 1;
1339
                for (i = 0; i < ntimes; i++) {
1340
                        if (getRandom().nextBoolean()) {
1341
                                iter = set.fastIterator();
1342
                        } else {
1343 42488 jjdelcerro
                                iter = set.fastIterator();
1344 40435 jjdelcerro
                        }
1345
                        if (getRandom().nextBoolean()) {
1346
                                iter1 = set1.fastIterator();
1347
                        } else {
1348 42488 jjdelcerro
                                iter1 = set1.fastIterator();
1349 40435 jjdelcerro
                        }
1350
                        while (iter.hasNext()) {
1351
                                feature = (Feature) iter.next();
1352
                                feature1 = (Feature) iter1.next();
1353
1354
                                iterAttr = set1.getDefaultFeatureType().iterator();
1355
                                while (iterAttr.hasNext()) {
1356
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1357
                                        v1 = feature.get("_" + attr.getName());
1358
                                        v2 = feature1.get(attr.getIndex());
1359
                                        if (attr.getType() == DataTypes.STRING) {
1360
                                                if (v2 != null) {
1361
                                                        v2 = ((String) v2).toUpperCase();
1362
                                                }
1363
1364
                                        }
1365
                                        compareFeatureValue(v1, v2, attr);
1366
                                }
1367
                        }
1368
                        assertFalse(iter1.hasNext());
1369
                        iter.dispose();
1370
                        iter1.dispose();
1371
                }
1372
                set.dispose();
1373
                set1.dispose();
1374
1375
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1376
                transform.setFeatureStore(store);
1377
1378
                store.getTransforms().add(transform);
1379
1380
                fullStoreIteratorTest(store);
1381
1382
                set = store.getFeatureSet();
1383
                set1 = store1.getFeatureSet();
1384
                ntimes = getRandom().nextInt(3) + 1;
1385
                for (i = 0; i < ntimes; i++) {
1386
                        if (getRandom().nextBoolean()) {
1387
                                iter = set.fastIterator();
1388
                        } else {
1389 42488 jjdelcerro
                                iter = set.fastIterator();
1390 40435 jjdelcerro
                        }
1391
                        if (getRandom().nextBoolean()) {
1392
                                iter1 = set1.fastIterator();
1393
                        } else {
1394 42488 jjdelcerro
                                iter1 = set1.fastIterator();
1395 40435 jjdelcerro
                        }
1396
                        while (iter.hasNext()) {
1397
                                feature = (Feature) iter.next();
1398
                                feature1 = (Feature) iter1.next();
1399
1400
                                iterAttr = set1.getDefaultFeatureType().iterator();
1401
                                while (iterAttr.hasNext()) {
1402
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1403
                                        v1 = feature.get("_" + attr.getName());
1404
                                        v2 = feature1.get(attr.getIndex());
1405
                                        if (attr.getType() == DataTypes.STRING) {
1406
                                                if (v2 != null) {
1407
                                                        v2 = ((String) v2).toUpperCase();
1408
                                                }
1409
1410
                                        }
1411
                                        compareFeatureValue(v1, v2, attr);
1412
                                }
1413
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1414
                                                .getDefaultFeatureType().getAttributeDescriptor(
1415
                                                                "__new__"));
1416
                        }
1417
                        assertFalse(iter1.hasNext());
1418
                        iter.dispose();
1419
                        iter1.dispose();
1420
                }
1421
                set.dispose();
1422
                set1.dispose();
1423
1424
1425
                transform = new RemoveAttribute("__new__");
1426
                transform.setFeatureStore(store);
1427
1428
                store.getTransforms().add(transform);
1429
1430
                fullStoreIteratorTest(store);
1431
1432
                set = store.getFeatureSet();
1433
                set1 = store1.getFeatureSet();
1434
                ntimes = getRandom().nextInt(3) + 1;
1435
                for (i = 0; i < ntimes; i++) {
1436
                        if (getRandom().nextBoolean()) {
1437
                                iter = set.fastIterator();
1438
                        } else {
1439 42488 jjdelcerro
                                iter = set.fastIterator();
1440 40435 jjdelcerro
                        }
1441
                        if (getRandom().nextBoolean()) {
1442
                                iter1 = set1.fastIterator();
1443
                        } else {
1444 42488 jjdelcerro
                                iter1 = set1.fastIterator();
1445 40435 jjdelcerro
                        }
1446
                        while (iter.hasNext()) {
1447
                                feature = (Feature) iter.next();
1448
                                feature1 = (Feature) iter1.next();
1449
1450
                                iterAttr = set1.getDefaultFeatureType().iterator();
1451
                                while (iterAttr.hasNext()) {
1452
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1453
                                        v1 = feature.get("_" + attr.getName());
1454
                                        v2 = feature1.get(attr.getIndex());
1455
                                        if (attr.getType() == DataTypes.STRING) {
1456
                                                if (v2 != null) {
1457
                                                        v2 = ((String) v2).toUpperCase();
1458
                                                }
1459
1460
                                        }
1461
                                        compareFeatureValue(v1, v2, attr);
1462
                                }
1463
                                assertNull(feature.getType().getAttributeDescriptor("__new__"));
1464
                        }
1465
                        assertFalse(iter1.hasNext());
1466
                        iter.dispose();
1467
                        iter1.dispose();
1468
                }
1469
                set.dispose();
1470
                set1.dispose();
1471
1472
                store.getTransforms().clear();
1473
1474
                compareStores(store, store1);
1475
1476
1477
                store.dispose();
1478
                store1.dispose();
1479
        }
1480
1481
        abstract class myTransform extends AbstractFeatureStoreTransform {
1482
                protected FeatureStore store;
1483
                protected FeatureType orgDefaultFType;
1484
                protected List orgFTypes;
1485
1486
                public void applyTransform(Feature source, EditableFeature target)
1487
                                throws DataException {
1488
1489
                        Iterator iter = target.getType().iterator();
1490
                        FeatureAttributeDescriptor attr;
1491
                        while (iter.hasNext()) {
1492
                                attr = (FeatureAttributeDescriptor) iter.next();
1493
                                this.setValue(source, target, attr);
1494
                        }
1495
1496
                }
1497
1498
                protected void setValue(Feature source, EditableFeature target,
1499
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1500
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1501
                }
1502
1503
                public FeatureType getDefaultFeatureType() throws DataException {
1504
                        return orgDefaultFType;
1505
                }
1506
1507
                public FeatureStore getFeatureStore() {
1508
                        return store;
1509
                }
1510
1511
                public List getFeatureTypes() throws DataException {
1512
                        return orgFTypes;
1513
                }
1514
1515
                public void setFeatureStore(FeatureStore featureStore) {
1516
                        this.store = featureStore;
1517
                        try {
1518
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1519
                                this.orgFTypes = this.store.getFeatureTypes();
1520
1521
                        } catch (DataException e) {
1522
                                throw new RuntimeException(e);
1523
                        }
1524
1525
                }
1526
1527
                public FeatureType getSourceFeatureTypeFrom(
1528
                                FeatureType targetFeatureType) {
1529
1530
                        return targetFeatureType;
1531
                }
1532
1533
        public String getName() {
1534
//            System.out
1535
//                .println("\nmyFeatureStore.getname(): " + store.getName());
1536
            return store.getName();
1537
        }
1538
1539
        public String getDescription() {
1540
//            System.out.println("\nmyFeatureStore.getDescription(getfullname): "
1541
//                + store.getFullName());
1542
            return store.getFullName();
1543
        }
1544
1545
        }
1546
1547
        abstract class TransformTypeTransform extends myTransform {
1548
1549
                private FeatureType myDefaultFeatureType = null;
1550
                private List myFeatureTypes = null;
1551
1552
                public FeatureType getDefaultFeatureType() throws DataException {
1553
                        if (this.myDefaultFeatureType == null) {
1554
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1555
                        }
1556
1557
                        return this.myDefaultFeatureType;
1558
                }
1559
1560
                protected abstract FeatureType transformType(FeatureType type);
1561
1562
                protected abstract FeatureType restoreType(FeatureType type);
1563
1564
1565
                public List getFeatureTypes() throws DataException {
1566
                        if (this.myFeatureTypes == null) {
1567
                                ArrayList list = new ArrayList();
1568
                                Iterator iter = orgFTypes.iterator();
1569
                                while (iter.hasNext()) {
1570
                                        FeatureType type = (FeatureType) iter.next();
1571
                                        if (type.getId().equals(
1572
                                                        this.getDefaultFeatureType().getId())) {
1573
                                                list.add(this.getDefaultFeatureType());
1574
                                        } else {
1575
                                                list.add(this.transformType(type));
1576
                                        }
1577
                                }
1578
                                this.myFeatureTypes = Collections.unmodifiableList(list);
1579
                        }
1580
                        return this.myFeatureTypes;
1581
                }
1582
1583
                public boolean isTransformsOriginalValues() {
1584
                        return false;
1585
                }
1586
1587
                public FeatureType getSourceFeatureTypeFrom(
1588
                                FeatureType targetFeatureType) {
1589
                        FeatureType org = null;
1590
                        FeatureType cur = null;
1591
                        Iterator iter = null;
1592
                        try {
1593
                                iter = this.getFeatureTypes().iterator();
1594
                        } catch (DataException e) {
1595
                                new RuntimeException(e);
1596
                        }
1597
                        while (iter.hasNext()) {
1598
                                cur = (FeatureType) iter.next();
1599
                                if (cur.getId().equals(targetFeatureType.getId())) {
1600
                                        org = cur;
1601
                                        break;
1602
                                }
1603
                        }
1604
                        if (org == null) {
1605
                                throw new RuntimeException();
1606
                        }
1607
1608
                        return this.restoreType(org);
1609
                }
1610
1611
        }
1612
1613
        abstract class TransformAttributeNameTransform extends
1614
                        TransformTypeTransform {
1615
1616
                protected void setValue(Feature source, EditableFeature target,
1617
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1618
                        target.set(attrTarget.getIndex(), source.get(this
1619
                                        .restoreAttributeName(attrTarget.getName())));
1620
                }
1621
1622
1623
                protected FeatureType transformType(FeatureType type) {
1624
                        EditableFeatureType result = type.getEditable();
1625
                        Iterator iter = result.iterator();
1626
                        EditableFeatureAttributeDescriptor attr;
1627
                        while (iter.hasNext()) {
1628
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1629
                                attr.setName(transformAttributeName(attr.getName()));
1630
                        }
1631
                        return result.getNotEditableCopy();
1632
                }
1633
1634
                protected abstract String transformAttributeName(String source);
1635
1636
                protected abstract String restoreAttributeName(String target);
1637
1638
                protected FeatureType restoreType(FeatureType type) {
1639
                        EditableFeatureType result;
1640
                        if (type instanceof EditableFeatureType) {
1641
                                result = (EditableFeatureType) type.getCopy();
1642
                        } else {
1643
                                result = type.getEditable();
1644
                        }
1645
                        Iterator iter = result.iterator();
1646
                        EditableFeatureAttributeDescriptor attr;
1647
                        while (iter.hasNext()) {
1648
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1649
1650
                                attr.setName(restoreAttributeName(attr.getName()));
1651
                        }
1652
                        return result.getNotEditableCopy();
1653
                }
1654
1655
                public FeatureType getSourceFeatureTypeFrom(
1656
                                FeatureType targetFeatureType) {
1657
                        FeatureType org = null;
1658
                        FeatureType cur = null;
1659
                        Iterator iter = null;
1660
                        iter = this.orgFTypes.iterator();
1661
                        while (iter.hasNext()) {
1662
                                cur = (FeatureType) iter.next();
1663
                                if (cur.getId().equals(targetFeatureType.getId())) {
1664
                                        org = cur;
1665
                                        break;
1666
                                }
1667
                        }
1668
                        if (cur == null) {
1669
                                throw new RuntimeException();
1670
                        }
1671
                        EditableFeatureType r = org.getEditable();
1672
                        iter = r.iterator();
1673
                        FeatureAttributeDescriptor attr;
1674
                        while (iter.hasNext()) {
1675
                                attr = (FeatureAttributeDescriptor) iter.next();
1676
                                if (targetFeatureType.getIndex(transformAttributeName(attr
1677
                                                .getName())) == -1) {
1678
                                        iter.remove();
1679
                                }
1680
                        }
1681
                        return r.getNotEditableCopy();
1682
                }
1683
1684
        }
1685
1686
1687
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1688
1689
                private String prefix;
1690
1691
                AddPrefixAttributeName(String prefix) {
1692
                        this.prefix = prefix;
1693
                }
1694
1695
                protected String restoreAttributeName(String target) {
1696
                        return target.substring(getPrefix().length(), target.length());
1697
                }
1698
1699
                private String getPrefix() {
1700
                        return prefix;
1701
                }
1702
1703
                protected String transformAttributeName(String source) {
1704
                        return getPrefix() + source;
1705
                }
1706
1707
        }
1708
1709
        class AddAttribute extends TransformTypeTransform {
1710
1711
                private String name;
1712
                private int type;
1713
                private Object defValue;
1714
                private int size;
1715
                private Evaluator eval;
1716
1717
                AddAttribute(String name) {
1718
                        this(name, DataTypes.STRING, null, 15);
1719
                }
1720
1721
                AddAttribute(String name, int type) {
1722
                        this(name, type, null, 15);
1723
                }
1724
1725
                AddAttribute(String name, int type, Object defValue) {
1726
                        this(name, type, defValue, 15);
1727
                }
1728
1729
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1730
                        this.name = name;
1731
                        this.type = type;
1732
                        this.defValue = null;
1733
                        this.size = size;
1734
                        this.eval = evaluator;
1735
                }
1736
1737
                AddAttribute(String name, int type, Object defValue, int size) {
1738
                        this.name = name;
1739
                        this.type = type;
1740
                        this.defValue = defValue;
1741
                        this.size = size;
1742
                        this.eval = null;
1743
                }
1744
1745
1746
1747
                protected FeatureType restoreType(FeatureType type) {
1748
                        EditableFeatureType result;
1749
                        if (type instanceof EditableFeatureType) {
1750
                                result = (EditableFeatureType) type.getCopy();
1751
                        } else {
1752
                                result = type.getEditable();
1753
                        }
1754
                        result.remove(this.name);
1755
                        return result.getNotEditableCopy();
1756
                }
1757
1758
                protected FeatureType transformType(FeatureType type) {
1759
                        EditableFeatureType result = type.getEditable();
1760
1761
                        EditableFeatureAttributeDescriptor att;
1762
                        if (this.eval == null) {
1763
                                att = result.add(name, this.type)
1764
                                                .setDefaultValue(this.defValue);
1765
                        } else {
1766
                                att = result.add(name, this.type, this.eval);
1767
                        }
1768
                        att.setSize(size);
1769
1770
1771
                        return result.getNotEditableCopy();
1772
                }
1773
1774
                protected void setValue(Feature source, EditableFeature target,
1775
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1776
                        if (attrTarget.getName().equals(this.name)) {
1777
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1778
                        } else {
1779
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1780
                                                .getName()));
1781
                        }
1782
                }
1783
        }
1784
1785
1786
        class RemoveAttribute extends TransformTypeTransform {
1787
1788
                private String attributeName;
1789
                private String fTypeIdToRemoveAttribute = null;
1790
                private FeatureAttributeDescriptor attr;
1791
1792
                RemoveAttribute(String attributeName) {
1793
                        this.attributeName = attributeName;
1794
                }
1795
1796
                RemoveAttribute(String attributeName, FeatureType fType) {
1797
                        this.attributeName = attributeName;
1798
                }
1799
1800
                protected FeatureType restoreType(FeatureType type) {
1801
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1802
                                return type;
1803
                        }
1804
                        EditableFeatureType result = type.getEditable();
1805
1806
                        EditableFeatureAttributeDescriptor att;
1807
                        if (this.attr.getEvaluator() == null) {
1808
                                att = result.add(attributeName, this.attr.getType())
1809
                                                .setDefaultValue(this.attr.getDefaultValue());
1810
                        } else {
1811
                                att = result.add(attributeName, this.attr.getType(),
1812
                                                this.attr.getEvaluator());
1813
                        }
1814
                        att.setSize(this.attr.getSize());
1815
                        att.setAllowNull(this.attr.allowNull());
1816
                        att.setGeometryType(this.attr.getGeometryType());
1817
                        att.setSRS(this.attr.getSRS());
1818
                        att.setPrecision(this.attr.getPrecision());
1819
                        // TODO
1820
1821
1822
                        return result.getNotEditableCopy();
1823
                }
1824
1825
                protected FeatureType transformType(FeatureType type) {
1826
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1827
                                return type;
1828
                        }
1829
1830
                        EditableFeatureType result;
1831
                        if (type instanceof EditableFeatureType) {
1832
                                result = (EditableFeatureType) type.getCopy();
1833
                        } else {
1834
                                result = type.getEditable();
1835
                        }
1836
                        result.remove(this.attributeName);
1837
                        return result.getNotEditableCopy();
1838
1839
                }
1840
1841
                public void setFeatureStore(FeatureStore featureStore) {
1842
                        Iterator iter;
1843
                        try {
1844
                                iter = featureStore.getFeatureTypes().iterator();
1845
                        } catch (DataException e) {
1846
                                throw new RuntimeException(e);
1847
                        }
1848
                        FeatureType type;
1849
                        FeatureAttributeDescriptor attrTmp;
1850
                        while (iter.hasNext()) {
1851
                                type = (FeatureType) iter.next();
1852
                                attrTmp = type.getAttributeDescriptor(this.attributeName);
1853
                                if (attrTmp != null) {
1854
                                        this.fTypeIdToRemoveAttribute = type.getId();
1855
                                        this.attr = attrTmp;
1856
                                        break;
1857
                                }
1858
                        }
1859
                        super.setFeatureStore(featureStore);
1860
                }
1861
1862
                public void applyTransform(Feature source, EditableFeature target)
1863
                                throws DataException {
1864
                        // TODO Auto-generated method stub
1865
                        super.applyTransform(source, target);
1866
                }
1867
1868
1869
1870
        }
1871
1872
1873
        public class StringsToLowerTransform extends myTransform {
1874
1875
                public boolean isTransformsOriginalValues() {
1876
                        return true;
1877
                }
1878
1879
                protected void setValue(Feature source, EditableFeature target,
1880
                                FeatureAttributeDescriptor attr) throws DataException {
1881
                        if (attr.getType() == DataTypes.STRING) {
1882
                                String v = ((String) source.get(attr.getName()));
1883
                                if (v != null){
1884
                                        v = v.toLowerCase();
1885
                                } else if (!attr.allowNull()) {
1886
                                        v = (String) attr.getDefaultValue();
1887
                                        v = v.toLowerCase();
1888
                                }
1889
                                target.set(attr.getName(), v);
1890
                        } else {
1891
                                target.set(attr.getName(), source.get(attr.getName()));
1892
                        }
1893
                }
1894
1895
        }
1896
1897
        class StringsToUpperTransform extends StringsToLowerTransform {
1898
                protected void setValue(Feature source, EditableFeature target,
1899
                                FeatureAttributeDescriptor attr) throws DataException {
1900
                        if (attr.getType() == DataTypes.STRING) {
1901
                                String v = ((String) source.get(attr.getName()));
1902
                                if (v != null) {
1903
                                        v = v.toUpperCase();
1904
                                } else if (!attr.allowNull()) {
1905
                                        v = (String) attr.getDefaultValue();
1906
                                        v.toUpperCase();
1907
                                }
1908
                                target.set(attr.getName(), v);
1909
                        } else {
1910
                                target.set(attr.getName(), source.get(attr.getName()));
1911
                        }
1912
                }
1913
1914
        }
1915
1916
1917
        public void testFeatureReference() throws Exception {
1918
                DataStoreParameters dbfParameters = this
1919
                                .getDefaultDataStoreParameters();
1920
1921
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1922
                                .getDataStoreName(), dbfParameters);
1923
1924
                Feature feature, refered;
1925
                FeatureSet set;
1926
                int nTimes2 = getRandom().nextInt(2) + 1;
1927
1928
                for (int j = 0; j < nTimes2; j++) {
1929
                        set = store.getFeatureSet();
1930
                        DisposableIterator iter;
1931
1932
                        int nTimes = getRandom().nextInt(2) + 3;
1933
                        for (int i = 0; i < nTimes; i++) {
1934
                                if (getRandom().nextBoolean()) {
1935
                                        iter = set.fastIterator();
1936
                                } else {
1937
                                        iter = set.fastIterator();
1938
                                }
1939
                                while (iter.hasNext()) {
1940
                                        feature = (Feature) iter.next();
1941
                                        refered = feature.getReference().getFeature();
1942
                                        compareFeatures(feature, refered);
1943
                                }
1944
                                iter.dispose();
1945
                        }
1946
1947
                        set.dispose();
1948
                }
1949
1950
                nTimes2 = getRandom().nextInt(5) + 2;
1951
                FeatureQuery query = store.createFeatureQuery();
1952
1953
                for (int j = 0; j < nTimes2; j++) {
1954
                        DisposableIterator iter;
1955
1956
                        query.setAttributeNames(getRandomAttibuteList(store
1957
                                        .getDefaultFeatureType()));
1958
                        set = store.getFeatureSet(query);
1959
1960
                        int nTimes = getRandom().nextInt(3) + 3;
1961
                        for (int i = 0; i < nTimes; i++) {
1962
                                if (getRandom().nextBoolean()) {
1963
                                        iter = set.fastIterator();
1964
                                } else {
1965
                                        iter = set.fastIterator();
1966
                                }
1967
                                while (iter.hasNext()) {
1968
                                        feature = (Feature) iter.next();
1969
                                        refered = feature.getReference().getFeature(
1970
                                                        set.getDefaultFeatureType());
1971
                                        compareFeatures(feature, refered);
1972
                                }
1973
                                iter.dispose();
1974
                        }
1975
1976
                        set.dispose();
1977
                }
1978
1979
1980
1981
                store.dispose();
1982
1983
        }
1984
1985
        public void testResourcesLocks() throws Exception {
1986
1987
                if (!this.usesResources()) {
1988
                        return;
1989
                }
1990
1991
                DataStoreParameters dbfParameters = this
1992
                                .getDefaultDataStoreParameters();
1993
1994
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1995
                                .getDataStoreName(), dbfParameters);
1996
1997
                int nThreads = getRandom().nextInt(4) + 2;
1998
                List threads = new ArrayList();
1999
                TaskTestIterators task;
2000
                for (int i = 0; i < nThreads; i++) {
2001
                        task = new TaskTestIterators(this, "" + i, store);
2002
                        threads.add(task);
2003
                        task.start();
2004
                }
2005
2006
                Iterator iter;
2007
                List stillAlives = new ArrayList();
2008
                stillAlives.addAll(threads);
2009
2010
                while (!stillAlives.isEmpty()) {
2011
                        iter = stillAlives.iterator();
2012
                        while (iter.hasNext()) {
2013
                                task = (TaskTestIterators) iter.next();
2014
                                if (!task.isAlive()) {
2015
                                        iter.remove();
2016
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
2017
                                        iter.remove();
2018
                                        getLogger().error("task {} outOfDate", task.getName());
2019
                                } else {
2020
                                        Thread.yield();
2021
                                        Thread.sleep(100);
2022
                                }
2023
                        }
2024
                }
2025
2026
                store.dispose();
2027
2028
                iter = threads.iterator();
2029
                while (iter.hasNext()) {
2030
                        task = (TaskTestIterators) iter.next();
2031
                        assertTrue(task.isFinishedOk());
2032
                }
2033
        }
2034
2035
        class TaskTestIterators extends StoreTask {
2036
                private BaseTestFeatureStore testInstance;
2037
2038
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2039
                                String name, FeatureStore store) {
2040
                        super(name, store);
2041
                        this.testInstance = testInstance;
2042
                }
2043
2044
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2045
                                String name, FeatureStore store, int timeToWait) {
2046
                        super(name, store, timeToWait);
2047
                        this.testInstance = testInstance;
2048
                }
2049
2050
                public void run() {
2051
                        if (!this.startProcess()) {
2052
                                return;
2053
                        }
2054
                        try {
2055
                                this.testInstance.fullStoreIteratorTest(store);
2056
2057
                                finishedOk();
2058
                        } catch (Throwable e) {
2059
                                finishedError(e);
2060
                                return;
2061
                        }
2062
                }
2063
2064
2065
        }
2066
2067
2068
        protected void tearDown() throws Exception {
2069
                super.tearDown();
2070
                if (!usesResources()) {
2071
                        return;
2072
                }
2073
2074
                ResourceManager resMan = DALLocator.getResourceManager();
2075
                resMan.closeResources();
2076
        }
2077
2078
2079
2080
}