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 / BaseTestEditableFeatureStore.java @ 40435

History | View | Annotate | Download (34.7 KB)

1 40435 jjdelcerro
/* 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.exception.ValidateDataParametersException;
42
import org.gvsig.fmap.dal.feature.exception.ConcurrentDataModificationException;
43
import org.gvsig.fmap.dal.feature.testmulithread.DeleteFirstAndLastFeature;
44
import org.gvsig.fmap.dal.feature.testmulithread.DeleteLastFeature;
45
import org.gvsig.fmap.dal.feature.testmulithread.InsertFeature;
46
import org.gvsig.fmap.dal.feature.testmulithread.StoreTask;
47
import org.gvsig.fmap.dal.feature.testmulithread.UpdateFeature;
48
import org.gvsig.tools.dispose.DisposableIterator;
49
import org.gvsig.tools.evaluator.AbstractEvaluator;
50
import org.gvsig.tools.evaluator.Evaluator;
51
import org.gvsig.tools.evaluator.EvaluatorData;
52
import org.gvsig.tools.evaluator.EvaluatorException;
53
import org.gvsig.tools.evaluator.EvaluatorFieldValue;
54
import org.gvsig.tools.observer.Observable;
55
import org.gvsig.tools.observer.Observer;
56
57
/**
58
 * @author jmvivo
59
 *
60
 */
