Statistics
| Revision:

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

History | View | Annotate | Download (47.3 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.geom.Geometry;
53
import org.gvsig.tools.ToolsLibrary;
54
import org.gvsig.tools.dynobject.DynClass;
55
import org.gvsig.tools.dynobject.DynField;
56
import org.gvsig.tools.dynobject.DynObject;
57
import org.gvsig.tools.evaluator.Evaluator;
58
import org.gvsig.tools.evaluator.EvaluatorData;
59
import org.gvsig.tools.evaluator.EvaluatorException;
60
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
61
import org.gvsig.tools.persistence.PersistenceException;
62
import org.gvsig.tools.persistence.PersistentState;
63
import org.slf4j.Logger;
64
import org.slf4j.LoggerFactory;
65

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

    
72
        private static Logger logger = null;
73

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

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

    
85
        public abstract boolean usesResources();
86

    
87
        public abstract boolean hasExplorer();
88

    
89
        public FeatureQuery getDefaultQuery(FeatureStore store) {
90
                return store.createFeatureQuery();
91
        }
92

    
93

    
94
        public abstract DataStoreParameters getDefaultDataStoreParameters()
95
                        throws DataException;
96

    
97
        /*
98
         * (non-Javadoc)
99
         *
100
         * @see junit.framework.TestCase#setUp()
101
         */
102
        protected void setUp() throws Exception {
103
                super.setUp();
104

    
105
                if (baseTestInitialized) {
106
                        return;
107
                }
108
                ToolsLibrary tools = new ToolsLibrary();
109
                tools.initialize();
110
                tools.postInitialize();
111

    
112
                DALLibrary lib = new DALLibrary();
113
                lib.initialize();
114
                lib.postInitialize();
115

    
116
                dataManager = DALLocator.getDataManager();
117
                baseTestInitialized = true;
118

    
119
        }
120

    
121

    
122

    
123
        //=================================================
124

    
125

    
126
        public void printFeature(Feature feature, int maxColSize) {
127
                printFeature(feature, true, maxColSize);
128
        }
129

    
130

    
131
        public void printFeature(Feature feature, boolean showColName,int maxColSize) {
132
                FeatureType fType = feature.getType();
133
                if (showColName){
134
                        this.printFeatureTypeColNames(feature.getType(), maxColSize);
135
                }
136
                StringBuilder row = new StringBuilder();
137
                Iterator iter = fType.iterator();
138
                FeatureAttributeDescriptor attr;
139

    
140
                while (iter.hasNext()) {
141
                        attr = (FeatureAttributeDescriptor) iter.next();
142
                        row.append(truncateOrFillString(feature.get(attr.getName()),
143
                                        maxColSize + 1, ' '));
144
                }
145
                System.out.println(row.toString());
146
        }
147

    
148
        public String truncateOrFillString(Object str, int max, char fillWith) {
149
                if (str == null) {
150
                        return truncateOrFillString("{null}", max, fillWith);
151
                }
152
                return truncateOrFillString(str.toString(), max, fillWith);
153
        }
154

    
155
        public String truncateOrFillString(String str, int max, char fillWith) {
156
                if (str.length() > max) {
157
                        return str.substring(0, max - 1) + " ";
158
                } else {
159
                        StringBuilder strB = new StringBuilder(str);
160
                        while (strB.length() < max) {
161
                                strB.append(fillWith);
162
                        }
163
                        return strB.toString();
164
                }
165

    
166
        }
167

    
168
        public void printFeatureTypeColNames(FeatureType fType, int maxColSize) {
169
                Iterator iter = fType.iterator();
170
                FeatureAttributeDescriptor attr;
171
                StringBuilder colNames = new StringBuilder();
172
                StringBuilder typeNames = new StringBuilder();
173
                StringBuilder sep = new StringBuilder();
174
                if (maxColSize < 1){
175
                        maxColSize = 15;
176
                }
177
                while (iter.hasNext()) {
178
                        attr = (FeatureAttributeDescriptor) iter.next();
179
                        colNames.append(truncateOrFillString(attr.getName(), maxColSize + 1, ' '));
180
                        typeNames.append(truncateOrFillString("(" + attr.getDataTypeName() + ")",
181
                                        maxColSize + 1, ' '));
182
                        sep.append(truncateOrFillString("", maxColSize, '='));
183
                        sep.append(' ');
184
                }
185

    
186
                System.out.println("");
187
                System.out.println("");
188
                System.out.println(colNames.toString());
189
                System.out.println(typeNames.toString());
190
                System.out.println(sep.toString());
191
        }
192

    
193
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
194
                        FeatureType ftype, int dataType) {
195
                return getFirstAttributeOfType(ftype, new int[] { dataType });
196
        }
197

    
198
        protected FeatureAttributeDescriptor getFirstAttributeOfType(
199
                        FeatureType ftype, int[] dataTypes) {
200
                FeatureAttributeDescriptor attr;
201
                Iterator iter = ftype.iterator();
202
                int i;
203
                while (iter.hasNext()) {
204
                        attr = (FeatureAttributeDescriptor) iter.next();
205
                        for (i = 0; i < dataTypes.length; i++) {
206
                                if (attr.getDataType() == dataTypes[i]) {
207
                                        return attr;
208
                                }
209
                        }
210
                }
211
                return null;
212
        }
213

    
214
        protected boolean compareDynObject(DynObject obj1, DynObject obj2) {
215
                DynClass dynClass = obj1.getDynClass();
216
                if (!dynClass.getName().equals(obj2.getDynClass().getName())) {
217
                        return false;
218
                }
219

    
220
                DynField[] fields = dynClass.getDeclaredDynFields();
221
                String fieldName;
222
                Object v1, v2;
223
                for (int i = 0; i < fields.length; i++) {
224
                        fieldName = fields[i].getName();
225
                        v1 = obj1.getDynValue(fieldName);
226
                        v2 = obj2.getDynValue(fieldName);
227
                        if (v1 == v2) {
228
                                continue;
229
                        } else if (v1 != null) {
230
                                if (!v1.equals(v2)) {
231
                                        return false;
232
                                }
233
                        }
234
                }
235

    
236
                return true;
237
        }
238

    
239
        protected boolean compareStores(FeatureStore store1, FeatureStore store2)
240
                        throws DataException {
241
                if (store1.getParameters().getClass() != store2.getParameters()
242
                                .getClass()) {
243
                        return false;
244
                }
245
                if (!compareDynObject(store1.getParameters(), store2.getParameters())) {
246
                        return false;
247
                }
248

    
249
                if (store1.getEnvelope() != store2.getEnvelope()) {
250
                        if (store1.getEnvelope() != null) {
251
                                return store1.getEnvelope().equals(store2.getEnvelope());
252
                        } else {
253
                                return false;
254
                        }
255
                }
256

    
257
                if (!store1.getName().equals(store2.getName())) {
258
                        return false;
259
                }
260
                if (((FeatureSelection) store1.getSelection()).getSize() != ((FeatureSelection) store2
261
                                .getSelection()).getSize()) {
262
                        return false;
263
                }
264
                DisposableIterator iter1 = ((FeatureSelection) store1.getSelection())
265
                                .fastIterator();
266
                DisposableIterator iter2 = ((FeatureSelection) store2.getSelection())
267
                                .fastIterator();
268
                if (!compareFeatureIterators(iter1, iter2)) {
269
                        return false;
270
                }
271
                iter1.dispose();
272
                iter2.dispose();
273

    
274
                if (store1.getFeatureTypes().size() != store2.getFeatureTypes().size()) {
275
                        return false;
276
                }
277
                Iterator iterTypes1 = store1.getFeatureTypes().iterator();
278
                Iterator iterTypes2 = store2.getFeatureTypes().iterator();
279
                while (iterTypes1.hasNext()) {
280
                        if (!compareTypes((FeatureType) iterTypes1.next(),
281
                                        (FeatureType) iterTypes2
282
                                        .next())) {
283
                                return false;
284
                        }
285
                }
286
                if (!compareTypes(store1.getDefaultFeatureType(), store2
287
                                .getDefaultFeatureType())) {
288
                        return false;
289
                }
290

    
291
                if (store1.getLocks() != null) {
292
                        if (store1.getLocks().getLocksCount() != store2.getLocks()
293
                                        .getLocksCount()) {
294
                                return false;
295
                        }
296
                        if (!compareFeatureIterators(store1.getLocks().getLocks(), store2
297
                                        .getLocks().getLocks())) {
298
                                return false;
299
                        }
300

    
301
                } else if (store2.getLocks() != null) {
302
                        return false;
303
                }
304

    
305
                return true;
306
        }
