Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_daldb / src / org / gvsig / fmap / data / feature / db / DBDataFeatureCollectionWithFeatureID.java @ 24491

History | View | Annotate | Download (4.09 KB)

1
package org.gvsig.fmap.data.feature.db;
2

    
3
import java.util.*;
4

    
5
import org.gvsig.fmap.dal.DataStore;
6
import org.gvsig.fmap.dal.exceptions.ReadException;
7
import org.gvsig.fmap.dal.feature.Feature;
8
import org.gvsig.fmap.dal.feature.FeatureSet;
9
import org.gvsig.fmap.dal.feature.FeatureType;
10
import org.gvsig.fmap.dal.feature.expressionevaluator.Filter;
11
import org.gvsig.fmap.dal.feature.impl.AbstractFeatureIDIterator;
12
import org.gvsig.fmap.dal.feature.impl.FeatureManager;
13
import org.gvsig.fmap.dal.impl.DefaultDataManager;
14

    
15
public abstract class DBDataFeatureCollectionWithFeatureID extends
16
                DBDataFeatureCollection {
17

    
18
        protected DBStore store;
19
        protected Collection featureIDs;
20
        protected FeatureType featureType;
21

    
22
        protected abstract FeatureSet newBaseDataFeatureCollection(DBStore store,FeatureType featureType,String filter,String order);
23

    
24
        protected void init(FeatureManager fm, DBStore store, FeatureType type, String filter, String order) throws ReadException {
25
                this.store=store;
26
                this.featureType= type;
27

    
28
                DefaultDataManager manager = DefaultDataManager.getManager();
29

    
30
                Filter parser = null;
31
                Feature feature;
32
                Collection tmpFeatures;
33
                if (order == null){
34
                        if (filter == null){
35
                                tmpFeatures = new ArrayList(); // Si queremos optimizar deberiamos inicializar
36
                                // el tama?o
37
                        } else {
38
                                tmpFeatures = new ArrayList();
39
                        }
40
                } else {
41
                        Comparator comparator = manager.getExpressionParser()
42
                                        .parseComparator(order);
43
                        tmpFeatures = new TreeSet(comparator);
44
                }
45

    
46
                if (filter != null && filter != ""){
47
                        parser = manager.getExpressionParser().parseFilter(filter);
48
                }
49
                for (int i=0;i<fm.getNum();i++){
50
                        feature = fm.get(i,store,this.featureType);
51
                        if (fm.isDeleted(feature)){
52
                                continue;
53
                        }
54
                        if (parser == null || parser.evaluate(feature)) {
55
                                if (order != null){
56
                                        tmpFeatures.add(feature);
57
                                } else {
58
                                        tmpFeatures.add(feature.getReference());
59
                                }
60
                        }
61

    
62

    
63
                }
64

    
65
                FeatureSet coll = this.newBaseDataFeatureCollection(store, featureType, filter, order);
66
                Iterator iter = coll.iterator();
67
                while (iter.hasNext()){
68
                        feature =(Feature)iter.next();
69
                        if (!fm.isDeleted(feature)){
70
                                if (order != null){
71
                                        tmpFeatures.add(feature);
72
                                } else {
73
                                        tmpFeatures.add(feature.getReference());
74
                                }
75
                        }
76
                }
77

    
78
                if (order != null){
79
                        featureIDs = new ArrayList();
80
                        iter = tmpFeatures.iterator();
81
                        while (iter.hasNext()){
82
                                featureIDs.add(((Feature)iter.next()).getReference());
83
                        }
84
                } else {
85
                        featureIDs = tmpFeatures;
86
                }
87

    
88

    
89
        }
90

    
91
        public int size() {
92
                checkModified();
93
                return featureIDs.size();
94
        }
95

    
96
        public Iterator iterator() {
97
                checkModified();
98
                FIDIterator dbfIter = new FIDIterator(featureIDs.iterator(),
99
                                this.featureType);
100
                return dbfIter;
101
        }
102
        
103
        protected Iterator internalIterator(int index) {
104
        checkModified();
105
        FIDIterator dbfIter;
106

    
107

    
108
        if (featureIDs instanceof List) {
109
            dbfIter = new FIDIterator(((List) featureIDs).listIterator(index),
110
                    featureType);
111
        } else {
112
            // TODO: If featureIDs is not a Collection of type List (actually,
113
            // only when ordering is applied), we are not able
114
            // to get a listIterator with an index, so we have to move the
115
            // iterator to the required position. This option will be probably
116
            // a lot slower, so an option would be to order with a List
117
            // instead of a TreeSet.
118
            Iterator iter = featureIDs.iterator();
119
            for (int i = 0; i < index; i++) {
120
                iter.next();
121
            }
122

    
123
            dbfIter = new FIDIterator(iter, featureType);
124
        }
125

    
126
        return dbfIter;
127
        }
128

    
129
        public class FIDIterator extends AbstractFeatureIDIterator {
130

    
131
                public FIDIterator(Iterator iter, FeatureType featureType) {
132
                        super(iter, featureType);
133
                }
134

    
135
                protected void checkModified() {
136
                        DBDataFeatureCollectionWithFeatureID.this.checkModified();
137
                }
138

    
139
        }
140

    
141
        public void dispose(){
142
                this.store.deleteObserver(this);
143
                this.store = null;
144
                this.featureType = null;
145
        }
146

    
147

    
148
        public boolean isFromStore(DataStore store) {
149
                return this.store.equals(store);
150
        }
151

    
152
        public FeatureType getDefaultFeatureType() {
153
                return this.featureType;
154
        }
155
}