61
public abstract class BaseTestEditableFeatureStore extends BaseTestFeatureStore {
62
63
        public abstract NewFeatureStoreParameters getDefaultNewDataStoreParameters()
64
                        throws Exception;
65
66
        public abstract boolean resourcesNotifyChanges();
67
68
        //=================================================
69
        //=================================================
70
71
72
        public void fillPrimaryKeyInserFeature(EditableFeature feature) {
73
                return;
74
        }
75
76
        protected Evaluator getEvaluatorToLower(String attibuteName) {
77
                return new ToLower(attibuteName);
78
79
        }
80
81
        protected Evaluator getEvaluatorToUpper(String attibuteName) {
82
                return new ToUpper(attibuteName);
83
        }
84
85
        public class ToLower extends AbstractEvaluator {
86
                private String attributeName;
87
88
                public ToLower(String attrName) {
89
                        this.attributeName = attrName;
90
                        this.getFieldsInfo().addFieldValue(this.attributeName);
91
                }
92
93
                public Object evaluate(EvaluatorData data) throws EvaluatorException {
94
                        String value = (String) data.getDataValue(this.attributeName);
95
                        if (value == null) {
96
                                return null;
97
                        }
98
                        return value.toLowerCase();
99
                }
100
101
                public String getSQL() {
102
                        return null;
103
                }
104
105
                public String getDescription() {
106
                        return null;
107
                }
108
109
                public String getName() {
110
                        return null;
111
                }
112
113
        }
114
115
        public class ToUpper extends AbstractEvaluator {
116
                private String attributeName;
117
118
                public ToUpper(String attrName) {
119
                        this.attributeName = attrName;
120
                        this.getFieldsInfo().addFieldValue(this.attributeName);
121
                }
122
123
                public Object evaluate(EvaluatorData data) throws EvaluatorException {
124
                        String value = (String) data.getDataValue(this.attributeName);
125
                        if (value == null) {
126
                                return null;
127
                        }
128
                        return value.toUpperCase();
129
                }
130
131
                public String getSQL() {
132
                        return null;
133
                }
134
135
                public String getDescription() {
136
                        return null;
137
                }
138
139
                public EvaluatorFieldValue[] getFieldValues(String name) {
140
                        return null;
141
                }
142
143
                public String getName() {
144
                        return null;
145
                }
146
147
        }
148
149
        protected FeatureStore getStoreCopy(FeatureStore source,
150
                        NewFeatureStoreParameters targetParams) throws DataException,
151
                        ValidateDataParametersException {
152
                DataServerExplorer explorer = source.getExplorer();
153
                source.export(explorer, source.getProviderName(), targetParams);
154
                FeatureStore result = (FeatureStore) dataManager.openStore(source.getProviderName(), targetParams);
155
156
                return result;
157
        }
158
159
        protected void clearCopy(FeatureStore source,
160
                        NewFeatureStoreParameters targetParams) throws Exception {
161
                DataServerExplorer explorer = source.getExplorer();
162
                explorer.remove(targetParams);
163
164
        }
165
166
        protected boolean compareFeatures(Feature f1, Feature f2,
167
                        String[] attrsNames, UpdateFeature updated, long index,
168
                        long lastIndex) throws DataException, EvaluatorException {
169
                FeatureAttributeDescriptor attr1;
170
                FeatureAttributeDescriptor attr2;
171
                EditableFeature f2e = f2.getEditable();
172
                updated.applyUpdateList(f2e, index, lastIndex);
173
174
                Object v1, v2;
175
                for (int i = 0; i < attrsNames.length; i++) {
176
                        attr1 = f1.getType().getAttributeDescriptor(attrsNames[i]);
177
                        attr2 = f2e.getType().getAttributeDescriptor(attrsNames[i]);
178
                        if (attr1 != attr2) {
179
                                if (!compareAttributes(attr1, attr1)) {
180
                                        return false;
181
                                }
182
                        }
183
                        v1 = f1.get(attr1.getName());
184
                        v2 = f2.get(attr2.getName());
185
                        if (!compareFeatureValue(v1, v2, attr1)) {
186
                                return false;
187
                        }
188
                }
189
190
                return true;
191
        }
192
193
        protected boolean compareFeatures(Feature f1, Feature f2,
194
                        UpdateFeature updated, long index, long lastIndex)
195
                        throws DataException, EvaluatorException {
196
                if (!compareTypes(f1.getType(), f2.getType())) {
197
                        System.out.println("compareFeatures() type !=");
198
                        return false;
199
                }
200
                Iterator iter = f1.getType().iterator();
201
                FeatureAttributeDescriptor attr;
202
                EditableFeature f1e = f1.getEditable();
203
                updated.applyUpdateList(f1e, index, lastIndex);
204
                Object v1, v2;
205
                while (iter.hasNext()) {
206
                        attr = (FeatureAttributeDescriptor) iter.next();
207
                        v1 = f1e.get(attr.getName());
208
                        v2 = f2.get(attr.getName());
209
                        if (!compareFeatureValue(v1, v2, attr)) {
210
                                return false;
211
                        }
212
                }
213
214
215
                return true;
216
217
        }
218
219
220
        //---------------
221
222
223
224
225
        //=================================================
226
        //=================================================
227
228
229
230
231
        public void testExport() throws Exception {
232
                DataStoreParameters parameters = null;
233
234
                parameters = getDefaultDataStoreParameters();
235
236
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
237
238
                NewFeatureStoreParameters newParams = this
239
                                .getDefaultNewDataStoreParameters();
240
                try {
241
                        this.clearCopy(store, newParams);
242
                } catch (RemoveException e) {
243
                        // Dp nothing
244
                }
245
246
                FeatureStore result = this.getStoreCopy(store, newParams);
247
248
                fullStoreIteratorTest(result);
249
250
                FeatureSet set;
251
                FeatureSet originalSet;
252
                if (result.getDefaultFeatureType().getPrimaryKey() != null
253
                                && result.getDefaultFeatureType().getPrimaryKey().length > 0) {
254
                        FeatureQuery queryR = result.createFeatureQuery();
255
                        FeatureQuery queryO = store.createFeatureQuery();
256
                        FeatureAttributeDescriptor[] pk = result.getDefaultFeatureType()
257
                                        .getPrimaryKey();
258
                        for (int i = 0; i < pk.length; i++) {
259
                                queryO.getOrder().add(pk[i].getName(), true);
260
                                queryR.getOrder().add(pk[i].getName(), true);
261
                        }
262
263
264
                        set = result.getFeatureSet(queryR);
265
                        originalSet = store.getFeatureSet(queryO);
266
267
268
                } else {
269
                        set = result.getFeatureSet();
270
                        originalSet = store.getFeatureSet();
271
                }
272
                assertEquals(set.getSize(), originalSet.getSize());
273
274
                DisposableIterator originalIter = originalSet.iterator();
275
                DisposableIterator iter = set.iterator();
276
                assertTrue(compareFeatureIterators(originalIter, iter));
277
                originalIter.dispose();
278
                iter.dispose();
279
280
                if (store.getEnvelope() != result.getEnvelope()) {
281
                        if (store.getEnvelope() != null) {
282
                                assertTrue(store.getEnvelope().equals(result.getEnvelope()));
283
                        } else {
284
                                fail("Envelope: src=" + store.getEnvelope() + " traget="
285
                                                + store.getEnvelope());
286
                        }
287
                }
288
289
                set.dispose();
290
                originalSet.dispose();
291
292
                result.dispose();
293
                this.clearCopy(store, newParams);
294
                store.dispose();
295
296
        }
297
298
        public void testRemove() throws Exception {
299
                DataStoreParameters parameters = null;
300
301
                parameters = getDefaultDataStoreParameters();
302
303
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
304
305
                NewFeatureStoreParameters newParams = this
306
                                .getDefaultNewDataStoreParameters();
307
                try {
308
                        this.clearCopy(store, newParams);
309
                } catch (RemoveException e) {
310
                        // Dp nothing
311
                }
312
313
                FeatureStore result = this.getStoreCopy(store, newParams);
314
315
                result.edit(FeatureStore.MODE_FULLEDIT);
316
317
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
318
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
319
                assertEquals(set.getSize(), originalSet.getSize());
320
321
                DisposableIterator originalIter = originalSet.iterator();
322
                DisposableIterator iter = set.iterator();
323
                int i = 0;
324
                while (iter.hasNext()) {
325
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
326
                                        (Feature) iter.next()));
327
                        i++;
328
                }
329
330
                iter.remove();
331
332
333
                assertEquals(originalSet.getSize() - 1, set.getSize());
334
335
                iter.dispose();
336
                originalIter.dispose();
337
338
339
                originalIter = originalSet.iterator();
340
                iter = set.iterator();
341
                i = 0;
342
                while (iter.hasNext()) {
343
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
344
                                        (Feature) iter.next()));
345
                        i++;
346
                }
347
348
                iter.remove();
349
350
                assertEquals(originalSet.getSize() - 2, set.getSize());
351
352
                iter.dispose();
353
                originalIter.dispose();
354
355
                set.dispose();
356
357
                result.finishEditing();
358
359
                set = result.getFeatureSet();
360
                assertEquals(originalSet.getSize() - 2, set.getSize());
361
362
                originalIter = originalSet.iterator();
363
                iter = set.iterator();
364
                i = 0;
365
                while (iter.hasNext()) {
366
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
367
                                        (Feature) iter.next()));