307

    
308
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2) {
309
                Feature feature;
310
                Feature ffeature;
311
                while (iter1.hasNext()) {
312
                        feature = (Feature) iter1.next();
313
                        ffeature = (Feature) iter2.next();
314
                        if (!this.compareFeatures(feature, ffeature)) {
315
                                return false;
316
                        }
317
                }
318

    
319
                return !iter2.hasNext();
320

    
321
        }
322

    
323
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2,
324
                        String[] attrNames) {
325
                Feature feature;
326
                Feature ffeature;
327
                while (iter1.hasNext()) {
328
                        feature = (Feature) iter1.next();
329
                        ffeature = (Feature) iter2.next();
330
                        if (!this.compareFeatures(feature, ffeature, attrNames)) {
331
                                return false;
332
                        }
333
                }
334

    
335
                return !iter2.hasNext();
336

    
337
        }
338

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

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

    
360
                if (ft1.getDefaultGeometryAttributeName() != null) {
361
                        if (!ft1.getDefaultGeometryAttributeName().equals(
362
                                        ft2.getDefaultGeometryAttributeName())) {
363
                                return false;
364
                        }
365
                } else {
366
                        if (ft2.getDefaultGeometryAttributeName() != null) {
367
                                return false;
368
                        }
369
                }
370

    
371

    
372

    
373
                FeatureAttributeDescriptor attr1, attr2;
374
                for (int i = 0; i < ft1.size(); i++) {
375
                        attr1 = ft1.getAttributeDescriptor(i);
376
                        attr2 = ft2.getAttributeDescriptor(i);
377

    
378
                        if (!compareAttributes(attr1, attr2)) {
379
                                return false;
380
                        }
381

    
382
                }
383
                return true;
384

    
385
        }
386

    
387
        protected boolean compareAttributes(FeatureAttributeDescriptor attr1,
388
                        FeatureAttributeDescriptor attr2) {
389
                if (attr1 == null || attr2 == null) {
390
                        return false;
391
                }
392
                if (!attr1.getName().equals(attr2.getName())) {
393
                        return false;
394
                }
395

    
396
                if (attr1.getDataType() != attr2.getDataType()) {
397
                        return false;
398
                }
399

    
400
                if (attr1.getSize() != attr2.getSize()) {
401
                        return false;
402
                }
403

    
404
                if (attr1.getPrecision() != attr2.getPrecision()) {
405
                        return false;
406
                }
407

    
408
                if (attr1.getGeometryType() != attr2.getGeometryType()) {
409
                        return false;
410
                }
411

    
412
                if (attr1.getSRS() != null) {
413
                        if (!attr1.getSRS().equals(attr2.getSRS())) {
414
                                return false;
415
                        }
416
                } else {
417
                        if (attr2.getSRS() != null) {
418
                                return false;
419
                        }
420
                }
421

    
422
                return true;
423
        }
424

    
425
        protected boolean compareFeatures(Feature f1, Feature f2,
426
                        String[] attrsNames) {
427
                FeatureAttributeDescriptor attr1;
428
                FeatureAttributeDescriptor attr2;
429
                Object v1, v2;
430
                for (int i = 0; i < attrsNames.length; i++) {
431
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
432
                        attr2 = f2.getType().getAttributeDescriptor(attrsNames[i]);
433
                        if (attr1 != attr2) {
434
                                if (!compareAttributes(attr1, attr1)) {
435
                                        return false;
436
                                }
437
                        }
438
                        v1 = f1.get(attr1.getName());
439
                        v2 = f2.get(attr2.getName());
440
                        if (!compareFeatureValue(v1, v2, attr1)) {
441
                                return false;
442
                        }
443
                }
444

    
445
                return true;
446
        }
447

    
448
        protected boolean compareFeatures(Feature f1, Feature f2) {
449
                if (!compareTypes(f1.getType(), f2.getType())) {
450
                        System.out.println("compareFeatures() type !=");
451
                        return false;
452
                }
453
                Iterator iter = f1.getType().iterator();
454
                FeatureAttributeDescriptor attr;
455
                Object v1, v2;
456
                while (iter.hasNext()) {
457
                        attr = (FeatureAttributeDescriptor) iter.next();
458
                        v1 = f1.get(attr.getName());
459
                        v2 = f2.get(attr.getName());
460
                        if (!compareFeatureValue(v1, v2, attr)) {
461
                                return false;
462
                        }
463
                }
464

    
465
                return true;
466

    
467
        }
468

    
469
        protected boolean compareFeatureValue(Object v1, Object v2,
470
                        FeatureAttributeDescriptor attr) {
471

    
472
                if ((v1 == null || v2 == null) &&  !attr.allowNull() ){
473
                        return false;
474
                }
475

    
476
                if (v1 == v2) {
477
                        return true;
478
                } else if (v1 == null) {
479
                        return false;
480
                }
481
                switch (attr.getDataType()) {
482
                case DataTypes.FEATURE:
483
                        return compareFeatures((Feature) v1, (Feature) v2);
484

    
485
                case DataTypes.GEOMETRY:
486
                        Geometry geom1 = (Geometry) v1;
487
                        Geometry geom2 = (Geometry) v2;
488
                        return geom1.equals(geom2);
489
                case DataTypes.DOUBLE:
490
                        double diff = ((Double) v1).doubleValue()
491
                                        - ((Double) v1).doubleValue();
492
                        return Math.abs(diff) < 0.000001;
493

    
494
                default:
495
                        return v1.equals(v2);
496
                }
497

    
498
        }
499

    
500

    
501
        //------------------------------------------------
502

    
503
        public void testSimpleIteration(FeatureStore store) {
504
                this.testSimpleIteration(store, null);
505
        }
506

    
507
        protected String[] getRandomAttibuteList(FeatureType fType) {
508
                String[] attrNames = new String[fType.size()];
509
                Iterator iter = fType.iterator();
510
                int i = 0;
511
                while (iter.hasNext()) {
512
                        attrNames[i] = ((FeatureAttributeDescriptor) iter.next()).getName();
513
                        i++;
514
                }
515
                return this.getRandomAttibuteList(attrNames);
516
        }
517

    
518
        protected Random getRandom(){
519
                if (rnd == null){
520
                        rnd = new Random();
521
                        rnd.setSeed(System.currentTimeMillis());
522
                }
523
                return rnd;
524
        }
525

    
526
        protected String[] getRandomAttibuteList(String[] attrNames) {
527
                int nAttributes = getRandom().nextInt(
528
                                attrNames.length + (attrNames.length / 2)) + 1;
529
                TreeSet set = new TreeSet();
530
                for (int i = 0; i < nAttributes; i++) {
531
                        set.add(attrNames[getRandom().nextInt(attrNames.length)]);
532
                }
533
                return (String[]) set.toArray(new String[0]);
534
        }
535

    
536
        public void testIterationFastAndStandart(FeatureStore store)
