Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dal / src-test / org / gvsig / fmap / dal / feature / BaseTestEditableFeatureStore.java @ 33053

History | View | Annotate | Download (34.6 KB)

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

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

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

    
33
import java.util.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.evaluator.AbstractEvaluator;
49
import org.gvsig.tools.evaluator.Evaluator;
50
import org.gvsig.tools.evaluator.EvaluatorData;
51
import org.gvsig.tools.evaluator.EvaluatorException;
52
import org.gvsig.tools.evaluator.EvaluatorFieldValue;
53
import org.gvsig.tools.observer.Observable;
54
import org.gvsig.tools.observer.Observer;
55

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

    
62
        public abstract NewFeatureStoreParameters getDefaultNewDataStoreParameters()
63
                        throws Exception;
64

    
65
        public abstract boolean resourcesNotifyChanges();
66

    
67
        //=================================================
68
        //=================================================
69

    
70

    
71
        public void fillPrimaryKeyInserFeature(EditableFeature feature) {
72
                return;
73
        }
74

    
75
        protected Evaluator getEvaluatorToLower(String attibuteName) {
76
                return new ToLower(attibuteName);
77

    
78
        }
79

    
80
        protected Evaluator getEvaluatorToUpper(String attibuteName) {
81
                return new ToUpper(attibuteName);
82
        }
83

    
84
        public class ToLower extends AbstractEvaluator {
85
                private String attributeName;
86

    
87
                public ToLower(String attrName) {
88
                        this.attributeName = attrName;
89
                        this.getFieldsInfo().addFieldValue(this.attributeName);
90
                }
91

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

    
100
                public String getSQL() {
101
                        return null;
102
                }
103

    
104
                public String getDescription() {
105
                        return null;
106
                }
107

    
108
                public String getName() {
109
                        return null;
110
                }
111

    
112
        }
113

    
114
        public class ToUpper extends AbstractEvaluator {
115
                private String attributeName;
116

    
117
                public ToUpper(String attrName) {
118
                        this.attributeName = attrName;
119
                        this.getFieldsInfo().addFieldValue(this.attributeName);
120
                }
121

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

    
130
                public String getSQL() {
131
                        return null;
132
                }
133

    
134
                public String getDescription() {
135
                        return null;
136
                }
137

    
138
                public EvaluatorFieldValue[] getFieldValues(String name) {
139
                        return null;
140
                }
141

    
142
                public String getName() {
143
                        return null;
144
                }
145

    
146
        }
147

    
148
        protected FeatureStore getStoreCopy(FeatureStore source,
149
                        NewFeatureStoreParameters targetParams) throws DataException,
150
                        ValidateDataParametersException {
151
                DataServerExplorer explorer = source.getExplorer();
152
                source.export(explorer, source.getProviderName(), targetParams);
153
                FeatureStore result = (FeatureStore) dataManager.openStore(source.getProviderName(), targetParams);
154

    
155
                return result;
156
        }
157

    
158
        protected void clearCopy(FeatureStore source,
159
                        NewFeatureStoreParameters targetParams) throws Exception {
160
                DataServerExplorer explorer = source.getExplorer();
161
                explorer.remove(targetParams);
162

    
163
        }
164

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

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

    
189
                return true;
190
        }
191

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

    
213

    
214
                return true;
215

    
216
        }
217

    
218

    
219
        //---------------
220

    
221

    
222

    
223

    
224
        //=================================================
225
        //=================================================
226

    
227

    
228

    
229

    
230
        public void testExport() throws Exception {
231
                DataStoreParameters parameters = null;
232

    
233
                parameters = getDefaultDataStoreParameters();
234

    
235
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
236

    
237
                NewFeatureStoreParameters newParams = this
238
                                .getDefaultNewDataStoreParameters();
239
                try {
240
                        this.clearCopy(store, newParams);
241
                } catch (RemoveException e) {
242
                        // Dp nothing
243
                }
244

    
245
                FeatureStore result = this.getStoreCopy(store, newParams);
246

    
247
                fullStoreIteratorTest(result);
248

    
249
                FeatureSet set;
250
                FeatureSet originalSet;
251
                if (result.getDefaultFeatureType().getPrimaryKey() != null
252
                                && result.getDefaultFeatureType().getPrimaryKey().length > 0) {
253
                        FeatureQuery queryR = result.createFeatureQuery();
254
                        FeatureQuery queryO = store.createFeatureQuery();
255
                        FeatureAttributeDescriptor[] pk = result.getDefaultFeatureType()
256
                                        .getPrimaryKey();
257
                        for (int i = 0; i < pk.length; i++) {
258
                                queryO.getOrder().add(pk[i].getName(), true);
259
                                queryR.getOrder().add(pk[i].getName(), true);
260
                        }
261

    
262

    
263
                        set = result.getFeatureSet(queryR);
264
                        originalSet = store.getFeatureSet(queryO);
265

    
266

    
267
                } else {
268
                        set = result.getFeatureSet();
269
                        originalSet = store.getFeatureSet();
270
                }
271
                assertEquals(set.getSize(), originalSet.getSize());
272

    
273
                DisposableIterator originalIter = originalSet.iterator();
274
                DisposableIterator iter = set.iterator();
275
                assertTrue(compareFeatureIterators(originalIter, iter));
276
                originalIter.dispose();
277
                iter.dispose();
278

    
279
                if (store.getEnvelope() != result.getEnvelope()) {
280
                        if (store.getEnvelope() != null) {
281
                                assertTrue(store.getEnvelope().equals(result.getEnvelope()));
282
                        } else {
283
                                fail("Envelope: src=" + store.getEnvelope() + " traget="
284
                                                + store.getEnvelope());
285
                        }
286
                }
287

    
288
                set.dispose();
289
                originalSet.dispose();
290

    
291
                result.dispose();
292
                this.clearCopy(store, newParams);
293
                store.dispose();
294

    
295
        }
