Statistics
| Revision:

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

History | View | Annotate | Download (51.1 KB)

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

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

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

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

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

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

    
72
        private static Logger logger = null;
73

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

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

    
84
        public abstract boolean usesResources();
85

    
86
        public abstract boolean hasExplorer();
87

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

    
97
                return query;
98
        }
99

    
100

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

    
104

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

    
109

    
110
        //=================================================
111

    
112

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

    
117

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

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

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

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

    
153
        }
154

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

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

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

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

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

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

    
223
                return true;
224
        }
225

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

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

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

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

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

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

    
292
                return true;
293
        }
294

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

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

    
313
        }
314

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

    
327
                return !iter2.hasNext();
328

    
329
        }
330

    
331

    
332

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

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

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

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

    
375

    
376

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

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

    
386
                }
387
                return true;
388

    
389
        }
390

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

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

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

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

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

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

    
443
                        return false;
444
                }
445

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

    
462
                return true;
463
        }
464

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

    
485
                return true;
486
        }
487

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

    
504
                return true;
505

    
506
        }
507

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

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

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

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

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

    
546
                        }
547
                        return true;
548

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

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

    
568
        }
569

    
570

    
571
        //------------------------------------------------
572

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

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

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

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

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

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

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

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

    
641

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

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

    
648
                query.setFilter(new Evaluator(){
649

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

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

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

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

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

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

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

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

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

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

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

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

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

    
710
        }
711

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

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

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

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

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

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

    
737
        }
738

    
739
        public void testSimpleIteration(DataStoreParameters parameters)
740
                        throws Exception {
741
                FeatureStore store = null;
742
                store = (FeatureStore) dataManager.createStore(parameters);
743

    
744
                this.testSimpleIteration(store);
745

    
746
                store.dispose();
747

    
748
        }
749

    
750
        public void testIterationFastAndStandart(DataStoreParameters parameters)
751
                        throws Exception {
752
                FeatureStore store = null;
753
                store = (FeatureStore) dataManager.createStore(parameters);
754

    
755
                this.testIterationFastAndStandart(store);
756

    
757
                store.dispose();
758

    
759
        }
760

    
761
        /**
762
         *
763
         * @param count
764
         *            if (< 0) list.size() >= 1 else list.size() == count
765
         * @throws Exception
766
         */
767
        public void testExplorerList(int count) throws Exception {
768
                FeatureStore store = null;
769
                store = (FeatureStore) dataManager.createStore(this
770
                                .getDefaultDataStoreParameters());
771

    
772
                DataServerExplorer explorer;
773
                explorer = store.getExplorer();
774

    
775
                if (count < 0) {
776
                        assertTrue(explorer.list().size() >= 1);
777
                } else {
778
                        assertTrue(explorer.list().size() == count);
779
                }
780

    
781
                store.dispose();
782

    
783
                explorer.dispose();
784
        }
785

    
786
        //=================================================
787
        //=================================================
788

    
789

    
790

    
791

    
792
        public void testIterationFastAndStandart() throws Exception {
793
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
794
        }
795

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

    
800
        public void testInitializeStore() throws Exception {
801
                FeatureStore store = (FeatureStore) dataManager.createStore(this
802
                                .getDefaultDataStoreParameters());
803

    
804
                assertNotNull(store.getMetadataID());
805
                assertNotNull(store.getName());
806
                assertEquals(store.getEnvelope(), store.getDynValue("Envelope"));
807
                assertTrue(store.getFeatureCount() > 0);
808
                if (store.isLocksSupported()) {
809
                        assertNotNull(store.getLocks());
810
                } else {
811
                        assertNull(store.getLocks());
812
                }
813
                store.dispose();
814
        }
815

    
816

    
817
        public void testExplorer() throws Exception {
818
                if (!this.hasExplorer()) {
819
                        return;
820
                }
821
                this.testExplorerList(-1);
822

    
823
        }
824

    
825
        public void testSelection() throws Exception {
826
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
827

    
828
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
829
                FeatureSet set = store.getFeatureSet();
830

    
831
                assertTrue(store.getFeatureSelection().isEmpty());
832
                store.setSelection(set);
833
                assertFalse(store.getFeatureSelection().isEmpty());
834

    
835
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
836

    
837
                DisposableIterator iter = set.iterator();
838
                while (iter.hasNext()) {
839
                        assertTrue(store.getFeatureSelection().isSelected(
840
                                        (Feature) iter.next()));
841
                }
842
                iter.dispose();
843

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

    
854
                store.getFeatureSelection().reverse();
855
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
856
                assertFalse(store.getFeatureSelection().isEmpty());
857

    
858
                set.dispose();
859

    
860
        }
861

    
862
        public void testCustomFTypeSet() throws Exception {
863
                DataStoreParameters dbfParameters = this
864
                                .getDefaultDataStoreParameters();
865

    
866
                FeatureStore store = (FeatureStore) dataManager
867
                                .createStore(dbfParameters);
868

    
869
                testCustomFTypeSet(store);
870

    
871
                store.dispose();
872
        }
