Statistics
| Revision:

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

History | View | Annotate | Download (33.3 KB)

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

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

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

    
33
import java.util.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.testediting.DeleteFirstAndLastFeature;
44
import org.gvsig.fmap.dal.feature.testediting.DeleteLastFeature;
45
import org.gvsig.fmap.dal.feature.testediting.EditStore;
46
import org.gvsig.fmap.dal.feature.testediting.InsertFeature;
47
import org.gvsig.fmap.dal.feature.testediting.UpdateFeature;
48
import org.gvsig.fmap.geom.Geometry;
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 usesResources();
67

    
68
        //=================================================
69
        //=================================================
70

    
71

    
72
        protected Evaluator getEvaluatorToLower(String attibuteName) {
73
                return new ToLower(attibuteName);
74

    
75
        }
76

    
77
        protected Evaluator getEvaluatorToUpper(String attibuteName) {
78
                return new ToUpper(attibuteName);
79
        }
80

    
81
        public class ToLower extends AbstractEvaluator {
82
                private String attributeName;
83

    
84
                public ToLower(String attrName) {
85
                        this.attributeName = attrName;
86
                        this.getFieldsInfo().addFieldValue(this.attributeName);
87
                }
88

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

    
97
                public String getCQL() {
98
                        return null;
99
                }
100

    
101
                public String getDescription() {
102
                        return null;
103
                }
104

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

    
109
        }