537
                        throws Exception {
538
                this.testIterationFastAndStandart(store, null);
539

    
540
                FeatureQuery query = this.getDefaultQuery(store);
541
                // Random Attribute list
542
                query.setAttributeNames(getRandomAttibuteList(store
543
                                .getDefaultFeatureType()));
544
                this.testIterationFastAndStandart(store, query);
545

    
546
                // Sorted
547
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(store
548
                                .getDefaultFeatureType(), new int[] { DataTypes.INT,
549
                                DataTypes.LONG, DataTypes.STRING });
550
                {
551
                        // asure that attr is in query attributes
552
                        boolean attrFound = false;
553
                        String[] curAttrs = query.getAttributeNames();
554
                        for (int i = 0; i < curAttrs.length; i++) {
555
                                if (curAttrs[i].equals(attr.getName())) {
556
                                        attrFound = true;
557
                                        break;
558

    
559
                                }
560
                        }
561
                        if (!attrFound) {
562
                                String[] newAttrs = new String[curAttrs.length + 1];
563
                                for (int i = 0; i < curAttrs.length; i++) {
564
                                        newAttrs[i] = curAttrs[i];
565
                                }
566
                                newAttrs[curAttrs.length] = attr.getName();
567
                                query.setAttributeNames(newAttrs);
568
                        }
569
                }
570

    
571

    
572
                query.getOrder().add(attr.getName(), true);
573
                this.testIterationFastAndStandart(store, query);
574

    
575
                // Filter
576
                query = this.getDefaultQuery(store);
577

    
578
                query.setFilter(new Evaluator(){
579

    
580
                        public Object evaluate(EvaluatorData data)
581
                                        throws EvaluatorException {
582
                                // TODO Auto-generated method stub
583
                                return Boolean.TRUE;
584
                        }
585

    
586
                        public String getCQL() {
587
                                return "true = true";
588
                        }
589

    
590
                        public String getDescription() {
591
                                // TODO Auto-generated method stub
592
                                return null;
593
                        }
594

    
595
                        public String getName() {
596
                                return "AlwaysTrue";
597
                        }
598

    
599
                        public EvaluatorFieldsInfo getFieldsInfo() {
600
                                // TODO Auto-generated method stub
601
                                return null;
602
                        }
603

    
604
                });
605
                this.testIterationFastAndStandart(store, query);
606

    
607
                // Filter + Sorted
608
                query.getOrder().add(attr.getName(), true);
609
                this.testIterationFastAndStandart(store, query);
610
        }
611

    
612
        public void testSimpleIteration(FeatureStore store, FeatureQuery query) {
613
                FeatureSet set;
614
                try {
615

    
616
                        if (query == null) {
617
                                query = this.getDefaultQuery(store);
618
                        }
619
                        set = store.getFeatureSet(query);
620
                        FeatureType type = set.getDefaultFeatureType();
621

    
622
                        DisposableIterator it = set.iterator();
623
                        Feature feature;
624
                        printFeatureTypeColNames(type, 15);
625
                        while (it.hasNext()) {
626

    
627
                                feature = (Feature) it.next();
628
                                printFeature(feature, false, 15);
629
                        }
630

    
631
                        it.dispose();
632
                        set.dispose();
633

    
634
                } catch (DataException e3) {
635
                        e3.printStackTrace();
636
                        fail();
637
                        return;
638
                }
639

    
640
        }
641

    
642
        public void testIterationFastAndStandart(FeatureStore store,
643
                        FeatureQuery query) {
644
                FeatureSet set;
645
                try {
646

    
647
                        if (query == null) {
648
                                query = this.getDefaultQuery(store);
649
                        }
650
                        set = store.getFeatureSet(query);
651

    
652
                        DisposableIterator it = set.iterator();
653
                        DisposableIterator fit = set.fastIterator();
654

    
655
                        assertTrue(this.compareFeatureIterators(it, fit));
656

    
657
                        it.dispose();
658
                        fit.dispose();
659
                        set.dispose();
660

    
661
                } catch (DataException e3) {
662
                        e3.printStackTrace();
663
                        fail();
664
                        return;
665
                }
666

    
667
        }
668

    
669
        public void testSimpleIteration(DataStoreParameters parameters)
670
                        throws Exception {
671
                FeatureStore store = null;
672
                store = (FeatureStore) dataManager.createStore(parameters);
673

    
674
                this.testSimpleIteration(store);
675

    
676
                store.dispose();
677

    
678
        }
679

    
680
        public void testIterationFastAndStandart(DataStoreParameters parameters)
681
                        throws Exception {
682
                FeatureStore store = null;
683
                store = (FeatureStore) dataManager.createStore(parameters);
684

    
685
                this.testIterationFastAndStandart(store);
686

    
687
                store.dispose();
688

    
689
        }
690

    
691
        /**
692
         *
693
         * @param count
694
         *            if (< 0) list.size() >= 1 else list.size() == count
695
         * @throws Exception
696
         */
697
        public void testExplorerList(int count) throws Exception {
698
                FeatureStore store = null;
699
                store = (FeatureStore) dataManager.createStore(this
700
                                .getDefaultDataStoreParameters());
701

    
702
                DataServerExplorer explorer;
703
                explorer = store.getExplorer();
704

    
705
                if (count < 0) {
706
                        assertTrue(explorer.list().size() >= 1);
707
                } else {
708
                        assertTrue(explorer.list().size() == count);
709
                }
710

    
711
                store.dispose();
712

    
713
                explorer.dispose();
714
        }
715

    
716
        //=================================================
717
        //=================================================
718

    
719

    
720

    
721

    
722
        public void testIterationFastAndStandart() throws Exception {
723
                this.testIterationFastAndStandart(this.getDefaultDataStoreParameters());
724
        }
725

    
726
        public void testSimpleIteration() throws Exception {
727
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
728
        }
729

    
730
        public void testInitializeStore() throws Exception {
731
                FeatureStore store = (FeatureStore) dataManager.createStore(this
732
                                .getDefaultDataStoreParameters());
733
                store.dispose();
734
        }
735

    
736

    
737
        public void testExplorer() throws Exception {
738
                if (!this.hasExplorer()) {
739
                        return;
740
                }
741
                this.testExplorerList(-1);
742

    
743
        }
744

    
745
        public void testSelection() throws Exception {
746
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
747

    
748
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
749
                FeatureSet set = store.getFeatureSet();
750

    
751
                assertTrue(store.getFeatureSelection().isEmpty());
752
                store.setSelection(set);
753
                assertFalse(store.getFeatureSelection().isEmpty());
754

    
755
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
756

    
757
                DisposableIterator iter = set.iterator();
758
                while (iter.hasNext()) {
759
                        assertTrue(store.getFeatureSelection().isSelected(
760
                                        (Feature) iter.next()));
761
                }
762
                iter.dispose();
763

    
764
                store.getFeatureSelection().reverse();
765
                assertTrue(store.getFeatureSelection().isEmpty());
766
                assertEquals(0, store.getFeatureSelection().getSize());
767
                iter = set.iterator();
768
                while (iter.hasNext()) {
769
                        assertFalse(store.getFeatureSelection().isSelected(
770
                                        (Feature) iter.next()));
771
                }
772
                iter.dispose();
773

    
774
                store.getFeatureSelection().reverse();
775
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
776
                assertFalse(store.getFeatureSelection().isEmpty());
777

    
778
                set.dispose();
779

    
780
        }
781

    
782
        public void testCustomFTypeSet() throws Exception {
783
                DataStoreParameters dbfParameters = this
784
                                .getDefaultDataStoreParameters();
785

    
786
                FeatureStore store = (FeatureStore) dataManager
787
                                .createStore(dbfParameters);
788

    
789
                testCustomFTypeSet(store);
790

    
791
                store.dispose();
792
        }
793

    
794
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
795

    
796
                FeatureSet set, set1;
797
                FeatureQuery query;
798
                DisposableIterator iter, iter1;
799
                Iterator attrIter;
800
                FeatureAttributeDescriptor attr;
801

    
802
                set = store.getFeatureSet();
803
                attrIter = store.getDefaultFeatureType().iterator();