873

    
874
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
875

    
876
                FeatureSet set, set1;
877
                FeatureQuery query;
878
                DisposableIterator iter, iter1;
879
                Iterator attrIter;
880
                FeatureAttributeDescriptor attr;
881

    
882
                set = store.getFeatureSet(this.getDefaultQuery(store));
883
                attrIter = store.getDefaultFeatureType().iterator();
884

    
885
                String[] names;
886
                while (attrIter.hasNext()) {
887
                        attr = (FeatureAttributeDescriptor) attrIter.next();
888
                        int fieldIndex = attr.getIndex();
889

    
890
                        query = this.getDefaultQuery(store);
891
                        String fieldName = store.getDefaultFeatureType()
892
                        .getAttributeDescriptor(fieldIndex).getName();
893

    
894
                        names = new String[] { fieldName };
895
                        query.setAttributeNames(names);
896
                        set1 = store.getFeatureSet(query);
897

    
898
                        if (getRandom().nextBoolean()) {
899
                                iter = set.fastIterator();
900
                        } else {
901
                                iter = set.iterator();
902
                        }
903
                        if (getRandom().nextBoolean()) {
904
                                iter1 = set1.fastIterator();
905
                        } else {
906
                                iter1 = set1.iterator();
907
                        }
908

    
909
                        assertTrue(compareFeatureIterators(iter, iter1, names));
910

    
911
                        iter.dispose();
912
                        iter1.dispose();
913
                        set1.dispose();
914
                }
915

    
916
                int ntimes = getRandom().nextInt(10) + 5;
917
                FeatureType type = store.getDefaultFeatureType();
918
                query = this.getDefaultQuery(store);
919
                for (int i = 0; i < ntimes; i++) {
920
                        names = getRandomAttibuteList(type);
921

    
922
                        query.setAttributeNames(names);
923
                        set1 = store.getFeatureSet(query);
924

    
925
                        if (getRandom().nextBoolean()) {
926
                                iter = set.fastIterator();
927
                        } else {
928
                                iter = set.iterator();
929
                        }
930
                        if (getRandom().nextBoolean()) {
931
                                iter1 = set1.fastIterator();
932
                        } else {
933
                                iter1 = set1.iterator();
934
                        }
935

    
936
                        assertTrue(compareFeatureIterators(iter, iter1, names));
937

    
938
                        iter.dispose();
939
                        iter1.dispose();
940

    
941
                        iter1 = set1.fastIterator();
942
                        assertTrue(checksAttributesPositions(iter1, names));
943
                        iter1.dispose();
944

    
945
                        iter1 = set1.iterator();
946
                        assertTrue(checksAttributesPositions(iter1, names));
947
                        iter1.dispose();
948

    
949
                        set1.dispose();
950

    
951

    
952
                }
953

    
954

    
955

    
956
                set.dispose();
957

    
958
        }
959

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

    
982
         public void testPersistence() throws Exception {
983
                if (ToolsLocator.getPersistenceManager() == null) {
984
                        fail("Default Persistence Manager not register");
985
                }
986
                DataStoreParameters params = this.getDefaultDataStoreParameters();
987

    
988
                FeatureStore store = (FeatureStore) dataManager.createStore(params);
989

    
990
                testSimpleIteration(store);
991

    
992
                PersistentState state = ToolsLocator.getPersistenceManager().getState(
993
                                store);
994

    
995
                FeatureStore store2 = (FeatureStore) ToolsLocator
996
                                .getPersistenceManager().create(state);
997

    
998
                testSimpleIteration(store2);
999

    
1000
                assertTrue(compareStores(store, store2));
1001

    
1002
                store.dispose();
1003
                store2.dispose();
1004

    
1005
        }
1006

    
1007

    
1008
        public void testSort() throws Exception {
1009
                DataStoreParameters dbfParameters = this
1010
                                .getDefaultDataStoreParameters();
1011

    
1012
                FeatureStore store = (FeatureStore) dataManager
1013
                                .createStore(dbfParameters);
1014

    
1015
                testSort(store);
1016

    
1017
                store.dispose();
1018

    
1019
        }
