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
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
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
                        DisposableIterator it = set.fastIterator();
685
                        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
                        DisposableIterator it = set.fastIterator();
715
                        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
                DisposableIterator iter = set.fastIterator();
835
                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
                iter = set.fastIterator();
845
                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
                                iter = set.fastIterator();
899
                        }
900
                        if (getRandom().nextBoolean()) {
901
                                iter1 = set1.fastIterator();
902
                        } else {
903
                                iter1 = set1.fastIterator();
904
                        }
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
                                iter = set.fastIterator();
926
                        }
927
                        if (getRandom().nextBoolean()) {
928
                                iter1 = set1.fastIterator();
929
                        } else {
930
                                iter1 = set1.fastIterator();
931
                        }
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
                        iter1 = set1.fastIterator();
943
                        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
                                iter1 = set1.fastIterator();
1049
                        }
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
                                iter = set.fastIterator();
1248
                        }
1249
                        if (getRandom().nextBoolean()) {
1250
                                iter1 = set1.fastIterator();
1251
                        } else {
1252
                                iter1 = set1.fastIterator();
1253
                        }
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
                                iter = set.fastIterator();
1297
                        }
1298
                        if (getRandom().nextBoolean()) {
1299
                                iter1 = set1.fastIterator();
1300
                        } else {
1301
                                iter1 = set1.fastIterator();
1302
                        }
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
                                iter = set.fastIterator();
1344
                        }
1345
                        if (getRandom().nextBoolean()) {
1346
                                iter1 = set1.fastIterator();
1347
                        } else {
1348
                                iter1 = set1.fastIterator();
1349
                        }
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
                                iter = set.fastIterator();
1390
                        }
1391
                        if (getRandom().nextBoolean()) {
1392
                                iter1 = set1.fastIterator();
1393
                        } else {
1394
                                iter1 = set1.fastIterator();
1395
                        }
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
                                iter = set.fastIterator();
1440
                        }
1441
                        if (getRandom().nextBoolean()) {
1442
                                iter1 = set1.fastIterator();
1443
                        } else {
1444
                                iter1 = set1.fastIterator();
1445
                        }
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
}