Statistics
| Revision:

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

History | View | Annotate | Download (51.6 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
/*
25
* AUTHORS (In addition to CIT):
26
* 2009 IVER T.I. S.A.   {{Task}}
27
*/
28

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

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

    
41
import org.gvsig.fmap.dal.DALLocator;
42
import org.gvsig.fmap.dal.DataManager;
43
import org.gvsig.fmap.dal.DataServerExplorer;
44
import org.gvsig.fmap.dal.DataStoreParameters;
45
import org.gvsig.fmap.dal.DataTypes;
46
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
47
import org.gvsig.fmap.dal.exception.DataException;
48
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
49
import org.gvsig.fmap.dal.feature.testmulithread.StoreTask;
50
import org.gvsig.fmap.dal.resource.ResourceManager;
51
import org.gvsig.fmap.geom.Geometry;
52
import org.gvsig.tools.ToolsLocator;
53
import org.gvsig.tools.dispose.DisposableIterator;
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.junit.AbstractLibraryAutoInitTestCase;
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
71
                AbstractLibraryAutoInitTestCase {
72

    
73
        private static Logger logger = null;
74

    
75
        protected DataManager dataManager = null;
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
                        throws DataException {
91
                FeatureQuery query = store.createFeatureQuery();
92
                FeatureAttributeDescriptor[] key = store.getDefaultFeatureType()
93
                                .getPrimaryKey();
94
                for (int i = 0; i < key.length; i++) {
95
                        query.getOrder().add(key[i].getName(), true);
96
                }
97

    
98
                return query;
99
        }
100

    
101

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

    
105

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

    
110

    
111
        //=================================================
112

    
113

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

    
118

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

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

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

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

    
154
        }
155

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

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

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

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

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

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

    
224
                return true;
225
        }
226

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

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

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

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

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

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

    
293
                return true;
294
        }
295

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

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

    
314
        }
315

    
316
        protected boolean compareFeatureIterators(Iterator iter1, Iterator iter2,
317
                        String[] attrNames) {
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, attrNames)) {
324
                                return false;
325
                        }
326
                }
327

    
328
                return !iter2.hasNext();
329

    
330
        }
331

    
332

    
333

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

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

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

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

    
376

    
377

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

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

    
387
                }
388
                return true;
389

    
390
        }
391

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

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

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

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

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

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

    
444
                        return false;
445
                }
446

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

    
463
                return true;
464
        }
465

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

    
486
                return true;
487
        }
488

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

    
505
                return true;
506

    
507
        }
508

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

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

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

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

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

    
547
                        }
548
                        return true;
549

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

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

    
569
        }
570

    
571

    
572
        //------------------------------------------------
573

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

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

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

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

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

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

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

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

    
642

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

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

    
649
                query.setFilter(new Evaluator(){
650
                    private EvaluatorFieldsInfo evaluatorFieldsInfo = new EvaluatorFieldsInfo();
651
                    
652
                        public Object evaluate(EvaluatorData data)
653
                                        throws EvaluatorException {
654
                                // TODO Auto-generated method stub
655
                                return Boolean.TRUE;
656
                        }
657

    
658
                        public String getSQL() {
659
                                return "true = true";
660
                        }
661

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

    
667
                        public String getName() {
668
                                return "AlwaysTrue";
669
                        }
670

    
671
                        public EvaluatorFieldsInfo getFieldsInfo() {                                
672
                                return evaluatorFieldsInfo;
673
                        }
674

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

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

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

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

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

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

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

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

    
711
        }
712

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

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

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

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

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

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

    
738
        }
739

    
740
        public void testSimpleIteration(DataStoreParameters parameters)
741
                        throws Exception {
742
                FeatureStore store = null;
743
                store = (FeatureStore) dataManager.openStore(parameters
744
                                .getDataStoreName(), parameters);
745

    
746
                this.testSimpleIteration(store);
747

    
748
                store.dispose();
749

    
750
        }
751

    
752
        public void testIterationFastAndStandart(DataStoreParameters parameters)
753
                        throws Exception {
754
                FeatureStore store = null;
755
                store = (FeatureStore) dataManager.openStore(parameters
756
                                .getDataStoreName(), parameters);
757

    
758
                this.testIterationFastAndStandart(store);
759

    
760
                store.dispose();
761

    
762
        }
