Statistics
| Revision:

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

History | View | Annotate | Download (33.2 KB)

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

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

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

    
33
import java.util.Iterator;
34

    
35
import org.gvsig.fmap.dal.DataServerExplorer;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import org.gvsig.fmap.dal.DataTypes;
39
import org.gvsig.fmap.dal.exception.DataException;
40
import org.gvsig.fmap.dal.exception.RemoveException;
41
import org.gvsig.fmap.dal.feature.exception.ConcurrentDataModificationException;
42
import org.gvsig.fmap.dal.feature.testediting.DeleteFirstAndLastFeature;
43
import org.gvsig.fmap.dal.feature.testediting.DeleteLastFeature;
44
import org.gvsig.fmap.dal.feature.testediting.EditStore;
45
import org.gvsig.fmap.dal.feature.testediting.InsertFeature;
46
import org.gvsig.fmap.dal.feature.testediting.UpdateFeature;
47
import org.gvsig.fmap.geom.Geometry;
48
import org.gvsig.tools.evaluator.Evaluator;
49
import org.gvsig.tools.evaluator.EvaluatorData;
50
import org.gvsig.tools.evaluator.EvaluatorException;
51
import org.gvsig.tools.evaluator.EvaluatorFieldValue;
52
import org.gvsig.tools.observer.Observable;
53
import org.gvsig.tools.observer.Observer;
54

    
55
/**
56
 * @author jmvivo
57
 *
58
 */