296

    
297
        public void testRemove() throws Exception {
298
                DataStoreParameters parameters = null;
299

    
300
                parameters = getDefaultDataStoreParameters();
301

    
302
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
303

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

    
312
                FeatureStore result = this.getStoreCopy(store, newParams);
313

    
314
                result.edit(FeatureStore.MODE_FULLEDIT);
315

    
316
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
317
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
318
                assertEquals(set.getSize(), originalSet.getSize());
319

    
320
                DisposableIterator originalIter = originalSet.iterator();
321
                DisposableIterator iter = set.iterator();
322
                int i = 0;
323
                while (iter.hasNext()) {
324
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
325
                                        (Feature) iter.next()));
326
                        i++;
327
                }
328

    
329
                iter.remove();
330

    
331

    
332
                assertEquals(originalSet.getSize() - 1, set.getSize());
333

    
334
                iter.dispose();
335
                originalIter.dispose();
336

    
337

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

    
347
                iter.remove();
348

    
349
                assertEquals(originalSet.getSize() - 2, set.getSize());
350

    
351
                iter.dispose();
352
                originalIter.dispose();
353

    
354
                set.dispose();
355

    
356
                result.finishEditing();
357

    
358
                set = result.getFeatureSet();
359
                assertEquals(originalSet.getSize() - 2, set.getSize());
360

    
361
                originalIter = originalSet.iterator();
362
                iter = set.iterator();
363
                i = 0;
364
                while (iter.hasNext()) {
365
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
366
                                        (Feature) iter.next()));
367
                        i++;
368
                }
369

    
370
                iter.dispose();
371
                originalIter.dispose();
372

    
373

    
374
                set.dispose();
375
                originalSet.dispose();
376

    
377
                result.dispose();
378
                this.clearCopy(store, newParams);
379
                store.dispose();
380

    
381

    
382
        }
383

    
384
        public void testInsert() throws Exception {
385
                DataStoreParameters parameters = null;
386

    
387
                parameters = getDefaultDataStoreParameters();
388

    
389

    
390
                FeatureStore store = (FeatureStore) dataManager
391
                .createStore(parameters);
392

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

    
401
                FeatureStore result = this.getStoreCopy(store, newParams);
402

    
403
                result.edit(FeatureStore.MODE_FULLEDIT);
404

    
405
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
406
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
407
                assertEquals(set.getSize(), originalSet.getSize());
408

    
409
                EditableFeature newFeature = result.createNewFeature(true);
410
                fillPrimaryKeyInserFeature(newFeature);
411
                set.insert(newFeature);
412
                DisposableIterator originalIter = originalSet.iterator();
413
                DisposableIterator iter = set.iterator();
414
                int i = 0;
415
                while (originalIter.hasNext()) {
416
                        assertTrue("" + i, compareFeatures((Feature) originalIter
417
                                        .next(), (Feature) iter.next()));
418
                        i++;
419
                }
420
                assertTrue(iter.hasNext());
421
                assertNotNull(iter.next());
422
                assertFalse(iter.hasNext());
423

    
424
                assertEquals(originalSet.getSize() + 1, set.getSize());
425

    
426
                iter.dispose();
427
                originalIter.dispose();
428

    
429
                originalIter = originalSet.iterator();
430
                iter = set.iterator();
431
                i = 0;
432
                while (originalIter.hasNext()) {
433
                        assertTrue("" + i, compareFeatures((Feature) originalIter
434
                                        .next(), (Feature) iter.next()));
435
                        i++;
436
                }
437
                assertTrue(iter.hasNext());
438
                assertNotNull(iter.next());
439

    
440
                newFeature = result.createNewFeature(true);
441
                fillPrimaryKeyInserFeature(newFeature);
442
                set.insert(newFeature);
443

    
444
                assertEquals(originalSet.getSize() + 2, set.getSize());
445

    
446
                iter.dispose();
447
                originalIter.dispose();
448

    
449
                set.dispose();
450

    
451
                result.finishEditing();
452

    
453
                set = result.getFeatureSet();
454
                assertEquals(originalSet.getSize() + 2, set.getSize());
455

    
456
                originalIter = originalSet.iterator();
457
                iter = set.iterator();
458
                i = 0;
459
                while (originalIter.hasNext()) {
460
                        assertTrue("" + i, compareFeatures((Feature) originalIter
461
                                        .next(), (Feature) iter.next()));
462
                        i++;
463
                }
464

    
465
                assertNotNull(iter.next());
466
                assertNotNull(iter.next());
467
                assertFalse(iter.hasNext());
468

    
469
                iter.dispose();
470
                originalIter.dispose();
471

    
472
                set.dispose();
473
                originalSet.dispose();
474

    
475
                result.dispose();
476
                this.clearCopy(store, newParams);
477
                store.dispose();
478

    
479

    
480
        }