110

    
111
        public class ToUpper extends AbstractEvaluator {
112
                private String attributeName;
113

    
114
                public ToUpper(String attrName) {
115
                        this.attributeName = attrName;
116
                        this.getFieldsInfo().addFieldValue(this.attributeName);
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
                        ValidateDataParametersException {
148
                DataServerExplorer explorer = source.getExplorer();
149
                source.export(explorer, targetParams);
150
                FeatureStore result = (FeatureStore) dataManager
151
                                .createStore(targetParams);
152

    
153
                return result;
154
        }
155

    
156
        protected void clearCopy(FeatureStore source,
157
                        NewFeatureStoreParameters targetParams) throws Exception {
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() throws Exception {
257
                DataStoreParameters parameters = null;
258

    
259
                        parameters = getDefaultDataStoreParameters();
260

    
261

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

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

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

    
275
                        fullStoreIteratorTest(result);
276

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

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

    
287
                        if (store.getEnvelope() != result.getEnvelope()){
288
                                if (store.getEnvelope() != null){
289
                                        assertTrue(store.getEnvelope().equals(result.getEnvelope()));
290
                                } else {
291
                                        fail("Envelope: src=" + store.getEnvelope() + " traget="
292
                                                        + store.getEnvelope());
293
                                }
294
                        }
295

    
296
                        set.dispose();
297
                        originalSet.dispose();
298

    
299
                        result.dispose();
300
                        this.clearCopy(store, newParams);
301
                        store.dispose();
302

    
303
        }
304

    
305
        public void testRemove() throws Exception {
306
                DataStoreParameters parameters = null;
307

    
308
                        parameters = getDefaultDataStoreParameters();
309

    
310
                        FeatureStore store = (FeatureStore) dataManager
311
                                        .createStore(parameters);
312

    
313
                        NewFeatureStoreParameters newParams = this
314
                                        .getDefaultNewDataStoreParameters();
315
                        try {
316
                                this.clearCopy(store, newParams);
317
                        } catch (RemoveException e) {
318
                                //Dp nothing
319
                        }
320

    
321
                        FeatureStore result = this.getStoreCopy(store, newParams);
322

    
323
                        result.edit(FeatureStore.MODE_FULLEDIT);
324

    
325
                        FeatureSet set = result.getFeatureSet();
326
                        FeatureSet originalSet = store.getFeatureSet();
327
                        assertEquals(set.getSize(), originalSet.getSize());
328

    
329
                        DisposableIterator originalIter = originalSet.iterator();
330
                        DisposableIterator iter = set.iterator();
331
                        int i = 0;
332
                        while (iter.hasNext()) {
333
                                assertTrue("" + i, compareFeatures((Feature) originalIter
334
                                                .next(), (Feature) iter.next()));
335
                                i++;
336
                        }
337

    
338
                        iter.remove();
339

    
340

    
341
                        assertEquals(originalSet.getSize() - 1, set.getSize());
342

    
343
                        iter.dispose();
344
                        originalIter.dispose();
345

    
346

    
347
                        originalIter = originalSet.iterator();
348
                        iter = set.iterator();
349
                        i = 0;
350
                        while (iter.hasNext()) {
351
                                assertTrue("" + i, compareFeatures((Feature) originalIter
352
                                                .next(), (Feature) iter.next()));
353
                                i++;
354
                        }
355

    
356
                        iter.remove();
357

    
358
                        assertEquals(originalSet.getSize() - 2, set.getSize());
359

    
360
                        iter.dispose();
361
                        originalIter.dispose();
362

    
363
                        set.dispose();
364

    
365
                        result.finishEditing();
366

    
367
                        set = result.getFeatureSet();
368
                        assertEquals(originalSet.getSize() - 2, set.getSize());
369

    
370
                        originalIter = originalSet.iterator();
371
                        iter = set.iterator();
372
                        i = 0;
373
                        while (iter.hasNext()) {
374
                                assertTrue("" + i, compareFeatures((Feature) originalIter
375
                                                .next(), (Feature) iter.next()));
376
                                i++;
377
                        }
378

    
379
                        iter.dispose();
380
                        originalIter.dispose();
381

    
382

    
383
                        set.dispose();
384
                        originalSet.dispose();
385

    
386
                        result.dispose();
387
                        this.clearCopy(store, newParams);
388
                        store.dispose();
389

    
390

    
391
        }
392

    
393
        public void testInsert() throws Exception {
394
                DataStoreParameters parameters = null;
395

    
396
                parameters = getDefaultDataStoreParameters();
397

    
398

    
399
                FeatureStore store = (FeatureStore) dataManager
400
                .createStore(parameters);
401

    
402
                NewFeatureStoreParameters newParams = this
403
                .getDefaultNewDataStoreParameters();
404
                try {
405
                        this.clearCopy(store, newParams);
406
                } catch (RemoveException e) {
407
                        //Do nothing
408
                }
409

    
410
                FeatureStore result = this.getStoreCopy(store, newParams);
411

    
412
                result.edit(FeatureStore.MODE_FULLEDIT);
413

    
414
                FeatureSet set = result.getFeatureSet();
415
                FeatureSet originalSet = store.getFeatureSet();
416
                assertEquals(set.getSize(), originalSet.getSize());
417

    
418
                set.insert(result.createNewFeature(true));
419
                DisposableIterator originalIter = originalSet.iterator();
420
                DisposableIterator iter = set.iterator();
421
                int i = 0;
422
                while (originalIter.hasNext()) {
423
                        assertTrue("" + i, compareFeatures((Feature) originalIter
424
                                        .next(), (Feature) iter.next()));
425
                        i++;
426
                }
427
                assertTrue(iter.hasNext());
428
                assertNotNull(iter.next());
429
                assertFalse(iter.hasNext());
430

    
431
                assertEquals(originalSet.getSize() + 1, set.getSize());
432

    
433
                iter.dispose();
434
                originalIter.dispose();
435

    
436
                originalIter = originalSet.iterator();
437
                iter = set.iterator();
438
                i = 0;
439
                while (originalIter.hasNext()) {
440
                        assertTrue("" + i, compareFeatures((Feature) originalIter
441
                                        .next(), (Feature) iter.next()));
442
                        i++;
443
                }
444
                assertTrue(iter.hasNext());
445
                assertNotNull(iter.next());
446

    
447
                set.insert(result.createNewFeature(true));
448

    
449
                assertEquals(originalSet.getSize() + 2, set.getSize());
450

    
451
                iter.dispose();
452
                originalIter.dispose();
453

    
454
                set.dispose();
455

    
456
                result.finishEditing();
457

    
458
                set = result.getFeatureSet();
459
                assertEquals(originalSet.getSize() + 2, set.getSize());
460

    
461
                originalIter = originalSet.iterator();
462
                iter = set.iterator();
463
                i = 0;
464
                while (originalIter.hasNext()) {
465
                        assertTrue("" + i, compareFeatures((Feature) originalIter
466
                                        .next(), (Feature) iter.next()));
467
                        i++;
468
                }
469

    
470
                assertNotNull(iter.next());
471
                assertNotNull(iter.next());
472
                assertFalse(iter.hasNext());
473

    
474
                iter.dispose();
475
                originalIter.dispose();
476

    
477
                set.dispose();
478
                originalSet.dispose();
479

    
480
                result.dispose();
481
                this.clearCopy(store, newParams);
482
                store.dispose();
483

    
484

    
485
        }
486

    
487

    
488

    
489
        public void testConcurrentRemove() throws Exception {
490
                DataStoreParameters parameters = null;
491

    
492
                parameters = getDefaultDataStoreParameters();
493

    
494

    
495
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
496

    
497
                NewFeatureStoreParameters newParams = this
498
                                .getDefaultNewDataStoreParameters();
499
                try {
500
                        this.clearCopy(store, newParams);
501
                } catch (RemoveException e) {
502
                        // Dp nothing
503
                }
504

    
505
                FeatureStore result = this.getStoreCopy(store, newParams);
506

    
507
                result.edit(FeatureStore.MODE_FULLEDIT);
508

    
509
                DeleteFirstAndLastFeature deleteFeature = new DeleteFirstAndLastFeature(
510
                                "1", result, EditStore.TIME_TO_WAIT_NO_WAIT);
511

    
512
                FeatureSet set = result.getFeatureSet();
513

    
514
                DisposableIterator iter = set.iterator();
515
                assertTrue(iter.hasNext());
516
                assertNotNull(iter.next());
517

    
518
                deleteFeature.start();
519

    
520
                while (deleteFeature.getCurrentStatus() <= EditStore.STATUS_RUNING) {
521
                        Thread.yield();
522
                        Thread.sleep(100);
523
                        if (deleteFeature.isOutOfDate()) {
524
                                break;
525
                        }
526
                }
527

    
528
                assertEquals(deleteFeature.getCurrentStatus(),
529
                                EditStore.STATUS_FINISHED_OK);
530

    
531
                Exception ex = null;
532
                try {
533
                        iter.next();
534
                } catch (Exception e) {
535
                        ex = e;
536
                }
537
                assertNotNull(ex);
538
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
539

    
540
                ex = null;
541
                try {
542
                        set.getSize();
543
                } catch (Exception e) {
544
                        ex = e;
545
                }
546
                assertNotNull(ex);
547
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
548

    
549
                iter.dispose();
550
                result.dispose();
551
                this.clearCopy(store, newParams);
552
                store.dispose();
553

    
554
        }
555

    
556
        public void testConcurrentInsert() throws Exception{
557
                DataStoreParameters parameters = null;
558

    
559
                parameters = getDefaultDataStoreParameters();
560

    
561

    
562
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
563

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

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

    
574
                result.edit(FeatureStore.MODE_FULLEDIT);
575

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

    
579
                FeatureSet set = result.getFeatureSet();
580

    
581
                DisposableIterator iter = set.iterator();
582
                assertTrue(iter.hasNext());
583
                assertNotNull(iter.next());
584

    
585
                insertFeature.start();
586

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

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

    
598
                Exception ex = null;
599
                try {
600
                        iter.next();
601
                } catch (Exception e) {
602
                        ex = e;
603
                }
604
                assertNotNull(ex);
605
                assertEquals(ConcurrentDataModificationException.class, ex.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.getClass());
615

    
616
                iter.dispose();
617
                result.dispose();
618
                this.clearCopy(store, newParams);
619
                store.dispose();
620
        }
621

    
622
        public void testConcurrentUpdate() throws Exception {
623
                DataStoreParameters parameters = null;
624

    
625
                parameters = getDefaultDataStoreParameters();
626

    
627

    
628
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
629

    
630
                NewFeatureStoreParameters newParams = this
631
                                .getDefaultNewDataStoreParameters();
632
                try {
633
                        this.clearCopy(store, newParams);
634
                } catch (RemoveException e) {
635
                        // Dp nothing
636
                }
637

    
638
                FeatureStore result = this.getStoreCopy(store, newParams);
639

    
640

    
641
                result.edit(FeatureStore.MODE_FULLEDIT);
642

    
643
                UpdateFeature updateFeature = new UpdateFeature("1", result,
644
                                EditStore.TIME_TO_WAIT_NO_WAIT);
645

    
646
                updateFeature.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES,
647
                                "OTRO_IDIOM", "XXX");
648

    
649
                FeatureSet set = result.getFeatureSet();
650

    
651
                DisposableIterator iter = set.iterator();
652
                assertTrue(iter.hasNext());
653
                assertNotNull(iter.next());
654

    
655
                updateFeature.start();
656

    
657
                while (updateFeature.getCurrentStatus() <= EditStore.STATUS_RUNING) {
658
                        Thread.yield();
659
                        Thread.sleep(100);
660
                        if (updateFeature.isOutOfDate()) {
661
                                break;
662
                        }
663
                }
664

    
665
                assertEquals(EditStore.STATUS_FINISHED_OK, updateFeature
666
                                .getCurrentStatus());
667

    
668
                Exception ex = null;
669
                try {
670
                        iter.next();
671
                } catch (Exception e) {
672
                        ex = e;
673
                }
674
                assertNotNull(ex);
675
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
676

    
677
                ex = null;
678
                try {
679
                        set.getSize();
680
                } catch (Exception e) {
681
                        ex = e;
682
                }
683
                assertNotNull(ex);
684
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
685

    
686
                iter.dispose();
687
                result.dispose();
688
                this.clearCopy(store, newParams);
689
                store.dispose();
690

    
691

    
692

    
693
        }
694

    
695
        public void testSequencedRemove() throws Exception {
696
                DataStoreParameters parameters = null;
697

    
698
                int ntimes = 3;
699

    
700
                parameters = getDefaultDataStoreParameters();
701

    
702
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
703

    
704
                NewFeatureStoreParameters newParams = this
705
                                .getDefaultNewDataStoreParameters();
706
                try {
707
                        this.clearCopy(store, newParams);
708
                } catch (RemoveException e) {
709
                        // Dp nothing
710
                }
711

    
712
                FeatureStore result = this.getStoreCopy(store, newParams);
713

    
714
                result.edit(FeatureStore.MODE_FULLEDIT);
715

    
716
                DeleteLastFeature[] deletesFeature = new DeleteLastFeature[ntimes];
717
                int i;
718
                for (i = 0; i < deletesFeature.length; i++) {
719
                        deletesFeature[i] = new DeleteLastFeature("DeleteLastFeature:" + i,
720
                                        result, 300 * i);
721
                }
722

    
723
                for (i = 0; i < deletesFeature.length; i++) {
724
                        deletesFeature[i].start();
725
                }
726

    
727
                try {
728
                        for (int x = 0; x < (deletesFeature.length + 2); x++) {
729
                                Thread.yield();
730
                                Thread.sleep(500);
731
                        }
732

    
733
                } catch (InterruptedException e) {
734
                        e.printStackTrace();
735
                        result.dispose();
736
                        fail();
737
                        return;
738
                }
739

    
740
                boolean testAll = false;
741
                boolean restart;
742
                DeleteLastFeature item;
743
                while (!testAll) {
744
                        restart = false;
745
                        for (i = 0; i < deletesFeature.length; i++) {
746
                                item = deletesFeature[i];
747
                                if (item.getCurrentStatus() <= EditStore.STATUS_RUNING) {
748
                                        if (item.isOutOfDate()) {
749
                                                result.dispose();
750
                                                fail("OutOfDate: " + i);
751
                                                return;
752
                                        }
753
                                        try {
754
                                                Thread.yield();
755
                                                Thread.sleep(400);
756
                                        } catch (InterruptedException e) {
757
                                                e.printStackTrace();
758
                                                result.dispose();
759
                                                fail();
760
                                                return;
761
                                        }
762
                                        restart = true;
763
                                        break;
764
                                } else if (item.getCurrentStatus() == EditStore.STATUS_ERROR) {
765
                                        item.getException().printStackTrace();
766
                                        result.dispose();
767
                                        fail("ERROR: " + i);
768
                                        return;
769
                                } else if (item.getCurrentStatus() != EditStore.STATUS_FINISHED_OK) {
770
                                        item.getException().printStackTrace();
771
                                        result.dispose();
772
                                        fail("Data ERROR: " + i);
773
                                        return;
774
                                }
775
                        }
776
                        if (restart) {
777
                                continue;
778
                        }
779
                        testAll = true;
780
                }
781

    
782
                FeatureSet set = result.getFeatureSet();
783
                FeatureSet originalSet = store.getFeatureSet();
784
                assertEquals(originalSet.getSize() - deletesFeature.length, set
785
                                .getSize());
786

    
787
                DisposableIterator originalIter = originalSet.iterator();
788
                DisposableIterator iter = set.iterator();
789

    
790
                i = 0;
791
                while (iter.hasNext()) {
792
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
793
                                        (Feature) iter.next()));
794
                        i++;
795
                }
796

    
797
                originalIter.dispose();
798
                iter.dispose();
799

    
800
                set.dispose();
801

    
802
                result.finishEditing();
803

    
804
                set = result.getFeatureSet();
805
                assertEquals(originalSet.getSize() - deletesFeature.length, set
806
                                .getSize());
807

    
808
                originalIter = originalSet.iterator();
809
                iter = set.iterator();
810
                i = 0;
811
                while (iter.hasNext()) {
812
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
813
                                        (Feature) iter.next()));
