Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / feature / impl / featureset / EditedIterator.java @ 45989

History | View | Annotate | Download (6.81 KB)

1 40559 jjdelcerro
/**
2
 * gvSIG. Desktop Geographic Information System.
3 40435 jjdelcerro
 *
4 40559 jjdelcerro
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6 40435 jjdelcerro
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8 40559 jjdelcerro
 * as published by the Free Software Foundation; either version 3
9 40435 jjdelcerro
 * of the License, or (at your option) any later version.
10 40559 jjdelcerro
 *
11 40435 jjdelcerro
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15 40559 jjdelcerro
 *
16 40435 jjdelcerro
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18 40559 jjdelcerro
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 40435 jjdelcerro
 * MA  02110-1301, USA.
20 40559 jjdelcerro
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23 40435 jjdelcerro
 */
24
package org.gvsig.fmap.dal.feature.impl.featureset;
25
26 45989 fdiaz
import java.util.HashSet;
27 40435 jjdelcerro
import java.util.Iterator;
28 45989 fdiaz
import java.util.Set;
29 45765 fdiaz
import java.util.logging.Level;
30
import java.util.logging.Logger;
31 40435 jjdelcerro
import org.gvsig.fmap.dal.exception.DataException;
32 45739 jjdelcerro
import org.gvsig.fmap.dal.feature.EditableFeature;
33 45688 fdiaz
import org.gvsig.fmap.dal.feature.FeatureReference;
34 40435 jjdelcerro
import org.gvsig.fmap.dal.feature.exception.ConcurrentDataModificationException;
35
import org.gvsig.fmap.dal.feature.impl.DefaultFeature;
36
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
37 43840 jjdelcerro
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureManager;
38 45688 fdiaz
import org.gvsig.fmap.dal.feature.impl.featurereference.FeatureReferenceFactory;
39 40435 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
40 45989 fdiaz
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
41 40435 jjdelcerro
import org.gvsig.tools.exception.BaseException;
42 45522 fdiaz
import org.gvsig.tools.util.ChainedIterator;
43 40435 jjdelcerro
44
/**
45
 * Iterator for stores in edition mode.
46
 *
47
 * @author gvSIG Team
48
 * @version $Id$
49
 * @deprecated use the {@link FastEditedIterator} instead
50
 */