481

    
482

    
483

    
484
        public void testConcurrentRemove() throws Exception {
485
                DataStoreParameters parameters = null;
486

    
487
                parameters = getDefaultDataStoreParameters();
488

    
489

    
490
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
491

    
492
                NewFeatureStoreParameters newParams = this
493
                .getDefaultNewDataStoreParameters();
494
                try {
495
                        this.clearCopy(store, newParams);
496
                } catch (RemoveException e) {
497
                        // Dp nothing
498
                }
499

    
500
                FeatureStore result = this.getStoreCopy(store, newParams);
501

    
502
                result.edit(FeatureStore.MODE_FULLEDIT);
503

    
504
                DeleteFirstAndLastFeature deleteFeature = new DeleteFirstAndLastFeature(
505
                                "1", result, StoreTask.TIME_TO_WAIT_NO_WAIT);
506

    
507
                FeatureSet set = result.getFeatureSet();
508

    
509
                DisposableIterator iter = set.iterator();
510
                assertTrue(iter.hasNext());
511
                assertNotNull(iter.next());
512

    
513
                deleteFeature.start();
514

    
515
                while (deleteFeature.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
516
                        Thread.yield();
517
                        Thread.sleep(100);
518
                        if (deleteFeature.isOutOfDate()) {
519
                                break;
520
                        }
521
                }
522

    
523
                assertEquals(deleteFeature.getCurrentStatus(),
524
                                StoreTask.STATUS_FINISHED_OK);
525

    
526
                Exception ex = null;
527
                try {
528
                        iter.next();
529
                } catch (Exception e) {
530
                        ex = e;
531
                }
532
                assertNotNull(ex);
533
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
534

    
535
                ex = null;
536
                try {
537
                        set.getSize();
538
                } catch (Exception e) {
539
                        ex = e;
540
                }
541
                assertNotNull(ex);
542
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
543

    
544
                iter.dispose();
545
                result.dispose();
546
                this.clearCopy(store, newParams);
547
                store.dispose();
548

    
549
        }
550

    
551
        public void testConcurrentInsert() throws Exception{
552
                DataStoreParameters parameters = null;
553

    
554
                parameters = getDefaultDataStoreParameters();
555

    
556

    
557
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
558

    
559
                NewFeatureStoreParameters newParams = this
560
                .getDefaultNewDataStoreParameters();
561
                try {
562
                        this.clearCopy(store, newParams);
563
                } catch (RemoveException e) {
564
                        // Dp nothing
565
                }
566

    
567
                FeatureStore result = this.getStoreCopy(store, newParams);
568

    
569
                result.edit(FeatureStore.MODE_FULLEDIT);
570

    
571
                InsertFeature insertFeature = new InsertFeature("1", result,
572
                                StoreTask.TIME_TO_WAIT_NO_WAIT, this);
573

    
574
                FeatureSet set = result.getFeatureSet();
575

    
576
                DisposableIterator iter = set.iterator();
577
                assertTrue(iter.hasNext());
578
                assertNotNull(iter.next());
579

    
580
                insertFeature.start();
581

    
582
                while (insertFeature.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
583
                        Thread.yield();
584
                        Thread.sleep(100);
585
                        if (insertFeature.isOutOfDate()) {
586
                                break;
587
                        }
588
                }
589

    
590
                assertEquals(StoreTask.STATUS_FINISHED_OK, insertFeature
591
                                .getCurrentStatus());
592

    
593
                Exception ex = null;
594
                try {
595
                        iter.next();
596
                } catch (Exception e) {
597
                        ex = e;
598
                }
599
                assertNotNull(ex);
600
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
601

    
602
                ex = null;
603
                try {
604
                        set.getSize();
605
                } catch (Exception e) {
606
                        ex = e;
607
                }
608
                assertNotNull(ex);
609
                assertEquals(ConcurrentDataModificationException.class, ex.getClass());
610

    
611
                iter.dispose();
612
                result.dispose();
613
                this.clearCopy(store, newParams);
614
                store.dispose();
615
        }