1020

    
1021
        public void testSort(FeatureStore store) throws Exception{
1022
                FeatureSet set1;
1023
                FeatureQuery query;
1024
                DisposableIterator iter1;
1025
                Iterator attrIter;
1026
                FeatureAttributeDescriptor attr;
1027

    
1028
                attrIter = store.getDefaultFeatureType().iterator();
1029

    
1030
                String[] names;
1031
                while (attrIter.hasNext()) {
1032
                        attr = (FeatureAttributeDescriptor) attrIter.next();
1033

    
1034
                        if (attr.getDataType() == DataTypes.GEOMETRY) {
1035
                                continue;
1036
                        }
1037
                        query = this.getDefaultQuery(store);
1038
                        String fieldName = attr.getName();
1039

    
1040

    
1041

    
1042
                        names = new String[] { fieldName };
1043
                        query.setAttributeNames(names);
1044
                        query.getOrder().add(fieldName, getRandom().nextBoolean());
1045

    
1046
                        set1 = store.getFeatureSet(query);
1047
                        if (getRandom().nextBoolean()) {
1048
                                iter1 = set1.fastIterator();
1049
                        } else {
1050
                                iter1 = set1.iterator();
1051
                        }
1052

    
1053
                        assertTrue(checkSort(iter1, query));
1054

    
1055
                        iter1.dispose();
1056
                        set1.dispose();
1057
                }
1058

    
1059
                int ntimes = getRandom().nextInt(10) + 5;
1060
                FeatureType type = store.getDefaultFeatureType();
1061
                query = this.getDefaultQuery(store);
1062
                for (int i = 0; i < ntimes; i++) {
1063
                        names = getRandomAttibuteList(type);
1064

    
1065
                        int nShortFields = getRandom().nextInt(names.length) + 1;
1066
                        query.getOrder().clear();
1067
                        for (int j = 0; j < nShortFields; j++) {
1068
                                attr = store.getDefaultFeatureType().getAttributeDescriptor(names[getRandom().nextInt(names.length)]);
1069
                                if (attr.getDataType() == DataTypes.INT
1070
                                                || attr.getDataType() == DataTypes.LONG
1071
                                                || attr.getDataType() == DataTypes.DOUBLE
1072
                                                || attr.getDataType() == DataTypes.STRING
1073
                                                || attr.getDataType() == DataTypes.DATE
1074
                                                || attr.getDataType() == DataTypes.BOOLEAN
1075
                                                || attr.getDataType() == DataTypes.BYTE
1076
                                                || attr.getDataType() == DataTypes.FLOAT) {
1077

    
1078
                                        query.getOrder().add(attr.getName(),
1079
                                                        getRandom().nextBoolean());
1080
                                }
1081
                        }
1082

    
1083
                        query.setAttributeNames(names);
1084
                        set1 = store.getFeatureSet(query);
1085

    
1086
                        // if (getRandom().nextBoolean()) {
1087
                                iter1 = set1.fastIterator();
1088
                                // } else {
1089
                                // iter1 = set1.iterator();
1090
                                // }
1091

    
1092
                                assertTrue(checkSort(iter1, query));
1093

    
1094
                                iter1.dispose();
1095
                                set1.dispose();
1096

    
1097
                }
1098

    
1099
        }
1100

    
1101

    
1102
        public boolean checkSort(Iterator iter, FeatureQuery query) {
1103

    
1104
                FeatureQueryOrderMember order;
1105
                Feature prevFeature = null;
1106
                Feature currFeature = null;
1107
                boolean isFirst = true;
1108
                Comparable v1, v2;
1109
                Object o1, o2;
1110
                int v;
1111
                FeatureQueryOrder queryOrder = query.getOrder();
1112

    
1113
                Iterator orderIter;
1114

    
1115
                //for debug only
1116
                /*
1117
                System.out.println("\nCheck order:");
1118
                Iterator orderIter = queryOrder.iterator();
1119
                while (orderIter.hasNext()) {
1120
                        order = (FeatureQueryOrderMember) orderIter.next();
1121
                        System.out.print(order.getAttributeName() + " ");
1122
                        if (order.getAscending()) {
1123
                                System.out.print("Asc, ");
1124
                        } else {
1125
                                System.out.print("Desc, ");
1126
                        }
1127
                }
1128
                System.out.println(";");
1129
                */
1130

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

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

    
1206
                return true;
1207
        }
1208

    
1209
        protected void fullStoreIteratorTest(FeatureStore store) throws Exception{
1210
                testIterationFastAndStandart(store);
1211
                testCustomFTypeSet(store);
1212
                testSort(store);
1213
        }
