Statistics
| Revision:

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

History | View | Annotate | Download (2.83 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.tools.dispose.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.FeatureProvider;
11
import org.gvsig.tools.exception.BaseException;
12

    
13
public class EditedIterator extends FilteredIterator {
14

    
15
        Iterator newsFeatures;
16
        boolean featureIsNew;
17

    
18

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

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

    
46
        }
47

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

    
62
        protected DefaultFeature createFeature(FeatureProvider data) {
63

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

    
82
        protected boolean isDeletedOrHasToSkip(FeatureProvider data) {
83

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

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

    
99
        protected void doDispose() throws BaseException {
100
                super.doDispose();
101
                if (newsFeatures instanceof DisposableIterator) {
102
                        ((DisposableIterator) newsFeatures).dispose();
103
                }
104
                newsFeatures = null;
105
        }
106

    
107

    
108
}