763

    
764
        /**
765
         *
766
         * @param count
767
         *            if (< 0) list.size() >= 1 else list.size() == count
768
         * @throws Exception
769
         */
770
        public void testExplorerList(int count) throws Exception {
771
                FeatureStore store = null;
772
                DataStoreParameters params = getDefaultDataStoreParameters();
773
                store = (FeatureStore) dataManager.openStore(params.getDataStoreName(),
774
                                params);
775

    
776
                DataServerExplorer explorer;
777
                explorer = store.getExplorer();
778

    
779
                if (count < 0) {
780
                        assertTrue(explorer.list().size() >= 1);
781
                } else {
782
                        assertTrue(explorer.list().size() == count);
783
                }
784

    
785
                store.dispose();
786

    
787
                explorer.dispose();
788
        }
789

    
790
        //=================================================
791
        //=================================================
792

    
793

    
794

    
795

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

    
800
        public void testSimpleIteration() throws Exception {
801
                this.testSimpleIteration(this.getDefaultDataStoreParameters());
802
        }
803

    
804
        public void testInitializeStore() throws Exception {
805
                DataStoreParameters params = getDefaultDataStoreParameters();
806
                FeatureStore store = (FeatureStore) dataManager.openStore(params
807
                                .getDataStoreName(), params);
808

    
809
                assertNotNull(store.getMetadataID());
810
                assertNotNull(store.getName());
811
                assertEquals(store.getEnvelope(), store.getDynValue("Envelope"));
812
                assertTrue("Feature count not > 0", store.getFeatureCount() > 0);
813
                if (store.isLocksSupported()) {
814
                        assertNotNull(store.getLocks());
815
                } else {
816
                        assertNull(store.getLocks());
817
                }
818
                store.dispose();
819
        }
820

    
821

    
822
        public void testExplorer() throws Exception {
823
                if (!this.hasExplorer()) {
824
                        return;
825
                }
826
                this.testExplorerList(-1);
827

    
828
        }
829

    
830
        public void testSelection() throws Exception {
831
                DataStoreParameters parameters = this.getDefaultDataStoreParameters();
832

    
833
                FeatureStore store = (FeatureStore) dataManager.openStore(parameters
834
                                .getDataStoreName(), parameters);
835
                FeatureSet set = store.getFeatureSet();
836

    
837
                assertTrue(store.getFeatureSelection().isEmpty());
838
                store.setSelection(set);
839
                assertFalse(store.getFeatureSelection().isEmpty());
840

    
841
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
842

    
843
                DisposableIterator iter = set.iterator();
844
                while (iter.hasNext()) {
845
                        assertTrue(store.getFeatureSelection().isSelected(
846
                                        (Feature) iter.next()));
847
                }
848
                iter.dispose();
849

    
850
                store.getFeatureSelection().reverse();
851
                assertTrue(store.getFeatureSelection().isEmpty());
852
                assertEquals(0, store.getFeatureSelection().getSize());
853
                iter = set.iterator();
854
                while (iter.hasNext()) {
855
                        assertFalse(store.getFeatureSelection().isSelected(
856
                                        (Feature) iter.next()));
857
                }
858
                iter.dispose();
859

    
860
                store.getFeatureSelection().reverse();
861
                assertEquals(set.getSize(), store.getFeatureSelection().getSize());
862
                assertFalse(store.getFeatureSelection().isEmpty());
863

    
864
                set.dispose();
865

    
866
        }
867

    
868
        public void testCustomFTypeSet() throws Exception {
869
                DataStoreParameters dbfParameters = this
870
                                .getDefaultDataStoreParameters();
871

    
872
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
873
                                .getDataStoreName(), dbfParameters);
874

    
875
                testCustomFTypeSet(store);
876

    
877
                store.dispose();
878
        }
