Statistics
| Revision:

root / trunk / libraries / libDataSourceDBBaseDrivers / src / org / gvsig / data / datastores / vectorial / db / jdbc / AbstractJDBCDataFeatureCollectionWithFeatureID.java @ 19975

History | View | Annotate | Download (3.44 KB)

1
package org.gvsig.data.datastores.vectorial.db.jdbc;
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.exception.ReadException;
11
import org.gvsig.data.vectorial.IFeature;
12
import org.gvsig.data.vectorial.IFeatureCollection;
13
import org.gvsig.data.vectorial.IFeatureID;
14
import org.gvsig.data.vectorial.IFeatureType;
15
import org.gvsig.data.vectorial.expansionadapter.FeatureManager;
16
import org.gvsig.data.vectorial.filter.FeatureFilterParser;
17
import org.gvsig.data.vectorial.order.FeatureComparator;
18

    
19
public abstract class AbstractJDBCDataFeatureCollectionWithFeatureID extends
20
                AbstractJDBCDataFeatureCollection {
21

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

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

    
28
        protected void init(FeatureManager fm, JDBCStore store, IFeatureType type, String filter, String order) throws ReadException {
29
                this.store=store;
30
                this.featureType= type;
31
                FeatureFilterParser 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 FeatureFilterParser(filter,featureType);
48
                }
49
                for (int i=0;i<fm.getNum();i++){
50
                        feature = fm.getFeature(i);
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
                return featureIDs.size();
93
        }
94

    
95
        public Iterator iterator() {
96
                FIDIterator dbfIter=new FIDIterator(featureIDs.iterator());
97
                return dbfIter;
98
        }
99

    
100
        public class FIDIterator implements Iterator{
101
                private Iterator iter;
102

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

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

    
116
                public Object next() {
117
                        checkModified();
118

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

    
129
                public void remove() {
130
                        throw new UnsupportedOperationException();
131
                }
132

    
133
        }
134

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