814
                        i++;
815
                }
816

    
817

    
818
                originalIter.dispose();
819
                iter.dispose();
820

    
821
                set.dispose();
822
                originalSet.dispose();
823

    
824
                result.dispose();
825
                this.clearCopy(store, newParams);
826
                store.dispose();
827
        }
828

    
829
        public void testSequencedInsert() throws Exception {
830
                DataStoreParameters parameters = null;
831

    
832
                int ntimes = 3;
833

    
834
                parameters = getDefaultDataStoreParameters();
835

    
836

    
837
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
838

    
839
                NewFeatureStoreParameters newParams = this
840
                                .getDefaultNewDataStoreParameters();
841
                try {
842
                        this.clearCopy(store, newParams);
843
                } catch (RemoveException e) {
844
                        // Dp nothing
845
                }
846

    
847
                FeatureStore result = this.getStoreCopy(store, newParams);
848

    
849
                result.edit(FeatureStore.MODE_FULLEDIT);
850

    
851
                InsertFeature[] insertsFeature = new InsertFeature[ntimes];
852
                int i;
853
                for (i = 0; i < insertsFeature.length; i++) {
854
                        insertsFeature[i] = new InsertFeature("InsertFeature:" + i, result,
855
                                        300 * i);
856
                }
857

    
858
                for (i = 0; i < insertsFeature.length; i++) {
859
                        insertsFeature[i].start();
860
                }
861

    
862
                try {
863

    
864
                        for (int x = 0; x < (insertsFeature.length + 2); x++) {
865
                                Thread.yield();
866
                                Thread.sleep(500);
867
                        }
868

    
869
                } catch (InterruptedException e) {
870
                        e.printStackTrace();
871
                        result.dispose();
872
                        fail();
873
                        return;
874
                }
875

    
876
                boolean testAll = false;
877
                boolean restart;
878
                InsertFeature item;
879
                while (!testAll) {
880
                        restart = false;
881
                        for (i = 0; i < insertsFeature.length; i++) {
882
                                item = insertsFeature[i];
883
                                if (item.getCurrentStatus() <= EditStore.STATUS_RUNING) {
884
                                        if (item.isOutOfDate()) {
885
                                                result.dispose();
886
                                                fail("OutOfDate: " + i);
887
                                                return;
888
                                        }
889
                                        try {
890
                                                Thread.yield();
891
                                                Thread.sleep(400);
892
                                        } catch (InterruptedException e) {
893
                                                e.printStackTrace();
894
                                                result.dispose();
895
                                                fail();
896
                                                return;
897
                                        }
898
                                        restart = true;
899
                                        break;
900
                                } else if (item.getCurrentStatus() == EditStore.STATUS_ERROR) {
901
                                        item.getException().printStackTrace();
902
                                        result.dispose();
903
                                        fail("ERROR: " + i);
904
                                        return;
905
                                } else if (item.getCurrentStatus() == EditStore.STATUS_FINISHED_NO_OK) {
906
                                        result.dispose();
907
                                        fail("No OK: " + i);
908
                                        return;
909
                                } else if (item.getCurrentStatus() != EditStore.STATUS_FINISHED_OK) {
910
                                        item.getException().printStackTrace();
911
                                        result.dispose();
912
                                        fail("Data ERROR: " + i);
913
                                        return;
914

    
915
                                }
916
                        }
917
                        if (restart) {
918
                                continue;
919
                        }
920
                        testAll = true;
921
                }
922

    
923
                FeatureSet set = result.getFeatureSet();
924
                FeatureSet originalSet = store.getFeatureSet();
925
                assertEquals(originalSet.getSize() + insertsFeature.length, set
926
                                .getSize());
927

    
928
                DisposableIterator originalIter = originalSet.iterator();
929
                DisposableIterator iter = set.iterator();
930

    
931
                i = 0;
932
                while (originalIter.hasNext()) {
933
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
934
                                        (Feature) iter.next()));