368
                        i++;
369
                }
370
371
                iter.dispose();
372
                originalIter.dispose();
373
374
375
                set.dispose();
376
                originalSet.dispose();
377
378
                result.dispose();
379
                this.clearCopy(store, newParams);
380
                store.dispose();
381
382
383
        }
384
385
        public void testInsert() throws Exception {
386
                DataStoreParameters parameters = null;
387
388
                parameters = getDefaultDataStoreParameters();
389
390
391
                FeatureStore store = (FeatureStore) dataManager
392
                .createStore(parameters);
393
394
                NewFeatureStoreParameters newParams = this
395
                .getDefaultNewDataStoreParameters();
396
                try {
397
                        this.clearCopy(store, newParams);
398
                } catch (RemoveException e) {
399
                        //Do nothing
400
                }
401
402
                FeatureStore result = this.getStoreCopy(store, newParams);
403
404
                result.edit(FeatureStore.MODE_FULLEDIT);
405
406
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
407
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
408
                assertEquals(set.getSize(), originalSet.getSize());
409
410
                EditableFeature newFeature = result.createNewFeature(true);
411
                fillPrimaryKeyInserFeature(newFeature);
412
                set.insert(newFeature);
413
                DisposableIterator originalIter = originalSet.iterator();
414
                DisposableIterator iter = set.iterator();
415
                int i = 0;
416
                while (originalIter.hasNext()) {
417
                        assertTrue("" + i, compareFeatures((Feature) originalIter
418
                                        .next(), (Feature) iter.next()));
419
                        i++;
420
                }
421
                assertTrue(iter.hasNext());
422
                assertNotNull(iter.next());
423
                assertFalse(iter.hasNext());
424
425
                assertEquals(originalSet.getSize() + 1, set.getSize());
426
427
                iter.dispose();
428
                originalIter.dispose();
429
430
                originalIter = originalSet.iterator();
431
                iter = set.iterator();
432
                i = 0;
433
                while (originalIter.hasNext()) {
434
                        assertTrue("" + i, compareFeatures((Feature) originalIter
435
                                        .next(), (Feature) iter.next()));
436
                        i++;
437
                }
438
                assertTrue(iter.hasNext());
439
                assertNotNull(iter.next());
440
441
                newFeature = result.createNewFeature(true);
442
                fillPrimaryKeyInserFeature(newFeature);
443
                set.insert(newFeature);
444
445
                assertEquals(originalSet.getSize() + 2, set.getSize());
446
447
                iter.dispose();
448
                originalIter.dispose();
449
450
                set.dispose();
451
452
                result.finishEditing();
453
454
                set = result.getFeatureSet();
455
                assertEquals(originalSet.getSize() + 2, set.getSize());
456
457
                originalIter = originalSet.iterator();
458
                iter = set.iterator();
459
                i = 0;
460
                while (originalIter.hasNext()) {
461
                        assertTrue("" + i, compareFeatures((Feature) originalIter
462
                                        .next(), (Feature) iter.next()));
463
                        i++;
464
                }
465
466
                assertNotNull(iter.next());
467
                assertNotNull(iter.next());
468
                assertFalse(iter.hasNext());
469
470
                iter.dispose();
471
                originalIter.dispose();
472
473
                set.dispose();
474
                originalSet.dispose();
475
476
                result.dispose();
477
                this.clearCopy(store, newParams);
478
                store.dispose();
479
480
481
        }
482
483
484
485
        public void testConcurrentRemove() throws Exception {
486
                DataStoreParameters parameters = null;
487
488
                parameters = getDefaultDataStoreParameters();
489
490
491
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
492
493
                NewFeatureStoreParameters newParams = this
494
                .getDefaultNewDataStoreParameters();
495
                try {
496
                        this.clearCopy(store, newParams);
497
                } catch (RemoveException e) {
498
                        // Dp nothing
499
                }
500
501
                FeatureStore result = this.getStoreCopy(store, newParams);
502
503
                result.edit(FeatureStore.MODE_FULLEDIT);
504
505
                DeleteFirstAndLastFeature deleteFeature = new DeleteFirstAndLastFeature(
506
                                "1", result, StoreTask.TIME_TO_WAIT_NO_WAIT);
507
508
                FeatureSet set = result.getFeatureSet();
509
510
                DisposableIterator iter = set.iterator();
511
                assertTrue(iter.hasNext());
512
                assertNotNull(iter.next());
513
514
                deleteFeature.start();
515
516
                while (deleteFeature.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
517
                        Thread.yield();
518
                        Thread.sleep(100);
519
                        if (deleteFeature.isOutOfDate()) {
520
                                break;
521
                        }
522
                }
523
524
                assertEquals(deleteFeature.getCurrentStatus(),
525
                                StoreTask.STATUS_FINISHED_OK);
526
527
                Exception ex = null;
528
                try {
529
                        iter.next();
530
                } catch (Exception e) {
531
                        ex = e;
532
                }
533
                assertNotNull(ex);
534
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
535
536
                ex = null;
537
                try {
538
                        set.getSize();
539
                } catch (Exception e) {
540
                        ex = e;
541
                }
542
                assertNotNull(ex);
543
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
544
545
                iter.dispose();
546
                result.dispose();
547
                this.clearCopy(store, newParams);
548
                store.dispose();
549
550
        }
