Statistics
| Revision:

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

History | View | Annotate | Download (51.2 KB)

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

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

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

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

    
40
import junit.framework.TestCase;
41

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

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

    
73
        private static Logger logger = null;
74

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

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

    
86
        public abstract boolean usesResources();
87

    
88
        public abstract boolean hasExplorer();
89

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

    
99
                return query;
100
        }
101

    
102

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

    
106
        /*
107
         * (non-Javadoc)
108
         *
109
         * @see junit.framework.TestCase#setUp()
110
         */
111
        protected void setUp() throws Exception {
112
                super.setUp();
113

    
114
                if (baseTestInitialized) {
115
                        return;
116
                }
117
                ToolsLibrary tools = new ToolsLibrary();
118
                tools.initialize();
119
                tools.postInitialize();
120

    
121
                DALLibrary lib = new DALLibrary();
122
                lib.initialize();
123
                lib.postInitialize();
124

    
125
                dataManager = DALLocator.getDataManager();
126
                baseTestInitialized = true;
127

    
128
        }
129

    
130

    
131

    
132
        //=================================================
133

    
134

    
135
        public void printFeature(Feature feature, int maxColSize) {
136
                printFeature(feature, true, maxColSize);
137
        }
138

    
139

    
140
        public void printFeature(Feature feature, boolean showColName,int maxColSize) {
141
                FeatureType fType = feature.getType();
142
                if (showColName){
143
                        this.printFeatureTypeColNames(feature.getType(), maxColSize);
144
                }
145
                StringBuilder row = new StringBuilder();
146
                Iterator iter = fType.iterator();
147
                FeatureAttributeDescriptor attr;
148

    
149
                while (iter.hasNext()) {
150
                        attr = (FeatureAttributeDescriptor) iter.next();
151
                        row.append(truncateOrFillString(feature.get(attr.getName()),
152
                                        maxColSize + 1, ' '));
153
                }
154
                System.out.println(row.toString());
155
        }
156

    
157
        public String truncateOrFillString(Object str, int max, char fillWith) {
158
                if (str == null) {
159
                        return truncateOrFillString("{null}", max, fillWith);
160
                }
161
                return truncateOrFillString(str.toString(), max, fillWith);
162
        }
163

    
164
        public String truncateOrFillString(String str, int max, char fillWith) {
165
                if (str.length() > max) {
166
                        return str.substring(0, max - 1) + " ";
167
                } else {
168
                        StringBuilder strB = new StringBuilder(str);
169
                        while (strB.length() < max) {
170
                                strB.append(fillWith);
171
                        }
172
                        return strB.toString();
173
                }
174

    
175
        }
176

    
177
        public void printFeatureTypeColNames(FeatureType fType, int maxColSize) {
178
                Iterator iter = fType.iterator();
179
                FeatureAttributeDescriptor attr;
180
                StringBuilder colNames = new StringBuilder();
181
                StringBuilder typeNames = new StringBuilder();
182
                StringBuilder sep = new StringBuilder();
183
                if (maxColSize < 1){
184
                        maxColSize = 15;
185
                }
186
                while (iter.hasNext()) {
187
                        attr = (FeatureAttributeDescriptor) iter.next();
188
                        colNames.append(truncateOrFillString(attr.getName(), maxColSize + 1, ' '));
189
                        typeNames.append(truncateOrFillString("(" + attr.getDataTypeName() + ")",
190
                                        maxColSize + 1, ' '));
191
                        sep.append(truncateOrFillString("", maxColSize, '='));
192
                        sep.append(' ');
193
                }
194

    
195
                System.out.println("");
196
                System.out.println("");
197
                System.out.println(colNames.toString());
198
                System.out.println(typeNames.toString());
199
                System.out.println(sep.toString());
200
        }
201

    
202
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
203
                        FeatureType ftype, int dataType) {
204
                return getFirstAttributeOfType(ftype, new int[] { dataType });
205
        }
206

    
207
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
208
                        FeatureType ftype, int[] dataTypes) {
209
                FeatureAttributeDescriptor attr;
210
                Iterator iter = ftype.iterator();
211
                int i;
212
                while (iter.hasNext()) {
213
                        attr = (FeatureAttributeDescriptor) iter.next();
214
                        for (i = 0; i < dataTypes.length; i++) {
215
                                if (attr.getDataType() == dataTypes[i]) {
216
                                        return attr;
217
                                }
218
                        }
219
                }
220
                return null;
221
        }