59
public abstract class BaseTestEditableFeatureStore extends BaseTestFeatureStore {
60

    
61
        public abstract NewFeatureStoreParameters getDefaultNewDataStoreParameters()
62
                        throws DataException;
63

    
64
        public abstract boolean usesResources();
65

    
66
        //=================================================
67
        //=================================================
68

    
69

    
70
        protected Evaluator getEvaluatorToLower(String attibuteName) {
71
                return new ToLower(attibuteName);
72

    
73
        }
74

    
75
        protected Evaluator getEvaluatorToUpper(String attibuteName) {
76
                return new ToUpper(attibuteName);
77
        }
78

    
79
        public class ToLower implements Evaluator {
80
                private String attributeName;
81

    
82
                public ToLower(String attrName) {
83
                        this.attributeName = attrName;
84
                }
85

    
86
                public Object evaluate(EvaluatorData data) throws EvaluatorException {
87
                        String value = (String) data.getDataValue(this.attributeName);
88
                        if (value == null) {
89
                                return null;
90
                        }
91
                        return value.toLowerCase();
92
                }
93

    
94
                public String getCQL() {
95
                        return null;
96
                }
97

    
98
                public String getDescription() {
99
                        return null;
100
                }
101

    
102
                public EvaluatorFieldValue[] getFieldValues(String name) {
103
                        return null;
104
                }
105

    
106
                public String getName() {
107
                        return null;
108
                }
109

    
110
        }
111

    
112
        public class ToUpper implements Evaluator {
113
                private String attributeName;
114

    
115
                public ToUpper(String attrName) {
116
                        this.attributeName = attrName;
117
                }
118

    
119
                public Object evaluate(EvaluatorData data) throws EvaluatorException {
120
                        String value = (String) data.getDataValue(this.attributeName);
121
                        if (value == null) {
122
                                return null;
123
                        }
124
                        return value.toUpperCase();
125
                }
126

    
127
                public String getCQL() {
128
                        return null;
129
                }
130

    
131
                public String getDescription() {
132
                        return null;
133
                }
134

    
135
                public EvaluatorFieldValue[] getFieldValues(String name) {
136
                        return null;
137
                }
138

    
139
                public String getName() {
140
                        return null;
141
                }
142

    
143
        }
144

    
145
        protected FeatureStore getStoreCopy(FeatureStore source,
146
                        NewFeatureStoreParameters targetParams) throws DataException {
147
                DataServerExplorer explorer = source.getExplorer();
148
                source.export(explorer, targetParams);
149
                FeatureStore result = (FeatureStore) dataManager
150
                                .createStore(targetParams);
151

    
152
                return result;
153
        }
154

    
155
        protected void clearCopy(FeatureStore source,
156
                        NewFeatureStoreParameters targetParams) throws DataException,
157
                        RemoveException {
158
                DataServerExplorer explorer = source.getExplorer();
159
                explorer.remove(targetParams);
160

    
161
        }
162

    
163
        protected boolean compareFeatures(Feature f1, Feature f2,
164
                        String[] attrsNames, UpdateFeature updated, long index,
165
                        long lastIndex) throws DataException, EvaluatorException {
166
                FeatureAttributeDescriptor attr1;
167
                FeatureAttributeDescriptor attr2;
168
                EditableFeature f2e = f2.getEditable();
169
                updated.applyUpdateList(f2e, index, lastIndex);
170

    
171
                Object v1, v2;
172
                for (int i = 0; i < attrsNames.length; i++) {
173
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
174
                        attr2 = f2e.getType().getAttributeDescriptor(attrsNames[i]);
175
                        if (attr1 != attr2) {
176
                                if (!compareAttributes(attr1, attr1)) {
177
                                        return false;
178
                                }
179
                        }
180
                        v1 = f1.get(attr1.getName());
181
                        v2 = f2.get(attr2.getName());
182
                        if (!compareFeatureValue(v1, v2, attr1)) {
183
                                return false;
184
                        }
185
                }
186

    
187
                return true;
188
        }
189

    
190
        protected boolean compareFeatures(Feature f1, Feature f2,
191
                        UpdateFeature updated, long index, long lastIndex)
192
                        throws DataException, EvaluatorException {
193
                if (!compareTypes(f1.getType(), f2.getType())) {
194
                        System.out.println("compareFeatures() type !=");
195
                        return false;
196
                }
197
                Iterator iter = f1.getType().iterator();
198
                FeatureAttributeDescriptor attr;
199
                EditableFeature f1e = f1.getEditable();
200
                updated.applyUpdateList(f1e, index, lastIndex);
201
                Object v1, v2;
202
                while (iter.hasNext()) {
203
                        attr = (FeatureAttributeDescriptor) iter.next();
204
                        v1 = f1e.get(attr.getName());
205
                        v2 = f2.get(attr.getName());
206
                        if (!compareFeatureValue(v1, v2, attr)) {
207
                                return false;
208
                        }
209
                }
210

    
211

    
212
                return true;
213

    
214
        }
215

    
216
        protected boolean compareFeatureValue(Object v1, Object v2,
217
                        FeatureAttributeDescriptor attr) {
218

    
219
                if (v1 == v2) {
220
                        return true;
221
                } else if (v1 == null) {
222
                        return false;
223
                }
224
                switch (attr.getDataType()) {
225
                case DataTypes.FEATURE:
226
                        return compareFeatures((Feature) v1, (Feature) v2);
227

    
228
                case DataTypes.GEOMETRY:
229
                        Geometry geom1 = (Geometry) v1;
230
                        Geometry geom2 = (Geometry) v2;
231
                        return geom1.equals(geom2);
232
                case DataTypes.DOUBLE:
233
                        double diff = ((Double) v1).doubleValue()
234
                                        - ((Double) v1).doubleValue();
235
                        return Math.abs(diff) < 0.000001;
236

    
237

    
238
                default:
239
                        return v1.equals(v2);
240
                }
241

    
242
        }
243

    
244

    
245
        //---------------
246

    
247

    
248

    
249

    
250
        //=================================================
251
        //=================================================
252

    
253

    
254

    
255

    
256
        public void testExport() {
257
                DataStoreParameters parameters = null;
258

    
259
                try {
260
                        parameters = getDefaultDataStoreParameters();
261

    
262

    
263
                        FeatureStore store = (FeatureStore) dataManager
264
                                        .createStore(parameters);
265

    
266
                        NewFeatureStoreParameters newParams = this
267
                                        .getDefaultNewDataStoreParameters();
268
                        try {
269
                                this.clearCopy(store, newParams);
270
                        } catch (RemoveException e) {
271
                                //Dp nothing
272
                        }
273

    
274
                        FeatureStore result = this.getStoreCopy(store, newParams);
275

    
276
                        FeatureSet set = result.getFeatureSet();
277
                        FeatureSet originalSet = store.getFeatureSet();
278
                        assertEquals(set.getSize(), originalSet.getSize());
279

    
280
                        Iterator originalIter = originalSet.iterator();
281
                        Iterator iter = set.iterator();
282
                        assertTrue(compareFeatureIterators(originalIter, iter));
283
                        set.dispose();
284
                        originalSet.dispose();
285

    
286
                        result.dispose();
287
                        this.clearCopy(store, newParams);
288
                        store.dispose();
289

    
290
                } catch (DataException e3) {
291
                        e3.printStackTrace();
292
                        fail();
293
                        return;
294
                }
295

    
296
        }
297

    
298
        public void testRemove() {
299
                DataStoreParameters parameters = null;
300

    
301
                try {
302
                        parameters = getDefaultDataStoreParameters();
303

    
304
                        FeatureStore store = (FeatureStore) dataManager
305
                                        .createStore(parameters);
306

    
307
                        NewFeatureStoreParameters newParams = this
308
                                        .getDefaultNewDataStoreParameters();
309
                        try {
310
                                this.clearCopy(store, newParams);
311
                        } catch (RemoveException e) {
312
                                //Dp nothing
313
                        }
314

    
315
                        FeatureStore result = this.getStoreCopy(store, newParams);
316

    
317
                        result.edit(FeatureStore.MODE_FULLEDIT);
318

    
319
                        FeatureSet set = result.getFeatureSet();
320
                        FeatureSet originalSet = store.getFeatureSet();
321
                        assertEquals(set.getSize(), originalSet.getSize());
322

    
323
                        Iterator originalIter = originalSet.iterator();
324
                        Iterator iter = set.iterator();
325
                        int i = 0;
326
                        while (iter.hasNext()) {
327
                                assertTrue("" + i, compareFeatures((Feature) originalIter
328
                                                .next(), (Feature) iter.next()));
329
                                i++;
330
                        }
331

    
332
                        iter.remove();
333

    
334
                        assertEquals(originalSet.getSize() - 1, set.getSize());
335

    
336
                        originalIter = originalSet.iterator();
337
                        iter = set.iterator();
338
                        i = 0;
339
                        while (iter.hasNext()) {
340
                                assertTrue("" + i, compareFeatures((Feature) originalIter
341
                                                .next(), (Feature) iter.next()));
342
                                i++;
343
                        }
344

    
345
                        iter.remove();
346

    
347
                        assertEquals(originalSet.getSize() - 2, set.getSize());
348

    
349
                        set.dispose();
350

    
351
                        result.finishEditing();
352

    
353
                        set = result.getFeatureSet();
354
                        assertEquals(originalSet.getSize() - 2, set.getSize());
355

    
356
                        originalIter = originalSet.iterator();
357
                        iter = set.iterator();
358
                        i = 0;
359
                        while (iter.hasNext()) {
360
                                assertTrue("" + i, compareFeatures((Feature) originalIter
361
                                                .next(), (Feature) iter.next()));
362
                                i++;
363
                        }
364

    
365
                        set.dispose();
366
                        originalSet.dispose();
367

    
368
                        result.dispose();
369
                        this.clearCopy(store, newParams);
370
                        store.dispose();
371

    
372
                } catch (DataException e3) {
373
                        e3.printStackTrace();
374
                        fail();
375
                        return;
376
                }
377

    
378
        }
379

    
380
        public void testInsert() {
381
                DataStoreParameters parameters = null;
382

    
383
                try {
384
                        parameters = getDefaultDataStoreParameters();
385

    
386

    
387
                        FeatureStore store = (FeatureStore) dataManager
388
                                        .createStore(parameters);
389

    
390
                        NewFeatureStoreParameters newParams = this
391
                                        .getDefaultNewDataStoreParameters();
392
                        try {
393
                                this.clearCopy(store, newParams);
394
                        } catch (RemoveException e) {
395
                                //Do nothing
396
                        }
397

    
398
                        FeatureStore result = this.getStoreCopy(store, newParams);
399

    
400
                        result.edit(FeatureStore.MODE_FULLEDIT);
401

    
402
                        FeatureSet set = result.getFeatureSet();
403
                        FeatureSet originalSet = store.getFeatureSet();
404
                        assertEquals(set.getSize(), originalSet.getSize());
405

    
406
                        set.insert(result.createNewFeature(true));
407
                        Iterator originalIter = originalSet.iterator();
408
                        Iterator iter = set.iterator();
409
                        int i = 0;
410
                        while (originalIter.hasNext()) {
411
                                assertTrue("" + i, compareFeatures((Feature) originalIter
412
                                                .next(), (Feature) iter.next()));
413
                                i++;
414
                        }
415
                        assertTrue(iter.hasNext());
416
                        assertNotNull(iter.next());
417
                        assertFalse(iter.hasNext());
418

    
419
                        assertEquals(originalSet.getSize() + 1, set.getSize());
420

    
421
                        originalIter = originalSet.iterator();
422
                        iter = set.iterator();
423
                        i = 0;
424
                        while (originalIter.hasNext()) {
425
                                assertTrue("" + i, compareFeatures((Feature) originalIter
426
                                                .next(), (Feature) iter.next()));
427
                                i++;
428
                        }
429
                        assertTrue(iter.hasNext());
430
                        assertNotNull(iter.next());
431

    
432
                        set.insert(result.createNewFeature(true));
433

    
434
                        assertEquals(originalSet.getSize() + 2, set.getSize());
435

    
436
                        set.dispose();
437

    
438
                        result.finishEditing();
439

    
440
                        set = result.getFeatureSet();
441
                        assertEquals(originalSet.getSize() + 2, set.getSize());
442

    
443
                        originalIter = originalSet.iterator();
444
                        iter = set.iterator();
445
                        i = 0;
446
                        while (originalIter.hasNext()) {
447
                                assertTrue("" + i, compareFeatures((Feature) originalIter
448
                                                .next(), (Feature) iter.next()));
449
                                i++;
450
                        }
451

    
452
                        assertNotNull(iter.next());
453
                        assertNotNull(iter.next());
454
                        assertFalse(iter.hasNext());
455

    
456
                        set.dispose();
457
                        originalSet.dispose();
458

    
459
                        result.dispose();
460
                        this.clearCopy(store, newParams);
461
                        store.dispose();
462

    
463
                } catch (DataException e3) {
464
                        e3.printStackTrace();
465
                        fail();
466
                        return;
467
                }
468

    
469
        }
470

    
471

    
472

    
473
        public void testConcurrentRemove() {
474
                DataStoreParameters parameters = null;
475

    
476
                try {
477
                        parameters = getDefaultDataStoreParameters();
478

    
479

    
480
                        FeatureStore store = (FeatureStore) dataManager
481
                                        .createStore(parameters);
482

    
483
                        NewFeatureStoreParameters newParams = this
484
                                        .getDefaultNewDataStoreParameters();
485
                        try {
486
                                this.clearCopy(store, newParams);
487
                        } catch (RemoveException e) {
488
                                //Dp nothing
489
                        }
490

    
491
                        FeatureStore result = this.getStoreCopy(store, newParams);
492

    
493
                        result.edit(FeatureStore.MODE_FULLEDIT);
494

    
495
                        DeleteFirstAndLastFeature deleteFeature = new DeleteFirstAndLastFeature(
496
                                        "1", result, EditStore.TIME_TO_WAIT_NO_WAIT);
497

    
498
                        FeatureSet set = result.getFeatureSet();
499

    
500
                        Iterator iter = set.iterator();
501
                        assertTrue(iter.hasNext());
502
                        assertNotNull(iter.next());
503

    
504
                        deleteFeature.start();
505

    
506
                        while (deleteFeature.getCurrentStatus() <= EditStore.STATUS_RUNING) {
507
                                Thread.yield();
508
                                Thread.sleep(100);
509
                                if (deleteFeature.isOutOfDate()) {
510
                                        break;
511
                                }
512
                        }
513

    
514
                        assertEquals(deleteFeature.getCurrentStatus(),
515
                                        EditStore.STATUS_FINISHED_OK);
516

    
517
                        Exception ex = null;
518
                        try {
519
                                iter.next();
520
                        } catch (Exception e) {
521
                                ex = e;
522
                        }
523
                        assertNotNull(ex);
524
                        assertEquals(ConcurrentDataModificationException.class, ex
525
                                        .getClass());
526

    
527
                        ex = null;
528
                        try {
529
                                set.getSize();
530
                        } catch (Exception e) {
531
                                ex = e;
532
                        }
533
                        assertNotNull(ex);
534
                        assertEquals(ConcurrentDataModificationException.class, ex
535
                                        .getClass());
536

    
537
                        result.dispose();
538
                        this.clearCopy(store, newParams);
539
                        store.dispose();
540

    
541

    
542
                } catch (DataException e3) {
543
                        e3.printStackTrace();
544
                        fail();
545
                        return;
546
                } catch (InterruptedException e) {
547
                        e.printStackTrace();
548
                        fail();
549
                        return;
550
                }
551
        }
552

    
553
        public void testConcurrentInsert() {
554
                DataStoreParameters parameters = null;
555

    
556
                try {
557
                        parameters = getDefaultDataStoreParameters();
558

    
559

    
560
                        FeatureStore store = (FeatureStore) dataManager
561
                                        .createStore(parameters);
562

    
563
                        NewFeatureStoreParameters newParams = this
564
                                        .getDefaultNewDataStoreParameters();
565
                        try {
566
                                this.clearCopy(store, newParams);
567
                        } catch (RemoveException e) {
568
                                //Dp nothing
569
                        }
570

    
571
                        FeatureStore result = this.getStoreCopy(store, newParams);
572

    
573
                        result.edit(FeatureStore.MODE_FULLEDIT);
574

    
575
                        InsertFeature insertFeature = new InsertFeature("1", result,
576
                                        EditStore.TIME_TO_WAIT_NO_WAIT);
577

    
578
                        FeatureSet set = result.getFeatureSet();
579

    
580
                        Iterator iter = set.iterator();
581
                        assertTrue(iter.hasNext());
582
                        assertNotNull(iter.next());
583

    
584
                        insertFeature.start();
585

    
586
                        while (insertFeature.getCurrentStatus() <= EditStore.STATUS_RUNING) {
587
                                Thread.yield();
588
                                Thread.sleep(100);
589
                                if (insertFeature.isOutOfDate()) {
590
                                        break;
591
                                }
592
                        }
593

    
594
                        assertEquals(EditStore.STATUS_FINISHED_OK, insertFeature
595
                                        .getCurrentStatus());
596

    
597
                        Exception ex = null;
598
                        try {
599
                                iter.next();
600
                        } catch (Exception e) {
601
                                ex = e;
602
                        }
603
                        assertNotNull(ex);
604
                        assertEquals(ConcurrentDataModificationException.class, ex
605
                                        .getClass());
606

    
607
                        ex = null;
608
                        try {
609
                                set.getSize();
610
                        } catch (Exception e) {
611
                                ex = e;
612
                        }
613
                        assertNotNull(ex);
614
                        assertEquals(ConcurrentDataModificationException.class, ex
615
                                        .getClass());
616

    
617
                        result.dispose();
618
                        this.clearCopy(store, newParams);
619
                        store.dispose();
620

    
621
                } catch (DataException e3) {
622
                        e3.printStackTrace();
623
                        fail();
624
                        return;
625
                } catch (InterruptedException e) {
626
                        e.printStackTrace();
627
                        fail();
628
                        return;
629
                }
630
        }
631

    
632
        public void testConcurrentUpdate() {
633
                DataStoreParameters parameters = null;
634

    
635
                try {
636
                        parameters = getDefaultDataStoreParameters();
637

    
638

    
639
                        FeatureStore store = (FeatureStore) dataManager
640
                                        .createStore(parameters);
641

    
642
                        NewFeatureStoreParameters newParams = this
643
                                        .getDefaultNewDataStoreParameters();
644
                        try {
645
                                this.clearCopy(store, newParams);
646
                        } catch (RemoveException e) {
647
                                //Dp nothing
648
                        }
649

    
650
                        FeatureStore result = this.getStoreCopy(store, newParams);
651

    
652

    
653
                        result.edit(FeatureStore.MODE_FULLEDIT);
654

    
655
                        UpdateFeature updateFeature = new UpdateFeature("1", result,
656
                                        EditStore.TIME_TO_WAIT_NO_WAIT);
657

    
658
                        updateFeature.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES,
659
                                        "OTRO_IDIOM", "XXX");
660

    
661
                        FeatureSet set = result.getFeatureSet();
662

    
663
                        Iterator iter = set.iterator();
664
                        assertTrue(iter.hasNext());
665
                        assertNotNull(iter.next());
666

    
667
                        updateFeature.start();
668

    
669
                        while (updateFeature.getCurrentStatus() <= EditStore.STATUS_RUNING) {
670
                                Thread.yield();
671
                                Thread.sleep(100);
672
                                if (updateFeature.isOutOfDate()) {
673
                                        break;
674
                                }
675
                        }
676

    
677
                        assertEquals(EditStore.STATUS_FINISHED_OK, updateFeature
678
                                        .getCurrentStatus());
679

    
680
                        Exception ex = null;
681
                        try {
682
                                iter.next();
683
                        } catch (Exception e) {
684
                                ex = e;
685
                        }
686
                        assertNotNull(ex);
687
                        assertEquals(ConcurrentDataModificationException.class, ex
688
                                        .getClass());
689

    
690
                        ex = null;
691
                        try {
692
                                set.getSize();
693
                        } catch (Exception e) {
694
                                ex = e;
695
                        }
696
                        assertNotNull(ex);
697
                        assertEquals(ConcurrentDataModificationException.class, ex
698
                                        .getClass());
699

    
700
                        result.dispose();
701
                        this.clearCopy(store, newParams);
702
                        store.dispose();
703

    
704

    
705
                } catch (DataException e3) {
706
                        e3.printStackTrace();
707
                        fail();
708
                        return;
709
                } catch (InterruptedException e) {
710
                        e.printStackTrace();
711
                        fail();
712
                        return;
713
                }
714
        }
