Statistics
| Revision:

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

History | View | Annotate | Download (4.25 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

    
8
import org.gvsig.data.ComplexObservable;
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

    
16

    
17
//FIXME: OJO Excepciones
18
public class DBFFeatureCollectionBitSet extends AbstractFeatureCollection {
19
        protected BitSet bitSet=new BitSet();
20
        protected ComplexObservable observable = new ComplexObservable();
21
//        protected Collection featureIDs;//<IFeatureID>
22
        protected IFeatureType featureType;
23
private DBFStore store;
24
private String filter;
25
private FeatureFilter parser;
26
private 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
                                        DBFFeatureID featureID=(DBFFeatureID)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 i=0;
144
                public DBFBitSetIterator(BitSet bitSet){
145
                        this.bs=bitSet;
146
                }
147
                public boolean hasNext() {
148
                        i=bs.nextSetBit(i);
149
                        return (i >= 0);
150
                }
151

    
152
                public Object next() {
153
                        DBFFeature feature=null;
154
                        try {
155
                                feature = new DBFFeature(featureType,store,i);
156
                        } catch (ReadException e) {
157
                                throw new RuntimeException(e);
158
                        }
159
                        return feature;
160
                }
161

    
162
                public void remove() {
163
                        throw new UnsupportedOperationException();
164
                }
165
        }
166

    
167
        public void dispose() {
168
                observable.deleteObservers();
169
                this.observable = null;
170
                this.bitSet.clear();
171
                this.featureType = null;
172

    
173
        }
174

    
175
}