879

    
880
        public void testCustomFTypeSet(FeatureStore store) throws Exception{
881

    
882
                FeatureSet set, set1;
883
                FeatureQuery query;
884
                DisposableIterator iter, iter1;
885
                Iterator attrIter;
886
                FeatureAttributeDescriptor attr;
887

    
888
                set = store.getFeatureSet(this.getDefaultQuery(store));
889
                attrIter = store.getDefaultFeatureType().iterator();
890

    
891
                String[] names;
892
                while (attrIter.hasNext()) {
893
                        attr = (FeatureAttributeDescriptor) attrIter.next();
894
                        int fieldIndex = attr.getIndex();
895

    
896
                        query = this.getDefaultQuery(store);
897
                        String fieldName = store.getDefaultFeatureType()
898
                        .getAttributeDescriptor(fieldIndex).getName();
899

    
900
                        names = new String[] { fieldName };
901
                        query.setAttributeNames(names);
902
                        set1 = store.getFeatureSet(query);
903

    
904
                        if (getRandom().nextBoolean()) {
905
                                iter = set.fastIterator();
906
                        } else {
907
                                iter = set.iterator();
908
                        }
909
                        if (getRandom().nextBoolean()) {
910
                                iter1 = set1.fastIterator();
911
                        } else {
912
                                iter1 = set1.iterator();
913
                        }
914

    
915
                        assertTrue(compareFeatureIterators(iter, iter1, names));
916

    
917
                        iter.dispose();
918
                        iter1.dispose();
919
                        set1.dispose();
920
                }
921

    
922
                int ntimes = getRandom().nextInt(10) + 5;
923
                FeatureType type = store.getDefaultFeatureType();
924
                query = this.getDefaultQuery(store);
925
                for (int i = 0; i < ntimes; i++) {
926
                        names = getRandomAttibuteList(type);
927

    
928
                        query.setAttributeNames(names);
929
                        set1 = store.getFeatureSet(query);
930

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

    
942
                        assertTrue(compareFeatureIterators(iter, iter1, names));
943

    
944
                        iter.dispose();
945
                        iter1.dispose();
946

    
947
                        iter1 = set1.fastIterator();
948
                        assertTrue(checksAttributesPositions(iter1, names));
949
                        iter1.dispose();
950

    
951
                        iter1 = set1.iterator();
952
                        assertTrue(checksAttributesPositions(iter1, names));
953
                        iter1.dispose();
954

    
955
                        set1.dispose();
956

    
957

    
958
                }
959

    
960

    
961

    
962
                set.dispose();
963

    
964
        }
965

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

    
988
         public void testPersistence() throws Exception {
989
                if (ToolsLocator.getPersistenceManager() == null) {
990
                        fail("Default Persistence Manager not register");
991
                }
992
                DataStoreParameters params = this.getDefaultDataStoreParameters();
993

    
994
                FeatureStore store = (FeatureStore) dataManager.openStore(params
995
                                .getDataStoreName(), params);
996

    
997
                testSimpleIteration(store);
998

    
999
                PersistentState state = ToolsLocator.getPersistenceManager().getState(
1000
                                store);
1001

    
1002
                FeatureStore store2 = (FeatureStore) ToolsLocator
1003
                                .getPersistenceManager().create(state);
1004

    
1005
                testSimpleIteration(store2);
1006

    
1007
                assertTrue(compareStores(store, store2));
1008

    
1009
                store.dispose();
1010
                store2.dispose();
1011

    
1012
        }
1013

    
1014

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

    
1019
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1020
                                .getDataStoreName(), dbfParameters);
1021

    
1022
                testSort(store);
1023

    
1024
                store.dispose();
1025

    
1026
        }
1027

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

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

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

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

    
1047

    
1048

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

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

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

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

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

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

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

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

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

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

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

    
1104
                }
1105

    
1106
        }
1107

    
1108

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

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

    
1120
                Iterator orderIter;
1121

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

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

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

    
1213
                return true;
1214
        }
1215

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

    
1222

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

    
1227
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1228
                                .getDataStoreName(), dbfParameters);
1229

    
1230
                FeatureStore store1 = (FeatureStore) dataManager.openStore(
1231
                                dbfParameters.getDataStoreName(), dbfParameters);
1232

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

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

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

    
1246

    
1247
                fullStoreIteratorTest(store);
1248

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

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

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

    
1286

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

    
1290

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

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

    
1296
                fullStoreIteratorTest(store);
1297

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

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

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

    
1337

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

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

    
1343
                fullStoreIteratorTest(store);
1344

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

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

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

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

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

    
1389
                fullStoreIteratorTest(store);
1390

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

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

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

    
1433

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

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

    
1439
                fullStoreIteratorTest(store);
1440

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

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

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

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

    
1483
                compareStores(store, store1);
1484

    
1485

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

    
1490
        abstract class myTransform extends AbstractFeatureStoreTransform {
1491
                protected FeatureStore store;
1492
                protected FeatureType orgDefaultFType;
1493
                protected List orgFTypes;
1494

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

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

    
1505
                }