715

    
716
        public void testSequencedRemove() {
717
                DataStoreParameters parameters = null;
718

    
719
                int ntimes = 3;
720

    
721
                try {
722
                        parameters = getDefaultDataStoreParameters();
723

    
724
                        FeatureStore store = (FeatureStore) dataManager
725
                                        .createStore(parameters);
726

    
727
                        NewFeatureStoreParameters newParams = this
728
                                        .getDefaultNewDataStoreParameters();
729
                        try {
730
                                this.clearCopy(store, newParams);
731
                        } catch (RemoveException e) {
732
                                //Dp nothing
733
                        }
734

    
735
                        FeatureStore result = this.getStoreCopy(store, newParams);
736

    
737
                        result.edit(FeatureStore.MODE_FULLEDIT);
738

    
739
                        DeleteLastFeature[] deletesFeature = new DeleteLastFeature[ntimes];
740
                        int i;
741
                        for (i = 0; i < deletesFeature.length; i++) {
742
                                deletesFeature[i] = new DeleteLastFeature("DeleteLastFeature:"
743
                                                + i, result, 300 * i);
744
                        }
745

    
746
                        for (i = 0; i < deletesFeature.length; i++) {
747
                                deletesFeature[i].start();
748
                        }
749

    
750
                        try {
751
                                for (int x = 0; x < (deletesFeature.length + 2); x++) {
752
                                        Thread.yield();
753
                                        Thread.sleep(500);
754
                                }
755

    
756
                        } catch (InterruptedException e) {
757
                                e.printStackTrace();
758
                                result.dispose();
759
                                fail();
760
                                return;
761
                        }
762

    
763
                        boolean testAll = false;
764
                        boolean restart;
765
                        DeleteLastFeature item;
766
                        while (!testAll) {
767
                                restart = false;
768
                                for (i = 0; i < deletesFeature.length; i++) {
769
                                        item = deletesFeature[i];
770
                                        if (item.getCurrentStatus() <= EditStore.STATUS_RUNING) {
771
                                                if (item.isOutOfDate()) {
772
                                                        result.dispose();
773
                                                        fail("OutOfDate: " + i);
774
                                                        return;
775
                                                }
776
                                                try {
777
                                                        Thread.yield();
778
                                                        Thread.sleep(400);
779
                                                } catch (InterruptedException e) {
780
                                                        e.printStackTrace();
781
                                                        result.dispose();
782
                                                        fail();
783
                                                        return;
784
                                                }
785
                                                restart = true;
786
                                                break;
787
                                        } else if (item.getCurrentStatus() == EditStore.STATUS_ERROR) {
788
                                                item.getException().printStackTrace();
789
                                                result.dispose();
790
                                                fail("ERROR: " + i);
791
                                                return;
792
                                        } else if (item.getCurrentStatus() != EditStore.STATUS_FINISHED_OK) {
793
                                                item.getException().printStackTrace();
794
                                                result.dispose();
795
                                                fail("Data ERROR: " + i);
796
                                                return;
797
                                        }
798
                                }
799
                                if (restart) {
800
                                        continue;
801
                                }
802
                                testAll = true;
803
                        }
804

    
805
                        FeatureSet set = result.getFeatureSet();
806
                        FeatureSet originalSet = store.getFeatureSet();
807
                        assertEquals(originalSet.getSize() - deletesFeature.length, set
808
                                        .getSize());
809

    
810
                        Iterator originalIter = originalSet.iterator();
811
                        Iterator iter = set.iterator();
812

    
813
                        i = 0;
814
                        while (iter.hasNext()) {
815
                                assertTrue("" + i, compareFeatures((Feature) originalIter
816
                                                .next(), (Feature) iter.next()));
817
                                i++;
818
                        }
819

    
820
                        set.dispose();
821

    
822
                        result.finishEditing();
823

    
824
                        set = result.getFeatureSet();
825
                        assertEquals(originalSet.getSize() - deletesFeature.length, set
826
                                        .getSize());
827

    
828
                        originalIter = originalSet.iterator();
829
                        iter = set.iterator();
830
                        i = 0;
831
                        while (iter.hasNext()) {
832
                                assertTrue("" + i, compareFeatures((Feature) originalIter
833
                                                .next(), (Feature) iter.next()));
834
                                i++;
835
                        }
836

    
837
                        set.dispose();
838
                        originalSet.dispose();
839

    
840
                        result.dispose();
841
                        this.clearCopy(store, newParams);
842
                        store.dispose();
843

    
844
                } catch (DataException e3) {
845
                        e3.printStackTrace();
846
                        fail();
847
                        return;
848
                }
849

    
850
        }