1214

    
1215

    
1216
        public void testTransformsData() throws Exception {
1217
                DataStoreParameters dbfParameters = this
1218
                                .getDefaultDataStoreParameters();
1219

    
1220
                FeatureStore store = (FeatureStore) dataManager
1221
                                .createStore(dbfParameters);
1222

    
1223
                FeatureStore store1 = (FeatureStore) dataManager
1224
                                .createStore(dbfParameters);
1225

    
1226
                FeatureStoreTransform transform = new StringsToLowerTransform();
1227
                transform.setFeatureStore(store);
1228

    
1229
                store.getTransforms().add(transform);
1230

    
1231
                FeatureSet set, set1;
1232
                DisposableIterator iter, iter1;
1233
                Iterator iterAttr;
1234
                FeatureAttributeDescriptor attr;
1235
                Feature feature, feature1;
1236
                int i, ntimes;
1237
                Object v1, v2;
1238

    
1239

    
1240
                fullStoreIteratorTest(store);
1241

    
1242
                set = store.getFeatureSet();
1243
                set1 = store1.getFeatureSet();
1244
                ntimes = getRandom().nextInt(3) + 1;
1245
                for (i = 0; i < ntimes; i++) {
1246
                        if (getRandom().nextBoolean()) {
1247
                                iter = set.fastIterator();
1248
                        } else {
1249
                                iter = set.iterator();
1250
                        }
1251
                        if (getRandom().nextBoolean()) {
1252
                                iter1 = set1.fastIterator();
1253
                        } else {
1254
                                iter1 = set1.iterator();
1255
                        }
1256
                        while (iter.hasNext()) {
1257
                                feature = (Feature) iter.next();
1258
                                feature1 = (Feature) iter1.next();
1259

    
1260
                                iterAttr = set.getDefaultFeatureType().iterator();
1261
                                while (iterAttr.hasNext()) {
1262
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1263
                                        v1 = feature.get(attr.getIndex());
1264
                                        v2 = feature1.get(attr.getIndex());
1265
                                        if (attr.getDataType() == DataTypes.STRING) {
1266
                                                if (v2 != null) {
1267
                                                        v2 = ((String) v2).toLowerCase();
1268
                                                }
1269

    
1270
                                        }
1271
                                        assertTrue(compareFeatureValue(v1, v2, attr));
1272
                                }
1273
                        }
1274
                        assertFalse(iter1.hasNext());
1275
                        iter.dispose();
1276
                        iter1.dispose();
1277
                }
1278

    
1279

    
1280
                set.dispose();
1281
                set1.dispose();
1282

    
1283

    
1284
                transform = new StringsToUpperTransform();
1285
                transform.setFeatureStore(store);
1286

    
1287
                store.getTransforms().add(transform);
1288

    
1289
                fullStoreIteratorTest(store);
1290

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

    
1309
                                iterAttr = set.getDefaultFeatureType().iterator();
1310
                                while (iterAttr.hasNext()) {
1311
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1312
                                        v1 = feature.get(attr.getIndex());
1313
                                        v2 = feature1.get(attr.getIndex());
1314
                                        if (attr.getDataType() == DataTypes.STRING) {
1315
                                                if (v2 != null) {
1316
                                                        v2 = ((String) v2).toUpperCase();
1317
                                                }
1318

    
1319
                                        }
1320
                                        compareFeatureValue(v1, v2, attr);
1321
                                }
1322
                        }
1323
                        assertFalse(iter1.hasNext());
1324
                        iter.dispose();
1325
                        iter1.dispose();
1326
                }
1327
                set.dispose();
1328
                set1.dispose();
1329

    
1330

    
1331
                transform = new AddPrefixAttributeName("_");
1332
                transform.setFeatureStore(store);
1333

    
1334
                store.getTransforms().add(transform);
1335

    
1336
                fullStoreIteratorTest(store);
1337

    
1338
                set = store.getFeatureSet();
1339
                set1 = store1.getFeatureSet();
1340
                ntimes = getRandom().nextInt(3) + 1;
1341
                for (i = 0; i < ntimes; i++) {
1342
                        if (getRandom().nextBoolean()) {
1343
                                iter = set.fastIterator();
1344
                        } else {
1345
                                iter = set.iterator();
1346
                        }
1347
                        if (getRandom().nextBoolean()) {
1348
                                iter1 = set1.fastIterator();
1349
                        } else {
1350
                                iter1 = set1.iterator();
1351
                        }
1352
                        while (iter.hasNext()) {
1353
                                feature = (Feature) iter.next();
1354
                                feature1 = (Feature) iter1.next();
1355

    
1356
                                iterAttr = set1.getDefaultFeatureType().iterator();
1357
                                while (iterAttr.hasNext()) {
1358
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1359
                                        v1 = feature.get("_" + attr.getName());
1360
                                        v2 = feature1.get(attr.getIndex());
1361
                                        if (attr.getDataType() == DataTypes.STRING) {
1362
                                                if (v2 != null) {
1363
                                                        v2 = ((String) v2).toUpperCase();
1364
                                                }
1365

    
1366
                                        }
1367
                                        compareFeatureValue(v1, v2, attr);
1368
                                }
1369
                        }
1370
                        assertFalse(iter1.hasNext());
1371
                        iter.dispose();
1372
                        iter1.dispose();
1373
                }
1374
                set.dispose();
1375
                set1.dispose();
1376

    
1377
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1378
                transform.setFeatureStore(store);
1379

    
1380
                store.getTransforms().add(transform);
1381

    
1382
                fullStoreIteratorTest(store);
1383

    
1384
                set = store.getFeatureSet();
1385
                set1 = store1.getFeatureSet();
1386
                ntimes = getRandom().nextInt(3) + 1;
1387
                for (i = 0; i < ntimes; i++) {
1388
                        if (getRandom().nextBoolean()) {
1389
                                iter = set.fastIterator();
1390
                        } else {
1391
                                iter = set.iterator();
1392
                        }
1393
                        if (getRandom().nextBoolean()) {
1394
                                iter1 = set1.fastIterator();
1395
                        } else {
1396
                                iter1 = set1.iterator();
1397
                        }
1398
                        while (iter.hasNext()) {
1399
                                feature = (Feature) iter.next();
1400
                                feature1 = (Feature) iter1.next();
1401

    
1402
                                iterAttr = set1.getDefaultFeatureType().iterator();
1403
                                while (iterAttr.hasNext()) {
1404
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1405
                                        v1 = feature.get("_" + attr.getName());
1406
                                        v2 = feature1.get(attr.getIndex());
1407
                                        if (attr.getDataType() == DataTypes.STRING) {
1408
                                                if (v2 != null) {
1409
                                                        v2 = ((String) v2).toUpperCase();
1410
                                                }
1411

    
1412
                                        }
1413
                                        compareFeatureValue(v1, v2, attr);
1414
                                }
1415
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1416
                                                .getDefaultFeatureType().getAttributeDescriptor(
1417
                                                                "__new__"));
1418
                        }