935
                        i++;
936
                }
937
                for (; i < insertsFeature.length; i++) {
938
                        iter.next();
939
                }
940

    
941

    
942
                originalIter.dispose();
943
                iter.dispose();
944

    
945
                set.dispose();
946

    
947
                result.finishEditing();
948

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

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

    
965
                set.dispose();
966
                originalSet.dispose();
967

    
968
                result.dispose();
969
                this.clearCopy(store, newParams);
970
                store.dispose();
971

    
972
        }
973

    
974

    
975
        public void testUpdate() throws Exception {
976
                DataStoreParameters parameters = null;
977

    
978
                parameters = getDefaultDataStoreParameters();
979

    
980
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
981

    
982
                NewFeatureStoreParameters newParams = this
983
                                .getDefaultNewDataStoreParameters();
984
                try {
985
                        this.clearCopy(store, newParams);
986
                } catch (RemoveException e) {
987
                        // Dp nothing
988
                }
989

    
990
                FeatureStore result = this.getStoreCopy(store, newParams);
991

    
992
                result.edit(FeatureStore.MODE_FULLEDIT);
993

    
994
                FeatureSet set = result.getFeatureSet();
995
                long size = set.getSize();
996

    
997
                set.dispose();
998

    
999
                UpdateFeature updater = new UpdateFeature("1", result,
1000
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1001
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(result
1002
                                .getDefaultFeatureType(), DataTypes.STRING);
1003
                assertNotNull("No String attributes found", attr);
1004

    
1005
                updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attr.getName(),
1006
                                getEvaluatorToLower(attr.getName()));
1007

    
1008
                updater.run();
1009
                while (updater.getCurrentStatus() < EditStore.STATUS_FINISHED_OK
1010
                                && !updater.isOutOfDate()) {
1011
                        Thread.yield();
1012
                        try {
1013
                                Thread.sleep(200);
1014
                        } catch (InterruptedException e) {
1015
                                e.printStackTrace();
1016
                                fail();
1017
                        }
1018
                }
1019
                set = result.getFeatureSet();
1020
                DisposableIterator iter = set.iterator();
1021

    
1022
                printFeatureTypeColNames(set.getDefaultFeatureType(), 15);
1023
                Feature f;
1024
                while (iter.hasNext()) {
1025
                        f = (Feature) iter.next();
1026
                        this.printFeature(f, false, 15);
1027
                }
1028

    
1029
                iter.dispose();
1030

    
1031
                FeatureSet originalSet = store.getFeatureSet();
1032

    
1033
                DisposableIterator originalIter = originalSet.iterator();
1034

    
1035
                iter = set.iterator();
1036

    
1037
                long i = 0;
1038
                while (originalIter.hasNext()) {
1039
                        try {
1040
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1041
                                                .next(), (Feature) iter.next(), updater, i, size));
1042
                        } catch (EvaluatorException e) {
1043
                                e.printStackTrace();
1044
                                fail();
1045
                        }