616

    
617
        public void testConcurrentUpdate() throws Exception {
618
                DataStoreParameters parameters = null;
619

    
620
                parameters = getDefaultDataStoreParameters();
621

    
622

    
623
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
624

    
625
                NewFeatureStoreParameters newParams = this
626
                .getDefaultNewDataStoreParameters();
627
                try {
628
                        this.clearCopy(store, newParams);
629
                } catch (RemoveException e) {
630
                        // Dp nothing
631
                }
632

    
633
                FeatureStore result = this.getStoreCopy(store, newParams);
634

    
635

    
636
                result.edit(FeatureStore.MODE_FULLEDIT);
637

    
638
                UpdateFeature updateFeature = new UpdateFeature("1", result,
639
                                StoreTask.TIME_TO_WAIT_NO_WAIT);
640

    
641
                FeatureType fType = result.getDefaultFeatureType();
642
                FeatureAttributeDescriptor attr;
643
                Iterator fTypeIter = fType.iterator();
644
                String attrName = null;
645
                while (fTypeIter.hasNext()){
646
                        attr = (FeatureAttributeDescriptor) fTypeIter.next();
647
                        if (attr.getDataType() == DataTypes.STRING && !attr.isReadOnly() && !attr.isPrimaryKey() && !attr.isAutomatic()){
648
                                attrName= attr.getName();
649
                        }
650
                }
651
                if (attrName == null) {
652
                        fail("This test needs an normal attribute String (no Pk, no ReadOnly & no Auto)");
653
                        return;
654
                }
655

    
656

    
657
                updateFeature.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attrName,
658
                                "XXX");
659

    
660
                FeatureSet set = result.getFeatureSet();
661

    
662
                DisposableIterator iter = set.iterator();
663
                assertTrue(iter.hasNext());
664
                assertNotNull(iter.next());
665

    
666
                updateFeature.start();
667

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

    
676
                assertEquals(StoreTask.STATUS_FINISHED_OK, updateFeature
677
                                .getCurrentStatus());
678

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

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

    
697
                iter.dispose();
698
                result.dispose();
699
                this.clearCopy(store, newParams);
700
                store.dispose();
701

    
702

    
703

    
704
        }
705

    
706
        public void testSequencedRemove() throws Exception {
707
                DataStoreParameters parameters = null;
708

    
709
                int ntimes = 3;
710

    
711
                parameters = getDefaultDataStoreParameters();
712

    
713
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
714

    
715
                NewFeatureStoreParameters newParams = this
716
                .getDefaultNewDataStoreParameters();
717
                try {
718
                        this.clearCopy(store, newParams);
719
                } catch (RemoveException e) {
720
                        // Dp nothing
721
                }
722

    
723
                FeatureStore result = this.getStoreCopy(store, newParams);
724

    
725
                result.edit(FeatureStore.MODE_FULLEDIT);
726

    
727
                DeleteLastFeature[] deletesFeature = new DeleteLastFeature[ntimes];
728
                int i;
729
                for (i = 0; i < deletesFeature.length; i++) {
730
                        deletesFeature[i] = new DeleteLastFeature("DeleteLastFeature:" + i,
731
                                        result, 300 * i);
732
                }
733

    
734
                for (i = 0; i < deletesFeature.length; i++) {
735
                        deletesFeature[i].start();
736
                }
737

    
738
                try {
739
                        for (int x = 0; x < (deletesFeature.length + 2); x++) {
740
                                Thread.yield();
741
                                Thread.sleep(500);
742
                        }
743

    
744
                } catch (InterruptedException e) {
745
                        e.printStackTrace();
746
                        result.dispose();
747
                        fail();
748
                        return;
749
                }
750

    
751
                boolean testAll = false;
752
                boolean restart;
753
                DeleteLastFeature item;
754
                while (!testAll) {
755
                        restart = false;
756
                        for (i = 0; i < deletesFeature.length; i++) {
757
                                item = deletesFeature[i];
758
                                if (item.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
759
                                        if (item.isOutOfDate()) {
760
                                                result.dispose();
761
                                                fail("OutOfDate: " + i);
762
                                                return;
763
                                        }
764
                                        try {
765
                                                Thread.yield();
766
                                                Thread.sleep(400);
767
                                        } catch (InterruptedException e) {
768
                                                e.printStackTrace();
769
                                                result.dispose();
770
                                                fail();
771
                                                return;
772
                                        }
773
                                        restart = true;
774
                                        break;
775
                                } else if (item.getCurrentStatus() == StoreTask.STATUS_ERROR) {
776
                                        item.getException().printStackTrace();
777
                                        result.dispose();
778
                                        fail("ERROR: " + i);
779
                                        return;
780
                                } else if (item.getCurrentStatus() != StoreTask.STATUS_FINISHED_OK) {
781
                                        item.getException().printStackTrace();
782
                                        result.dispose();
783
                                        fail("Data ERROR: " + i);
784
                                        return;
785
                                }
786
                        }
787
                        if (restart) {
788
                                continue;
789
                        }
790
                        testAll = true;
791
                }
792

    
793
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
794
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
795
                assertEquals(originalSet.getSize() - deletesFeature.length, set
796
                                .getSize());
797

    
798
                DisposableIterator originalIter = originalSet.iterator();
799
                DisposableIterator iter = set.iterator();
800

    
801
                i = 0;
802
                while (iter.hasNext()) {
803
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
804
                                        (Feature) iter.next()));
805
                        i++;
806
                }
807

    
808
                originalIter.dispose();
809
                iter.dispose();