551
552
        public void testConcurrentInsert() throws Exception{
553
                DataStoreParameters parameters = null;
554
555
                parameters = getDefaultDataStoreParameters();
556
557
558
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
559
560
                NewFeatureStoreParameters newParams = this
561
                .getDefaultNewDataStoreParameters();
562
                try {
563
                        this.clearCopy(store, newParams);
564
                } catch (RemoveException e) {
565
                        // Dp nothing
566
                }
567
568
                FeatureStore result = this.getStoreCopy(store, newParams);
569
570
                result.edit(FeatureStore.MODE_FULLEDIT);
571
572
                InsertFeature insertFeature = new InsertFeature("1", result,
573
                                StoreTask.TIME_TO_WAIT_NO_WAIT, this);
574
575
                FeatureSet set = result.getFeatureSet();
576
577
                DisposableIterator iter = set.iterator();
578
                assertTrue(iter.hasNext());
579
                assertNotNull(iter.next());
580
581
                insertFeature.start();
582
583
                while (insertFeature.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
584
                        Thread.yield();
585
                        Thread.sleep(100);
586
                        if (insertFeature.isOutOfDate()) {
587
                                break;
588
                        }
589
                }
590
591
                assertEquals(StoreTask.STATUS_FINISHED_OK, insertFeature
592
                                .getCurrentStatus());
593
594
                Exception ex = null;
595
                try {
596
                        iter.next();
597
                } catch (Exception e) {
598
                        ex = e;
599
                }
600
                assertNotNull(ex);
601
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
602
603
                ex = null;
604
                try {
605
                        set.getSize();
606
                } catch (Exception e) {
607
                        ex = e;
608
                }
609
                assertNotNull(ex);
610
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
611
612
                iter.dispose();
613
                result.dispose();
614
                this.clearCopy(store, newParams);
615
                store.dispose();
616
        }
617
618
        public void testConcurrentUpdate() throws Exception {
619
                DataStoreParameters parameters = null;
620
621
                parameters = getDefaultDataStoreParameters();
622
623
624
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
625
626
                NewFeatureStoreParameters newParams = this
627
                .getDefaultNewDataStoreParameters();
628
                try {
629
                        this.clearCopy(store, newParams);
630
                } catch (RemoveException e) {
631
                        // Dp nothing
632
                }
633
634
                FeatureStore result = this.getStoreCopy(store, newParams);
635
636
637
                result.edit(FeatureStore.MODE_FULLEDIT);
638
639
                UpdateFeature updateFeature = new UpdateFeature("1", result,
640
                                StoreTask.TIME_TO_WAIT_NO_WAIT);
641
642
                FeatureType fType = result.getDefaultFeatureType();
643
                FeatureAttributeDescriptor attr;
644
                Iterator fTypeIter = fType.iterator();
645
                String attrName = null;
646
                while (fTypeIter.hasNext()){
647
                        attr = (FeatureAttributeDescriptor) fTypeIter.next();
648
                        if (attr.getType() == DataTypes.STRING && !attr.isReadOnly() && !attr.isPrimaryKey() && !attr.isAutomatic()){
649
                                attrName= attr.getName();
650
                        }
651
                }
652
                if (attrName == null) {
653
                        fail("This test needs an normal attribute String (no Pk, no ReadOnly & no Auto)");
654
                        return;
655
                }
656
657
658
                updateFeature.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attrName,
659
                                "XXX");
660
661
                FeatureSet set = result.getFeatureSet();
662
663
                DisposableIterator iter = set.iterator();
664
                assertTrue(iter.hasNext());
665
                assertNotNull(iter.next());
666
667
                updateFeature.start();
668
669
                while (updateFeature.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
670
                        Thread.yield();
671
                        Thread.sleep(100);
672
                        if (updateFeature.isOutOfDate()) {
673
                                break;
674
                        }
675
                }
676
677
                assertEquals(StoreTask.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.getClass());
688
689
                ex = null;
690
                try {
691
                        set.getSize();
692
                } catch (Exception e) {
693
                        ex = e;
694
                }
695
                assertNotNull(ex);
696
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
697
698
                iter.dispose();
699
                result.dispose();
700
                this.clearCopy(store, newParams);
701
                store.dispose();
702
703
704
705
        }