222

    
223
        protected boolean compareDynObject(DynObject obj1, DynObject obj2) {
224
                DynClass dynClass = obj1.getDynClass();
225
                if (!dynClass.getName().equals(obj2.getDynClass().getName())) {
226
                        return false;
227
                }
228

    
229
                DynField[] fields = dynClass.getDeclaredDynFields();
230
                String fieldName;
231
                Object v1, v2;
232
                for (int i = 0; i < fields.length; i++) {
233
                        fieldName = fields[i].getName();
234
                        v1 = obj1.getDynValue(fieldName);
235
                        v2 = obj2.getDynValue(fieldName);
236
                        if (v1 == v2) {
237
                                continue;
238
                        } else if (v1 != null) {
239
                                if (!v1.equals(v2)) {
240
                                        return false;
241
                                }
242
                        }
243
                }
244

    
245
                return true;
246
        }
247

    
248
        protected boolean compareStores(FeatureStore store1, FeatureStore store2)
249
                        throws DataException {
250
                if (store1.getParameters().getClass() != store2.getParameters()
251
                                .getClass()) {
252
                        return false;
253
                }
254
                if (!compareDynObject(store1.getParameters(), store2.getParameters())) {
255
                        return false;
256
                }
257

    
258
                if (store1.getEnvelope() != store2.getEnvelope()) {
259
                        if (store1.getEnvelope() != null) {
260
                                return store1.getEnvelope().equals(store2.getEnvelope());
261
                        } else {
262
                                return false;
263
                        }
264
                }
265

    
266
                if (!store1.getName().equals(store2.getName())) {
267
                        return false;
268
                }
269
                if (((FeatureSelection) store1.getSelection()).getSize() != ((FeatureSelection) store2
270
                                .getSelection()).getSize()) {
271
                        return false;
272
                }
273
                DisposableIterator iter1 = ((FeatureSelection) store1.getSelection())
274
                                .fastIterator();
275
                DisposableIterator iter2 = ((FeatureSelection) store2.getSelection())
276
                                .fastIterator();
277
                if (!compareFeatureIterators(iter1, iter2)) {
278
                        return false;
279
                }
280
                iter1.dispose();
281
                iter2.dispose();
282

    
283
                if (store1.getFeatureTypes().size() != store2.getFeatureTypes().size()) {
284
                        return false;
285
                }
286
                Iterator iterTypes1 = store1.getFeatureTypes().iterator();
287
                Iterator iterTypes2 = store2.getFeatureTypes().iterator();
288
                while (iterTypes1.hasNext()) {
289
                        if (!compareTypes((FeatureType) iterTypes1.next(),
290
                                        (FeatureType) iterTypes2
291
                                        .next())) {
292
                                return false;
293
                        }
294
                }
295
                if (!compareTypes(store1.getDefaultFeatureType(), store2
296
                                .getDefaultFeatureType())) {
297
                        return false;
298
                }
299

    
300
                if (store1.getLocks() != null) {
301
                        if (store1.getLocks().getLocksCount() != store2.getLocks()
302
                                        .getLocksCount()) {
303
                                return false;
304
                        }
305
                        if (!compareFeatureIterators(store1.getLocks().getLocks(), store2
306
                                        .getLocks().getLocks())) {
307
                                return false;
308
                        }
309

    
310
                } else if (store2.getLocks() != null) {
311
                        return false;
312
                }
313

    
314
                return true;
315
        }
316

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

    
328
                if (!iter2.hasNext()) {
329
                        return true;
330
                } else {
331
                        getLogger().warn("size !=");
332
                        return false;
333
                }
334

    
335
        }
336

    
337
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2,
338
                        String[] attrNames) {
339
                Feature feature;
340
                Feature ffeature;
341
                while (iter1.hasNext()) {
342
                        feature = (Feature) iter1.next();
343
                        ffeature = (Feature) iter2.next();
344
                        if (!this.compareFeatures(feature, ffeature, attrNames)) {
345
                                return false;
346
                        }
347
                }
348

    
349
                return !iter2.hasNext();
350

    
351
        }