810

    
811
                set.dispose();
812

    
813
                result.finishEditing();
814

    
815
                set = result.getFeatureSet(getDefaultQuery(result));
816
                assertEquals(originalSet.getSize() - deletesFeature.length, set
817
                                .getSize());
818

    
819
                originalIter = originalSet.iterator();
820
                iter = set.iterator();
821
                i = 0;
822
                while (iter.hasNext()) {
823
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
824
                                        (Feature) iter.next()));
825
                        i++;
826
                }
827

    
828

    
829
                originalIter.dispose();
830
                iter.dispose();
831

    
832
                set.dispose();
833
                originalSet.dispose();
834

    
835
                result.dispose();
836
                this.clearCopy(store, newParams);
837
                store.dispose();
838
        }
839

    
840
        public void testSequencedInsert() throws Exception {
841
                DataStoreParameters parameters = null;
842

    
843
                int ntimes = 3;
844

    
845
                parameters = getDefaultDataStoreParameters();
846

    
847

    
848
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
849

    
850
                NewFeatureStoreParameters newParams = this
851
                .getDefaultNewDataStoreParameters();
852
                try {
853
                        this.clearCopy(store, newParams);
854
                } catch (RemoveException e) {
855
                        // Dp nothing
856
                }
857

    
858
                FeatureStore result = this.getStoreCopy(store, newParams);
859

    
860
                result.edit(FeatureStore.MODE_FULLEDIT);
861

    
862
                InsertFeature[] insertsFeature = new InsertFeature[ntimes];
863
                int i;
864
                for (i = 0; i < insertsFeature.length; i++) {
865
                        insertsFeature[i] = new InsertFeature("InsertFeature:" + i, result,
866
                                        300 * i, this);
867
                }
868

    
869
                for (i = 0; i < insertsFeature.length; i++) {
870
                        insertsFeature[i].start();
871
                }
872

    
873
                try {
874

    
875
                        for (int x = 0; x < (insertsFeature.length + 2); x++) {
876
                                Thread.yield();
877
                                Thread.sleep(500);
878
                        }
879

    
880
                } catch (InterruptedException e) {
881
                        e.printStackTrace();
882
                        result.dispose();
883
                        fail();
884
                        return;
885
                }
886

    
887
                boolean testAll = false;
888
                boolean restart;
889
                InsertFeature item;
890
                while (!testAll) {
891
                        restart = false;
892
                        for (i = 0; i < insertsFeature.length; i++) {
893
                                item = insertsFeature[i];
894
                                if (item.getCurrentStatus() <= StoreTask.STATUS_RUNING) {
895
                                        if (item.isOutOfDate()) {
896
                                                result.dispose();
897
                                                fail("OutOfDate: " + i);
898
                                                return;
899
                                        }
900
                                        try {
901
                                                Thread.yield();
902
                                                Thread.sleep(400);
903
                                        } catch (InterruptedException e) {
904
                                                e.printStackTrace();
905
                                                result.dispose();
906
                                                fail();
907
                                                return;
908
                                        }
909
                                        restart = true;
910
                                        break;
911
                                } else if (item.getCurrentStatus() == StoreTask.STATUS_ERROR) {
912
                                        item.getException().printStackTrace();
913
                                        result.dispose();
914
                                        fail("ERROR: " + i);
915
                                        return;
916
                                } else if (item.getCurrentStatus() == StoreTask.STATUS_FINISHED_NO_OK) {
917
                                        result.dispose();
918
                                        fail("No OK: " + i);
919
                                        return;
920
                                } else if (item.getCurrentStatus() != StoreTask.STATUS_FINISHED_OK) {
921
                                        item.getException().printStackTrace();
922
                                        result.dispose();
923
                                        fail("Data ERROR: " + i);
924
                                        return;
925

    
926
                                }
927
                        }
928
                        if (restart) {
929
                                continue;
930
                        }
931
                        testAll = true;
932
                }
933

    
934
                FeatureSet set = result.getFeatureSet(getDefaultQuery(result));
935
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
936
                assertEquals(originalSet.getSize() + insertsFeature.length, set
937
                                .getSize());
938

    
939
                DisposableIterator originalIter = originalSet.iterator();
940
                DisposableIterator iter = set.iterator();
941

    
942
                i = 0;
943
                while (originalIter.hasNext()) {
944
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
945
                                        (Feature) iter.next()));
946
                        i++;
947
                }
948
                for (; i < insertsFeature.length; i++) {
949
                        iter.next();
950
                }
951

    
952

    
953
                originalIter.dispose();
954
                iter.dispose();
955

    
956
                set.dispose();
957

    
958
                result.finishEditing();
959

    
960
                set = result.getFeatureSet();
961
                assertEquals(originalSet.getSize() + insertsFeature.length, set
962
                                .getSize());
963

    
964
                originalIter = originalSet.iterator();
965
                iter = set.iterator();
966
                i = 0;
967
                while (originalIter.hasNext()) {
968
                        assertTrue("" + i, compareFeatures((Feature) originalIter.next(),
969
                                        (Feature) iter.next()));
970
                        i++;
971
                }