1419
                        assertFalse(iter1.hasNext());
1420
                        iter.dispose();
1421
                        iter1.dispose();
1422
                }
1423
                set.dispose();
1424
                set1.dispose();
1425

    
1426

    
1427
                transform = new RemoveAttribute("__new__");
1428
                transform.setFeatureStore(store);
1429

    
1430
                store.getTransforms().add(transform);
1431

    
1432
                fullStoreIteratorTest(store);
1433

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

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

    
1462
                                        }
1463
                                        compareFeatureValue(v1, v2, attr);
1464
                                }
1465
                                assertNull(feature.getType().getAttributeDescriptor("__new__"));
1466
                        }
1467
                        assertFalse(iter1.hasNext());
1468
                        iter.dispose();
1469
                        iter1.dispose();
1470
                }
1471
                set.dispose();
1472
                set1.dispose();
1473

    
1474
                store.getTransforms().clear();
1475

    
1476
                compareStores(store, store1);
1477

    
1478

    
1479
                store.dispose();
1480
                store1.dispose();
1481
        }
1482

    
1483
        abstract class myTransform implements FeatureStoreTransform {
1484
                protected FeatureStore store;
1485
                protected FeatureType orgDefaultFType;
1486
                protected List orgFTypes;
1487

    
1488
                public void applyTransform(Feature source, EditableFeature target)
1489
                                throws DataException {
1490

    
1491
                        Iterator iter = target.getType().iterator();
1492
                        FeatureAttributeDescriptor attr;
1493
                        while (iter.hasNext()) {
1494
                                attr = (FeatureAttributeDescriptor) iter.next();
1495
                                this.setValue(source, target, attr);
1496
                        }
1497

    
1498
                }
1499

    
1500
                protected void setValue(Feature source, EditableFeature target,
1501
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1502
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1503
                }
1504

    
1505
                public void saveToState(PersistentState state)
1506
                throws PersistenceException {
1507
                        // TODO Auto-generated method stub
1508

    
1509
                }
1510

    
1511
                public void loadFromState(PersistentState state) throws PersistenceException {
1512
                        // TODO Auto-generated method stub
1513

    
1514
                }
1515

    
1516
                public FeatureType getDefaultFeatureType() throws DataException {
1517
                        return orgDefaultFType;
1518
                }
1519

    
1520
                public FeatureStore getFeatureStore() {
1521
                        return store;
1522
                }
1523

    
1524
                public List getFeatureTypes() throws DataException {
1525
                        return orgFTypes;
1526
                }
1527

    
1528
                public void setFeatureStore(FeatureStore featureStore) {
1529
                        this.store = featureStore;
1530
                        try {
1531
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1532
                                this.orgFTypes = this.store.getFeatureTypes();
1533

    
1534
                        } catch (DataException e) {
1535
                                throw new RuntimeException(e);
1536
                        }
1537

    
1538
                }
1539

    
1540
                public PersistentState getState() throws PersistenceException {
1541
                        // TODO Auto-generated method stub
1542
                        return null;
1543
                }
1544

    
1545
                public FeatureType getSourceFeatureTypeFrom(
1546
                                FeatureType targetFeatureType) {
1547

    
1548
                        return targetFeatureType;
1549
                }
1550

    
1551
        }