352

    
353
        protected boolean compareTypes(FeatureType ft1, FeatureType ft2) {
354
                if (ft1.size() != ft2.size()) {
355
                        getLogger().warn("size !=");
356
                        return false;
357
                }
358
                if (ft1.getDefaultGeometryAttributeIndex() != ft2
359
                                .getDefaultGeometryAttributeIndex()) {
360
                        getLogger().warn(
361
                                        "getDefaultGeometryAttributeIndex "
362
                                                        + ft1.getDefaultGeometryAttributeIndex() +
363
                                        " !="+ ft2.getDefaultGeometryAttributeIndex());
364
                        return false;
365
                }
366
                if (ft1.getDefaultGeometryAttributeIndex() > -1) {
367
                        if (ft1.getDefaultSRS() != null) {
368
                                if (!ft1.getDefaultSRS().equals(ft2.getDefaultSRS())) {
369
                                        getLogger().warn("getDefaultSRS !=");
370
                                        return false;
371
                                }
372

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

    
381
                if (ft1.getDefaultGeometryAttributeName() != null) {
382
                        if (!ft1.getDefaultGeometryAttributeName().equals(
383
                                        ft2.getDefaultGeometryAttributeName())) {
384
                                getLogger().warn("getDefaultGeometryAttributeName !=");
385

    
386
                                return false;
387
                        }
388
                } else {
389
                        if (ft2.getDefaultGeometryAttributeName() != null) {
390
                                getLogger().warn("getDefaultGeometryAttributeName !=");
391
                                return false;
392
                        }
393
                }
394

    
395

    
396

    
397
                FeatureAttributeDescriptor attr1, attr2;
398
                for (int i = 0; i < ft1.size(); i++) {
399
                        attr1 = ft1.getAttributeDescriptor(i);
400
                        attr2 = ft2.getAttributeDescriptor(i);
401

    
402
                        if (!compareAttributes(attr1, attr2)) {
403
                                return false;
404
                        }
405

    
406
                }
407
                return true;
408

    
409
        }
410

    
411
        protected boolean compareAttributes(FeatureAttributeDescriptor attr1,
412
                        FeatureAttributeDescriptor attr2) {
413
                if (attr1 == null || attr2 == null) {
414
                        getLogger().warn("attr1 == null || attr2 == null");
415
                        return false;
416
                }
417
                if (!attr1.getName().equals(attr2.getName())) {
418
                        getLogger().warn(
419
                                        "name '" + attr1.getName() + "' != '" + attr2.getName()
420
                                                        + "'");
421
                        return false;
422
                }
423

    
424
                if (attr1.getDataType() != attr2.getDataType()) {
425
                        getLogger().warn(
426
                                        attr1.getName() + ":" +
427
                                        "dataType '" + attr1.getDataTypeName() + "'["
428
                                                        + attr1.getDataType() + "] != '"
429
                                                        + attr2.getDataTypeName() + "'["
430
                                                        + attr2.getDataType() + "]");
431
                        return false;
432
                }
433

    
434
                if (attr1.getSize() != attr2.getSize()) {
435
                        getLogger().warn(
436
                                        attr1.getName() + ":" +
437
                                        "size " + attr1.getSize() + " != " + attr2.getSize());
438
                        return false;
439
                }
440

    
441
                if (attr1.getPrecision() != attr2.getPrecision()) {
442
                        getLogger().warn(
443
                                        attr1.getName() + ":" +
444
                                        "precision " + attr1.getPrecision() + " != "
445
                                                        + attr1.getPrecision());
446
                        return false;
447
                }
448

    
449
                if (attr1.getGeometryType() != attr2.getGeometryType()) {
450
                        getLogger().warn(
451
                                        attr1.getName() + ":" +
452
                                        "GeometryType " + attr1.getGeometryType() + " != "
453
                                                        + attr2.getGeometryType());
454
                        return false;
455
                }
456

    
457
                if (attr1.getGeometrySubType() != attr2.getGeometrySubType()) {
458
                        getLogger().warn(
459
                                        attr1.getName() + ":" +
460
                                        "GeometrySubType " + attr1.getGeometrySubType() + " != "
461
                                                        + attr2.getGeometrySubType());
462

    
463
                        return false;
464
                }
465

    
466
                if (attr1.getSRS() != null) {
467
                        if (!attr1.getSRS().equals(attr2.getSRS())) {
468
                                getLogger().warn(
469
                                                attr1.getName() + ":" +
470
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
471
                                return false;
472
                        }
473
                } else {
474
                        if (attr2.getSRS() != null) {
475
                                getLogger().warn(
476
                                                attr1.getName() + ":" +
477
                                                "srs " + attr1.getSRS() + " != " + attr2.getSRS());
478
                                return false;
479
                        }
480
                }
481

    
482
                return true;
483
        }
484

    
485
        protected boolean compareFeatures(Feature f1, Feature f2,
486
                        String[] attrsNames) {
487
                FeatureAttributeDescriptor attr1;
488
                FeatureAttributeDescriptor attr2;
489
                Object v1, v2;
490
                for (int i = 0; i < attrsNames.length; i++) {
491
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
492
                        attr2 = f2.getType().getAttributeDescriptor(attrsNames[i]);
493
                        if (attr1 != attr2) {
494
                                if (!compareAttributes(attr1, attr1)) {
495
                                        return false;
496
                                }
497
                        }
498
                        v1 = f1.get(attr1.getName());
499
                        v2 = f2.get(attr2.getName());
500
                        if (!compareFeatureValue(v1, v2, attr1)) {
501
                                return false;
502
                        }
503
                }
504

    
505
                return true;
506
        }
507

    
508
        protected boolean compareFeatures(Feature f1, Feature f2) {
509
                if (!compareTypes(f1.getType(), f2.getType())) {
510
                        return false;
511
                }
512
                Iterator iter = f1.getType().iterator();
513
                FeatureAttributeDescriptor attr;
514
                Object v1, v2;
515
                while (iter.hasNext()) {
516
                        attr = (FeatureAttributeDescriptor) iter.next();
517
                        v1 = f1.get(attr.getName());
518
                        v2 = f2.get(attr.getName());
519
                        if (!compareFeatureValue(v1, v2, attr)) {
520
                                return false;
521
                        }
522
                }
523

    
524
                return true;
525

    
526
        }
527

    
528
        protected boolean compareFeatureValue(Object v1, Object v2,
529
                        FeatureAttributeDescriptor attr) {
530

    
531
                if ((v1 == null || v2 == null) &&  !attr.allowNull() ){
532
                        getLogger().warn("null and !allowNull:"
533
                                                        + attr.getName());
534
                        return false;
535
                }
536

    
537
                if (v1 == v2) {
538
                        return true;
539
                } else if (v1 == null) {
540
                        getLogger().warn(" v1 == null and v2 != null:"
541
                                                        + attr.getName());
542
                        return false;
543
                } else if (v2 == null) {
544
                        getLogger().warn("v2 == null and v1 != null:"
545
                                                        + attr.getName());
546
                        return false;
547

    
548
                }
549
                switch (attr.getDataType()) {
550
                case DataTypes.FEATURE:
551
                        return compareFeatures((Feature) v1, (Feature) v2);
552

    
553
                case DataTypes.GEOMETRY:
554
                        Geometry geom1 = (Geometry) v1;
555
                        Geometry geom2 = (Geometry) v2;
556
                        if (!geom1.equals(geom2)) {
557
                                getLogger().warn(" v1 != v2 (Geom):" + attr.getName());
558
                                return false;
559

    
560
                        }
561
                        return true;
562
                case DataTypes.DOUBLE:
563
                        double diff = ((Double) v1).doubleValue()
564
                                        - ((Double) v1).doubleValue();
565
                        if (!(Math.abs(diff) < 0.000001)) {
566
                                getLogger().warn(" v1 != v2 (Dobule):" + attr.getName());
567
                                return false;
568

    
569
                        }
570
                        return true;
571

    
572
                case DataTypes.BYTEARRAY:
573
                        byte[] bytes1 = (byte[]) v1;
574
                        byte[] bytes2 = (byte[]) v2;
575
                        if (bytes1.length != bytes2.length) {
576
                                getLogger().warn(
577
                                                "v1.length != v2.length (byte []):" + attr.getName());
578
                                return false;
579
                        }
580
                        for (int i = 0; i < bytes1.length; i++) {
581
                                if (bytes1[i] != bytes2[i]) {
582
                                        getLogger().warn(
583
                                                        " v1[" + i + "] != v2[" + i + "] (byte []):"
584
                                                                        + attr.getName());
585
                                        return false;
586
                                }
587
                        }
588
                        return true;
589

    
590
                case DataTypes.OBJECT:
591
                        if (!v1.equals(v2)) {
592
                                getLogger().warn(
593
                                                " v1 != v2 (object):" + attr.getName() + " [ignored]");
594

    
595
                        }
596
                        return true;
597

    
598
                default:
599
                        if (!v1.equals(v2)) {
600
                                getLogger()
601
                                                .warn(
602
                                                                " v1 != v2:" + attr.getName() + ": " + v1
603
                                                                                + " != " + v2);
604
                                return false;
605
                        }
606
                }
607
                return true;
608

    
609
        }
610

    
611

    
612
        //------------------------------------------------
613

    
614
        public void testSimpleIteration(FeatureStore store) {
615
                this.testSimpleIteration(store, null);
616
        }
617

    
618
        protected String[] getRandomAttibuteList(FeatureType fType) {
619
                String[] attrNames = new String[fType.size()];
620
                Iterator iter = fType.iterator();
621
                int i = 0;
622
                while (iter.hasNext()) {
623
                        attrNames[i] = ((FeatureAttributeDescriptor) iter.next()).getName();
624
                        i++;
625
                }
626
                return this.getRandomAttibuteList(attrNames);
627
        }
628

    
629
        protected Random getRandom(){
630
                if (rnd == null){
631
                        rnd = new Random();
632
                        rnd.setSeed(System.currentTimeMillis());
633
                }
634
                return rnd;
635
        }
636

    
637
        protected String[] getRandomAttibuteList(String[] attrNames) {
638
                int nAttributes = getRandom().nextInt(
639
                                attrNames.length + (attrNames.length / 2)) + 1;
640
                TreeSet set = new TreeSet();
641
                for (int i = 0; i < nAttributes; i++) {
642
                        set.add(attrNames[getRandom().nextInt(attrNames.length)]);
643
                }
644
                return (String[]) set.toArray(new String[0]);
645
        }
646

    
647
        public void testIterationFastAndStandart(FeatureStore store)
648
                        throws Exception {
649
                this.testIterationFastAndStandart(store, null);
650

    
651
                FeatureQuery query = this.getDefaultQuery(store);
652
                // Random Attribute list
653
                query.setAttributeNames(getRandomAttibuteList(store
654
                                .getDefaultFeatureType()));
655
                this.testIterationFastAndStandart(store, query);
656

    
657
                // Sorted
658
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(store
659
                                .getDefaultFeatureType(), new int[] { DataTypes.INT,
660
                                DataTypes.LONG, DataTypes.STRING });
661
                {
662
                        // asure that attr is in query attributes
663
                        boolean attrFound = false;
664
                        String[] curAttrs = query.getAttributeNames();
665
                        for (int i = 0; i < curAttrs.length; i++) {
666
                                if (curAttrs[i].equals(attr.getName())) {
667
                                        attrFound = true;
668
                                        break;
669

    
670
                                }
671
                        }
672
                        if (!attrFound) {
673
                                String[] newAttrs = new String[curAttrs.length + 1];
674
                                for (int i = 0; i < curAttrs.length; i++) {
675
                                        newAttrs[i] = curAttrs[i];
676
                                }
677
                                newAttrs[curAttrs.length] = attr.getName();
678
                                query.setAttributeNames(newAttrs);
679
                        }
680
                }
681

    
682

    
683
                query.getOrder().add(attr.getName(), true);
684
                this.testIterationFastAndStandart(store, query);
685

    
686
                // Filter
687
                query = this.getDefaultQuery(store);
688

    
689
                query.setFilter(new Evaluator(){
690

    
691
                        public Object evaluate(EvaluatorData data)
692
                                        throws EvaluatorException {
693
                                // TODO Auto-generated method stub
694
                                return Boolean.TRUE;
695
                        }
696

    
697
                        public String getCQL() {
698
                                return "true = true";
699
                        }
700

    
701
                        public String getDescription() {
702
                                // TODO Auto-generated method stub
703
                                return null;
704
                        }
705

    
706
                        public String getName() {
707
                                return "AlwaysTrue";
708
                        }
709

    
710
                        public EvaluatorFieldsInfo getFieldsInfo() {
711
                                // TODO Auto-generated method stub
712
                                return null;
713
                        }
714

    
715
                });
716
                this.testIterationFastAndStandart(store, query);
717

    
718
                // Filter + Sorted
719
                query.getOrder().add(attr.getName(), true);
720
                this.testIterationFastAndStandart(store, query);
721
        }
722

    
723
        public void testSimpleIteration(FeatureStore store, FeatureQuery query) {
724
                FeatureSet set;
725
                try {
726

    
727
                        if (query == null) {
728
                                query = this.getDefaultQuery(store);
729
                        }
730
                        set = store.getFeatureSet(query);
731
                        FeatureType type = set.getDefaultFeatureType();
732

    
733
                        DisposableIterator it = set.iterator();
734
                        Feature feature;
735
                        printFeatureTypeColNames(type, 15);
736
                        while (it.hasNext()) {
737

    
738
                                feature = (Feature) it.next();
739
                                printFeature(feature, false, 15);
740
                        }
741

    
742
                        it.dispose();
743
                        set.dispose();
744

    
745
                } catch (DataException e3) {
746
                        e3.printStackTrace();
747
                        fail();
748
                        return;
749
                }
750

    
751
        }
752

    
753
        public void testIterationFastAndStandart(FeatureStore store,
754
                        FeatureQuery query) {
755
                FeatureSet set;
756
                try {
757

    
758
                        if (query == null) {
759
                                query = this.getDefaultQuery(store);
760
                        }
761
                        set = store.getFeatureSet(query);
762

    
763
                        DisposableIterator it = set.iterator();
764
                        DisposableIterator fit = set.fastIterator();
765

    
766
                        assertTrue(this.compareFeatureIterators(it, fit));
767

    
768
                        it.dispose();
769
                        fit.dispose();
770
                        set.dispose();
771

    
772
                } catch (DataException e3) {
773
                        e3.printStackTrace();
774
                        fail();
775
                        return;
776
                }
777

    
778
        }
779

    
780
        public void testSimpleIteration(DataStoreParameters parameters)
781
                        throws Exception {
782
                FeatureStore store = null;
783
                store = (FeatureStore) dataManager.createStore(parameters);
784

    
785
                this.testSimpleIteration(store);
786

    
787
                store.dispose();
788

    
789
        }
790

    
791
        public void testIterationFastAndStandart(DataStoreParameters parameters)
792
                        throws Exception {
793
                FeatureStore store = null;
794
                store = (FeatureStore) dataManager.createStore(parameters);
795

    
796
                this.testIterationFastAndStandart(store);
797

    
798
                store.dispose();
799

    
800
        }
801

    
802
        /**
803
         *
804
         * @param count
805
         *            if (< 0) list.size() >= 1 else list.size() == count
806
         * @throws Exception
807
         */
808
        public void testExplorerList(int count) throws Exception {
809
                FeatureStore store = null;
810
                store = (FeatureStore) dataManager.createStore(this
811
                                .getDefaultDataStoreParameters());
812

    
813
                DataServerExplorer explorer;
814
                explorer = store.getExplorer();
815

    
816
                if (count < 0) {
817
                        assertTrue(explorer.list().size() >= 1);
818
                } else {
819
                        assertTrue(explorer.list().size() == count);
820
                }
821

    
822
                store.dispose();
823

    
824
                explorer.dispose();
825
        }
826

    
827
        //=================================================
828
        //=================================================
829

    
830

    
831

    
832

    
833
        public void testIterationFastAndStandart() throws Exception {
834
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
835
        }
836

    
837
        public void testSimpleIteration() throws Exception {
838
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
839
        }
840

    
841
        public void testInitializeStore() throws Exception {
842
                FeatureStore store = (FeatureStore) dataManager.createStore(this
843
                                .getDefaultDataStoreParameters());
844
                store.dispose();
845
        }
846

    
847

    
848
        public void testExplorer() throws Exception {
849
                if (!this.hasExplorer()) {
850
                        return;
851
                }
852
                this.testExplorerList(-1);
853

    
854
        }
855

    
856
        public void testSelection() throws Exception {
857
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
858

    
859
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
860
                FeatureSet set = store.getFeatureSet();
861

    
862
                assertTrue(store.getFeatureSelection().isEmpty());
863
                store.setSelection(set);
864
                assertFalse(store.getFeatureSelection().isEmpty());
865

    
866
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
867

    
868
                DisposableIterator iter = set.iterator();
869
                while (iter.hasNext()) {
870
                        assertTrue(store.getFeatureSelection().isSelected(
871
                                        (Feature) iter.next()));
872
                }
873
                iter.dispose();
874

    
875
                store.getFeatureSelection().reverse();
876
                assertTrue(store.getFeatureSelection().isEmpty());
877
                assertEquals(0, store.getFeatureSelection().getSize());
878
                iter = set.iterator();
879
                while (iter.hasNext()) {
880
                        assertFalse(store.getFeatureSelection().isSelected(
881
                                        (Feature) iter.next()));
882
                }
883
                iter.dispose();
884

    
885
                store.getFeatureSelection().reverse();
886
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
887
                assertFalse(store.getFeatureSelection().isEmpty());
888

    
889
                set.dispose();
890

    
891
        }
892

    
893
        public void testCustomFTypeSet() throws Exception {
894
                DataStoreParameters dbfParameters = this
895
                                .getDefaultDataStoreParameters();
896

    
897
                FeatureStore store = (FeatureStore) dataManager
898
                                .createStore(dbfParameters);
899

    
900
                testCustomFTypeSet(store);
901

    
902
                store.dispose();
903
        }
904

    
905
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
906

    
907
                FeatureSet set, set1;
908
                FeatureQuery query;
909
                DisposableIterator iter, iter1;
910
                Iterator attrIter;
911
                FeatureAttributeDescriptor attr;
912

    
913
                set = store.getFeatureSet(this.getDefaultQuery(store));
914
                attrIter = store.getDefaultFeatureType().iterator();
915

    
916
                String[] names;
917
                while (attrIter.hasNext()) {
918
                        attr = (FeatureAttributeDescriptor) attrIter.next();
919
                        int fieldIndex = attr.getIndex();
920

    
921
                        query = this.getDefaultQuery(store);
922
                        String fieldName = store.getDefaultFeatureType()
923
                        .getAttributeDescriptor(fieldIndex).getName();
924

    
925
                        names = new String[] { fieldName };
926
                        query.setAttributeNames(names);
927
                        set1 = store.getFeatureSet(query);
928

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

    
940
                        assertTrue(compareFeatureIterators(iter, iter1, names));
941

    
942
                        iter.dispose();
943
                        iter1.dispose();
944
                        set1.dispose();
945
                }
946

    
947
                int ntimes = getRandom().nextInt(10) + 5;
948
                FeatureType type = store.getDefaultFeatureType();
949
                query = this.getDefaultQuery(store);
950
                for (int i = 0; i < ntimes; i++) {
951
                        names = getRandomAttibuteList(type);
952

    
953
                        query.setAttributeNames(names);
954
                        set1 = store.getFeatureSet(query);
955

    
956
                        if (getRandom().nextBoolean()) {
957
                                iter = set.fastIterator();
958
                        } else {
959
                                iter = set.iterator();
960
                        }
961
                        if (getRandom().nextBoolean()) {
962
                                iter1 = set1.fastIterator();
963
                        } else {
964
                                iter1 = set1.iterator();
965
                        }
966

    
967
                        assertTrue(compareFeatureIterators(iter, iter1, names));
968

    
969
                        iter.dispose();
970
                        iter1.dispose();
971
                        set1.dispose();
972

    
973

    
974
                }
975

    
976

    
977

    
978
                set.dispose();
979

    
980
        }
981

    
982
        // TODO: Corregir este test
983
    // public void testPersistence() throws Exception {
984
    // if (ToolsLocator.getPersistenceManager() == null) {
985
    // fail("Default Persistence Manager not register");
986
    // }
987
    // DataStoreParameters params = this.getDefaultDataStoreParameters();
988
    //
989
    //
990
    // FeatureStore store = (FeatureStore) dataManager.createStore(params);
991
    //
992
    // testSimpleIteration(store);
993
    //
994
    // PersistentState state = store.getState();
995
    //
996
    // FeatureStore store2 = (FeatureStore) ToolsLocator
997
    // .getPersistenceManager().create(state);
998
    //
999
    // testSimpleIteration(store2);
1000
    //
1001
    // assertTrue(compareStores(store, store2));
1002
    //
1003
    // // TODO Compare states
1004
    // // XMLEntityState state2 = (XMLEntityState) store.getState();
1005
    // //
1006
    // // assertEquals(state.getXMLEntity().toString(), state2.getXMLEntity()
1007
    // // .toString());
1008
    // //
1009
    // store.dispose();
1010
    // store2.dispose();
1011
    //
1012
    //
1013
    // }
1014

    
1015

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

    
1020
                FeatureStore store = (FeatureStore) dataManager
1021
                                .createStore(dbfParameters);
1022

    
1023
                testShort(store);
1024

    
1025
                store.dispose();
1026

    
1027
        }
1028

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

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

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

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

    
1048

    
1049

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

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

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

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

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

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

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

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

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

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

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

    
1105
                }