804

    
805
                String[] names;
806
                while (attrIter.hasNext()) {
807
                        attr = (FeatureAttributeDescriptor) attrIter.next();
808
                        int fieldIndex = attr.getIndex();
809

    
810
                        query = this.getDefaultQuery(store);
811
                        String fieldName = store.getDefaultFeatureType()
812
                        .getAttributeDescriptor(fieldIndex).getName();
813

    
814
                        names = new String[] { fieldName };
815
                        query.setAttributeNames(names);
816
                        set1 = store.getFeatureSet(query);
817

    
818
                        if (getRandom().nextBoolean()) {
819
                                iter = set.fastIterator();
820
                        } else {
821
                                iter = set.iterator();
822
                        }
823
                        if (getRandom().nextBoolean()) {
824
                                iter1 = set1.fastIterator();
825
                        } else {
826
                                iter1 = set1.iterator();
827
                        }
828

    
829
                        assertTrue(compareFeatureIterators(iter, iter1, names));
830

    
831
                        iter.dispose();
832
                        iter1.dispose();
833
                        set1.dispose();
834
                }
835

    
836
                int ntimes = getRandom().nextInt(10) + 5;
837
                FeatureType type = store.getDefaultFeatureType();
838
                query = this.getDefaultQuery(store);
839
                for (int i = 0; i < ntimes; i++) {
840
                        names = getRandomAttibuteList(type);
841

    
842
                        query.setAttributeNames(names);
843
                        set1 = store.getFeatureSet(query);
844

    
845
                        if (getRandom().nextBoolean()) {
846
                                iter = set.fastIterator();
847
                        } else {
848
                                iter = set.iterator();
849
                        }
850
                        if (getRandom().nextBoolean()) {
851
                                iter1 = set1.fastIterator();
852
                        } else {
853
                                iter1 = set1.iterator();
854
                        }
855

    
856
                        assertTrue(compareFeatureIterators(iter, iter1, names));
857

    
858
                        iter.dispose();
859
                        iter1.dispose();
860
                        set1.dispose();
861

    
862

    
863
                }
864

    
865

    
866

    
867
                set.dispose();
868

    
869
        }
870

    
871
        // TODO: Corregir este test
872
    // public void testPersistence() throws Exception {
873
    // if (ToolsLocator.getPersistenceManager() == null) {
874
    // fail("Default Persistence Manager not register");
875
    // }
876
    // DataStoreParameters params = this.getDefaultDataStoreParameters();
877
    //
878
    //
879
    // FeatureStore store = (FeatureStore) dataManager.createStore(params);
880
    //
881
    // testSimpleIteration(store);
882
    //
883
    // PersistentState state = store.getState();
884
    //
885
    // FeatureStore store2 = (FeatureStore) ToolsLocator
886
    // .getPersistenceManager().create(state);
887
    //
888
    // testSimpleIteration(store2);
889
    //
890
    // assertTrue(compareStores(store, store2));
891
    //
892
    // // TODO Compare states
893
    // // XMLEntityState state2 = (XMLEntityState) store.getState();
894
    // //
895
    // // assertEquals(state.getXMLEntity().toString(), state2.getXMLEntity()
896
    // // .toString());
897
    // //
898
    // store.dispose();
899
    // store2.dispose();
900
    //
901
    //
902
    // }
903

    
904

    
905
        public void testShort() throws Exception {
906
                DataStoreParameters dbfParameters = this
907
                                .getDefaultDataStoreParameters();
908

    
909
                FeatureStore store = (FeatureStore) dataManager
910
                                .createStore(dbfParameters);
911

    
912
                testShort(store);
913

    
914
                store.dispose();
915

    
916
        }
917

    
918
        public void testShort(FeatureStore store) throws Exception{
919
                FeatureSet set1;
920
                FeatureQuery query;
921
                DisposableIterator iter1;
922
                Iterator attrIter;
923
                FeatureAttributeDescriptor attr;
924

    
925
                attrIter = store.getDefaultFeatureType().iterator();
926

    
927
                String[] names;
928
                while (attrIter.hasNext()) {
929
                        attr = (FeatureAttributeDescriptor) attrIter.next();
930

    
931
                        if (attr.getDataType() == DataTypes.GEOMETRY) {
932
                                continue;
933
                        }
934
                        query = this.getDefaultQuery(store);
935
                        String fieldName = attr.getName();
936

    
937

    
938

    
939
                        names = new String[] { fieldName };
940
                        query.setAttributeNames(names);
941
                        query.getOrder().add(fieldName, getRandom().nextBoolean());
942

    
943
                        set1 = store.getFeatureSet(query);
944
                        if (getRandom().nextBoolean()) {
945
                                iter1 = set1.fastIterator();
946
                        } else {
947
                                iter1 = set1.iterator();
948
                        }
949

    
950
                        assertTrue(checkSort(iter1, query));
951

    
952
                        iter1.dispose();
953
                        set1.dispose();
954
                }
955

    
956
                int ntimes = getRandom().nextInt(10) + 5;
957
                FeatureType type = store.getDefaultFeatureType();
958
                query = this.getDefaultQuery(store);
959
                for (int i = 0; i < ntimes; i++) {
960
                        names = getRandomAttibuteList(type);
961

    
962
                        int nShortFields = getRandom().nextInt(names.length) + 1;
963
                        query.getOrder().clear();
964
                        for (int j = 0; j < nShortFields; j++) {
965
                                attr = store.getDefaultFeatureType().getAttributeDescriptor(names[getRandom().nextInt(names.length)]);
966
                                if (attr.getDataType() == DataTypes.INT
967
                                                || attr.getDataType() == DataTypes.LONG
968
                                                || attr.getDataType() == DataTypes.DOUBLE
969
                                                || attr.getDataType() == DataTypes.STRING
970
                                                || attr.getDataType() == DataTypes.DATE
971
                                                || attr.getDataType() == DataTypes.BOOLEAN
972
                                                || attr.getDataType() == DataTypes.BYTE
973
                                                || attr.getDataType() == DataTypes.FLOAT) {
974

    
975
                                        query.getOrder().add(attr.getName(),
976
                                                        getRandom().nextBoolean());
977
                                }
978
                        }
979

    
980
                        query.setAttributeNames(names);
981
                        set1 = store.getFeatureSet(query);
982

    
983
                        // if (getRandom().nextBoolean()) {
984
                                iter1 = set1.fastIterator();
985
                                // } else {
986
                                // iter1 = set1.iterator();
987
                                // }
988

    
989
                                assertTrue(checkSort(iter1, query));
990

    
991
                                iter1.dispose();
992
                                set1.dispose();
993

    
994
                }
995

    
996
        }