706
707
        public void testSequencedRemove() throws Exception {
708
                DataStoreParameters parameters = null;
709
710
                int ntimes = 3;
711
712
                parameters = getDefaultDataStoreParameters();
713
714
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
715
716
                NewFeatureStoreParameters newParams = this
717
                .getDefaultNewDataStoreParameters();
718
                try {
719
                        this.clearCopy(store, newParams);
720
                } catch (RemoveException e) {
721
                        // Dp nothing
722
                }
723
724
                FeatureStore result = this.getStoreCopy(store, newParams);
725
726
                result.edit(FeatureStore.MODE_FULLEDIT);
727
728
                DeleteLastFeature[] deletesFeature = new DeleteLastFeature[ntimes];
729
                int i;
730
                for (i = 0; i < deletesFeature.length; i++) {
731
                        deletesFeature[i] = new DeleteLastFeature("DeleteLastFeature:" + i,
732
                                        result, 300 * i);
733
                }
734
735
                for (i = 0; i < deletesFeature.length; i++) {
736
                        deletesFeature[i].start();
737
                }
738
739
                try {
740
                        for (int x = 0; x < (deletesFeature.length + 2); x++) {
741
                                Thread.yield();
742
                                Thread.sleep(500);
743
                        }
744
745
                } catch (InterruptedException e) {
746
                        e.printStackTrace();
747
                        result.dispose();
748
                        fail();
749
                        return;
750
                }
751
752
                boolean testAll = false;
753
                boolean restart;
754
                DeleteLastFeature item;
755
                while (!testAll) {
756
                        restart = false;
757
                        for (i = 0; i < deletesFeature.length; i++) {
758
                                item = deletesFeature[i];
759
                                if (item.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
760
                                        if (item.isOutOfDate()) {
761
                                                result.dispose();
762
                                                fail("OutOfDate: " + i);
763
                                                return;
764
                                        }
765
                                        try {
766
                                                Thread.yield();
767
                                                Thread.sleep(400);
768
                                        } catch (InterruptedException e) {
769
                                                e.printStackTrace();
770
                                                result.dispose();
771
                                                fail();
772
                                                return;
773
                                        }
774
                                        restart = true;
775
                                        break;
776
                                } else if (item.getCurrentStatus() == StoreTask.STATUS_ERROR) {
777
                                        item.getException().printStackTrace();
778
                                        result.dispose();
779
                                        fail("ERROR: " + i);
780
                                        return;
781
                                } else if (item.getCurrentStatus() != StoreTask.STATUS_FINISHED_OK) {
782
                                        item.getException().printStackTrace();
783
                                        result.dispose();
784
                                        fail("Data ERROR: " + i);
785
                                        return;
786
                                }
787
                        }
788
                        if (restart) {
789
                                continue;
790
                        }
791
                        testAll = true;
792
                }
793
794
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
795
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
796
                assertEquals(originalSet.getSize() - deletesFeature.length, set
797
                                .getSize());
798
799
                DisposableIterator originalIter = originalSet.iterator();
800
                DisposableIterator iter = set.iterator();
801
802
                i = 0;
803
                while (iter.hasNext()) {
804
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
805
                                        (Feature) iter.next()));
806
                        i++;
807
                }
808
809
                originalIter.dispose();
810
                iter.dispose();
811
812
                set.dispose();
813
814
                result.finishEditing();
815
816
                set = result.getFeatureSet(getDefaultQuery(result));
817
                assertEquals(originalSet.getSize() - deletesFeature.length, set
818
                                .getSize());
819
820
                originalIter = originalSet.iterator();
821
                iter = set.iterator();
822
                i = 0;
823
                while (iter.hasNext()) {
824
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
825
                                        (Feature) iter.next()));
826
                        i++;
827
                }
828
829
830
                originalIter.dispose();
831
                iter.dispose();
832
833
                set.dispose();
834
                originalSet.dispose();
835
836
                result.dispose();
837
                this.clearCopy(store, newParams);
838
                store.dispose();
839
        }
840
841
        public void testSequencedInsert() throws Exception {
842
                DataStoreParameters parameters = null;
843
844
                int ntimes = 3;
845
846
                parameters = getDefaultDataStoreParameters();
847
848
849
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
850
851
                NewFeatureStoreParameters newParams = this
852
                .getDefaultNewDataStoreParameters();
853
                try {
854
                        this.clearCopy(store, newParams);
855
                } catch (RemoveException e) {
856
                        // Dp nothing
857
                }
858
859
                FeatureStore result = this.getStoreCopy(store, newParams);
860
861
                result.edit(FeatureStore.MODE_FULLEDIT);
862
863
                InsertFeature[] insertsFeature = new InsertFeature[ntimes];
864
                int i;
865
                for (i = 0; i < insertsFeature.length; i++) {
866
                        insertsFeature[i] = new InsertFeature("InsertFeature:" + i, result,
867
                                        300 * i, this);
868
                }
869
870
                for (i = 0; i < insertsFeature.length; i++) {
871
                        insertsFeature[i].start();
872
                }
873
874
                try {
875
876
                        for (int x = 0; x < (insertsFeature.length + 2); x++) {
877
                                Thread.yield();
878
                                Thread.sleep(500);
879
                        }
880
881
                } catch (InterruptedException e) {
882
                        e.printStackTrace();
883
                        result.dispose();
884
                        fail();
885
                        return;
886
                }
887
888
                boolean testAll = false;
889
                boolean restart;
890
                InsertFeature item;
891
                while (!testAll) {
892
                        restart = false;
893
                        for (i = 0; i < insertsFeature.length; i++) {
894
                                item = insertsFeature[i];
895
                                if (item.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
896
                                        if (item.isOutOfDate()) {
897
                                                result.dispose();
898
                                                fail("OutOfDate: " + i);
899
                                                return;
900
                                        }
901
                                        try {
902
                                                Thread.yield();
903
                                                Thread.sleep(400);
904
                                        } catch (InterruptedException e) {
905
                                                e.printStackTrace();
906
                                                result.dispose();
907
                                                fail();
908
                                                return;
909
                                        }
910
                                        restart = true;
911
                                        break;
912
                                } else if (item.getCurrentStatus() == StoreTask.STATUS_ERROR) {
913
                                        item.getException().printStackTrace();
914
                                        result.dispose();
915
                                        fail("ERROR: " + i);
916
                                        return;
917
                                } else if (item.getCurrentStatus() == StoreTask.STATUS_FINISHED_NO_OK) {
918
                                        result.dispose();
919
                                        fail("No OK: " + i);
920
                                        return;
921
                                } else if (item.getCurrentStatus() != StoreTask.STATUS_FINISHED_OK) {
922
                                        item.getException().printStackTrace();
923
                                        result.dispose();
924
                                        fail("Data ERROR: " + i);
925
                                        return;
926
927
                                }
928
                        }
929
                        if (restart) {
930
                                continue;
931
                        }
932
                        testAll = true;
933
                }
934
935
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
936
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
937
                assertEquals(originalSet.getSize() + insertsFeature.length, set
938
                                .getSize());
939
940
                DisposableIterator originalIter = originalSet.iterator();
941
                DisposableIterator iter = set.iterator();
942
943
                i = 0;
944
                while (originalIter.hasNext()) {
945
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
946
                                        (Feature) iter.next()));
