Statistics
| Revision:

root / trunk / libraries / libDataSourceBaseDrivers / src / org / gvsig / data / datastores / vectorial / file / dbf / DBFFeatureCollectionBitSet.java @ 20602

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.exception.ReadException;
10
import org.gvsig.data.vectorial.AbstractFeatureCollection;
11
import org.gvsig.data.vectorial.IFeature;
12
import org.gvsig.data.vectorial.IFeatureID;
13
import org.gvsig.data.vectorial.IFeatureType;
14
import org.gvsig.data.vectorial.expressionevaluator.FeatureFilter;
15
import org.gvsig.util.observer.Observable;
16

    
17

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

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

    
37
        }
38

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
151

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

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

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

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

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

    
179
        }
180

    
181
}