1552

    
1553
        abstract class TransformTypeTransform extends myTransform {
1554

    
1555
                private FeatureType myDefaultFeatureType = null;
1556
                private List myFeatureTypes = null;
1557

    
1558
                public FeatureType getDefaultFeatureType() throws DataException {
1559
                        if (this.myDefaultFeatureType == null) {
1560
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1561
                        }
1562

    
1563
                        return this.myDefaultFeatureType;
1564
                }
1565

    
1566
                protected abstract FeatureType transformType(FeatureType type);
1567

    
1568
                protected abstract FeatureType restoreType(FeatureType type);
1569

    
1570

    
1571
                public List getFeatureTypes() throws DataException {
1572
                        if (this.myFeatureTypes == null) {
1573
                                ArrayList list = new ArrayList();
1574
                                Iterator iter = orgFTypes.iterator();
1575
                                while (iter.hasNext()) {
1576
                                        FeatureType type = (FeatureType) iter.next();
1577
                                        if (type.getId().equals(
1578
                                                        this.getDefaultFeatureType().getId())) {
1579
                                                list.add(this.getDefaultFeatureType());
1580
                                        } else {
1581
                                                list.add(this.transformType(type));
1582
                                        }
1583
                                }
1584
                                this.myFeatureTypes = Collections.unmodifiableList(list);
1585
                        }
1586
                        return this.myFeatureTypes;
1587
                }
1588

    
1589
                public boolean isTransformsOriginalValues() {
1590
                        return false;
1591
                }
1592

    
1593
                public FeatureType getSourceFeatureTypeFrom(
1594
                                FeatureType targetFeatureType) {
1595
                        FeatureType org = null;
1596
                        FeatureType cur = null;
1597
                        Iterator iter = null;
1598
                        try {
1599
                                iter = this.getFeatureTypes().iterator();
1600
                        } catch (DataException e) {
1601
                                new RuntimeException(e);
1602
                        }
1603
                        while (iter.hasNext()) {
1604
                                cur = (FeatureType) iter.next();
1605
                                if (cur.getId().equals(targetFeatureType.getId())) {
1606
                                        org = cur;
1607
                                        break;
1608
                                }
1609
                        }
1610
                        if (org == null) {
1611
                                throw new RuntimeException();
1612
                        }
1613

    
1614
                        return this.restoreType(org);
1615
                }
1616

    
1617
        }
1618

    
1619
        abstract class TransformAttributeNameTransform extends
1620
                        TransformTypeTransform {
1621

    
1622
                protected void setValue(Feature source, EditableFeature target,
1623
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1624
                        target.set(attrTarget.getIndex(), source.get(this
1625
                                        .restoreAttributeName(attrTarget.getName())));
1626
                }
1627

    
1628

    
1629
                protected FeatureType transformType(FeatureType type) {
1630
                        EditableFeatureType result = type.getEditable();
1631
                        Iterator iter = result.iterator();
1632
                        EditableFeatureAttributeDescriptor attr;
1633
                        while (iter.hasNext()) {
1634
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1635
                                attr.setName(transformAttributeName(attr.getName()));
1636
                        }
1637
                        return result.getNotEditableCopy();
1638
                }
1639

    
1640
                protected abstract String transformAttributeName(String source);
1641

    
1642
                protected abstract String restoreAttributeName(String target);
1643

    
1644
                protected FeatureType restoreType(FeatureType type) {
1645
                        EditableFeatureType result;
1646
                        if (type instanceof EditableFeatureType) {
1647
                                result = (EditableFeatureType) type.getCopy();
1648
                        } else {
1649
                                result = type.getEditable();
1650
                        }
1651
                        Iterator iter = result.iterator();
1652
                        EditableFeatureAttributeDescriptor attr;
1653
                        while (iter.hasNext()) {
1654
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1655

    
1656
                                attr.setName(restoreAttributeName(attr.getName()));
1657
                        }
1658
                        return result.getNotEditableCopy();
1659
                }
1660

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

    
1690
        }
1691

    
1692

    
1693
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1694

    
1695
                private String prefix;
1696

    
1697
                AddPrefixAttributeName(String prefix) {
1698
                        this.prefix = prefix;
1699
                }
1700

    
1701
                protected String restoreAttributeName(String target) {
1702
                        return target.substring(getPrefix().length(), target.length());
1703
                }
1704

    
1705
                private String getPrefix() {
1706
                        return prefix;
1707
                }
1708

    
1709
                protected String transformAttributeName(String source) {
1710
                        return getPrefix() + source;
1711
                }
1712

    
1713
        }
1714

    
1715
        class AddAttribute extends TransformTypeTransform {
1716

    
1717
                private String name;
1718
                private int type;
1719
                private Object defValue;
1720
                private int size;
1721
                private Evaluator eval;
1722

    
1723
                AddAttribute(String name) {
1724
                        this(name, DataTypes.STRING, null, 15);
1725
                }
1726

    
1727
                AddAttribute(String name, int type) {
1728
                        this(name, type, null, 15);
1729
                }
1730

    
1731
                AddAttribute(String name, int type, Object defValue) {
1732
                        this(name, type, defValue, 15);
1733
                }
1734

    
1735
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1736
                        this.name = name;
1737
                        this.type = type;
1738
                        this.defValue = null;
1739
                        this.size = size;
1740
                        this.eval = evaluator;
1741
                }
1742

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

    
1751

    
1752

    
1753
                protected FeatureType restoreType(FeatureType type) {
1754
                        EditableFeatureType result;
1755
                        if (type instanceof EditableFeatureType) {
1756
                                result = (EditableFeatureType) type.getCopy();
1757
                        } else {
1758
                                result = type.getEditable();
1759
                        }
1760
                        result.remove(this.name);
1761
                        return result.getNotEditableCopy();
1762
                }
1763

    
1764
                protected FeatureType transformType(FeatureType type) {
1765
                        EditableFeatureType result = type.getEditable();
1766

    
1767
                        EditableFeatureAttributeDescriptor att;
1768
                        if (this.eval == null) {
1769
                                att = result.add(name, this.type)
1770
                                                .setDefaultValue(this.defValue);
1771
                        } else {
1772
                                att = result.add(name, this.type, this.eval);
1773
                        }
1774
                        att.setSize(size);
1775

    
1776

    
1777
                        return result.getNotEditableCopy();
1778
                }