972
                for (; i < insertsFeature.length; i++) {
973
                        iter.next();
974
                }
975

    
976
                set.dispose();
977
                originalSet.dispose();
978

    
979
                result.dispose();
980
                this.clearCopy(store, newParams);
981
                store.dispose();
982

    
983
        }
984

    
985

    
986
        public void testUpdate() throws Exception {
987
                DataStoreParameters parameters = null;
988

    
989
                parameters = getDefaultDataStoreParameters();
990

    
991
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
992

    
993
                NewFeatureStoreParameters newParams = this
994
                .getDefaultNewDataStoreParameters();
995
                try {
996
                        this.clearCopy(store, newParams);
997
                } catch (RemoveException e) {
998
                        // Dp nothing
999
                }
1000

    
1001
                FeatureStore result = this.getStoreCopy(store, newParams);
1002

    
1003
                result.edit(FeatureStore.MODE_FULLEDIT);
1004

    
1005
                FeatureSet set = result.getFeatureSet();
1006
                long size = set.getSize();
1007

    
1008
                set.dispose();
1009

    
1010
                UpdateFeature updater = new UpdateFeature("1", result,
1011
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1012
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(result
1013
                                .getDefaultFeatureType(), DataTypes.STRING);
1014
                assertNotNull("No String attributes found", attr);
1015

    
1016
                updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attr.getName(),
1017
                                getEvaluatorToLower(attr.getName()));
1018

    
1019
                updater.run();
1020
                while (updater.getCurrentStatus() < StoreTask.STATUS_FINISHED_OK
1021
                                && !updater.isOutOfDate()) {
1022
                        Thread.yield();
1023
                        try {
1024
                                Thread.sleep(200);
1025
                        } catch (InterruptedException e) {
1026
                                e.printStackTrace();
1027
                                fail();
1028
                        }
1029
                }
1030
                set = result.getFeatureSet(getDefaultQuery(result));
1031
                DisposableIterator iter = set.iterator();
1032

    
1033
                printFeatureTypeColNames(set.getDefaultFeatureType(), 15);
1034
                Feature f;
1035
                while (iter.hasNext()) {
1036
                        f = (Feature) iter.next();
1037
                        this.printFeature(f, false, 15);
1038
                }
1039

    
1040
                iter.dispose();
1041

    
1042
                FeatureSet originalSet = store.getFeatureSet(getDefaultQuery(store));
1043

    
1044
                DisposableIterator originalIter = originalSet.iterator();
1045

    
1046
                iter = set.iterator();
1047

    
1048
                long i = 0;
1049
                while (originalIter.hasNext()) {
1050
                        try {
1051
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1052
                                                .next(), (Feature) iter.next(), updater, i, size));
1053
                        } catch (EvaluatorException e) {
1054
                                e.printStackTrace();
1055
                                fail();
1056
                        }
1057
                        i++;
1058
                }
1059
                iter.dispose();
1060
                originalIter.dispose();
1061

    
1062

    
1063
                set.dispose();
1064

    
1065
                result.finishEditing();
1066

    
1067
                set = result.getFeatureSet();
1068
                assertEquals(originalSet.getSize(), set.getSize());
1069

    
1070
                originalIter = originalSet.iterator();
1071
                iter = set.iterator();
1072
                i = 0;
1073
                while (originalIter.hasNext()) {
1074
                        try {
1075
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1076
                                                .next(), (Feature) iter.next(), updater, i, size));
1077
                        } catch (EvaluatorException e) {
1078
                                e.printStackTrace();
1079
                                fail();
1080
                        }
1081
                        i++;
1082
                }
1083

    
1084

    
1085
                iter.dispose();
1086
                originalIter.dispose();
1087
                set.dispose();
1088

    
1089

    
1090
                updater = new UpdateFeature("1", result,
1091
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1092

    
1093
                updater.addUpdate(UpdateFeature.UPDATE_ALL_FEATURES, attr.getName(),
1094
                                getEvaluatorToLower(attr.getName()));
1095

    
1096
                updater.run();
1097
                while (updater.getCurrentStatus() < StoreTask.STATUS_FINISHED_OK
1098
                                && !updater.isOutOfDate()) {
1099
                        Thread.yield();
1100
                        try {
1101
                                Thread.sleep(200);
1102
                        } catch (InterruptedException e) {
1103
                                e.printStackTrace();
1104
                                fail();
1105
                        }
1106
                }
1107
                set = result.getFeatureSet();
1108

    
1109
                iter = set.iterator();
1110
                originalIter = originalSet.iterator();
1111
                i = 0;
1112
                while (originalIter.hasNext()) {
1113
                        try {
1114
                                assertTrue("" + i, compareFeatures((Feature) originalIter
1115
                                                .next(), (Feature) iter.next(), updater, i, size));
1116
                        } catch (EvaluatorException e) {
1117
                                e.printStackTrace();
1118
                                fail();
1119
                        }
1120
                        i++;
1121
                }
1122

    
1123
                iter.dispose();
1124
                originalIter.dispose();
1125
                set.dispose();
1126

    
1127

    
1128

    
1129

    
1130

    
1131
                originalSet.dispose();
1132

    
1133
                result.dispose();
1134
                this.clearCopy(store, newParams);
1135
                store.dispose();
1136

    
1137
        }