1106

    
1107
        }
1108

    
1109

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

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

    
1121
                Iterator orderIter;
1122

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

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

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

    
1214
                return true;
1215
        }
1216

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

    
1223

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

    
1228
                FeatureStore store = (FeatureStore) dataManager
1229
                                .createStore(dbfParameters);
1230

    
1231
                FeatureStore store1 = (FeatureStore) dataManager
1232
                                .createStore(dbfParameters);
1233

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

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

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

    
1247

    
1248
                fullStoreIteratorTest(store);
1249

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

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

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

    
1287

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

    
1291

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

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

    
1297
                fullStoreIteratorTest(store);
1298

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

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

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

    
1338

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

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

    
1344
                fullStoreIteratorTest(store);
1345

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

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

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

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

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

    
1390
                fullStoreIteratorTest(store);
1391

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

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

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

    
1434

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

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

    
1440
                fullStoreIteratorTest(store);
1441

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

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

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

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

    
1484
                compareStores(store, store1);
1485

    
1486

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

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

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

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

    
1506
                }
1507

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

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

    
1517
                }
1518

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

    
1522
                }
1523

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

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

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

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

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

    
1546
                }
1547

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

    
1553
                public FeatureType getSourceFeatureTypeFrom(
1554
                                FeatureType targetFeatureType) {
1555

    
1556
                        return targetFeatureType;
1557
                }