947
                        i++;
948
                }
949
                for (; i < insertsFeature.length; i++) {
950
                        iter.next();
951
                }
952
953
954
                originalIter.dispose();
955
                iter.dispose();
956
957
                set.dispose();
958
959
                result.finishEditing();
960
961
                set = result.getFeatureSet();
962
                assertEquals(originalSet.getSize() + insertsFeature.length, set
963
                                .getSize());
964
965
                originalIter = originalSet.iterator();
966
                iter = set.iterator();
967
                i = 0;
968
                while (originalIter.hasNext()) {
969
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
970
                                        (Feature) iter.next()));
971
                        i++;
972
                }
973
                for (; i < insertsFeature.length; i++) {
974
                        iter.next();
975
                }
976
977
                set.dispose();
978
                originalSet.dispose();
979
980
                result.dispose();
981
                this.clearCopy(store, newParams);
982
                store.dispose();
983
984
        }
985
986
987
        public void testUpdate() throws Exception {
988
                DataStoreParameters parameters = null;
989
990
                parameters = getDefaultDataStoreParameters();
991
992
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
993
994
                NewFeatureStoreParameters newParams = this
995
                .getDefaultNewDataStoreParameters();
996
                try {
997
                        this.clearCopy(store, newParams);
998
                } catch (RemoveException e) {
999
                        // Dp nothing
1000
                }
1001
1002
                FeatureStore result = this.getStoreCopy(store, newParams);
1003
1004
                result.edit(FeatureStore.MODE_FULLEDIT);
1005
1006
                FeatureSet set = result.getFeatureSet();
1007
                long size = set.getSize();
1008
1009
                set.dispose();
1010
1011
                UpdateFeature updater = new UpdateFeature("1", result,
1012
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1013
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(result
1014
                                .getDefaultFeatureType(), DataTypes.STRING);
1015
                assertNotNull("No String attributes found", attr);
1016
1017
                updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attr.getName(),
1018
                                getEvaluatorToLower(attr.getName()));
1019
1020
                updater.run();
1021
                while (updater.getCurrentStatus() < StoreTask.STATUS_FINISHED_OK
1022
                                && !updater.isOutOfDate()) {
1023
                        Thread.yield();
1024
                        try {
1025
                                Thread.sleep(200);
1026
                        } catch (InterruptedException e) {
1027
                                e.printStackTrace();
1028
                                fail();
1029
                        }
1030
                }
1031
                set = result.getFeatureSet(getDefaultQuery(result));
1032
                DisposableIterator iter = set.iterator();
1033
1034
                printFeatureTypeColNames(set.getDefaultFeatureType(), 15);
1035
                Feature f;
1036
                while (iter.hasNext()) {
1037
                        f = (Feature) iter.next();
1038
                        this.printFeature(f, false, 15);
1039
                }
1040
1041
                iter.dispose();
1042
1043
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
1044
1045
                DisposableIterator originalIter = originalSet.iterator();
1046
1047
                iter = set.iterator();
1048
1049
                long i = 0;
1050
                while (originalIter.hasNext()) {
1051
                        try {
1052
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1053
                                                .next(), (Feature) iter.next(), updater, i, size));
1054
                        } catch (EvaluatorException e) {
1055
                                e.printStackTrace();
1056
                                fail();
1057
                        }
1058
                        i++;
1059
                }
1060
                iter.dispose();
1061
                originalIter.dispose();
1062
1063
1064
                set.dispose();
1065
1066
                result.finishEditing();
1067
1068
                set = result.getFeatureSet();
1069
                assertEquals(originalSet.getSize(), set.getSize());
1070
1071
                originalIter = originalSet.iterator();
1072
                iter = set.iterator();
1073
                i = 0;
1074
                while (originalIter.hasNext()) {
1075
                        try {
1076
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1077
                                                .next(), (Feature) iter.next(), updater, i, size));
1078
                        } catch (EvaluatorException e) {
1079
                                e.printStackTrace();
1080
                                fail();
1081
                        }
1082
                        i++;
1083
                }
1084
1085
1086
                iter.dispose();
1087
                originalIter.dispose();
1088
                set.dispose();
1089
1090
1091
                updater = new UpdateFeature("1", result,
1092
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1093
1094
                updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attr.getName(),
1095
                                getEvaluatorToLower(attr.getName()));
1096
1097
                updater.run();
1098
                while (updater.getCurrentStatus() < StoreTask.STATUS_FINISHED_OK
1099
                                && !updater.isOutOfDate()) {
1100
                        Thread.yield();
1101
                        try {
1102
                                Thread.sleep(200);
1103
                        } catch (InterruptedException e) {
1104
                                e.printStackTrace();
1105
                                fail();
1106
                        }
1107
                }
1108
                set = result.getFeatureSet();
1109
1110
                iter = set.iterator();
