Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dataDB / src / org / gvsig / data / datastores / vectorial / db / DBDataFeatureCollectionWithFeatureID.java @ 20973

History | View | Annotate | Download (3.44 KB)

1
package org.gvsig.data.datastores.vectorial.db;
2

    
3
import java.util.ArrayList;
4
import java.util.Collection;
5
import java.util.Comparator;
6
import java.util.ConcurrentModificationException;
7
import java.util.Iterator;
8
import java.util.TreeSet;
9

    
10
import org.gvsig.data.ReadException;
11
import org.gvsig.data.vectorial.FeatureManager;
12
import org.gvsig.data.vectorial.IFeature;
13
import org.gvsig.data.vectorial.IFeatureCollection;
14
import org.gvsig.data.vectorial.IFeatureID;
15
import org.gvsig.data.vectorial.IFeatureType;
16
import org.gvsig.data.vectorial.expressionevaluator.FeatureComparator;
17
import org.gvsig.data.vectorial.expressionevaluator.FeatureFilter;
18

    
19
public abstract class DBDataFeatureCollectionWithFeatureID extends
20
                DBDataFeatureCollection {
21

    
22
        protected DBStore store;
23
        protected Collection featureIDs;
24
        protected IFeatureType featureType;
25

    
26
        protected abstract IFeatureCollection newBaseDataFeatureCollection(DBStore store,IFeatureType featureType,String filter,String order);
27

    
28
        protected void init(FeatureManager fm, DBStore store, IFeatureType type, String filter, String order) throws ReadException {
29
                this.store=store;
30
                this.featureType= type;
31
                FeatureFilter parser = null;
32
                IFeature feature;
33
                Collection tmpFeatures;
34
                if (order == null){
35
                        if (filter == null){
36
                                tmpFeatures = new ArrayList(); // Si queremos optimizar deberiamos inicializar
37
                                // el tama?o
38
                        } else {
39
                                tmpFeatures = new ArrayList();
40
                        }
41
                } else {
42
                        Comparator comparator = new FeatureComparator(this.featureType,order);
43
                        tmpFeatures = new TreeSet(comparator);
44
                }
45

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

    
62

    
63
                }
64

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

    
78
                if (order != null){
79
                        featureIDs = new ArrayList();
80
                        iter = tmpFeatures.iterator();
81
                        while (iter.hasNext()){
82
                                featureIDs.add(((IFeature)iter.next()).getID());
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
                return dbfIter;
100
        }
101

    
102
        public class FIDIterator implements Iterator{
103
                private Iterator iter;
104

    
105
                public FIDIterator(Iterator iter){
106
                        this.iter=iter;
107
                }
108
                public boolean hasNext() {
109
                        checkModified();
110
                        return iter.hasNext();
111
                }
112

    
113
                protected void checkModified(){
114
                        if (modified)
115
                                throw new ConcurrentModificationException("FeatureCollection modified");
116
                }
117

    
118
                public Object next() {
119
                        checkModified();
120

    
121
                        IFeatureID fid= (IFeatureID)iter.next();
122
                        IFeature feature;
123
                        try {
124
                                feature = fid.getFeature(featureType);
125
                        } catch (ReadException e) {
126
                                throw new RuntimeException(e);
127
                        }
128
                        return feature;
129
                }
130

    
131
                public void remove() {
132
                        throw new UnsupportedOperationException();
133
                }
134

    
135
        }
136

    
137
        public void dispose(){
138
                this.store.deleteObserver(this);
139
                this.store = null;
140
                this.featureType = null;
141
        }
142
}