51
public class EditedIterator extends FilteredIterator {
52
53
    private DefaultFeatureStore store;
54
    protected FeatureManager featureManager;
55 45989 fdiaz
    private Set<FeatureReference> visitedReferences;
56
57 40435 jjdelcerro
    public EditedIterator(DefaultFeatureSet featureSet) {
58
        super(featureSet);
59
        this.store = featureSet.store;
60
        this.featureManager = this.store.getFeatureManager();
61 45989 fdiaz
        this.visitedReferences = new HashSet<>();
62 40435 jjdelcerro
    }
63
64 45989 fdiaz
    public EditedIterator(DefaultFeatureSet featureSet, long index, long elements)
65 40435 jjdelcerro
        throws DataException {
66
        this(featureSet);
67 40629 jldominguez
68 45739 jjdelcerro
        Iterator<EditableFeature> insertedFeatures = this.featureManager.getInsertedFeatures();//Don't use getInserteds because referenceFeature will be missed
69
        Iterator<EditableFeature> updatedFeatures = this.featureManager.getUpdatedFeatures();
70 45989 fdiaz
        final Iterator<FeatureProvider> providerIterator;
71
        FeatureSetProvider provider = featureSet.provider;
72
        boolean canDelegateInProvider = provider.canFilter() && provider.canIterateFromIndex() && !featureManager.hasDeleteds();
73
        if (canDelegateInProvider) {
74
            providerIterator = provider.iterator(index, elements);
75
        } else {
76
            providerIterator = provider.iterator();
77
        }
78
79
80 45522 fdiaz
        Iterator<FeatureProvider> wrappedProviderIterator = new Iterator<FeatureProvider>() {
81
            @Override
82
            public boolean hasNext() {
83
                return providerIterator.hasNext();
84
            }
85 40629 jldominguez
86 45522 fdiaz
            @Override
87
            public FeatureProvider next() {
88 45765 fdiaz
                FeatureProvider data = providerIterator.next();
89
                FeatureReference ref = FeatureReferenceFactory.createFromFeatureProvider(store, data);
90
                DefaultFeature modified;
91
                try {
92
                    modified = featureManager.get(ref, store);
93
                } catch (DataException ex) {
94
                    return data;
95
                }
96
                if (modified != null) {
97 45989 fdiaz
                    visitedReferences.add(ref);
98 45765 fdiaz
                    return modified.getData();
99
                }
100
                return data;
101 40435 jjdelcerro
            }
102
103 45522 fdiaz
            @Override
104
            public void remove() {
105
                EditedIterator.super.remove();
106
            }
107
        };
108 45989 fdiaz
        this.iterator = new ChainedIterator(wrappedProviderIterator, insertedFeatures, updatedFeatures);
109
        if (!canDelegateInProvider) {
110
            if (index > 0) {
111
                skypto(index);
112
            }
113 45522 fdiaz
        }
114 40435 jjdelcerro
    }
115
116 45522 fdiaz
    @Override
117 40435 jjdelcerro
    public void remove() {
118 45522 fdiaz
        this.iterator.remove();
119 40435 jjdelcerro
    }
120
121 45522 fdiaz
    @Override
122 40435 jjdelcerro
    public boolean hasNext() {
123
        if (store.isEditing()) {
124
            return super.hasNext();
125
        } else {
126
            throw new ConcurrentDataModificationException(store.getFullName());
127
        }
128
    }
129
130 45522 fdiaz
    @Override
131 40435 jjdelcerro
    public Object next() {
132
        if (store.isEditing()) {
133
            return super.next();
134
        } else {
135
            throw new ConcurrentDataModificationException(store.getFullName());
136
        }
137
    }
138
139 45522 fdiaz
    @Override
140
    protected ChainedIterator getIterator() {
141
        return (ChainedIterator) this.iterator;
142 40435 jjdelcerro
    }
143 45522 fdiaz
144
    @Override
145 40435 jjdelcerro
    protected DefaultFeature createFeature(FeatureProvider data) throws DataException {
146
147 45647 fdiaz
        DefaultFeature f = this.featureManager.get(data);
148
//        DefaultFeature f = null;
149
//        try {
150
//            FeatureReference ref = new DefaultFeatureReference(store, data);
151
//            f= (DefaultFeature) this.featureManager.get(ref, store, data.getType());
152
//        } catch (DataException e) {
153
//            RuntimeException ex = new RuntimeException();
154
//            e.initCause(e);
155
//            throw ex;
156
//        }
157 40435 jjdelcerro
        if (f == null) {
158
            // La feature no se ha editado.
159
            f = new DefaultFeature(store, data);
160
        }
161
        if (this.fset.transform.isEmpty()) {
162
            return f;
163
        } else {
164
            return (DefaultFeature) this.fset.transform.applyTransform(
165
                    f, fset.getDefaultFeatureType());
166
        }
167
    }
168 45522 fdiaz
169
    @Override
170
    protected boolean skipFeature(FeatureProvider data) {
171
        try {
172 45989 fdiaz
            switch (getIterator().getCurrent()) {
173
                case 0:
174
                    if (this.featureManager.isDeleted(data)) {
175
                        return true;
176
                    }
177
                    break;
178
                case 2:
179
                    FeatureReference ref = FeatureReferenceFactory.createFromFeatureProvider(store, data);
180
                    if (visitedReferences.contains(ref)){
181
                        return true;
182
                    }
183
                    break;
184 45522 fdiaz
            }
185 45531 fdiaz
        } catch (Exception ex) {
186 45522 fdiaz
            LOGGER.warn("Can't check if must skip feature.", ex);
187 40435 jjdelcerro
        }
188 45522 fdiaz
        return false;
189 40435 jjdelcerro
    }
190
191 45522 fdiaz
    @Override
192 40435 jjdelcerro
    protected void doDispose() throws BaseException {
193
        super.doDispose();
194
        this.featureManager = null;
195
        this.store = null;
196
    }
197
198
}