Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libDataSourceBaseDrivers / src / org / gvsig / data / datastores / vectorial / file / dbf / DBFFeatureCollectionBitSet.java @ 20467

History | View | Annotate | Download (4.42 KB)

1
package org.gvsig.data.datastores.vectorial.file.dbf;
2

    
3
import java.util.ArrayList;
4
import java.util.BitSet;
5
import java.util.Collection;
6
import java.util.Iterator;
7
import java.util.NoSuchElementException;
8

    
9
import org.gvsig.data.ComplexObservable;
10
import org.gvsig.data.exception.ReadException;
11
import org.gvsig.data.vectorial.AbstractFeatureCollection;
12
import org.gvsig.data.vectorial.IFeature;
13
import org.gvsig.data.vectorial.IFeatureID;
14
import org.gvsig.data.vectorial.IFeatureType;
15
import org.gvsig.data.vectorial.expressionevaluator.FeatureFilter;
16

    
17

    
18
//FIXME: OJO Excepciones
19
public class DBFFeatureCollectionBitSet extends AbstractFeatureCollection {
20
        protected BitSet bitSet=new BitSet();
21
        protected ComplexObservable observable = new ComplexObservable();
22
//        protected Collection featureIDs;//<IFeatureID>
23
        protected IFeatureType featureType;
24
private DBFStore store;
25
private String filter;
26
private FeatureFilter parser;
27
private long driverFeatureCount;
28

    
29
        public DBFFeatureCollectionBitSet(DBFStore store,IFeatureType type, String filter) throws ReadException {
30
                this.featureType=type;
31
                this.filter=filter;
32
                if (this.filter!=null)
33
                        parser = new FeatureFilter(filter,this.featureType);
34
                driverFeatureCount=store.getFeatureCount();
35
                this.store=store;
36
                intilizeFeatureIDs();
37

    
38
        }
39

    
40
        protected void intilizeFeatureIDs() throws ReadException {
41
                try{
42
                        bitSet.clear();
43
                        if (filter==null){
44
                                for (int i = 0; i < driverFeatureCount; i++) {
45
                                        bitSet.set(i);
46
                                }
47
                        }else{
48
                                for (int i = 0; i < driverFeatureCount; i++) {
49
                                        DBFFeatureID featureID=(DBFFeatureID)createCurrentFeatureID(i);
50
                                        if (parser.match(featureID.getFeature(featureType))){
51
                                                bitSet.set(i);
52
                                        }
53
                                }
54
                        }
55
                }catch (Exception e) {
56
                        throw new ReadException("DBFFeatureCollectionBitSet",e);
57
                }
58
        }
59

    
60
        protected IFeatureID createCurrentFeatureID(long pos){
61
                if (pos<driverFeatureCount){
62
                        return new DBFFeatureID((DBFStore)store,pos);
63
                } else {
64
                        return null;
65
                }
66
        }
67

    
68
        public int size() {
69
                return bitSet.cardinality();
70
        }
71

    
72
        public boolean isEmpty() {
73
                return bitSet.isEmpty();
74
        }
75

    
76
        public boolean contains(Object o) {
77
                if (o instanceof IFeature){
78
                        return bitSet.get((int)((DBFFeatureID)((IFeature)o).getID()).getIndex());
79
                }
80
                return false;
81
        }
82

    
83
        public Iterator iterator() {
84
                DBFBitSetIterator dbfIter=new DBFBitSetIterator(bitSet);
85
                return dbfIter;
86
        }
87

    
88
        public Object[] toArray() {
89
                ArrayList features= new ArrayList();
90
                Iterator iterator= this.iterator();
91
                while(iterator.hasNext()){
92
                        IFeature feature=(IFeature)iterator.next();
93
                        features.add(feature);
94
                }
95
                return features.toArray();
96
        }
97

    
98
        public Object[] toArray(Object[] a) {
99
                ArrayList features= new ArrayList();
100
                Iterator iterator= this.iterator();
101
                while(iterator.hasNext()){
102
                        IFeature feature=(IFeature)iterator.next();
103
                        features.add(feature);
104
                }
105
                return features.toArray(a);
106
        }
107

    
108
        public boolean add(Object o) {
109
                throw new UnsupportedOperationException();
110
        }
111

    
112
        public boolean remove(Object o) {
113
                throw new UnsupportedOperationException();
114
        }
115

    
116
        public boolean containsAll(Collection c) {
117
                Iterator iter = c.iterator();
118
                while (iter.hasNext()){
119
                        if (!this.contains(iter.next())){
120
                                return false;
121
                        }
122
                }
123
                return true;
124
        }
125

    
126
        public boolean addAll(Collection c) {
127
                throw new UnsupportedOperationException();
128
        }
129

    
130
        public boolean removeAll(Collection c) {
131
                throw new UnsupportedOperationException();
132
        }
133

    
134
        public boolean retainAll(Collection c) {
135
                throw new UnsupportedOperationException();
136
        }
137

    
138
        public void clear() {
139
                throw new UnsupportedOperationException();
140
        }
141

    
142
        private class DBFBitSetIterator implements Iterator{
143
                private BitSet bs;
144
                private int current=-1;
145
                public DBFBitSetIterator(BitSet bitSet){
146
                        this.bs=bitSet;
147
                }
148
                public boolean hasNext() {
149
                        return (bs.nextSetBit(current+1) >= 0);
150
                }
151

    
152

    
153
                public Object next() {
154
                        DBFFeature feature=null;
155
                        if (!this.hasNext()){
156
                                throw new NoSuchElementException();
157
                        }
158

    
159
                        current = bs.nextSetBit(current+1);
160

    
161
                        try {
162
                                feature = new DBFFeature(featureType,store,current);
163
                        } catch (ReadException e) {
164
                                throw new RuntimeException(e);
165
                        }
166
                        return feature;
167
                }
168

    
169
                public void remove() {
170
                        throw new UnsupportedOperationException();
171
                }
172
        }
173

    
174
        public void dispose() {
175
                observable.deleteObservers();
176
                this.observable = null;
177
                this.bitSet.clear();
178
                this.featureType = null;
179

    
180
        }
181

    
182
}