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 @ 40435

History | View | Annotate | Download (51.6 KB)

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

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

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

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

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

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

    
72
        private static Logger logger = null;
73

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

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

    
84
        public abstract boolean usesResources();
85

    
86
        public abstract boolean hasExplorer();
87

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

    
97
                return query;
98
        }
99

    
100

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

    
104

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

    
109

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

    
112

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

    
117

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

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

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

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

    
153
        }
154

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

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

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

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

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

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

    
223
                return true;
224
        }
225

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

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

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

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

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

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

    
292
                return true;
293
        }
294

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

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

    
313
        }
314

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

    
327
                return !iter2.hasNext();
328

    
329
        }
330

    
331

    
332

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

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

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

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

    
375

    
376

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

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

    
386
                }
387
                return true;
388

    
389
        }
390

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

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

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

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

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

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

    
443
                        return false;
444
                }
445

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

    
462
                return true;
463
        }
464

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

    
485
                return true;
486
        }
487

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

    
504
                return true;
505

    
506
        }
507

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

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

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

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

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

    
546
                        }
547
                        return true;
548

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

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

    
568
        }
569

    
570

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

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

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

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

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

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

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

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

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

    
641

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
710
        }
711

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

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

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

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

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

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

    
737
        }
738

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

    
745
                this.testSimpleIteration(store);
746

    
747
                store.dispose();
748

    
749
        }
750

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

    
757
                this.testIterationFastAndStandart(store);
758

    
759
                store.dispose();
760

    
761
        }
762

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

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

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

    
784
                store.dispose();
785

    
786
                explorer.dispose();
787
        }
788

    
789
        //=================================================
790
        //=================================================
791

    
792

    
793

    
794

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

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

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

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

    
820

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

    
827
        }
828

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

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

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

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

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

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

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

    
863
                set.dispose();
864

    
865
        }
866

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

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

    
874
                testCustomFTypeSet(store);
875

    
876
                store.dispose();
877
        }
878

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
954
                        set1.dispose();
955

    
956

    
957
                }
958

    
959

    
960

    
961
                set.dispose();
962

    
963
        }
964

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

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

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

    
996
                testSimpleIteration(store);
997

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

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

    
1004
                testSimpleIteration(store2);
1005

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

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

    
1011
        }
1012

    
1013

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

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

    
1021
                testSort(store);
1022

    
1023
                store.dispose();
1024

    
1025
        }
1026

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

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

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

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

    
1046

    
1047

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

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

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

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

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

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

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

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

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

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

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

    
1103
                }
1104

    
1105
        }
1106

    
1107

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

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

    
1119
                Iterator orderIter;
1120

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

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

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

    
1212
                return true;
1213
        }
1214

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

    
1221

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

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

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

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

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

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

    
1245

    
1246
                fullStoreIteratorTest(store);
1247

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

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

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

    
1285

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

    
1289

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

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

    
1295
                fullStoreIteratorTest(store);
1296

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

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

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

    
1336

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

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

    
1342
                fullStoreIteratorTest(store);
1343

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

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

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

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

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

    
1388
                fullStoreIteratorTest(store);
1389

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

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

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

    
1432

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

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

    
1438
                fullStoreIteratorTest(store);
1439

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

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

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

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

    
1482
                compareStores(store, store1);
1483

    
1484

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

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

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

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

    
1504
                }
1505

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

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

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

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

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

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

    
1533
                }
1534

    
1535
                public FeatureType getSourceFeatureTypeFrom(
1536
                                FeatureType targetFeatureType) {
1537

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

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

    
1553
        }
1554

    
1555
        abstract class TransformTypeTransform extends myTransform {
1556

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

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

    
1565
                        return this.myDefaultFeatureType;
1566
                }
1567

    
1568
                protected abstract FeatureType transformType(FeatureType type);
1569

    
1570
                protected abstract FeatureType restoreType(FeatureType type);
1571

    
1572

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

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

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

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

    
1619
        }
1620

    
1621
        abstract class TransformAttributeNameTransform extends
1622
                        TransformTypeTransform {
1623

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

    
1630

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

    
1642
                protected abstract String transformAttributeName(String source);
1643

    
1644
                protected abstract String restoreAttributeName(String target);
1645

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

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

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

    
1692
        }
1693

    
1694

    
1695
        class AddPrefixAttributeName extends TransformAttributeNameTransform {
1696

    
1697
                private String prefix;
1698

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

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

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

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

    
1715
        }
1716

    
1717
        class AddAttribute extends TransformTypeTransform {
1718

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

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

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

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

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

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

    
1753

    
1754

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

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

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

    
1778

    
1779
                        return result.getNotEditableCopy();
1780
                }
1781

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

    
1793

    
1794
        class RemoveAttribute extends TransformTypeTransform {
1795

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

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

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

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

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

    
1829

    
1830
                        return result.getNotEditableCopy();
1831
                }
1832

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

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

    
1847
                }
1848

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

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

    
1876

    
1877

    
1878
        }
1879

    
1880

    
1881
        public class StringsToLowerTransform extends myTransform {
1882

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

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

    
1903
        }
1904

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

    
1922
        }
1923

    
1924

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

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

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

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

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

    
1955
                        set.dispose();
1956
                }
1957

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

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

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

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

    
1984
                        set.dispose();
1985
                }
1986

    
1987

    
1988

    
1989
                store.dispose();
1990

    
1991
        }
1992

    
1993
        public void testResourcesLocks() throws Exception {
1994

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

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

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

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

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

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

    
2034
                store.dispose();
2035

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

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

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

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

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

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

    
2072

    
2073
        }
2074

    
2075

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

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

    
2086

    
2087

    
2088
}