1111
                originalIter = originalSet.iterator();
1112
                i = 0;
1113
                while (originalIter.hasNext()) {
1114
                        try {
1115
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1116
                                                .next(), (Feature) iter.next(), updater, i, size));
1117
                        } catch (EvaluatorException e) {
1118
                                e.printStackTrace();
1119
                                fail();
1120
                        }
1121
                        i++;
1122
                }
1123
1124
                iter.dispose();
1125
                originalIter.dispose();
1126
                set.dispose();
1127
1128
1129
1130
1131
1132
                originalSet.dispose();
1133
1134
                result.dispose();
1135
                this.clearCopy(store, newParams);
1136
                store.dispose();
1137
1138
        }
1139
1140
1141
        public void testResourceChangeNotification() throws Exception{
1142
                if (!resourcesNotifyChanges()) {
1143
                        return;
1144
                }
1145
1146
                DataStoreParameters parameters = null;
1147
1148
                parameters = getDefaultDataStoreParameters();
1149
1150
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
1151
1152
                NewFeatureStoreParameters newParams = this
1153
                .getDefaultNewDataStoreParameters();
1154
                try {
1155
                        this.clearCopy(store, newParams);
1156
                } catch (RemoveException e) {
1157
                        // Dp nothing
1158
                }
1159
1160
                FeatureStore result = this.getStoreCopy(store, newParams);
1161
1162
                FeatureStore result2 = (FeatureStore) dataManager
1163
                .createStore(newParams);
1164
1165
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(result
1166
                                .getDefaultFeatureType(), DataTypes.STRING);
1167
                assertNotNull("No String attributes found", attr);
1168
1169
1170
                UpdateFeature updater = new UpdateFeature("1", result,
1171
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1172
1173
                updater.addUpdate(UpdateFeature.UPDATE_LAST_FEATURE, attr.getName(),
1174
                                getEvaluatorToLower(attr.getName()));
1175
1176
                StoreObserverForNotify observer = new StoreObserverForNotify(result2,
1177
                                FeatureStoreNotification.RESOURCE_CHANGED);
1178
                result2.addObserver(observer);
1179
1180
                result.edit();
1181
                updater.run();
1182
                while (updater.getCurrentStatus() < StoreTask.STATUS_FINISHED_OK
1183
                                && !updater.isOutOfDate()) {
1184
                        Thread.yield();
1185
                        try {
1186
                                Thread.sleep(200);
1187
                        } catch (InterruptedException e) {
1188
                                e.printStackTrace();
1189
                                fail();
1190
                        }
1191
                }
1192
1193
                result.finishEditing();
1194
1195
                assertTrue("The observer hasn't been notified", observer.notified());
1196
1197
                result2.refresh();
1198
1199
                FeatureSet set = result.getFeatureSet();
1200
                FeatureSet set2 = result2.getFeatureSet();
1201
1202
                DisposableIterator iter1 = set.iterator();
1203
                DisposableIterator iter2 = set2.iterator();
1204
                assertTrue(this.compareFeatureIterators(iter1, iter2));
1205
                iter1.dispose();
1206
                iter2.dispose();
1207
1208
                set2.dispose();
1209
                set.dispose();
1210
1211
                // TODO checks FeatureType change
1212
1213
                result2.dispose();
1214
                result.dispose();
1215
                this.clearCopy(store, newParams);
1216
                store.dispose();
1217
        }
1218
1219
        public abstract class StoreObserver implements Observer{
1220
1221
                public DataStore store = null;
1222
1223
        }
1224
1225
        public class StoreObserverForNotify implements Observer{
1226
1227
                public DataStore store = null;
1228
1229
                public String notifyType = null;
1230
1231
                private boolean notifyRecived = false;
1232
1233
                public StoreObserverForNotify(DataStore store,String notifyType){
1234
                        this.store = store;
1235
                        this.notifyType = notifyType;
1236
                        this.notifyRecived = false;
1237
                }
1238
1239
                public boolean notified(){
1240
                        return notifyRecived;
1241
                }
1242
1243
                public void update(Observable observable, Object notification) {
1244
                        if (!(observable == this.store)){
1245
                                return;
1246
                        }
1247
                        if (!(notification instanceof FeatureStoreNotification)){
1248
                                return;
1249
                        }
1250
                        FeatureStoreNotification fsNotification = (FeatureStoreNotification) notification;
1251
1252
                        if (fsNotification.getType().equals(this.notifyType)){
1253
                                notifyRecived = true;
1254
                        }
1255
                }
1256
1257
        }
1258
1259
        public void testUpdateFeatureType_AddField() throws Exception {
1260
                DataStoreParameters parameters = null;
1261
1262
                parameters = getDefaultDataStoreParameters();
1263
1264
                FeatureStore store = (FeatureStore) dataManager
1265
                .createStore(parameters);
1266
1267
                NewFeatureStoreParameters newParams = this
1268
                .getDefaultNewDataStoreParameters();
1269
                try {
1270
                        this.clearCopy(store, newParams);
1271
                } catch (RemoveException e) {
1272
                        // Dp nothing
1273
                }
1274
1275
                int pkAttributesCount = 0;
1276
1277
                FeatureStore result = this.getStoreCopy(store, newParams);
1278
1279
                result.edit();
1280
1281
1282
                String[] orgAttNames = new String[result.getDefaultFeatureType()
1283
                                                  .size()];
1284
1285
                Iterator iter = result.getDefaultFeatureType().iterator();
1286
                int i = 0;
1287
1288
                while (iter.hasNext()) {
1289
                        FeatureAttributeDescriptor attr = ((FeatureAttributeDescriptor) iter
1290
                                        .next());
1291
                        orgAttNames[i] = attr.getName();
1292
                        i++;
1293
                        if (attr.isPrimaryKey()) {
1294
                                pkAttributesCount++;
1295
                        }
1296
                }
1297
1298
                EditableFeatureType edFtype = result
1299
                .getDefaultFeatureType().getEditable();
1300
1301
                edFtype.add("__ATTR1__", DataTypes.STRING).setSize(10)
1302
                .setDefaultValue(
1303
                                "HOLA");
1304
1305
                result.update(edFtype);
1306
1307
                assertEquals(store.getDefaultFeatureType().size() + 1, result
1308
                                .getDefaultFeatureType().size());
1309
1310
                testIterationFastAndStandart(result);
1311
1312
                FeatureSet orgSet = store.getFeatureSet(getDefaultQuery(store));
1313
                FeatureSet curSet = result.getFeatureSet(getDefaultQuery(result));
1314
1315
                assertEquals(orgSet.getDefaultFeatureType().size() + 1, curSet
1316
                                .getDefaultFeatureType().size());
1317
1318
                DisposableIterator orgIter = orgSet.iterator();
1319
                DisposableIterator curIter = curSet.iterator();
1320
1321
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1322
1323
                orgIter.dispose();
1324
                curIter.dispose();
1325
1326
                orgIter = orgSet.fastIterator();
1327
                curIter = curSet.fastIterator();
1328
1329
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1330
                orgIter.dispose();
1331
                curIter.dispose();
1332
1333
                orgIter = orgSet.iterator();
1334
                curIter = curSet.fastIterator();
1335
1336
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1337
                orgIter.dispose();
1338
                curIter.dispose();
1339
1340
                orgIter = orgSet.fastIterator();
1341
                curIter = curSet.iterator();
1342
1343
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1344
                orgIter.dispose();
1345
                curIter.dispose();
1346
1347
                curIter = curSet.iterator();
1348
                Feature feature;
1349
                while (curIter.hasNext()) {
1350
                        feature = (Feature) curIter.next();
1351
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1352
                }
1353
                curIter.dispose();
1354
                curSet.dispose();
1355
1356
                FeatureQuery query = this.getDefaultQuery(result);
1357
                query.setAttributeNames(new String[] { "__ATTR1__" });
1358
                curSet = result.getFeatureSet(query);
1359
1360
                assertEquals(1 + pkAttributesCount, curSet.getDefaultFeatureType()
1361
                                .size());
1362
1363
                assertEquals(orgSet.getSize(), curSet.getSize());
1364
                curIter = curSet.iterator();
1365
                while (curIter.hasNext()) {
1366
                        feature = (Feature) curIter.next();
1367
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1368
                }
1369
                curIter.dispose();
1370
                curSet.dispose();
1371
1372
                result.finishEditing();
1373
1374
                testIterationFastAndStandart(result);
1375
1376
                assertEquals(store.getDefaultFeatureType().size() + 1, result
1377
                                .getDefaultFeatureType().size());
1378
1379
1380
                orgSet = store.getFeatureSet(getDefaultQuery(store));
1381
                curSet = result.getFeatureSet(getDefaultQuery(result));
1382
1383
                assertEquals(orgSet.getDefaultFeatureType().size() + 1, curSet
1384
                                .getDefaultFeatureType().size());
1385
1386
                orgIter = orgSet.iterator();
1387
                curIter = curSet.iterator();
1388
1389
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1390
                orgIter.dispose();
1391
                curIter.dispose();
1392
1393
                orgIter = orgSet.fastIterator();
1394
                curIter = curSet.fastIterator();
1395
1396
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1397
                orgIter.dispose();
1398
                curIter.dispose();
1399
1400
                orgIter = orgSet.iterator();
1401
                curIter = curSet.fastIterator();
1402
1403
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1404
                orgIter.dispose();
1405
                curIter.dispose();
1406
1407
                orgIter = orgSet.fastIterator();
1408
                curIter = curSet.iterator();
1409
1410
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1411
                orgIter.dispose();
1412
                curIter.dispose();
1413
1414
                curIter = curSet.iterator();
1415
                while (curIter.hasNext()) {
1416
                        feature = (Feature) curIter.next();
1417
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1418
                }
1419
                curIter.dispose();
1420
                curSet.dispose();
1421
1422
                query = this.getDefaultQuery(result);
1423
                query.setAttributeNames(new String[] { "__ATTR1__" });
1424
                curSet = result.getFeatureSet(query);
1425
1426
                assertEquals(1 + pkAttributesCount, curSet.getDefaultFeatureType()
1427
                                .size());
1428
1429
                assertEquals(orgSet.getSize(), curSet.getSize());
1430
                curIter = curSet.iterator();
1431
                while (curIter.hasNext()) {
1432
                        feature = (Feature) curIter.next();
1433
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1434
                }
1435
                curIter.dispose();
1436
                curSet.dispose();
1437
1438
                orgSet.dispose();
1439
                result.dispose();
1440
                this.clearCopy(store, newParams);
1441
                store.dispose();
1442
1443
1444
        }
1445
1446
        public void testResourcesLocks() throws Exception {
1447
1448
1449
        }
1450
1451
}