997

    
998

    
999
        public boolean checkSort(Iterator iter, FeatureQuery query) {
1000

    
1001
                FeatureQueryOrderMember order;
1002
                Feature prevFeature = null;
1003
                Feature currFeature = null;
1004
                boolean isFirst = true;
1005
                Comparable v1, v2;
1006
                int v;
1007
                FeatureQueryOrder queryOrder = query.getOrder();
1008

    
1009
                Iterator orderIter;
1010

    
1011
                //for debug only
1012
                /*
1013
                System.out.println("\nCheck order:");
1014
                Iterator orderIter = queryOrder.iterator();
1015
                while (orderIter.hasNext()) {
1016
                        order = (FeatureQueryOrderMember) orderIter.next();
1017
                        System.out.print(order.getAttributeName() + " ");
1018
                        if (order.getAscending()) {
1019
                                System.out.print("Asc, ");
1020
                        } else {
1021
                                System.out.print("Desc, ");
1022
                        }
1023
                }
1024
                System.out.println(";");
1025
                */
1026

    
1027
                while (iter.hasNext()) {
1028
                        currFeature = (Feature) iter.next();
1029
                        if (isFirst) {
1030
                                prevFeature = currFeature.getCopy();
1031
                                // printFeature(prevFeature, true, 15);
1032
                                isFirst = false;
1033
                                continue;
1034
                        }
1035
                        // printFeature(currFeature, false, 15);
1036
                        orderIter = queryOrder.iterator();
1037
                        while (orderIter.hasNext()) {
1038
                                order = (FeatureQueryOrderMember) orderIter.next();
1039
                                if (order.hasEvaluator()) {
1040
                                        try {
1041
                                                v1 = (Comparable) order.getEvaluator().evaluate(
1042
                                                                (EvaluatorData) prevFeature);
1043
                                                v2 = (Comparable) order.getEvaluator().evaluate(
1044
                                                                (EvaluatorData) currFeature);
1045
                                        } catch (EvaluatorException e) {
1046
                                                throw new DataEvaluatorRuntimeException(e);
1047
                                        }
1048
                                } else {
1049
                                        v1 = (Comparable) prevFeature.get(order.getAttributeName());
1050
                                        v2 = (Comparable) currFeature.get(order.getAttributeName());
1051
                                }
1052
                                if (v1 == null) {
1053
                                        if (v2 == null) {
1054
                                                break;
1055
                                        } else {
1056
                                                v = 1;
1057
                                        }
1058
                                } else {
1059
                                        v = v1.compareTo(v2);
1060
                                }
1061
                                if (v != 0) {
1062
                                        if (!order.getAscending()) {
1063
                                                v = -v;
1064
                                        }
1065
                                }
1066
                                if (v < 0) {
1067
                                        break;
1068
                                } else if (v > 0) {
1069
                                        return false;
1070
                                }
1071
                        }
1072
                        prevFeature = currFeature.getCopy();
1073
                }
1074

    
1075
                return true;
1076
        }
1077

    
1078
        protected void fullStoreIteratorTest(FeatureStore store) throws Exception{
1079
                testIterationFastAndStandart(store);
1080
                testCustomFTypeSet(store);
1081
                testShort(store);
1082
        }
1083

    
1084

    
1085
        public void testTransformsData() throws Exception {
1086
                DataStoreParameters dbfParameters = this
1087
                                .getDefaultDataStoreParameters();
1088

    
1089
                FeatureStore store = (FeatureStore) dataManager
1090
                                .createStore(dbfParameters);
1091

    
1092
                FeatureStore store1 = (FeatureStore) dataManager
1093
                                .createStore(dbfParameters);
1094

    
1095
                FeatureStoreTransform transform = new StringsToLowerTransform();
1096
                transform.setFeatureStore(store);
1097

    
1098
                store.getTransforms().add(transform);
1099

    
1100
                FeatureSet set, set1;
1101
                DisposableIterator iter, iter1;
1102
                Iterator iterAttr;
1103
                FeatureAttributeDescriptor attr;
1104
                Feature feature, feature1;
1105
                int i, ntimes;
1106
                Object v1, v2;
1107

    
1108

    
1109
                fullStoreIteratorTest(store);
1110

    
1111
                set = store.getFeatureSet();
1112
                set1 = store1.getFeatureSet();
1113
                ntimes = getRandom().nextInt(3) + 1;
1114
                for (i = 0; i < ntimes; i++) {
1115
                        if (getRandom().nextBoolean()) {
1116
                                iter = set.fastIterator();
1117
                        } else {
1118
                                iter = set.iterator();
1119
                        }
1120
                        if (getRandom().nextBoolean()) {
1121
                                iter1 = set1.fastIterator();
1122
                        } else {
1123
                                iter1 = set1.iterator();
1124
                        }
1125
                        while (iter.hasNext()) {
1126
                                feature = (Feature) iter.next();
1127
                                feature1 = (Feature) iter1.next();
1128

    
1129
                                iterAttr = set.getDefaultFeatureType().iterator();
1130
                                while (iterAttr.hasNext()) {
1131
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1132
                                        v1 = feature.get(attr.getIndex());
1133
                                        v2 = feature1.get(attr.getIndex());
1134
                                        if (attr.getDataType() == DataTypes.STRING) {
1135
                                                if (v1 != null) {
1136
                                                        v1 = ((String) v1).toLowerCase();
1137
                                                }
1138

    
1139
                                        }
1140
                                        compareFeatureValue(v1, v2, attr);
1141
                                }
1142
                        }
1143
                        assertFalse(iter1.hasNext());
1144
                        iter.dispose();
1145
                        iter1.dispose();
1146
                }
1147

    
1148

    
1149
                set.dispose();
1150
                set1.dispose();
1151

    
1152

    
1153
                transform = new StringsToUpperTransform();
1154
                transform.setFeatureStore(store);
1155

    
1156
                store.getTransforms().add(transform);
1157

    
1158
                fullStoreIteratorTest(store);
1159

    
1160
                set = store.getFeatureSet();
1161
                set1 = store1.getFeatureSet();
1162
                ntimes = getRandom().nextInt(3) + 1;
1163
                for (i = 0; i < ntimes; i++) {
1164
                        if (getRandom().nextBoolean()) {
1165
                                iter = set.fastIterator();
1166
                        } else {
1167
                                iter = set.iterator();
1168
                        }
1169
                        if (getRandom().nextBoolean()) {
1170
                                iter1 = set1.fastIterator();
1171
                        } else {
1172
                                iter1 = set1.iterator();
1173
                        }
1174
                        while (iter.hasNext()) {
1175
                                feature = (Feature) iter.next();
1176
                                feature1 = (Feature) iter1.next();
1177

    
1178
                                iterAttr = set.getDefaultFeatureType().iterator();
1179
                                while (iterAttr.hasNext()) {
1180
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1181
                                        v1 = feature.get(attr.getIndex());
1182
                                        v2 = feature1.get(attr.getIndex());
1183
                                        if (attr.getDataType() == DataTypes.STRING) {
1184
                                                if (v1 != null) {
1185
                                                        v1 = ((String) v1).toUpperCase();
1186
                                                }
1187

    
1188
                                        }
1189
                                        compareFeatureValue(v1, v2, attr);
1190
                                }
1191
                        }
1192
                        assertFalse(iter1.hasNext());
1193
                        iter.dispose();
1194
                        iter1.dispose();
1195
                }
1196
                set.dispose();
1197
                set1.dispose();
1198

    
1199

    
1200
                transform = new AddPrefixAttributeName("_");
1201
                transform.setFeatureStore(store);
1202

    
1203
                store.getTransforms().add(transform);
1204

    
1205
                fullStoreIteratorTest(store);
1206

    
1207
                set = store.getFeatureSet();
1208
                set1 = store1.getFeatureSet();
1209
                ntimes = getRandom().nextInt(3) + 1;
1210
                for (i = 0; i < ntimes; i++) {
1211
                        if (getRandom().nextBoolean()) {
1212
                                iter = set.fastIterator();
1213
                        } else {
1214
                                iter = set.iterator();
1215
                        }
1216
                        if (getRandom().nextBoolean()) {
1217
                                iter1 = set1.fastIterator();
1218
                        } else {
1219
                                iter1 = set1.iterator();
1220
                        }
1221
                        while (iter.hasNext()) {
1222
                                feature = (Feature) iter.next();
1223
                                feature1 = (Feature) iter1.next();
1224

    
1225
                                iterAttr = set1.getDefaultFeatureType().iterator();
1226
                                while (iterAttr.hasNext()) {
1227
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1228
                                        v1 = feature.get("_" + attr.getName());
1229
                                        v2 = feature1.get(attr.getIndex());
1230
                                        if (attr.getDataType() == DataTypes.STRING) {
1231
                                                if (v1 != null) {
1232
                                                        v1 = ((String) v1).toUpperCase();
1233
                                                }
1234

    
1235
                                        }
1236
                                        compareFeatureValue(v1, v2, attr);
1237
                                }
1238
                        }
1239
                        assertFalse(iter1.hasNext());
1240
                        iter.dispose();
1241
                        iter1.dispose();
1242
                }
1243
                set.dispose();
1244
                set1.dispose();
1245

    
1246
                transform = new AddAttribute("__new__", DataTypes.STRING, "$$OK$$", 10);
1247
                transform.setFeatureStore(store);
1248

    
1249
                store.getTransforms().add(transform);
1250

    
1251
                fullStoreIteratorTest(store);
1252

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

    
1271
                                iterAttr = set1.getDefaultFeatureType().iterator();
1272
                                while (iterAttr.hasNext()) {
1273
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1274
                                        v1 = feature.get("_" + attr.getName());
1275
                                        v2 = feature1.get(attr.getIndex());
1276
                                        if (attr.getDataType() == DataTypes.STRING) {
1277
                                                if (v1 != null) {
1278
                                                        v1 = ((String) v1).toUpperCase();
1279
                                                }
1280

    
1281
                                        }
1282
                                        compareFeatureValue(v1, v2, attr);
1283
                                }
1284
                                compareFeatureValue(feature.get("__new__"), "$$OK$$", set1
1285
                                                .getDefaultFeatureType().getAttributeDescriptor(
1286
                                                                "__new__"));
1287
                        }