1558

    
1559
        }
1560

    
1561
        abstract class TransformTypeTransform extends myTransform {
1562

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

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

    
1571
                        return this.myDefaultFeatureType;
1572
                }
1573

    
1574
                protected abstract FeatureType transformType(FeatureType type);
1575

    
1576
                protected abstract FeatureType restoreType(FeatureType type);
1577

    
1578

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

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

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

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

    
1625
        }
1626

    
1627
        abstract class TransformAttributeNameTransform extends
1628
                        TransformTypeTransform {
1629

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

    
1636

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

    
1648
                protected abstract String transformAttributeName(String source);
1649

    
1650
                protected abstract String restoreAttributeName(String target);
1651

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

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

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

    
1698
        }
1699

    
1700

    
1701
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1702

    
1703
                private String prefix;
1704

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

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

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

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

    
1721
        }
1722

    
1723
        class AddAttribute extends TransformTypeTransform {
1724

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

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

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

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

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

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

    
1759

    
1760

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

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

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

    
1784

    
1785
                        return result.getNotEditableCopy();
1786
                }
1787

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

    
1799

    
1800
        class RemoveAttribute extends TransformTypeTransform {
1801

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

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

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

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

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

    
1835

    
1836
                        return result.getNotEditableCopy();
1837
                }
1838

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

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

    
1853
                }
1854

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

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

    
1882

    
1883

    
1884
        }
1885

    
1886

    
1887
        public class StringsToLowerTransform extends myTransform {
1888

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

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

    
1909
        }
1910

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

    
1928
        }
1929

    
1930

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

    
1935
                FeatureStore store = (FeatureStore) dataManager
1936
                                .createStore(dbfParameters);
1937

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

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

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

    
1961
                        set.dispose();
1962
                }
1963

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

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

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

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

    
1990
                        set.dispose();
1991
                }
1992

    
1993

    
1994

    
1995
                store.dispose();
1996

    
1997
        }
1998

    
1999
        public void testResourcesLocks() throws Exception {
2000

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

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

    
2008
                FeatureStore store = (FeatureStore) dataManager
2009
                                .createStore(dbfParameters);
2010

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

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

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

    
2040
                store.dispose();
2041

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

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

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

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

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

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

    
2078

    
2079
        }
2080

    
2081

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

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

    
2092
}