1506

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

    
1512
                public FeatureType getDefaultFeatureType() throws DataException {
1513
                        return orgDefaultFType;
1514
                }
1515

    
1516
                public FeatureStore getFeatureStore() {
1517
                        return store;
1518
                }
1519

    
1520
                public List getFeatureTypes() throws DataException {
1521
                        return orgFTypes;
1522
                }
1523

    
1524
                public void setFeatureStore(FeatureStore featureStore) {
1525
                        this.store = featureStore;
1526
                        try {
1527
                                this.orgDefaultFType = this.store.getDefaultFeatureType();
1528
                                this.orgFTypes = this.store.getFeatureTypes();
1529

    
1530
                        } catch (DataException e) {
1531
                                throw new RuntimeException(e);
1532
                        }
1533

    
1534
                }
1535

    
1536
                public FeatureType getSourceFeatureTypeFrom(
1537
                                FeatureType targetFeatureType) {
1538

    
1539
                        return targetFeatureType;
1540
                }
1541
                
1542
        public String getName() {
1543
//            System.out
1544
//                .println("\nmyFeatureStore.getname(): " + store.getName());
1545
            return store.getName();
1546
        }
1547

    
1548
        public String getDescription() {
1549
//            System.out.println("\nmyFeatureStore.getDescription(getfullname): "
1550
//                + store.getFullName());
1551
            return store.getFullName();
1552
        }
1553

    
1554
        }
1555

    
1556
        abstract class TransformTypeTransform extends myTransform {
1557

    
1558
                private FeatureType myDefaultFeatureType = null;
1559
                private List myFeatureTypes = null;
1560

    
1561
                public FeatureType getDefaultFeatureType() throws DataException {
1562
                        if (this.myDefaultFeatureType == null) {
1563
                                this.myDefaultFeatureType = this.transformType(orgDefaultFType);
1564
                        }
1565

    
1566
                        return this.myDefaultFeatureType;
1567
                }
1568

    
1569
                protected abstract FeatureType transformType(FeatureType type);
1570

    
1571
                protected abstract FeatureType restoreType(FeatureType type);
1572

    
1573

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

    
1592
                public boolean isTransformsOriginalValues() {
1593
                        return false;
1594
                }
1595

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

    
1617
                        return this.restoreType(org);
1618
                }
1619

    
1620
        }
1621

    
1622
        abstract class TransformAttributeNameTransform extends
1623
                        TransformTypeTransform {
1624

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

    
1631

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

    
1643
                protected abstract String transformAttributeName(String source);
1644

    
1645
                protected abstract String restoreAttributeName(String target);
1646

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

    
1659
                                attr.setName(restoreAttributeName(attr.getName()));
1660
                        }
1661
                        return result.getNotEditableCopy();
1662
                }
1663

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

    
1693
        }
1694

    
1695

    
1696
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1697

    
1698
                private String prefix;
1699

    
1700
                AddPrefixAttributeName(String prefix) {
1701
                        this.prefix = prefix;
1702
                }
1703

    
1704
                protected String restoreAttributeName(String target) {
1705
                        return target.substring(getPrefix().length(), target.length());
1706
                }
1707

    
1708
                private String getPrefix() {
1709
                        return prefix;
1710
                }
1711

    
1712
                protected String transformAttributeName(String source) {
1713
                        return getPrefix() + source;
1714
                }
1715

    
1716
        }
1717

    
1718
        class AddAttribute extends TransformTypeTransform {
1719

    
1720
                private String name;
1721
                private int type;
1722
                private Object defValue;
1723
                private int size;
1724
                private Evaluator eval;
1725

    
1726
                AddAttribute(String name) {
1727
                        this(name, DataTypes.STRING, null, 15);
1728
                }
1729

    
1730
                AddAttribute(String name, int type) {
1731
                        this(name, type, null, 15);
1732
                }
1733

    
1734
                AddAttribute(String name, int type, Object defValue) {
1735
                        this(name, type, defValue, 15);
1736
                }
1737

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

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

    
1754

    
1755

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

    
1767
                protected FeatureType transformType(FeatureType type) {
1768
                        EditableFeatureType result = type.getEditable();
1769

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

    
1779

    
1780
                        return result.getNotEditableCopy();
1781
                }
1782

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

    
1794

    
1795
        class RemoveAttribute extends TransformTypeTransform {
1796

    
1797
                private String attributeName;
1798
                private String fTypeIdToRemoveAttribute = null;
1799
                private FeatureAttributeDescriptor attr;
1800

    
1801
                RemoveAttribute(String attributeName) {
1802
                        this.attributeName = attributeName;
1803
                }
1804

    
1805
                RemoveAttribute(String attributeName, FeatureType fType) {
1806
                        this.attributeName = attributeName;
1807
                }
1808

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

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

    
1830

    
1831
                        return result.getNotEditableCopy();
1832
                }
1833

    
1834
                protected FeatureType transformType(FeatureType type) {
1835
                        if (!type.getId().equals(this.fTypeIdToRemoveAttribute)) {
1836
                                return type;
1837
                        }
1838

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

    
1848
                }
1849

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

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

    
1877

    
1878

    
1879
        }