1046
                        i++;
1047
                }
1048
                iter.dispose();
1049
                originalIter.dispose();
1050

    
1051

    
1052
                set.dispose();
1053

    
1054
                result.finishEditing();
1055

    
1056
                set = result.getFeatureSet();
1057
                assertEquals(originalSet.getSize(), set.getSize());
1058

    
1059
                originalIter = originalSet.iterator();
1060
                iter = set.iterator();
1061
                i = 0;
1062
                while (originalIter.hasNext()) {
1063
                        try {
1064
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1065
                                                .next(), (Feature) iter.next(), updater, i, size));
1066
                        } catch (EvaluatorException e) {
1067
                                e.printStackTrace();
1068
                                fail();
1069
                        }
1070
                        i++;
1071
                }
1072

    
1073

    
1074
                iter.dispose();
1075
                originalIter.dispose();
1076
                set.dispose();
1077

    
1078

    
1079
                updater = new UpdateFeature("1", result,
1080
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1081

    
1082
                updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attr.getName(),
1083
                                getEvaluatorToLower(attr.getName()));
1084

    
1085
                updater.run();
1086
                while (updater.getCurrentStatus() < EditStore.STATUS_FINISHED_OK
1087
                                && !updater.isOutOfDate()) {
1088
                        Thread.yield();
1089
                        try {
1090
                                Thread.sleep(200);
1091
                        } catch (InterruptedException e) {
1092
                                e.printStackTrace();
1093
                                fail();
1094
                        }
1095
                }