1288
                        assertFalse(iter1.hasNext());
1289
                        iter.dispose();
1290
                        iter1.dispose();
1291
                }
1292
                set.dispose();
1293
                set1.dispose();
1294

    
1295

    
1296
                transform = new RemoveAttribute("__new__");
1297
                transform.setFeatureStore(store);
1298

    
1299
                store.getTransforms().add(transform);
1300

    
1301
                fullStoreIteratorTest(store);
1302

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

    
1321
                                iterAttr = set1.getDefaultFeatureType().iterator();
1322
                                while (iterAttr.hasNext()) {
1323
                                        attr = (FeatureAttributeDescriptor) iterAttr.next();
1324
                                        v1 = feature.get("_" + attr.getName());
1325
                                        v2 = feature1.get(attr.getIndex());
1326
                                        if (attr.getDataType() == DataTypes.STRING) {
1327
                                                if (v1 != null) {
1328
                                                        v1 = ((String) v1).toUpperCase();
1329
                                                }
1330

    
1331
                                        }
1332
                                        compareFeatureValue(v1, v2, attr);
1333
                                }
1334
                                assertNull(feature.getType().getAttributeDescriptor("__new__"));
1335
                        }
1336
                        assertFalse(iter1.hasNext());
1337
                        iter.dispose();
1338
                        iter1.dispose();
1339
                }
1340
                set.dispose();
1341
                set1.dispose();
1342

    
1343
                store.getTransforms().clear();
1344

    
1345
                compareStores(store, store1);
1346

    
1347

    
1348
                store.dispose();
1349
                store1.dispose();
1350
        }
1351

    
1352
        abstract class myTransform implements FeatureStoreTransform {
1353
                protected FeatureStore store;
1354
                protected FeatureType orgDefaultFType;
1355
                protected List orgFTypes;
1356

    
1357
                public void applyTransform(Feature source, EditableFeature target)
1358
                                throws DataException {
1359

    
1360
                        Iterator iter = target.getType().iterator();
1361
                        FeatureAttributeDescriptor attr;
1362
                        while (iter.hasNext()) {
1363
                                attr = (FeatureAttributeDescriptor) iter.next();
1364
                                this.setValue(source, target, attr);
1365
                        }
1366

    
1367
                }
1368

    
1369
                protected void setValue(Feature source, EditableFeature target,
1370
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1371
                        target.set(attrTarget.getIndex(), source.get(attrTarget.getName()));
1372
                }
1373

    
1374
                public void saveToState(PersistentState state)
1375
                throws PersistenceException {
1376
                        // TODO Auto-generated method stub
1377

    
1378
                }
1379

    
1380
                public void setState(PersistentState state) throws PersistenceException {
1381
                        // TODO Auto-generated method stub
1382

    
1383
                }
1384

    
1385
                public FeatureType getDefaultFeatureType() throws DataException {
1386
                        return orgDefaultFType;
1387
                }
1388

    
1389
                public FeatureStore getFeatureStore() {
1390
                        return store;
1391
                }
1392

    
1393
                public List getFeatureTypes() throws DataException {
1394
                        return orgFTypes;
1395
                }
1396

    
1397
                public void setFeatureStore(FeatureStore featureStore) {
1398
                        this.store = featureStore;
1399
                        try {
1400
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1401
                                this.orgFTypes = this.store.getFeatureTypes();
1402

    
1403
                        } catch (DataException e) {
1404
                                throw new RuntimeException(e);
1405
                        }
1406

    
1407
                }
1408

    
1409
                public PersistentState getState() throws PersistenceException {
1410
                        // TODO Auto-generated method stub
1411
                        return null;
1412
                }
1413

    
1414
                public FeatureType getSourceFeatureTypeFrom(
1415
                                FeatureType targetFeatureType) {
1416

    
1417
                        return targetFeatureType;
1418
                }
1419

    
1420
        }
1421

    
1422
        abstract class TransformTypeTransform extends myTransform {
1423

    
1424
                private FeatureType myDefaultFeatureType = null;
1425
                private List myFeatureTypes = null;
1426

    
1427
                public FeatureType getDefaultFeatureType() throws DataException {
1428
                        if (this.myDefaultFeatureType == null) {
1429
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1430
                        }
1431

    
1432
                        return this.myDefaultFeatureType;
1433
                }
1434

    
1435
                protected abstract FeatureType transformType(FeatureType type);
1436

    
1437
                protected abstract FeatureType restoreType(FeatureType type);
1438

    
1439

    
1440
                public List getFeatureTypes() throws DataException {
1441
                        if (this.myFeatureTypes == null) {
1442
                                ArrayList list = new ArrayList();
1443
                                Iterator iter = orgFTypes.iterator();
1444
                                while (iter.hasNext()) {
1445
                                        FeatureType type = (FeatureType) iter.next();
1446
                                        if (type.getId().equals(
1447
                                                        this.getDefaultFeatureType().getId())) {
1448
                                                list.add(this.getDefaultFeatureType());
1449
                                        } else {
1450
                                                list.add(this.transformType(type));
1451
                                        }
1452
                                }
1453
                                this.myFeatureTypes = Collections.unmodifiableList(list);
1454
                        }
1455
                        return this.myFeatureTypes;
1456
                }
1457

    
1458
                public boolean isTransformsOriginalValues() {
1459
                        return false;
1460
                }
1461

    
1462
                public FeatureType getSourceFeatureTypeFrom(
1463
                                FeatureType targetFeatureType) {
1464
                        FeatureType org = null;
1465
                        FeatureType cur = null;
1466
                        Iterator iter = null;
1467
                        try {
1468
                                iter = this.getFeatureTypes().iterator();
1469
                        } catch (DataException e) {
1470
                                new RuntimeException(e);
1471
                        }
1472
                        while (iter.hasNext()) {
1473
                                cur = (FeatureType) iter.next();
1474
                                if (cur.getId().equals(targetFeatureType.getId())) {
1475
                                        org = cur;
1476
                                        break;
1477
                                }
1478
                        }
1479
                        if (org == null) {
1480
                                throw new RuntimeException();
1481
                        }
1482

    
1483
                        return this.restoreType(org);
1484
                }
1485

    
1486
        }
1487

    
1488
        abstract class TransformAttributeNameTransform extends