1779

    
1780
                protected void setValue(Feature source, EditableFeature target,
1781
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1782
                        if (attrTarget.getName().equals(this.name)) {
1783
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1784
                        } else {
1785
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1786
                                                .getName()));
1787
                        }
1788
                }
1789
        }
1790

    
1791

    
1792
        class RemoveAttribute extends TransformTypeTransform {
1793

    
1794
                private String attributeName;
1795
                private String fTypeIdToRemoveAttribute = null;
1796
                private FeatureAttributeDescriptor attr;
1797

    
1798
                RemoveAttribute(String attributeName) {
1799
                        this.attributeName = attributeName;
1800
                }
1801

    
1802
                RemoveAttribute(String attributeName, FeatureType fType) {
1803
                        this.attributeName = attributeName;
1804
                }
1805

    
1806
                protected FeatureType restoreType(FeatureType type) {
1807
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1808
                                return type;
1809
                        }
1810
                        EditableFeatureType result = type.getEditable();
1811

    
1812
                        EditableFeatureAttributeDescriptor att;
1813
                        if (this.attr.getEvaluator() == null) {
1814
                                att = result.add(attributeName, this.attr.getDataType())
1815
                                                .setDefaultValue(this.attr.getDefaultValue());
1816
                        } else {
1817
                                att = result.add(attributeName, this.attr.getDataType(),
1818
                                                this.attr.getEvaluator());
1819
                        }
1820
                        att.setSize(this.attr.getSize());
1821
                        att.setAllowNull(this.attr.allowNull());
1822
                        att.setGeometryType(this.attr.getGeometryType());
1823
                        att.setSRS(this.attr.getSRS());
1824
                        att.setPrecision(this.attr.getPrecision());
1825
                        // TODO
1826

    
1827

    
1828
                        return result.getNotEditableCopy();
1829
                }
1830

    
1831
                protected FeatureType transformType(FeatureType type) {
1832
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1833
                                return type;
1834
                        }
1835

    
1836
                        EditableFeatureType result;
1837
                        if (type instanceof EditableFeatureType) {
1838
                                result = (EditableFeatureType) type.getCopy();
1839
                        } else {
1840
                                result = type.getEditable();
1841
                        }
1842
                        result.remove(this.attributeName);
1843
                        return result.getNotEditableCopy();
1844

    
1845
                }
1846

    
1847
                public void setFeatureStore(FeatureStore featureStore) {
1848
                        Iterator iter;
1849
                        try {
1850
                                iter = featureStore.getFeatureTypes().iterator();
1851
                        } catch (DataException e) {
1852
                                throw new RuntimeException(e);
1853
                        }
1854
                        FeatureType type;
1855
                        FeatureAttributeDescriptor attrTmp;
1856
                        while (iter.hasNext()) {
1857
                                type = (FeatureType) iter.next();
1858
                                attrTmp = type.getAttributeDescriptor(this.attributeName);
1859
                                if (attrTmp != null) {
1860
                                        this.fTypeIdToRemoveAttribute = type.getId();
1861
                                        this.attr = attrTmp;
1862
                                        break;
1863
                                }
1864
                        }
1865
                        super.setFeatureStore(featureStore);
1866
                }
1867

    
1868
                public void applyTransform(Feature source, EditableFeature target)
1869
                                throws DataException {
1870
                        // TODO Auto-generated method stub
1871
                        super.applyTransform(source, target);
1872
                }
1873

    
1874

    
1875

    
1876
        }
1877

    
1878

    
1879
        public class StringsToLowerTransform extends myTransform {
1880

    
1881
                public boolean isTransformsOriginalValues() {
1882
                        return true;
1883
                }
1884

    
1885
                protected void setValue(Feature source, EditableFeature target,
1886
                                FeatureAttributeDescriptor attr) throws DataException {
1887
                        if (attr.getDataType() == DataTypes.STRING) {
1888
                                String v = ((String) source.get(attr.getName()));
1889
                                if (v != null){
1890
                                        v = v.toLowerCase();
1891
                                } else if (!attr.allowNull()) {
1892
                                        v = (String) attr.getDefaultValue();
1893
                                        v = v.toLowerCase();
1894
                                }
1895
                                target.set(attr.getName(), v);
1896
                        } else {
1897
                                target.set(attr.getName(), source.get(attr.getName()));
1898
                        }
1899
                }
1900

    
1901
        }
1902

    
1903
        class StringsToUpperTransform extends StringsToLowerTransform {
1904
                protected void setValue(Feature source, EditableFeature target,
1905
                                FeatureAttributeDescriptor attr) throws DataException {
1906
                        if (attr.getDataType() == DataTypes.STRING) {
1907
                                String v = ((String) source.get(attr.getName()));
1908
                                if (v != null) {
1909
                                        v = v.toUpperCase();
1910
                                } else if (!attr.allowNull()) {
1911
                                        v = (String) attr.getDefaultValue();
1912
                                        v.toUpperCase();
1913
                                }
1914
                                target.set(attr.getName(), v);
1915
                        } else {
1916
                                target.set(attr.getName(), source.get(attr.getName()));
1917
                        }
1918
                }
1919

    
1920
        }