1138

    
1139

    
1140
        public void testResourceChangeNotification() throws Exception{
1141
                if (!resourcesNotifyChanges()) {
1142
                        return;
1143
                }
1144

    
1145
                DataStoreParameters parameters = null;
1146

    
1147
                parameters = getDefaultDataStoreParameters();
1148

    
1149
                FeatureStore store = (FeatureStore) dataManager.createStore(parameters);
1150

    
1151
                NewFeatureStoreParameters newParams = this
1152
                .getDefaultNewDataStoreParameters();
1153
                try {
1154
                        this.clearCopy(store, newParams);
1155
                } catch (RemoveException e) {
1156
                        // Dp nothing
1157
                }
1158

    
1159
                FeatureStore result = this.getStoreCopy(store, newParams);
1160

    
1161
                FeatureStore result2 = (FeatureStore) dataManager
1162
                .createStore(newParams);
1163

    
1164
                FeatureAttributeDescriptor attr = getFirstAttributeOfType(result
1165
                                .getDefaultFeatureType(), DataTypes.STRING);
1166
                assertNotNull("No String attributes found", attr);
1167

    
1168

    
1169
                UpdateFeature updater = new UpdateFeature("1", result,
1170
                                UpdateFeature.TIME_TO_WAIT_NO_WAIT);
1171

    
1172
                updater.addUpdate(UpdateFeature.UPDATE_LAST_FEATURE, attr.getName(),
1173
                                getEvaluatorToLower(attr.getName()));
1174

    
1175
                StoreObserverForNotify observer = new StoreObserverForNotify(result2,
1176
                                FeatureStoreNotification.RESOURCE_CHANGED);
1177
                result2.addObserver(observer);
1178

    
1179
                result.edit();
1180
                updater.run();
1181
                while (updater.getCurrentStatus() < StoreTask.STATUS_FINISHED_OK
1182
                                && !updater.isOutOfDate()) {
1183
                        Thread.yield();
1184
                        try {
1185
                                Thread.sleep(200);
1186
                        } catch (InterruptedException e) {
1187
                                e.printStackTrace();
1188
                                fail();
1189
                        }
1190
                }
1191

    
1192
                result.finishEditing();
1193

    
1194
                assertTrue("The observer hasn't been notified", observer.notified());
1195

    
1196
                result2.refresh();
1197

    
1198
                FeatureSet set = result.getFeatureSet();
1199
                FeatureSet set2 = result2.getFeatureSet();
1200

    
1201
                DisposableIterator iter1 = set.iterator();
1202
                DisposableIterator iter2 = set2.iterator();
1203
                assertTrue(this.compareFeatureIterators(iter1, iter2));
1204
                iter1.dispose();
1205
                iter2.dispose();
1206

    
1207
                set2.dispose();
1208
                set.dispose();
1209

    
1210
                // TODO checks FeatureType change
1211

    
1212
                result2.dispose();
1213
                result.dispose();
1214
                this.clearCopy(store, newParams);
1215
                store.dispose();
1216
        }
1217

    
1218
        public abstract class StoreObserver implements Observer{
1219

    
1220
                public DataStore store = null;
1221

    
1222
        }
1223

    
1224
        public class StoreObserverForNotify implements Observer{
1225

    
1226
                public DataStore store = null;
1227

    
1228
                public String notifyType = null;
1229

    
1230
                private boolean notifyRecived = false;
1231

    
1232
                public StoreObserverForNotify(DataStore store,String notifyType){
1233
                        this.store = store;
1234
                        this.notifyType = notifyType;
1235
                        this.notifyRecived = false;
1236
                }
1237

    
1238
                public boolean notified(){
1239
                        return notifyRecived;
1240
                }
1241

    
1242
                public void update(Observable observable, Object notification) {
1243
                        if (!(observable == this.store)){
1244
                                return;
1245
                        }
1246
                        if (!(notification instanceof FeatureStoreNotification)){
1247
                                return;
1248
                        }
1249
                        FeatureStoreNotification fsNotification = (FeatureStoreNotification) notification;
1250

    
1251
                        if (fsNotification.getType().equals(this.notifyType)){
1252
                                notifyRecived = true;
1253
                        }
1254
                }
1255

    
1256
        }
