Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / impl / featureset / EditedIterator.java @ 27525

History | View | Annotate | Download (2.75 KB)

1
package org.gvsig.fmap.dal.feature.impl.featureset;
2

    
3
import java.util.Iterator;
4

    
5
import org.gvsig.fmap.dal.exception.DataException;
6
import org.gvsig.fmap.dal.feature.DisposableIterator;
7
import org.gvsig.fmap.dal.feature.FeatureReference;
8
import org.gvsig.fmap.dal.feature.impl.DefaultFeature;
9
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureReference;
10
import org.gvsig.fmap.dal.feature.spi.FeatureData;
11

    
12
public class EditedIterator extends FilteredIterator {
13

    
14
        Iterator newsFeatures;
15
        boolean featureIsNew;
16

    
17

    
18
        public EditedIterator(DefaultFeatureSet featureSet) {
19
                super(featureSet);
20
        }
21

    
22
        public EditedIterator(DefaultFeatureSet featureSet, long index)
23
                        throws DataException {
24
                super(featureSet);
25
                this.newsFeatures = null;
26
                if (index > 0) {
27
                        if (featureSet.provider.canIterateFromIndex()) {
28
                                try {
29
                                        this.iterator = featureSet.provider.iterator(index);
30
                                } catch (IllegalArgumentException e) {
31
                                        this.iterator = featureSet.provider.iterator();
32
                                        skypto(index);
33
                                } catch (UnsupportedOperationException e) {
34
                                        this.iterator = featureSet.provider.iterator();
35
                                        skypto(index);
36
                                }
37
                        } else {
38
                                this.iterator = featureSet.provider.iterator();
39
                                skypto(index);
40
                        }
41
                } else {
42
                        this.iterator = featureSet.provider.iterator();
43
                }
44

    
45
        }
46

    
47
        protected Iterator getIterator() {
48
                if (this.featureIsNew){
49
                        return this.newsFeatures;
50
                } else if (this.iterator.hasNext()) {
51
                        featureIsNew=false;
52
                        return this.iterator;
53
                } else{
54
                        featureIsNew = true;
55
                        this.newsFeatures = this.fset.store.getFeatureManager()
56
                                        .getInserted();
57
                        return this.newsFeatures;
58
                }
59
        }
60

    
61
        protected DefaultFeature createFeature(FeatureData data) {
62

    
63
                DefaultFeature f = null;
64
                data.setNew(featureIsNew);
65
                try {
66
                        FeatureReference ref = new DefaultFeatureReference(fset.store, data);
67
                        f = (DefaultFeature) fset.store.getFeatureManager().get(ref,
68
                                        fset.store, data.getType());
69
                } catch (DataException e) {
70
                        RuntimeException ex = new RuntimeException();
71
                        e.initCause(e);
72
                        throw ex;
73
                }
74
                if (f == null) {
75
                        // La feature no se ha editado.
76
                        f = new DefaultFeature(fset.store, data);
77
                }
78
                return f;
79
        }
80

    
81
        protected boolean isDeletedOrHasToSkip(FeatureData data) {
82

    
83
                // XXX
84
                // si recorriendo los originales nos
85
                // encontramos uno nuevo, no lo devolvemos
86
                // porque se recorrera mas tarde.
87
                // Esto es una interaccion con los indices
88
                // ya que estos contienen todas las features ya
89
                // sea nuevas o no
90

    
91
                if (data.isNew() && !featureIsNew) {
92
                        return true;
93
                }
94
                FeatureReference ref = new DefaultFeatureReference(fset.store, data);
95
                return fset.store.getFeatureManager().isDeleted(ref);
96
        }
97

    
98
        public void dispose() {
99
                super.dispose();
100
                if (newsFeatures instanceof DisposableIterator) {
101
                        ((DisposableIterator) newsFeatures).dispose();
102
                }
103
                newsFeatures = null;
104
        }
105

    
106

    
107
}