1921

    
1922

    
1923
        public void testFeatureReference() throws Exception {
1924
                DataStoreParameters dbfParameters = this
1925
                                .getDefaultDataStoreParameters();
1926

    
1927
                FeatureStore store = (FeatureStore) dataManager
1928
                                .createStore(dbfParameters);
1929

    
1930
                Feature feature, refered;
1931
                FeatureSet set;
1932
                int nTimes2 = getRandom().nextInt(2) + 1;
1933

    
1934
                for (int j = 0; j < nTimes2; j++) {
1935
                        set = store.getFeatureSet();
1936
                        DisposableIterator iter;
1937

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

    
1953
                        set.dispose();
1954
                }
1955

    
1956
                nTimes2 = getRandom().nextInt(5) + 2;
1957
                FeatureQuery query = store.createFeatureQuery();
1958

    
1959
                for (int j = 0; j < nTimes2; j++) {
1960
                        DisposableIterator iter;
1961

    
1962
                        query.setAttributeNames(getRandomAttibuteList(store
1963
                                        .getDefaultFeatureType()));
1964
                        set = store.getFeatureSet(query);
1965

    
1966
                        int nTimes = getRandom().nextInt(3) + 3;
1967
                        for (int i = 0; i < nTimes; i++) {
1968
                                if (getRandom().nextBoolean()) {
1969
                                        iter = set.fastIterator();
1970
                                } else {
1971
                                        iter = set.fastIterator();
1972
                                }
1973
                                while (iter.hasNext()) {
1974
                                        feature = (Feature) iter.next();
1975
                                        refered = feature.getReference().getFeature(
1976
                                                        set.getDefaultFeatureType());
1977
                                        compareFeatures(feature, refered);
1978
                                }
1979
                                iter.dispose();
1980
                        }
1981

    
1982
                        set.dispose();
1983
                }
1984

    
1985

    
1986

    
1987
                store.dispose();
1988

    
1989
        }
1990

    
1991
        public void testResourcesLocks() throws Exception {
1992

    
1993
                if (!this.usesResources()) {
1994
                        return;
1995
                }
1996

    
1997
                DataStoreParameters dbfParameters = this
1998
                                .getDefaultDataStoreParameters();
1999

    
2000
                FeatureStore store = (FeatureStore) dataManager
2001
                                .createStore(dbfParameters);
2002

    
2003
                int nThreads = getRandom().nextInt(4) + 2;
2004
                List threads = new ArrayList();
2005
                TaskTestIterators task;
2006
                for (int i = 0; i < nThreads; i++) {
2007
                        task = new TaskTestIterators(this, "" + i, store);
2008
                        threads.add(task);
2009
                        task.start();
2010
                }
2011

    
2012
                Iterator iter;
2013
                List stillAlives = new ArrayList();
2014
                stillAlives.addAll(threads);
2015

    
2016
                while (!stillAlives.isEmpty()) {
2017
                        iter = stillAlives.iterator();
2018
                        while (iter.hasNext()) {
2019
                                task = (TaskTestIterators) iter.next();
2020
                                if (!task.isAlive()) {
2021
                                        iter.remove();
2022
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
2023
                                        iter.remove();
2024
                                        getLogger().error("task {} outOfDate", task.getName());
2025
                                } else {
2026
                                        Thread.yield();
2027
                                        Thread.sleep(100);
2028
                                }
2029
                        }
2030
                }
2031

    
2032
                store.dispose();
2033

    
2034
                iter = threads.iterator();
2035
                while (iter.hasNext()) {
2036
                        task = (TaskTestIterators) iter.next();
2037
                        assertTrue(task.isFinishedOk());
2038
                }
2039
        }
2040

    
2041
        class TaskTestIterators extends StoreTask {
2042
                private BaseTestFeatureStore testInstance;
2043

    
2044
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2045
                                String name, FeatureStore store) {
2046
                        super(name, store);
2047
                        this.testInstance = testInstance;
2048
                }
2049

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

    
2056
                public void run() {
2057
                        if (!this.startProcess()) {
2058
                                return;
2059
                        }
2060
                        try {
2061
                                this.testInstance.fullStoreIteratorTest(store);
2062

    
2063
                                finishedOk();
2064
                        } catch (Throwable e) {
2065
                                finishedError(e);
2066
                                return;
2067
                        }
2068
                }
2069

    
2070

    
2071
        }
2072

    
2073

    
2074
        protected void tearDown() throws Exception {
2075
                super.tearDown();
2076
                if (!usesResources()) {
2077
                        return;
2078
                }
2079

    
2080
                ResourceManager resMan = DALLocator.getResourceManager();
2081
                resMan.closeResources();
2082
        }
2083

    
2084

    
2085

    
2086
}