1096
                set = result.getFeatureSet();
1097

    
1098
                iter = set.iterator();
1099
                originalIter = originalSet.iterator();
1100
                i = 0;
1101
                while (originalIter.hasNext()) {
1102
                        try {
1103
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1104
                                                .next(), (Feature) iter.next(), updater, i, size));
1105
                        } catch (EvaluatorException e) {
1106
                                e.printStackTrace();
1107
                                fail();
1108
                        }
1109
                        i++;
1110
                }
1111

    
1112
                iter.dispose();
1113
                originalIter.dispose();
1114
                set.dispose();
1115

    
1116

    
1117

    
1118

    
1119

    
1120
                originalSet.dispose();
1121

    
1122
                result.dispose();
1123
                this.clearCopy(store, newParams);
1124
                store.dispose();
1125

    
1126
        }
1127

    
1128

    
1129
        public void testResourceChangeNotification() throws Exception{
1130
                DataStoreParameters parameters = null;
1131

    
1132
                parameters = getDefaultDataStoreParameters();
1133

    
1134
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
1135

    
1136
                NewFeatureStoreParameters newParams = this
1137
                                .getDefaultNewDataStoreParameters();
1138
                try {
1139
                        this.clearCopy(store, newParams);
1140
                } catch (RemoveException e) {
1141
                        // Dp nothing
1142
                }
1143

    
1144
                FeatureStore result = this.getStoreCopy(store, newParams);
1145

    
1146
                FeatureStore result2 = (FeatureStore) dataManager
1147
                                .createStore(newParams);
1148

    
1149
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(result
1150
                                .getDefaultFeatureType(), DataTypes.STRING);
1151
                assertNotNull("No String attributes found", attr);
1152

    
1153

    
1154
                UpdateFeature updater = new UpdateFeature("1", result,
1155
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1156

    
1157
                updater.addUpdate(UpdateFeature.UPDATE_LAST_FEATURE, attr.getName(),
1158
                                getEvaluatorToLower(attr.getName()));
1159

    
1160
                StoreObserverForNotify observer = new StoreObserverForNotify(result2,
1161
                                FeatureStoreNotification.RESOURCE_CHANGED);
1162
                result2.addObserver(observer);
1163

    
1164
                result.edit();
1165
                updater.run();
1166
                while (updater.getCurrentStatus() < EditStore.STATUS_FINISHED_OK
1167
                                && !updater.isOutOfDate()) {
1168
                        Thread.yield();
1169
                        try {
1170
                                Thread.sleep(200);
1171
                        } catch (InterruptedException e) {
1172
                                e.printStackTrace();
1173
                                fail();
1174
                        }
1175
                }
1176

    
1177
                result.finishEditing();
1178

    
1179
                assertTrue(observer.notified());
1180

    
1181
                result2.refresh();
1182

    
1183
                FeatureSet set = result.getFeatureSet();
1184
                FeatureSet set2 = result2.getFeatureSet();
1185

    
1186
                DisposableIterator iter1 = set.iterator();
1187
                DisposableIterator iter2 = set2.iterator();
1188
                assertTrue(this.compareFeatureIterators(iter1, iter2));
1189
                iter1.dispose();
1190
                iter2.dispose();
1191

    
1192
                set2.dispose();
1193
                set.dispose();
1194

    
1195
                // TODO checks FeatureType change
1196

    
1197
                result2.dispose();
1198
                result.dispose();
1199
                this.clearCopy(store, newParams);
1200
                store.dispose();
1201
        }
1202

    
1203
        public abstract class StoreObserver implements Observer{
1204

    
1205
                public DataStore store = null;
1206

    
1207
        }
1208

    
1209
        public class StoreObserverForNotify implements Observer{
1210

    
1211
                public DataStore store = null;
1212

    
1213
                public String notifyType = null;
1214

    
1215
                private boolean notifyRecived = false;
1216

    
1217
                public StoreObserverForNotify(DataStore store,String notifyType){
1218
                        this.store = store;
1219
                        this.notifyType = notifyType;
1220
                        this.notifyRecived = false;
1221
                }
1222

    
1223
                public boolean notified(){
1224
                        return notifyRecived;
1225
                }
1226

    
1227
                public void update(Observable observable, Object notification) {
1228
                        if (!(observable == this.store)){
1229
                                return;
1230
                        }
1231
                        if (!(notification instanceof FeatureStoreNotification)){
1232
                                return;
1233
                        }
1234
                        FeatureStoreNotification fsNotification = (FeatureStoreNotification) notification;
1235

    
1236
                        if (fsNotification.getType().equals(this.notifyType)){
1237
                                notifyRecived = true;
1238
                        }
1239
                }
1240

    
1241
        }
1242

    
1243
        public void testUpdateFeatureType_AddField() throws Exception {
1244
                DataStoreParameters parameters = null;
1245

    
1246
                parameters = getDefaultDataStoreParameters();
1247

    
1248
                FeatureStore store = (FeatureStore) dataManager
1249
                .createStore(parameters);
1250

    
1251
                NewFeatureStoreParameters newParams = this
1252
                .getDefaultNewDataStoreParameters();
1253
                try {
1254
                        this.clearCopy(store, newParams);
1255
                } catch (RemoveException e) {
1256
                        // Dp nothing
1257
                }
1258

    
1259
                FeatureStore result = this.getStoreCopy(store, newParams);
1260

    
1261
                result.edit();
1262

    
1263

    
1264
                String[] orgAttNames = new String[result.getDefaultFeatureType()
1265
                                                  .size()];
1266

    
1267
                Iterator iter = result.getDefaultFeatureType().iterator();
1268
                int i = 0;
1269
                while (iter.hasNext()) {
1270
                        orgAttNames[i] = ((FeatureAttributeDescriptor) iter.next())
1271
                        .getName();
1272
                        i++;
1273
                }
1274

    
1275
                EditableFeatureType edFtype = result
1276
                .getDefaultFeatureType().getEditable();
1277

    
1278
                edFtype.add("__ATTR1__", DataTypes.STRING).setSize(10)
1279
                .setDefaultValue("HOLA");
1280

    
1281
                result.update(edFtype);
1282

    
1283
                assertEquals(store.getDefaultFeatureType().size() + 1, result
1284
                                .getDefaultFeatureType().size());
1285

    
1286
                testIterationFastAndStandart(result);
1287

    
1288
                FeatureSet orgSet = store.getFeatureSet();
1289
                FeatureSet curSet = result.getFeatureSet();
1290

    
1291
                assertEquals(orgSet.getDefaultFeatureType().size() + 1, curSet
1292
                                .getDefaultFeatureType().size());
1293

    
1294
                DisposableIterator orgIter = orgSet.iterator();
1295
                DisposableIterator curIter = curSet.iterator();
1296

    
1297
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1298

    
1299
                orgIter.dispose();
1300
                curIter.dispose();
1301

    
1302
                orgIter = orgSet.fastIterator();
1303
                curIter = curSet.fastIterator();
1304

    
1305
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1306
                orgIter.dispose();
1307
                curIter.dispose();
1308

    
1309
                orgIter = orgSet.iterator();
1310
                curIter = curSet.fastIterator();
1311

    
1312
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1313
                orgIter.dispose();
1314
                curIter.dispose();
1315

    
1316
                orgIter = orgSet.fastIterator();
1317
                curIter = curSet.iterator();
1318

    
1319
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1320
                orgIter.dispose();
1321
                curIter.dispose();
1322

    
1323
                curIter = curSet.iterator();
1324
                Feature feature;
1325
                while (curIter.hasNext()) {
1326
                        feature = (Feature) curIter.next();
1327
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1328
                }
1329
                curIter.dispose();
1330
                curSet.dispose();
1331

    
1332
                FeatureQuery query = this.getDefaultQuery(result);
1333
                query.setAttributeNames(new String[] { "__ATTR1__" });
1334
                curSet = result.getFeatureSet(query);
1335

    
1336
                assertEquals(1, curSet.getDefaultFeatureType().size());
1337

    
1338
                assertEquals(orgSet.getSize(), curSet.getSize());
1339
                curIter = curSet.iterator();
1340
                while (curIter.hasNext()) {
1341
                        feature = (Feature) curIter.next();
1342
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1343
                }
1344
                curIter.dispose();
1345
                curSet.dispose();
1346

    
1347
                result.finishEditing();
1348

    
1349
                testIterationFastAndStandart(result);
1350

    
1351
                assertEquals(store.getDefaultFeatureType().size() + 1, result
1352
                                .getDefaultFeatureType().size());
1353

    
1354
                orgSet = store.getFeatureSet();
1355
                curSet = result.getFeatureSet();
1356

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

    
1360
                orgIter = orgSet.iterator();
1361
                curIter = curSet.iterator();
1362

    
1363
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1364
                orgIter.dispose();
1365
                curIter.dispose();
1366

    
1367
                orgIter = orgSet.fastIterator();
1368
                curIter = curSet.fastIterator();
1369

    
1370
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1371
                orgIter.dispose();
1372
                curIter.dispose();
1373

    
1374
                orgIter = orgSet.iterator();
1375
                curIter = curSet.fastIterator();
1376

    
1377
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1378
                orgIter.dispose();
1379
                curIter.dispose();
1380

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

    
1384
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1385
                orgIter.dispose();
1386
                curIter.dispose();
1387

    
1388
                curIter = curSet.iterator();
1389
                while (curIter.hasNext()) {
1390
                        feature = (Feature) curIter.next();
1391
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1392
                }
1393
                curIter.dispose();
1394
                curSet.dispose();
1395

    
1396
                query = this.getDefaultQuery(result);
1397
                query.setAttributeNames(new String[] { "__ATTR1__" });
1398
                curSet = result.getFeatureSet(query);
1399

    
1400
                assertEquals(1, curSet.getDefaultFeatureType().size());
1401

    
1402
                assertEquals(orgSet.getSize(), curSet.getSize());
1403
                curIter = curSet.iterator();
1404
                while (curIter.hasNext()) {
1405
                        feature = (Feature) curIter.next();
1406
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1407
                }
1408
                curIter.dispose();
1409
                curSet.dispose();
1410

    
1411
                orgSet.dispose();
1412
                result.dispose();
1413
                this.clearCopy(store, newParams);
1414
                store.dispose();
1415

    
1416

    
1417
        }
1418

    
1419
}