851

    
852
        public void testSequencedInsert() {
853
                DataStoreParameters parameters = null;
854

    
855
                int ntimes = 3;
856

    
857
                try {
858
                        parameters = getDefaultDataStoreParameters();
859

    
860

    
861
                        FeatureStore store = (FeatureStore) dataManager
862
                                        .createStore(parameters);
863

    
864
                        NewFeatureStoreParameters newParams = this
865
                                        .getDefaultNewDataStoreParameters();
866
                        try {
867
                                this.clearCopy(store, newParams);
868
                        } catch (RemoveException e) {
869
                                //Dp nothing
870
                        }
871

    
872
                        FeatureStore result = this.getStoreCopy(store, newParams);
873

    
874
                        result.edit(FeatureStore.MODE_FULLEDIT);
875

    
876
                        InsertFeature[] insertsFeature = new InsertFeature[ntimes];
877
                        int i;
878
                        for (i = 0; i < insertsFeature.length; i++) {
879
                                insertsFeature[i] = new InsertFeature("InsertFeature:" + i,
880
                                                result, 300 * i);
881
                        }
882

    
883
                        for (i = 0; i < insertsFeature.length; i++) {
884
                                insertsFeature[i].start();
885
                        }
886

    
887
                        try {
888

    
889
                                for (int x = 0; x < (insertsFeature.length + 2); x++) {
890
                                        Thread.yield();
891
                                        Thread.sleep(500);
892
                                }
893

    
894
                        } catch (InterruptedException e) {
895
                                e.printStackTrace();
896
                                result.dispose();
897
                                fail();
898
                                return;
899
                        }
900

    
901
                        boolean testAll = false;
902
                        boolean restart;
903
                        InsertFeature item;
904
                        while (!testAll) {
905
                                restart = false;
906
                                for (i = 0; i < insertsFeature.length; i++) {
907
                                        item = insertsFeature[i];
908
                                        if (item.getCurrentStatus() <= EditStore.STATUS_RUNING) {
909
                                                if (item.isOutOfDate()) {
910
                                                        result.dispose();
911
                                                        fail("OutOfDate: " + i);
912
                                                        return;
913
                                                }
914
                                                try {
915
                                                        Thread.yield();
916
                                                        Thread.sleep(400);
917
                                                } catch (InterruptedException e) {
918
                                                        e.printStackTrace();
919
                                                        result.dispose();
920
                                                        fail();
921
                                                        return;
922
                                                }
923
                                                restart = true;
924
                                                break;
925
                                        } else if (item.getCurrentStatus() == EditStore.STATUS_ERROR) {
926
                                                item.getException().printStackTrace();
927
                                                result.dispose();
928
                                                fail("ERROR: " + i);
929
                                                return;
930
                                        } else if (item.getCurrentStatus() == EditStore.STATUS_FINISHED_NO_OK) {
931
                                                result.dispose();
932
                                                fail("No OK: " + i);
933
                                                return;
934
                                        } else if (item.getCurrentStatus() != EditStore.STATUS_FINISHED_OK) {
935
                                                item.getException().printStackTrace();
936
                                                result.dispose();
937
                                                fail("Data ERROR: " + i);
938
                                                return;
939

    
940
                                        }
941
                                }
942
                                if (restart) {
943
                                        continue;
944
                                }
945
                                testAll = true;
946
                        }
947

    
948
                        FeatureSet set = result.getFeatureSet();
949
                        FeatureSet originalSet = store.getFeatureSet();
950
                        assertEquals(originalSet.getSize() + insertsFeature.length, set
951
                                        .getSize());
952

    
953
                        Iterator originalIter = originalSet.iterator();
954
                        Iterator iter = set.iterator();
955

    
956
                        i = 0;
957
                        while (originalIter.hasNext()) {
958
                                assertTrue("" + i, compareFeatures((Feature) originalIter
959
                                                .next(), (Feature) iter.next()));
960
                                i++;
961
                        }
962
                        for (; i < insertsFeature.length; i++) {
963
                                iter.next();
964
                        }
965

    
966
                        set.dispose();
967

    
968
                        result.finishEditing();
969

    
970
                        set = result.getFeatureSet();
971
                        assertEquals(originalSet.getSize() + insertsFeature.length, set
972
                                        .getSize());
973

    
974
                        originalIter = originalSet.iterator();
975
                        iter = set.iterator();
976
                        i = 0;
977
                        while (originalIter.hasNext()) {
978
                                assertTrue("" + i, compareFeatures((Feature) originalIter
979
                                                .next(), (Feature) iter.next()));
980
                                i++;
981
                        }
982
                        for (; i < insertsFeature.length; i++) {
983
                                iter.next();
984
                        }
985

    
986
                        set.dispose();
987
                        originalSet.dispose();
988

    
989
                        result.dispose();
990
                        this.clearCopy(store, newParams);
991
                        store.dispose();
992

    
993

    
994
                } catch (DataException e3) {
995
                        e3.printStackTrace();
996
                        fail();
997
                        return;
998
                }
999

    
1000
        }