1880

    
1881

    
1882
        public class StringsToLowerTransform extends myTransform {
1883

    
1884
                public boolean isTransformsOriginalValues() {
1885
                        return true;
1886
                }
1887

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

    
1904
        }
1905

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

    
1923
        }
1924

    
1925

    
1926
        public void testFeatureReference() throws Exception {
1927
                DataStoreParameters dbfParameters = this
1928
                                .getDefaultDataStoreParameters();
1929

    
1930
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
1931
                                .getDataStoreName(), dbfParameters);
1932

    
1933
                Feature feature, refered;
1934
                FeatureSet set;
1935
                int nTimes2 = getRandom().nextInt(2) + 1;
1936

    
1937
                for (int j = 0; j < nTimes2; j++) {
1938
                        set = store.getFeatureSet();
1939
                        DisposableIterator iter;
1940

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

    
1956
                        set.dispose();
1957
                }
1958

    
1959
                nTimes2 = getRandom().nextInt(5) + 2;
1960
                FeatureQuery query = store.createFeatureQuery();
1961

    
1962
                for (int j = 0; j < nTimes2; j++) {
1963
                        DisposableIterator iter;
1964

    
1965
                        query.setAttributeNames(getRandomAttibuteList(store
1966
                                        .getDefaultFeatureType()));
1967
                        set = store.getFeatureSet(query);
1968

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

    
1985
                        set.dispose();
1986
                }
1987

    
1988

    
1989

    
1990
                store.dispose();
1991

    
1992
        }
1993

    
1994
        public void testResourcesLocks() throws Exception {
1995

    
1996
                if (!this.usesResources()) {
1997
                        return;
1998
                }
1999

    
2000
                DataStoreParameters dbfParameters = this
2001
                                .getDefaultDataStoreParameters();
2002

    
2003
                FeatureStore store = (FeatureStore) dataManager.openStore(dbfParameters
2004
                                .getDataStoreName(), dbfParameters);
2005

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

    
2015
                Iterator iter;
2016
                List stillAlives = new ArrayList();
2017
                stillAlives.addAll(threads);
2018

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

    
2035
                store.dispose();
2036

    
2037
                iter = threads.iterator();
2038
                while (iter.hasNext()) {
2039
                        task = (TaskTestIterators) iter.next();
2040
                        assertTrue(task.isFinishedOk());
2041
                }
2042
        }
2043

    
2044
        class TaskTestIterators extends StoreTask {
2045
                private BaseTestFeatureStore testInstance;
2046

    
2047
                public TaskTestIterators(BaseTestFeatureStore testInstance,
2048
                                String name, FeatureStore store) {
2049
                        super(name, store);
2050
                        this.testInstance = testInstance;
2051
                }
2052

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

    
2059
                public void run() {
2060
                        if (!this.startProcess()) {
2061
                                return;
2062
                        }
2063
                        try {
2064
                                this.testInstance.fullStoreIteratorTest(store);
2065

    
2066
                                finishedOk();
2067
                        } catch (Throwable e) {
2068
                                finishedError(e);
2069
                                return;
2070
                        }
2071
                }
2072

    
2073

    
2074
        }
2075

    
2076

    
2077
        protected void tearDown() throws Exception {
2078
                super.tearDown();
2079
                if (!usesResources()) {
2080
                        return;
2081
                }
2082

    
2083
                ResourceManager resMan = DALLocator.getResourceManager();
2084
                resMan.closeResources();
2085
        }
2086

    
2087

    
2088

    
2089
}