Statistics
| Revision:

gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.extension / src / main / java / org / gvsig / geoprocess / core / gvFeatureIterator.java @ 172

History | View | Annotate | Download (4.51 KB)

1
package org.gvsig.geoprocess.core;
2

    
3
import java.util.ArrayList;
4
import java.util.Iterator;
5
import java.util.List;
6
import java.util.NoSuchElementException;
7

    
8
import com.vividsolutions.jts.geom.Geometry;
9

    
10
import es.unex.sextante.core.Sextante;
11
import es.unex.sextante.dataObjects.FeatureImpl;
12
import es.unex.sextante.dataObjects.IFeature;
13
import es.unex.sextante.dataObjects.IFeatureIterator;
14
import es.unex.sextante.dataObjects.vectorFilters.IVectorLayerFilter;
15

    
16
import org.gvsig.fmap.dal.exception.DataException;
17
import org.gvsig.fmap.dal.feature.Feature;
18
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
19
import org.gvsig.fmap.dal.feature.FeatureSet;
20
import org.gvsig.fmap.dal.feature.FeatureType;
21
import org.gvsig.fmap.geom.operation.tojts.ToJTS;
22
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
23
import org.gvsig.tools.dispose.DisposableIterator;
24

    
25
public class gvFeatureIterator implements IFeatureIterator {
26

    
27
    private final List<IVectorLayerFilter> m_Filters;
28
    private boolean m_bIsNextConsumed;
29
    private IFeature m_CurrentValue;
30
    private boolean m_bFinished;
31
    private DisposableIterator m_FeatureIterator;
32

    
33
    public gvFeatureIterator(final FLyrVect layer,
34
        final List<IVectorLayerFilter> filters) {
35

    
36
        m_bIsNextConsumed = true;
37
        m_Filters = filters;
38

    
39
        FeatureSet set = null;
40
        try {
41
            set = layer.getFeatureStore().getFeatureSet();
42
            m_FeatureIterator = set.fastIterator();
43
        } catch (final DataException e) {
44
            if (m_FeatureIterator != null) {
45
                m_FeatureIterator.dispose();
46
            }
47
            if (set != null) {
48
                set.dispose();
49
            }
50
        }
51
    }
52

    
53
    public gvFeatureIterator() {
54

    
55
        m_Filters = null;
56

    
57
    }
58

    
59
    private boolean accept(final IFeature value) {
60

    
61
        for (final IVectorLayerFilter filter : m_Filters) {
62
            if (!filter.accept(value, 0)) {
63
                return false;
64
            }
65
        }
66
        return true;
67
    }
68

    
69
    public boolean moveToNextValid() {
70

    
71
        if (m_FeatureIterator == null) {
72
            return false;
73
        }
74

    
75
        boolean bFound = false;
76
        ;
77
        while (!bFound && m_FeatureIterator.hasNext()) {
78
            try {
79
                final Feature f = (Feature) m_FeatureIterator.next();
80
                final org.gvsig.fmap.geom.Geometry geometry =
81
                    f.getDefaultGeometry();
82
                final Geometry geom =
83
                    (Geometry) geometry.invokeOperation(ToJTS.CODE, null);
84
                final FeatureType type = f.getType();
85
                @SuppressWarnings("unchecked")
86
                final Iterator<FeatureAttributeDescriptor> iter =
87
                    type.iterator();
88
                final ArrayList<Object> objects = new ArrayList<Object>();
89
                while (iter.hasNext()) {
90
                    final FeatureAttributeDescriptor descriptor = iter.next();
91
                    final String name = descriptor.getName();
92
                    // Comment this as if the geometry field is in the middle of
93
                    // the fields it will be problematic elsewhere
94
                    if (!type.getDefaultGeometryAttributeName().equals(name)) {
95
                        objects.add(f.get(name));
96
                    }
97
                }
98
                final FeatureImpl feature =
99
                    new FeatureImpl(geom, objects.toArray(new Object[0]));
100
                if (accept(feature)) {
101
                    bFound = true;
102
                    m_CurrentValue = feature;
103
                    m_bIsNextConsumed = false;
104
                }
105
            } catch (final Exception e) {
106
                Sextante.addErrorToLog(e);
107
                return false;
108
            }
109
        }
110
        if (!bFound) {
111
            m_bFinished = true;
112
        }
113
        return bFound;
114
    }
115

    
116
    public IFeature next() {
117

    
118
        if (!m_bIsNextConsumed) {
119
            m_bIsNextConsumed = true;
120
            return m_CurrentValue;
121
        }
122

    
123
        if (!m_bFinished) {
124
            if (moveToNextValid()) {
125
                m_bIsNextConsumed = true;
126
                return m_CurrentValue;
127
            }
128
        }
129

    
130
        throw new NoSuchElementException();
131
    }
132

    
133
    public boolean hasNext() {
134

    
135
        if (m_bFinished) {
136
            return false;
137
        }
138

    
139
        if (!m_bIsNextConsumed) {
140
            return true;
141
        }
142

    
143
        return moveToNextValid();
144

    
145
    }
146

    
147
    public void close() {
148
    }
149

    
150
}