1001

    
1002

    
1003
        public void testUpdate() {
1004
                DataStoreParameters parameters = null;
1005

    
1006
                try {
1007
                        parameters = getDefaultDataStoreParameters();
1008

    
1009
                        FeatureStore store = (FeatureStore) dataManager
1010
                                        .createStore(parameters);
1011

    
1012
                        NewFeatureStoreParameters newParams = this
1013
                                        .getDefaultNewDataStoreParameters();
1014
                        try {
1015
                                this.clearCopy(store, newParams);
1016
                        } catch (RemoveException e) {
1017
                                //Dp nothing
1018
                        }
1019

    
1020
                        FeatureStore result = this.getStoreCopy(store, newParams);
1021

    
1022
                        result.edit(FeatureStore.MODE_FULLEDIT);
1023

    
1024
                        FeatureSet set = result.getFeatureSet();
1025
                        long size = set.getSize();
1026

    
1027
                        set.dispose();
1028

    
1029
                        UpdateFeature updater = new UpdateFeature("1", result,
1030
                                        UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1031
                        FeatureAttributeDescriptor attr = getFirstAttributeOfType(result.getDefaultFeatureType(), DataTypes.STRING);
1032
                        assertNotNull("No String attributes found", attr);
1033

    
1034
                        updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES,
1035
                                        attr.getName(), getEvaluatorToLower(attr.getName()));
1036

    
1037
                        updater.run();
1038
                        while (updater.getCurrentStatus() < EditStore.STATUS_FINISHED_OK
1039
                                        && !updater.isOutOfDate()) {
1040
                                Thread.yield();
1041
                                try {
1042
                                        Thread.sleep(200);
1043
                                } catch (InterruptedException e) {
1044
                                        e.printStackTrace();
1045
                                        fail();
1046
                                }
1047
                        }
1048
                        set = result.getFeatureSet();
1049
                        Iterator iter = set.iterator();
1050

    
1051
                        printFeatureTypeColNames(set.getDefaultFeatureType(), 15);
1052
                        Feature f;
1053
                        while (iter.hasNext()) {
1054
                                f = (Feature) iter.next();
1055
                                this.printFeature(f,false, 15);
1056
                        }
1057

    
1058
                        FeatureSet originalSet = store.getFeatureSet();
1059

    
1060
                        Iterator originalIter = originalSet.iterator();
1061

    
1062
                        iter = set.iterator();
1063

    
1064
                        long i = 0;
1065
                        while (originalIter.hasNext()) {
1066
                                try {
1067
                                        assertTrue("" + i, compareFeatures((Feature) originalIter
1068
                                                        .next(), (Feature) iter.next(), updater, i, size));
1069
                                } catch (EvaluatorException e) {
1070
                                        e.printStackTrace();
1071
                                        fail();
1072
                                }
1073
                                i++;
1074
                        }
1075

    
1076

    
1077
                        set.dispose();
1078

    
1079
                        result.finishEditing();
1080

    
1081
                        set = result.getFeatureSet();
1082
                        assertEquals(originalSet.getSize(), set.getSize());
1083

    
1084
                        originalIter = originalSet.iterator();
1085
                        iter = set.iterator();
1086
                        i = 0;
1087
                        while (originalIter.hasNext()) {
1088
                                try {
1089
                                        assertTrue("" + i, compareFeatures((Feature) originalIter
1090
                                                        .next(), (Feature) iter.next(), updater, i, size));
1091
                                } catch (EvaluatorException e) {
1092
                                        e.printStackTrace();
1093
                                        fail();
1094
                                }
1095
                                i++;
1096
                        }
1097

    
1098

    
1099
                        set.dispose();
1100

    
1101

    
1102
                        updater = new UpdateFeature("1", result,
1103
                                        UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1104

    
1105
                        updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES,
1106
                                        attr.getName(), getEvaluatorToLower(attr.getName()));
1107

    
1108
                        updater.run();
1109
                        while (updater.getCurrentStatus() < EditStore.STATUS_FINISHED_OK
1110
                                        && !updater.isOutOfDate()) {
1111
                                Thread.yield();
1112
                                try {
1113
                                        Thread.sleep(200);
1114
                                } catch (InterruptedException e) {
1115
                                        e.printStackTrace();
1116
                                        fail();
1117
                                }
1118
                        }
1119
                        set = result.getFeatureSet();
1120

    
1121
                        iter = set.iterator();
1122
                        originalIter = originalSet.iterator();
1123
                        i = 0;
1124
                        while (originalIter.hasNext()) {
1125
                                try {
1126
                                        assertTrue("" + i, compareFeatures((Feature) originalIter
1127
                                                        .next(), (Feature) iter.next(), updater, i, size));
1128
                                } catch (EvaluatorException e) {
1129
                                        e.printStackTrace();
1130
                                        fail();
1131
                                }
1132
                                i++;
1133
                        }
1134

    
1135
                        set.dispose();
1136

    
1137

    
1138

    
1139

    
1140

    
1141
                        originalSet.dispose();
1142

    
1143
                        result.dispose();
1144
                        this.clearCopy(store, newParams);
1145
                        store.dispose();
1146

    
1147
                } catch (DataException e3) {
1148
                        e3.printStackTrace();
1149
                        fail();
1150
                        return;
1151
                }
1152

    
1153
        }