1489
                        TransformTypeTransform {
1490

    
1491
                protected void setValue(Feature source, EditableFeature target,
1492
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1493
                        target.set(attrTarget.getIndex(), source.get(this
1494
                                        .restoreAttributeName(attrTarget.getName())));
1495
                }
1496

    
1497

    
1498
                protected FeatureType transformType(FeatureType type) {
1499
                        EditableFeatureType result = type.getEditable();
1500
                        Iterator iter = result.iterator();
1501
                        EditableFeatureAttributeDescriptor attr;
1502
                        while (iter.hasNext()) {
1503
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1504
                                attr.setName(transformAttributeName(attr.getName()));
1505
                        }
1506
                        return result.getNotEditableCopy();
1507
                }
1508

    
1509
                protected abstract String transformAttributeName(String source);
1510

    
1511
                protected abstract String restoreAttributeName(String target);
1512

    
1513
                protected FeatureType restoreType(FeatureType type) {
1514
                        EditableFeatureType result;
1515
                        if (type instanceof EditableFeatureType) {
1516
                                result = (EditableFeatureType) type.getCopy();
1517
                        } else {
1518
                                result = type.getEditable();
1519
                        }
1520
                        Iterator iter = result.iterator();
1521
                        EditableFeatureAttributeDescriptor attr;
1522
                        while (iter.hasNext()) {
1523
                                attr = (EditableFeatureAttributeDescriptor) iter.next();
1524

    
1525
                                attr.setName(restoreAttributeName(attr.getName()));
1526
                        }
1527
                        return result.getNotEditableCopy();
1528
                }
1529

    
1530
                public FeatureType getSourceFeatureTypeFrom(
1531
                                FeatureType targetFeatureType) {
1532
                        FeatureType org = null;
1533
                        FeatureType cur = null;
1534
                        Iterator iter = null;
1535
                        iter = this.orgFTypes.iterator();
1536
                        while (iter.hasNext()) {
1537
                                cur = (FeatureType) iter.next();
1538
                                if (cur.getId().equals(targetFeatureType.getId())) {
1539
                                        org = cur;
1540
                                        break;
1541
                                }
1542
                        }
1543
                        if (cur == null) {
1544
                                throw new RuntimeException();
1545
                        }
1546
                        EditableFeatureType r = org.getEditable();
1547
                        iter = r.iterator();
1548
                        FeatureAttributeDescriptor attr;
1549
                        while (iter.hasNext()) {
1550
                                attr = (FeatureAttributeDescriptor) iter.next();
1551
                                if (targetFeatureType.getIndex(transformAttributeName(attr
1552
                                                .getName())) == -1) {
1553
                                        iter.remove();
1554
                                }
1555
                        }
1556
                        return r.getNotEditableCopy();
1557
                }
1558

    
1559
        }
1560

    
1561

    
1562
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1563

    
1564
                private String prefix;
1565

    
1566
                AddPrefixAttributeName(String prefix) {
1567
                        this.prefix = prefix;
1568
                }
1569

    
1570
                protected String restoreAttributeName(String target) {
1571
                        return target.substring(getPrefix().length(), target.length());
1572
                }
1573

    
1574
                private String getPrefix() {
1575
                        return prefix;
1576
                }
1577

    
1578
                protected String transformAttributeName(String source) {
1579
                        return getPrefix() + source;
1580
                }
1581

    
1582
        }
1583

    
1584
        class AddAttribute extends TransformTypeTransform {
1585

    
1586
                private String name;
1587
                private int type;
1588
                private Object defValue;
1589
                private int size;
1590
                private Evaluator eval;
1591

    
1592
                AddAttribute(String name) {
1593
                        this(name, DataTypes.STRING, null, 15);
1594
                }
1595

    
1596
                AddAttribute(String name, int type) {
1597
                        this(name, type, null, 15);
1598
                }
1599

    
1600
                AddAttribute(String name, int type, Object defValue) {
1601
                        this(name, type, defValue, 15);
1602
                }
1603

    
1604
                AddAttribute(String name, int type, Evaluator evaluator, int size) {
1605
                        this.name = name;
1606
                        this.type = type;
1607
                        this.defValue = null;
1608
                        this.size = size;
1609
                        this.eval = evaluator;
1610
                }
1611

    
1612
                AddAttribute(String name, int type, Object defValue, int size) {
1613
                        this.name = name;
1614
                        this.type = type;
1615
                        this.defValue = defValue;
1616
                        this.size = size;
1617
                        this.eval = null;
1618
                }
1619

    
1620

    
1621

    
1622
                protected FeatureType restoreType(FeatureType type) {
1623
                        EditableFeatureType result;
1624
                        if (type instanceof EditableFeatureType) {
1625
                                result = (EditableFeatureType) type.getCopy();
1626
                        } else {
1627
                                result = type.getEditable();
1628
                        }
1629
                        result.remove(this.name);
1630
                        return result.getNotEditableCopy();
1631
                }
1632

    
1633
                protected FeatureType transformType(FeatureType type) {
1634
                        EditableFeatureType result = type.getEditable();
1635

    
1636
                        EditableFeatureAttributeDescriptor att;
1637
                        if (this.eval == null) {
1638
                                att = result.add(name, this.type)
1639
                                                .setDefaultValue(this.defValue);
1640
                        } else {
1641
                                att = result.add(name, this.type, this.eval);
1642
                        }
1643
                        att.setSize(size);
1644

    
1645

    
1646
                        return result.getNotEditableCopy();
1647
                }
1648

    
1649
                protected void setValue(Feature source, EditableFeature target,
1650
                                FeatureAttributeDescriptor attrTarget) throws DataException {
1651
                        if (attrTarget.getName().equals(this.name)) {
1652
                                target.set(attrTarget.getIndex(), attrTarget.getDefaultValue());
1653
                        } else {
1654
                                target.set(attrTarget.getIndex(), source.get(attrTarget
1655
                                                .getName()));
1656
                        }
1657
                }
1658
        }
1659

    
1660

    
1661
        class RemoveAttribute extends TransformTypeTransform {
1662

    
1663
                private String attributeName;
1664
                private String fTypeIdToRemoveAttribute = null;
1665
                private FeatureAttributeDescriptor attr;
1666

    
1667
                RemoveAttribute(String attributeName) {
1668
                        this.attributeName = attributeName;
1669
                }
1670

    
1671
                RemoveAttribute(String attributeName, FeatureType fType) {
1672
                        this.attributeName = attributeName;
1673
                }
1674

    
1675
                protected FeatureType restoreType(FeatureType type) {
1676
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1677
                                return type;
1678
                        }
1679
                        EditableFeatureType result = type.getEditable();
1680

    
1681
                        EditableFeatureAttributeDescriptor att;
1682
                        if (this.attr.getEvaluator() == null) {
1683
                                att = result.add(attributeName, this.attr.getDataType())
1684
                                                .setDefaultValue(this.attr.getDefaultValue());
1685
                        } else {
1686
                                att = result.add(attributeName, this.attr.getDataType(),
1687
                                                this.attr.getEvaluator());
1688
                        }
1689
                        att.setSize(this.attr.getSize());
1690
                        att.setAllowNull(this.attr.allowNull());
1691
                        att.setGeometryType(this.attr.getGeometryType());
1692
                        att.setSRS(this.attr.getSRS());
1693
                        att.setPrecision(this.attr.getPrecision());
1694
                        // TODO
1695

    
1696

    
1697
                        return result.getNotEditableCopy();
1698
                }
1699

    
1700
                protected FeatureType transformType(FeatureType type) {
1701
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1702
                                return type;
1703
                        }
1704

    
1705
                        EditableFeatureType result;
1706
                        if (type instanceof EditableFeatureType) {
1707
                                result = (EditableFeatureType) type.getCopy();
1708
                        } else {
1709
                                result = type.getEditable();
1710
                        }
1711
                        result.remove(this.attributeName);
1712
                        return result.getNotEditableCopy();
1713

    
1714
                }