1257

    
1258
        public void testUpdateFeatureType_AddField() throws Exception {
1259
                DataStoreParameters parameters = null;
1260

    
1261
                parameters = getDefaultDataStoreParameters();
1262

    
1263
                FeatureStore store = (FeatureStore) dataManager
1264
                .createStore(parameters);
1265

    
1266
                NewFeatureStoreParameters newParams = this
1267
                .getDefaultNewDataStoreParameters();
1268
                try {
1269
                        this.clearCopy(store, newParams);
1270
                } catch (RemoveException e) {
1271
                        // Dp nothing
1272
                }
1273

    
1274
                int pkAttributesCount = 0;
1275

    
1276
                FeatureStore result = this.getStoreCopy(store, newParams);
1277

    
1278
                result.edit();
1279

    
1280

    
1281
                String[] orgAttNames = new String[result.getDefaultFeatureType()
1282
                                                  .size()];
1283

    
1284
                Iterator iter = result.getDefaultFeatureType().iterator();
1285
                int i = 0;
1286

    
1287
                while (iter.hasNext()) {
1288
                        FeatureAttributeDescriptor attr = ((FeatureAttributeDescriptor) iter
1289
                                        .next());
1290
                        orgAttNames[i] = attr.getName();
1291
                        i++;
1292
                        if (attr.isPrimaryKey()) {
1293
                                pkAttributesCount++;
1294
                        }
1295
                }
1296

    
1297
                EditableFeatureType edFtype = result
1298
                .getDefaultFeatureType().getEditable();
1299

    
1300
                edFtype.add("__ATTR1__", DataTypes.STRING).setSize(10)
1301
                .setDefaultValue(
1302
                                "HOLA");
1303

    
1304
                result.update(edFtype);
1305

    
1306
                assertEquals(store.getDefaultFeatureType().size() + 1, result
1307
                                .getDefaultFeatureType().size());
1308

    
1309
                testIterationFastAndStandart(result);
1310

    
1311
                FeatureSet orgSet = store.getFeatureSet(getDefaultQuery(store));
1312
                FeatureSet curSet = result.getFeatureSet(getDefaultQuery(result));
1313

    
1314
                assertEquals(orgSet.getDefaultFeatureType().size() + 1, curSet
1315
                                .getDefaultFeatureType().size());
1316

    
1317
                DisposableIterator orgIter = orgSet.iterator();
1318
                DisposableIterator curIter = curSet.iterator();
1319

    
1320
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1321

    
1322
                orgIter.dispose();
1323
                curIter.dispose();
1324

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

    
1328
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1329
                orgIter.dispose();
1330
                curIter.dispose();
1331

    
1332
                orgIter = orgSet.iterator();
1333
                curIter = curSet.fastIterator();
1334

    
1335
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1336
                orgIter.dispose();
1337
                curIter.dispose();
1338

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

    
1342
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1343
                orgIter.dispose();
1344
                curIter.dispose();
1345

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

    
1355
                FeatureQuery query = this.getDefaultQuery(result);
1356
                query.setAttributeNames(new String[] { "__ATTR1__" });
1357
                curSet = result.getFeatureSet(query);
1358

    
1359
                assertEquals(1 + pkAttributesCount, curSet.getDefaultFeatureType()
1360
                                .size());
1361

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

    
1371
                result.finishEditing();
1372

    
1373
                testIterationFastAndStandart(result);
1374

    
1375
                assertEquals(store.getDefaultFeatureType().size() + 1, result
1376
                                .getDefaultFeatureType().size());
1377

    
1378

    
1379
                orgSet = store.getFeatureSet(getDefaultQuery(store));
1380
                curSet = result.getFeatureSet(getDefaultQuery(result));
1381

    
1382
                assertEquals(orgSet.getDefaultFeatureType().size() + 1, curSet
1383
                                .getDefaultFeatureType().size());
1384

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

    
1388
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1389
                orgIter.dispose();
1390
                curIter.dispose();
1391

    
1392
                orgIter = orgSet.fastIterator();
1393
                curIter = curSet.fastIterator();
1394

    
1395
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1396
                orgIter.dispose();
1397
                curIter.dispose();
1398

    
1399
                orgIter = orgSet.iterator();
1400
                curIter = curSet.fastIterator();
1401

    
1402
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1403
                orgIter.dispose();
1404
                curIter.dispose();
1405

    
1406
                orgIter = orgSet.fastIterator();
1407
                curIter = curSet.iterator();
1408

    
1409
                assertTrue(compareFeatureIterators(orgIter, curIter, orgAttNames));
1410
                orgIter.dispose();
1411
                curIter.dispose();
1412

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

    
1421
                query = this.getDefaultQuery(result);
1422
                query.setAttributeNames(new String[] { "__ATTR1__" });
1423
                curSet = result.getFeatureSet(query);
1424

    
1425
                assertEquals(1 + pkAttributesCount, curSet.getDefaultFeatureType()
1426
                                .size());
1427

    
1428
                assertEquals(orgSet.getSize(), curSet.getSize());
1429
                curIter = curSet.iterator();
1430
                while (curIter.hasNext()) {
1431
                        feature = (Feature) curIter.next();
1432
                        assertEquals("HOLA", feature.get("__ATTR1__"));
1433
                }
1434
                curIter.dispose();
1435
                curSet.dispose();
1436

    
1437
                orgSet.dispose();
1438
                result.dispose();
1439
                this.clearCopy(store, newParams);
1440
                store.dispose();
1441

    
1442

    
1443
        }
1444

    
1445
        public void testResourcesLocks() throws Exception {
1446

    
1447

    
1448
        }
1449

    
1450
}