1154

    
1155

    
1156
        public void testResourceChangeNotification() {
1157
                DataStoreParameters parameters = null;
1158

    
1159
                try {
1160
                        parameters = getDefaultDataStoreParameters();
1161

    
1162
                        FeatureStore store = (FeatureStore) dataManager
1163
                                        .createStore(parameters);
1164

    
1165
                        NewFeatureStoreParameters newParams = this
1166
                                        .getDefaultNewDataStoreParameters();
1167
                        try {
1168
                                this.clearCopy(store, newParams);
1169
                        } catch (RemoveException e) {
1170
                                //Dp nothing
1171
                        }
1172

    
1173
                        FeatureStore result = this.getStoreCopy(store, newParams);
1174

    
1175
                        FeatureStore result2 = (FeatureStore) dataManager
1176
                                .createStore(newParams);
1177

    
1178
                        FeatureAttributeDescriptor attr = getFirstAttributeOfType(result.getDefaultFeatureType(), DataTypes.STRING);
1179
                        assertNotNull("No String attributes found", attr);
1180

    
1181

    
1182
                        UpdateFeature updater = new UpdateFeature("1", result,
1183
                                        UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1184

    
1185
                        updater.addUpdate(UpdateFeature.UPDATE_LAST_FEATURE,
1186
                                        attr.getName(), getEvaluatorToLower(attr.getName()));
1187

    
1188
                        StoreObserverForNotify observer = new StoreObserverForNotify(result2,FeatureStoreNotification.RESOURCE_CHANGED);
1189
                        result2.addObserver(observer);
1190

    
1191
                        result.edit();
1192
                        updater.run();
1193
                        while (updater.getCurrentStatus() < EditStore.STATUS_FINISHED_OK
1194
                                        && !updater.isOutOfDate()) {
1195
                                Thread.yield();
1196
                                try {
1197
                                        Thread.sleep(200);
1198
                                } catch (InterruptedException e) {
1199
                                        e.printStackTrace();
1200
                                        fail();
1201
                                }
1202
                        }
1203

    
1204
                        result.finishEditing();
1205

    
1206
                        assertTrue(observer.notified());
1207

    
1208
                        result2.refresh();
1209

    
1210
                        FeatureSet set = result.getFeatureSet();
1211
                        FeatureSet set2 = result2.getFeatureSet();
1212

    
1213
                        assertTrue(this.compareFeatureIterators(set.iterator(), set2.iterator()));
1214

    
1215
                        set2.dispose();
1216
                        set.dispose();
1217

    
1218
                        // TODO checks FeatureType change
1219

    
1220
                        result2.dispose();
1221
                        result.dispose();
1222
                        this.clearCopy(store, newParams);
1223
                        store.dispose();
1224

    
1225
                } catch (DataException e3) {
1226
                        e3.printStackTrace();
1227
                        fail();
1228
                        return;
1229
                }
1230

    
1231
        }
1232

    
1233
        public abstract class StoreObserver implements Observer{
1234

    
1235
                public DataStore store = null;
1236

    
1237
        }
1238

    
1239
        public class StoreObserverForNotify implements Observer{
1240

    
1241
                public DataStore store = null;
1242

    
1243
                public String notifyType = null;
1244

    
1245
                private boolean notifyRecived = false;
1246

    
1247
                public StoreObserverForNotify(DataStore store,String notifyType){
1248
                        this.store = store;
1249
                        this.notifyType = notifyType;
1250
                        this.notifyRecived = false;
1251
                }
1252

    
1253
                public boolean notified(){
1254
                        return notifyRecived;
1255
                }
1256

    
1257
                public void update(Observable observable, Object notification) {
1258
                        if (!(observable == this.store)){
1259
                                return;
1260
                        }
1261
                        if (!(notification instanceof FeatureStoreNotification)){
1262
                                return;
1263
                        }
1264
                        FeatureStoreNotification fsNotification = (FeatureStoreNotification) notification;
1265

    
1266
                        if (fsNotification.getType().equals(this.notifyType)){
1267
                                notifyRecived = true;
1268
                        }
1269
                }
1270

    
1271
        }
1272

    
1273
        public void testUpdateFeatureType() {
1274
                DataStoreParameters parameters = null;
1275

    
1276
                try {
1277
                        parameters = getDefaultDataStoreParameters();
1278

    
1279
                        FeatureStore store = (FeatureStore) dataManager
1280
                                        .createStore(parameters);
1281

    
1282
                        NewFeatureStoreParameters newParams = this
1283
                                        .getDefaultNewDataStoreParameters();
1284
                        try {
1285
                                this.clearCopy(store, newParams);
1286
                        } catch (RemoveException e) {
1287
                                // Dp nothing
1288
                        }
1289

    
1290
                        FeatureStore result = this.getStoreCopy(store, newParams);
1291

    
1292
                        result.edit();
1293

    
1294

    
1295
                        String[] orgAttNames = new String[result.getDefaultFeatureType()
1296
                                        .size()];
1297

    
1298
                        Iterator iter = result.getDefaultFeatureType().iterator();
1299
                        int i = 0;
1300
                        while (iter.hasNext()) {
1301
                                orgAttNames[i] = ((FeatureAttributeDescriptor) iter.next())
1302
                                                .getName();
1303
                                i++;
1304
                        }
1305

    
1306
                        EditableFeatureType edFtype = result
1307
                                        .getDefaultFeatureType().getEditable();
1308

    
1309
                        edFtype.add("__ATTR1__", DataTypes.STRING).setSize(10)
1310
                                        .setDefaultValue("HOLA");
1311

    
1312
                        result.update(edFtype);
1313

    
1314
                        assertEquals(store.getDefaultFeatureType().size() + 1, result
1315
                                        .getDefaultFeatureType().size());
1316

    
1317
                        testIterationFastAndStandart(result);
1318

    
1319
                        FeatureSet orgSet = store.getFeatureSet();
1320
                        FeatureSet curSet = result.getFeatureSet();
1321

    
1322
                        assertEquals(orgSet.getDefaultFeatureType().size() + 1, curSet
1323
                                        .getDefaultFeatureType().size());
1324

    
1325
                        Iterator orgIter = orgSet.iterator();
1326
                        Iterator curIter = curSet.iterator();
1327

    
1328
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1329

    
1330
                        orgIter = orgSet.fastIterator();
1331
                        curIter = curSet.fastIterator();
1332

    
1333
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1334

    
1335
                        orgIter = orgSet.iterator();
1336
                        curIter = curSet.fastIterator();
1337

    
1338
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1339

    
1340
                        orgIter = orgSet.fastIterator();
1341
                        curIter = curSet.iterator();
1342

    
1343
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1344

    
1345
                        curIter = curSet.iterator();
1346
                        Feature feature;
1347
                        while (curIter.hasNext()) {
1348
                                feature = (Feature) curIter.next();
1349
                                assertEquals("HOLA", feature.get("__ATTR1__"));
1350
                        }
1351
                        curSet.dispose();
1352

    
1353
                        FeatureQuery query =result.createFeatureQuery();
1354
                        query.setAttributeNames(new String[] { "__ATTR1__" });
1355
                        curSet = result.getFeatureSet(query);
1356

    
1357
                        assertEquals(1, curSet.getDefaultFeatureType().size());
1358

    
1359
                        assertEquals(orgSet.getSize(), curSet.getSize());
1360
                        curIter = curSet.iterator();
1361
                        while (curIter.hasNext()) {
1362
                                feature = (Feature) curIter.next();
1363
                                assertEquals("HOLA", feature.get("__ATTR1__"));
1364
                        }
1365
                        curSet.dispose();
1366

    
1367
                        result.finishEditing();
1368

    
1369
                        testIterationFastAndStandart(result);
1370

    
1371
                        assertEquals(store.getDefaultFeatureType().size() + 1, result
1372
                                        .getDefaultFeatureType().size());
1373

    
1374
                        orgSet = store.getFeatureSet();
1375
                        curSet = result.getFeatureSet();
1376

    
1377
                        assertEquals(orgSet.getDefaultFeatureType().size() + 1, curSet
1378
                                        .getDefaultFeatureType().size());
1379

    
1380
                        orgIter = orgSet.iterator();
1381
                        curIter = curSet.iterator();
1382

    
1383
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1384

    
1385
                        orgIter = orgSet.fastIterator();
1386
                        curIter = curSet.fastIterator();
1387

    
1388
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1389

    
1390
                        orgIter = orgSet.iterator();
1391
                        curIter = curSet.fastIterator();
1392

    
1393
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1394

    
1395
                        orgIter = orgSet.fastIterator();
1396
                        curIter = curSet.iterator();
1397

    
1398
                        assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1399

    
1400
                        curIter = curSet.iterator();
1401
                        while (curIter.hasNext()) {
1402
                                feature = (Feature) curIter.next();
1403
                                assertEquals("HOLA", feature.get("__ATTR1__"));
1404
                        }
1405
                        curSet.dispose();
1406

    
1407
                        query = result.createFeatureQuery();
1408
                        query.setAttributeNames(new String[] { "__ATTR1__" });
1409
                        curSet = result.getFeatureSet(query);
1410

    
1411
                        assertEquals(1, curSet.getDefaultFeatureType().size());
1412

    
1413
                        assertEquals(orgSet.getSize(), curSet.getSize());
1414
                        curIter = curSet.iterator();
1415
                        while (curIter.hasNext()) {
1416
                                feature = (Feature) curIter.next();
1417
                                assertEquals("HOLA", feature.get("__ATTR1__"));
1418
                        }
1419
                        curSet.dispose();
1420

    
1421
                        orgSet.dispose();
1422
                        result.dispose();
1423
                        this.clearCopy(store, newParams);
1424
                        store.dispose();
1425

    
1426
                } catch (DataException e3) {
1427
                        e3.printStackTrace();
1428
                        fail();
1429
                        return;
1430
                }
1431

    
1432
        }
1433

    
1434
}