1715

    
1716
                public void setFeatureStore(FeatureStore featureStore) {
1717
                        Iterator iter;
1718
                        try {
1719
                                iter = featureStore.getFeatureTypes().iterator();
1720
                        } catch (DataException e) {
1721
                                throw new RuntimeException(e);
1722
                        }
1723
                        FeatureType type;
1724
                        FeatureAttributeDescriptor attrTmp;
1725
                        while (iter.hasNext()) {
1726
                                type = (FeatureType) iter.next();
1727
                                attrTmp = type.getAttributeDescriptor(this.attributeName);
1728
                                if (attrTmp != null) {
1729
                                        this.fTypeIdToRemoveAttribute = type.getId();
1730
                                        this.attr = attrTmp;
1731
                                        break;
1732
                                }
1733
                        }
1734
                        super.setFeatureStore(featureStore);
1735
                }
1736

    
1737
                public void applyTransform(Feature source, EditableFeature target)
1738
                                throws DataException {
1739
                        // TODO Auto-generated method stub
1740
                        super.applyTransform(source, target);
1741
                }
1742

    
1743

    
1744

    
1745
        }
1746

    
1747

    
1748
        public class StringsToLowerTransform extends myTransform {
1749

    
1750
                public boolean isTransformsOriginalValues() {
1751
                        return true;
1752
                }
1753

    
1754
                protected void setValue(Feature source, EditableFeature target,
1755
                                FeatureAttributeDescriptor attr) throws DataException {
1756
                        if (attr.getDataType() == DataTypes.STRING) {
1757
                                String v = ((String) source.get(attr.getName()));
1758
                                if (v != null){
1759
                                        v = v.toLowerCase();
1760
                                } else if (!attr.allowNull()) {
1761
                                        v = (String) attr.getDefaultValue();
1762
                                        v = v.toLowerCase();
1763
                                }
1764
                                target.set(attr.getName(), v);
1765
                        } else {
1766
                                target.set(attr.getName(), source.get(attr.getName()));
1767
                        }
1768
                }
1769

    
1770
        }
1771

    
1772
        class StringsToUpperTransform extends StringsToLowerTransform {
1773
                protected void setValue(Feature source, EditableFeature target,
1774
                                FeatureAttributeDescriptor attr) throws DataException {
1775
                        if (attr.getDataType() == DataTypes.STRING) {
1776
                                String v = ((String) source.get(attr.getName()));
1777
                                if (v != null) {
1778
                                        v = v.toUpperCase();
1779
                                } else if (!attr.allowNull()) {
1780
                                        v = (String) attr.getDefaultValue();
1781
                                        v.toUpperCase();
1782
                                }
1783
                                target.set(attr.getName(), v);
1784
                        } else {
1785
                                target.set(attr.getName(), source.get(attr.getName()));
1786
                        }
1787
                }
1788

    
1789
        }
1790

    
1791

    
1792
        public void testFeatureReference() throws Exception {
1793
                DataStoreParameters dbfParameters = this
1794
                                .getDefaultDataStoreParameters();
1795

    
1796
                FeatureStore store = (FeatureStore) dataManager
1797
                                .createStore(dbfParameters);
1798

    
1799
                Feature feature, refered;
1800
                FeatureSet set;
1801
                int nTimes2 = getRandom().nextInt(2) + 1;
1802

    
1803
                for (int j = 0; j < nTimes2; j++) {
1804
                        set = store.getFeatureSet();
1805
                        DisposableIterator iter;
1806

    
1807
                        int nTimes = getRandom().nextInt(2) + 3;
1808
                        for (int i = 0; i < nTimes; i++) {
1809
                                if (getRandom().nextBoolean()) {
1810
                                        iter = set.fastIterator();
1811
                                } else {
1812
                                        iter = set.fastIterator();
1813
                                }
1814
                                while (iter.hasNext()) {
1815
                                        feature = (Feature) iter.next();
1816
                                        refered = feature.getReference().getFeature();
1817
                                        compareFeatures(feature, refered);
1818
                                }
1819
                                iter.dispose();
1820
                        }
1821

    
1822
                        set.dispose();
1823
                }
1824

    
1825
                nTimes2 = getRandom().nextInt(5) + 2;
1826
                FeatureQuery query = store.createFeatureQuery();
1827

    
1828
                for (int j = 0; j < nTimes2; j++) {
1829
                        DisposableIterator iter;
1830

    
1831
                        query.setAttributeNames(getRandomAttibuteList(store
1832
                                        .getDefaultFeatureType()));
1833
                        set = store.getFeatureSet(query);
1834

    
1835
                        int nTimes = getRandom().nextInt(3) + 3;
1836
                        for (int i = 0; i < nTimes; i++) {
1837
                                if (getRandom().nextBoolean()) {
1838
                                        iter = set.fastIterator();
1839
                                } else {
1840
                                        iter = set.fastIterator();
1841
                                }
1842
                                while (iter.hasNext()) {
1843
                                        feature = (Feature) iter.next();
1844
                                        refered = feature.getReference().getFeature(
1845
                                                        set.getDefaultFeatureType());
1846
                                        compareFeatures(feature, refered);
1847
                                }
1848
                                iter.dispose();
1849
                        }
1850

    
1851
                        set.dispose();
1852
                }
1853

    
1854

    
1855

    
1856
                store.dispose();
1857

    
1858
        }
1859

    
1860
        public void testResourcesLocks() throws Exception {
1861

    
1862
                if (!this.usesResources()) {
1863
                        return;
1864
                }
1865

    
1866
                DataStoreParameters dbfParameters = this
1867
                                .getDefaultDataStoreParameters();
1868

    
1869
                FeatureStore store = (FeatureStore) dataManager
1870
                                .createStore(dbfParameters);
1871

    
1872
                int nThreads = getRandom().nextInt(4) + 2;
1873
                List threads = new ArrayList();
1874
                TaskTestIterators task;
1875
                for (int i = 0; i < nThreads; i++) {
1876
                        task = new TaskTestIterators(this, "" + i, store);
1877
                        threads.add(task);
1878
                        task.start();
1879
                }
1880

    
1881
                Iterator iter;
1882
                List stillAlives = new ArrayList();
1883
                stillAlives.addAll(threads);
1884

    
1885
                while (!stillAlives.isEmpty()) {
1886
                        iter = stillAlives.iterator();
1887
                        while (iter.hasNext()) {
1888
                                task = (TaskTestIterators) iter.next();
1889
                                if (!task.isAlive()) {
1890
                                        iter.remove();
1891
                                } else if ((!task.isFinished()) && task.isOutOfDate()) {
1892
                                        iter.remove();
1893
                                        getLogger().error("task {} outOfDate", task.getName());
1894
                                } else {
1895
                                        Thread.yield();
1896
                                        Thread.sleep(100);
1897
                                }
1898
                        }
1899
                }
1900

    
1901
                store.dispose();
1902

    
1903
                iter = threads.iterator();
1904
                while (iter.hasNext()) {
1905
                        task = (TaskTestIterators) iter.next();
1906
                        assertTrue(task.isFinishedOk());
1907
                }
1908
        }
1909

    
1910
        class TaskTestIterators extends StoreTask {
1911
                private BaseTestFeatureStore testInstance;
1912

    
1913
                public TaskTestIterators(BaseTestFeatureStore testInstance,
1914
                                String name, FeatureStore store) {
1915
                        super(name, store);
1916
                        this.testInstance = testInstance;
1917
                }
1918

    
1919
                public TaskTestIterators(BaseTestFeatureStore testInstance,
1920
                                String name, FeatureStore store, int timeToWait) {
1921
                        super(name, store, timeToWait);
1922
                        this.testInstance = testInstance;
1923
                }
1924

    
1925
                public void run() {
1926
                        if (!this.startProcess()) {
1927
                                return;
1928
                        }
1929
                        try {
1930
                                this.testInstance.fullStoreIteratorTest(store);
1931

    
1932
                                finishedOk();
1933
                        } catch (Throwable e) {
1934
                                finishedError(e);
1935
                                return;
1936
                        }
1937
                }
1938

    
1939

    
1940
        }
1941

    
1942
}