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 @ 46905

History | View | Annotate | Download (7.18 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * 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
 *
16
 * 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
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
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
 */
24
package org.gvsig.fmap.dal.feature.impl.featureset;
25

    
26
import java.util.HashSet;
27
import java.util.Iterator;
28
import java.util.Set;
29
import java.util.logging.Level;
30
import java.util.logging.Logger;
31
import org.gvsig.fmap.dal.exception.DataException;
32
import org.gvsig.fmap.dal.feature.EditableFeature;
33
import org.gvsig.fmap.dal.feature.Feature;
34
import org.gvsig.fmap.dal.feature.FeatureReference;
35
import org.gvsig.fmap.dal.feature.exception.ConcurrentDataModificationException;
36
import org.gvsig.fmap.dal.feature.impl.DefaultFeature;
37
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
38
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureManager;
39
import org.gvsig.fmap.dal.feature.impl.featurereference.FeatureReferenceFactory;
40
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
41
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
42
import org.gvsig.tools.dispose.DisposableIterator;
43
import org.gvsig.tools.dispose.DisposeUtils;
44
import org.gvsig.tools.exception.BaseException;
45
import org.gvsig.tools.util.ChainedIterator;
46

    
47
/**
48
 * Iterator for stores in edition mode.
49
 * 
50
 * @author gvSIG Team
51
 * @version $Id$
52
 * @deprecated use the {@link FastEditedIterator} instead
53
 */
54
public class EditedIterator extends FilteredIterator {
55

    
56
    private DefaultFeatureStore store;
57
    protected FeatureManager featureManager;
58
    private Set<FeatureReference> visitedReferences;
59
    
60
    public EditedIterator(DefaultFeatureSet featureSet) {
61
        super(featureSet);
62
        this.store = featureSet.store;
63
        this.featureManager = this.store.getFeatureManager();
64
        this.visitedReferences = new HashSet<>();
65
    }
66

    
67
    public EditedIterator(DefaultFeatureSet featureSet, long index, long elements)
68
        throws DataException {
69
        this(featureSet);
70

    
71
        Iterator<EditableFeature> insertedFeatures = this.featureManager.getInsertedFeatures();//Don't use getInserteds because referenceFeature will be missed
72
        Iterator<EditableFeature> updatedFeatures = this.featureManager.getUpdatedFeatures();
73
        final Iterator<FeatureProvider> providerIterator;
74
        FeatureSetProvider provider = featureSet.provider;
75
        boolean canDelegateInProvider = provider.canFilter() && provider.canIterateFromIndex() && !featureManager.hasDeleteds();
76
        if (canDelegateInProvider) {
77
            providerIterator = provider.iterator(index, elements);
78
        } else {
79
            providerIterator = provider.iterator();
80
        }
81

    
82

    
83
        Iterator<FeatureProvider> wrappedProviderIterator = new DisposableIterator<FeatureProvider>() {
84
            @Override
85
            public boolean hasNext() {
86
                return providerIterator.hasNext();
87
            }
88

    
89
            @Override
90
            public FeatureProvider next() {
91
                FeatureProvider data = providerIterator.next();
92
                FeatureReference ref = FeatureReferenceFactory.createFromFeatureProvider(store, data);
93
                DefaultFeature modified;
94
                try {
95
                    modified = featureManager.get(ref, store);
96
                } catch (DataException ex) {
97
                    return data;
98
                }
99
                if (modified != null) {
100
                    visitedReferences.add(ref);
101
                    return modified.getData();
102
                }
103
                return data;
104
            }
105

    
106
            @Override
107
            public void remove() {
108
                EditedIterator.super.remove();
109
            }
110

    
111
            @Override
112
            public void dispose() {
113
                DisposeUtils.disposeQuietly(providerIterator);
114
            }
115
        };
116
        this.iterator = new ChainedIterator(wrappedProviderIterator, insertedFeatures, updatedFeatures);
117
        if (!canDelegateInProvider) {
118
            if (index > 0) {
119
                skypto(index);
120
            }
121
        }
122
    }
123
    
124
    @Override
125
    public void remove() {
126
        this.iterator.remove();
127
    }
128

    
129
    @Override
130
    public boolean hasNext() {
131
        if (store.isEditing()) {
132
            return super.hasNext();
133
        } else {
134
            throw new ConcurrentDataModificationException(store.getFullName());
135
        }
136
    }
137

    
138
    @Override
139
    public Object next() {
140
        if (store.isEditing()) {
141
            Feature n = (Feature) super.next();
142
            this.visitedReferences.add(n.getReference());
143
            return n;
144
        } else {
145
            throw new ConcurrentDataModificationException(store.getFullName());
146
        }
147
    }
148

    
149
    @Override
150
    protected ChainedIterator getIterator() {
151
        return (ChainedIterator) this.iterator;
152
    }
153
    
154
    @Override
155
    protected DefaultFeature createFeature(FeatureProvider data) throws DataException {
156

    
157
        DefaultFeature f = this.featureManager.get(data);
158
//        DefaultFeature f = null;
159
//        try {
160
//            FeatureReference ref = new DefaultFeatureReference(store, data);
161
//            f= (DefaultFeature) this.featureManager.get(ref, store, data.getType());
162
//        } catch (DataException e) {
163
//            RuntimeException ex = new RuntimeException();
164
//            e.initCause(e);
165
//            throw ex;
166
//        }
167
        if (f == null) {
168
            // La feature no se ha editado.
169
            f = new DefaultFeature(store, data);
170
        }
171
        if (this.fset.transform.isEmpty()) {
172
            return f;
173
        } else {
174
            return (DefaultFeature) this.fset.transform.applyTransform(
175
                    f, fset.getDefaultFeatureType());
176
        }     
177
    }
178
    
179
    @Override
180
    protected boolean skipFeature(FeatureProvider data) {
181
        try {
182
            switch (getIterator().getCurrent()) {
183
                case 0:
184
                    if (this.featureManager.isDeleted(data)) {
185
                        return true;
186
                    }
187
                    break;
188
                case 2:
189
                    FeatureReference ref = FeatureReferenceFactory.createFromFeatureProvider(store, data);
190
                    if (visitedReferences.contains(ref)){
191
                        return true;
192
                    }
193
                    break;
194
            }
195
        } catch (Exception ex) {
196
            LOGGER.warn("Can't check if must skip feature.", ex);
197
        }
198
        return false;
199
    }
200

    
201
    @Override
202
    protected void doDispose() throws BaseException {
203
        super.doDispose();
204
        this.featureManager = null;
205
        this.store = null;
206
    }
207

    
208
}