Revision 43840

View differences:

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/FeatureManager.java
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;
25

  
26
import java.util.Collection;
27
import java.util.HashMap;
28
import java.util.Iterator;
29
import java.util.LinkedHashMap;
30
import java.util.LinkedHashSet;
31
import java.util.Map;
32
import java.util.NoSuchElementException;
33

  
34
import org.gvsig.fmap.dal.exception.DataException;
35
import org.gvsig.fmap.dal.feature.Feature;
36
import org.gvsig.fmap.dal.feature.FeatureReference;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.dal.feature.FeatureType;
39
import org.gvsig.fmap.dal.feature.impl.expansionadapter.ExpansionAdapter;
40

  
41

  
42
public class FeatureManager {
43

  
44
    private int deltaSize = 0;
45
    private final ExpansionAdapter expansionAdapter;
46
    private final Collection<FeatureReference> deleted = new LinkedHashSet();
47
    private final Map<FeatureReference, Integer> added = new LinkedHashMap();
48
    private final Map<FeatureReference, Integer> addedAndDeleted = new LinkedHashMap();
49
    private final Map<FeatureReference, Integer> modifiedFromOriginal = new HashMap();
50

  
51
    public FeatureManager(ExpansionAdapter expansionAdapter) {
52
        this.expansionAdapter = expansionAdapter;
53
    }
54

  
55
    /**
56
     * Deletes feature from this manager.
57
     *
58
     * @param id
59
     * @return The deleted feature or null if the feature had not been edited or
60
     * previously added in the editing session
61
     */
62
    public Feature delete(FeatureReference id) {
63
        deleted.add(id);
64
        Integer num = added.remove(id);
65
        Feature feature = null;
66
        if (num == null || num == -1) {
67
            num = modifiedFromOriginal.remove(id);
68
            if (num != null) {
69
                feature = (Feature) expansionAdapter.getObject(num);
70
            }
71
            // if num is null here, method returns null
72
        } else {
73
            feature = (Feature) expansionAdapter.getObject(num);
74
            addedAndDeleted.put(id, num);
75
        }
76
        deltaSize--;
77
        return feature;
78
    }
79

  
80
    public void add(Feature feature) {
81
        int pos = expansionAdapter.addObject(feature);
82
        added.put(feature.getReference(), pos);
83
        deleted.remove(feature.getReference());
84
        deltaSize++;
85
    }
86

  
87
    public Feature deleteLastFeature() {
88
        expansionAdapter.deleteLastObject();
89
        Feature feature = (Feature) expansionAdapter.getObject(expansionAdapter.getSize() - 1);
90
        added.remove(feature.getReference());
91
        modifiedFromOriginal.remove(feature.getReference());
92
        deltaSize--;
93
        return feature;
94
    }
95

  
96
    /**
97
     * Returns a Feature of the default type.
98
     *
99
     * @param id the feature reference
100
     * @param store the store to get the feature from
101
     * @return a Feature with the given reference
102
     * @throws DataException if there is an error getting the Feature
103
     */
104
    public Feature get(FeatureReference id, FeatureStore store)
105
            throws DataException {
106
        return get(id, store, null);
107
    }
108

  
109
    /**
110
     * Returns a Feature of the given type.
111
     *
112
     * @param id the feature reference
113
     * @param store the store to get the feature from
114
     * @param featureType the type of the feature to return
115
     * @return a Feature with the given reference
116
     * @throws DataException if there is an error getting the Feature
117
     */
118
    public Feature get(FeatureReference id, FeatureStore store,
119
            FeatureType featureType) throws DataException {
120
        // FIXME: y si el featuretype que paso esta modificado.
121
        //        Deberia buscarlo en el featuretypemanager ?
122
        //
123
        //        Si no existe feature con ese id... ? retorna null ?
124
        //        en EditedDefaultIterator se hace uso de ese comportamiento.
125
        //
126
        Integer intNum = (added.get(id));
127
        if (intNum == null) {
128
            intNum = (modifiedFromOriginal.get(id));
129
            if (intNum == null) {
130
                //If the feature has been added and deleted
131
                intNum = addedAndDeleted.get(id);
132
                if (intNum == null) {
133
                    return null;
134
                }
135
            }
136
        }
137
        int num = intNum;
138
        if (num == -1) {
139
            return null;
140
        }
141
        Feature feature = (Feature) expansionAdapter.getObject(num);
142
        if (featureType == null) {
143
            featureType = store.getDefaultFeatureType();
144
        }
145
        return new DefaultFeature(featureType, feature);
146
    }
147

  
148
    public int update(Feature feature, Feature oldFeature) {
149
        int oldNum = -1;
150
        int num = expansionAdapter.addObject(feature);
151
        FeatureReference id = feature.getReference();
152
        if (added.containsKey(id)) {
153
            oldNum = (added.get(id));
154
            added.put(id, num);
155
        } else {
156
            if (modifiedFromOriginal.get(id) != null) {
157
                oldNum = (modifiedFromOriginal.get(id));
158
            }
159
            modifiedFromOriginal.put(id, num);
160
        }
161
        return oldNum;
162
    }
163

  
164
    public void restore(FeatureReference id) {
165
        deleted.remove(id);
166
        deltaSize++;
167
    }
168

  
169
    public void restore(FeatureReference id, int num) {
170
        if (added.containsKey(id)) {
171
            added.put(id, num);
172
        } else {
173
            modifiedFromOriginal.put(id, num);
174
        }
175
    }
176

  
177
    public boolean isDeleted(Feature feature) {
178
        return deleted.contains(feature.getReference());
179
    }
180

  
181
    public boolean isDeleted(FeatureReference featureID) {
182
        return deleted.contains(featureID);
183
    }
184

  
185
    public void clear() {
186
        added.clear();
187
        modifiedFromOriginal.clear();
188
        expansionAdapter.close();
189
        deleted.clear();
190
        addedAndDeleted.clear();
191
        deltaSize = 0;
192
    }
193

  
194
    public boolean hasChanges() {
195
        return added.size() > 0 || modifiedFromOriginal.size() > 0 || deleted.size() > 0;
196
    }
197

  
198
    public Iterator getDeleted() {
199
        return new DeletedIterator();
200

  
201
    }
202

  
203
    private class DeletedIterator implements Iterator {
204

  
205
        private Boolean hasnext = null;
206
        private final Iterator iter;
207
        private DefaultFeatureReference obj;
208

  
209
        public DeletedIterator() {
210
            iter = deleted.iterator();
211
        }
212

  
213
        @Override
214
        public boolean hasNext() {
215
            if (hasnext != null) {
216
                return hasnext;
217
            }
218
            hasnext = false;
219
            while (iter.hasNext()) {
220
                obj = (DefaultFeatureReference) iter.next();
221
                if (obj.isNewFeature()) {
222
                    continue;
223
                }
224
                hasnext = false;
225
                break;
226
            }
227
            return hasnext;
228
        }
229

  
230
        @Override
231
        public Object next() {
232
            if (!hasNext()) {
233
                throw new NoSuchElementException();
234
            }
235
            hasnext = null;
236
            return obj;
237
        }
238

  
239
        @Override
240
        public void remove() {
241
            throw new UnsupportedOperationException();
242
        }
243

  
244
    }
245

  
246
    public Iterator getInserted() {
247
        return new InsertedIterator();
248
    }
249

  
250
    private class InsertedIterator implements Iterator {
251

  
252
        private final Iterator addedIter;
253
        private DefaultFeature obj;
254
        private Boolean hasnext = null;
255

  
256
        public InsertedIterator() {
257
            addedIter = added.values().iterator();
258
        }
259

  
260
        @Override
261
        public boolean hasNext() {
262
            if (hasnext != null) {
263
                return hasnext;
264
            }
265
            hasnext = false;
266
            int pos;
267
            while (addedIter.hasNext()) {
268
                pos = ((Integer) addedIter.next());
269
                obj = (DefaultFeature) expansionAdapter.getObject(pos);
270
                if (!deleted.contains(obj.getReference())) {
271
                    hasnext = true;
272
                    break;
273
                }
274
            }
275
            return hasnext;
276
        }
277

  
278
        @Override
279
        public Object next() {
280
            if (!hasNext()) {
281
                throw new NoSuchElementException();
282
            }
283
            hasnext = null;
284
            return obj.getData();
285
        }
286

  
287
        @Override
288
        public void remove() {
289
            addedIter.remove();
290
        }
291

  
292
    }
293

  
294
    public Iterator getUpdated() {
295
        return new UpdatedIterator();
296
    }
297

  
298
    private class UpdatedIterator implements Iterator {
299

  
300
        private Boolean hasnext = null;
301
        private final Iterator iter;
302
        private DefaultFeature obj;
303
        private int pos;
304

  
305
        public UpdatedIterator() {
306
            iter = expansionAdapter.iterator();
307
            pos = -1;
308
        }
309

  
310
        @Override
311
        public boolean hasNext() {
312
            if (hasnext != null) {
313
                return hasnext;
314
            }
315
            hasnext = false;
316
            while (iter.hasNext()) {
317
                pos++;
318
                obj = (DefaultFeature) iter.next();
319
                if (deleted.contains(obj.getReference())) {
320
                    continue;
321
                } else if (!modifiedFromOriginal.containsValue(pos)) {
322
                    continue;
323
                } else {
324
                    hasnext = true;
325
                    break;
326
                }
327
            }
328
            return hasnext;
329
        }
330

  
331
        @Override
332
        public Object next() {
333
            if (!hasNext()) {
334
                throw new NoSuchElementException();
335
            }
336
            hasnext = null;
337
            return obj.getData();
338
        }
339

  
340
        @Override
341
        public void remove() {
342
            throw new UnsupportedOperationException();
343

  
344
        }
345
    }
346

  
347
    public boolean hasNews() {
348
        return !added.isEmpty();
349
    }
350

  
351
    public long getDeltaSize() {
352
        return deltaSize;
353
    }
354

  
355
    /**
356
     * Indicates if any operation has comprimised the selected features.
357
     *
358
     * @return
359
     */
360
    public boolean isSelectionCompromised() {
361
        //Only deleted features can change order, as added features are added at the end.
362
        return deleted.size() > 0;
363
    }
364
}
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/SpatialManager.java
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;
25

  
26
import java.util.ArrayList;
27
import java.util.ConcurrentModificationException;
28
import java.util.Iterator;
29

  
30
import org.gvsig.fmap.dal.exception.DataException;
31
import org.gvsig.fmap.dal.feature.Feature;
32
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
33
import org.gvsig.fmap.dal.feature.FeatureIndex;
34
import org.gvsig.fmap.dal.feature.FeatureIndexes;
35
import org.gvsig.fmap.dal.feature.FeatureReference;
36
import org.gvsig.fmap.dal.feature.FeatureSet;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.dal.feature.FeatureType;
39
import org.gvsig.fmap.dal.feature.exception.ConcurrentDataModificationException;
40
import org.gvsig.fmap.geom.GeometryLocator;
41
import org.gvsig.fmap.geom.primitive.Envelope;
42
import org.gvsig.tools.dispose.DisposableIterator;
43
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
45

  
46
/**
47
 * DOCUMENT ME!
48
 *
49
 * @author Vicente Caballero Navarro
50
 */
51
public class SpatialManager {
52
    private static final Logger LOG = LoggerFactory.getLogger(SpatialManager.class);
53
    
54
    protected boolean isFullExtentDirty = true;
55
    private FeatureStore featureStore;
56
    private FeatureIndex featureIndex = null;
57
    private Envelope originalEnvelope = null;
58
    private Envelope fullEnvelope = null;
59
    private ArrayList feaOperation=new ArrayList();
60
    private boolean noSpatialData = false;
61

  
62
    public SpatialManager(FeatureStore featureStore, Envelope originalEnvelope)
63
            throws DataException {
64
        this.featureStore=featureStore;
65
        FeatureIndexes findexes=featureStore.getIndexes();
66
        // Comprobamos si hay algun campo espacial a manejar
67

  
68
        FeatureType fType = this.featureStore.getDefaultFeatureType();
69
        // TODO Multy FType !!
70
        if (fType.getDefaultGeometryAttributeIndex() < 0) {
71
            noSpatialData = true;
72
            return;
73
        }
74
        FeatureAttributeDescriptor attr = fType.getAttributeDescriptor(fType
75
                .getDefaultGeometryAttributeIndex());
76
        this.originalEnvelope = originalEnvelope;
77
        if ((originalEnvelope != null) && (!originalEnvelope.isEmpty())) {
78
            this.fullEnvelope = originalEnvelope.getGeometry().getEnvelope();
79
        } else {
80
            FeatureAttributeDescriptor geoAttr = fType.getAttributeDescriptor(fType.getDefaultGeometryAttributeIndex());
81
            try {
82
                this.fullEnvelope = GeometryLocator.getGeometryManager()
83
                        .createEnvelope(geoAttr.getGeometrySubType());
84
            } catch (Exception e) {
85
                // FIXME Excpetion
86
                throw new RuntimeException(e);
87
            }
88
        }
89
        if (!fType.hasOID()) {
90
            return;
91
        }
92

  
93
        Iterator iterator = findexes.iterator();
94
        FeatureIndex index;
95
        while (iterator.hasNext()) {
96
            index = (FeatureIndex) iterator.next();
97
            if (index.getAttributeNames().size() == 1
98
                    && index.getAttributeNames().contains(attr.getName())) {
99
                featureIndex = index;
100
                break;
101
            }
102
        }
103

  
104
        if (featureIndex instanceof DefaultFeatureIndex) {
105
            ((DefaultFeatureIndex) featureIndex).setValid(true);
106
        }
107
    }
108

  
109

  
110

  
111
    /**
112
     * DOCUMENT ME!
113
     *
114
     * @param feature DOCUMENT ME!
115
     * @param oldFeature DOCUMENT ME!
116
     */
117
    public void updateFeature(Feature feature, Feature oldFeature) {
118
        if (noSpatialData) {
119
            return;
120
        }
121
            try {
122
            	if (featureIndex != null) {
123
            		featureIndex.delete(oldFeature);
124
            	}
125
                feaOperation.add(new FeatureOperation(((DefaultFeature) oldFeature)
126
                        .getReference(), FeatureOperation.DELETE));
127
            	if (featureIndex != null) {
128
            		featureIndex.insert(feature);
129
            	}
130
                feaOperation.add(new FeatureOperation(((DefaultFeature) feature)
131
                        .getReference(), FeatureOperation.INSERT));
132
            } catch (DataException e) {
133
                throw new RuntimeException("Exception updating feature: "
134
                    + feature, e);
135
            }
136
            // } else {
137
            // fullEnvelope.add(feature.getDefaultEnvelope());
138
        isFullExtentDirty = true;
139
    }
140

  
141
    /**
142
     * DOCUMENT ME!
143
     *
144
     * @param feature DOCUMENT ME!
145
     */
146
    public void insertFeature(Feature feature) {
147
        if (noSpatialData) {
148
            return;
149
        }
150
            try {
151
            	if (featureIndex != null) {
152
            		featureIndex.insert(feature);
153
            	}
154
                feaOperation.add(new FeatureOperation(
155
                    ((DefaultFeature) feature).getReference(),
156
                    FeatureOperation.INSERT));
157
            } catch (DataException e) {
158
                throw new RuntimeException("Exception inserting feature: "
159
                    + feature, e);
160
            }
161
            isFullExtentDirty = true;
162
//        } else if (!isFullExtentDirty) {
163
//            fullEnvelope.add(feature.getDefaultEnvelope());
164
//        }
165
    }
166

  
167
    /**
168
     * DOCUMENT ME!
169
     *
170
     * @param feature DOCUMENT ME!
171
     */
172
    public void deleteFeature(Feature feature) {
173
        if (noSpatialData) {
174
            return;
175
        }
176
            try {
177
            	if (featureIndex != null) {
178
            		featureIndex.delete(feature);
179
            	}
180
                feaOperation.add(new FeatureOperation(((DefaultFeature) feature)
181
                        .getReference(), FeatureOperation.DELETE));
182
            } catch (DataException e) {
183
                throw new RuntimeException("Exception deleting feature: "
184
                    + feature, e);
185
            }
186
        isFullExtentDirty = true;
187
    }
188

  
189
    public void clear() {
190
    }
191

  
192
    public Envelope getEnvelope() throws DataException {
193
        if (noSpatialData) {
194
            return null;
195
        }
196
        if (!isFullExtentDirty){
197
            return this.fullEnvelope;
198
        }
199

  
200
        // FIXME in every changes when anyone ask for envelope it was regenerated.
201
        //       if we assume that the envelope may not be the minimum in edit mode
202
        //       this call must be very much faster
203

  
204

  
205
        FeatureAttributeDescriptor attr = featureStore.getDefaultFeatureType()
206
                .getAttributeDescriptor(
207
                        featureStore.getDefaultFeatureType()
208
                                .getDefaultGeometryAttributeIndex());
209
        Envelope fullEnvelope = null;
210

  
211
        FeatureSet set = null;
212
        DisposableIterator iterator = null;
213
        try {
214
            set = featureStore.getFeatureSet();
215
            iterator = set.fastIterator();
216
            //First while to initialize the feature envelope
217
            while (iterator.hasNext()) {
218
                Feature feature = (Feature) iterator.next();
219
                Envelope envelope = feature.getDefaultEnvelope();
220
                if (envelope != null){
221
                    fullEnvelope = (Envelope)envelope.clone();
222
                    break;
223
                }
224
            }           
225
            //Second while to add new evelopes tho the full envelope
226
            while (iterator.hasNext()) {
227
                Feature feature = (Feature) iterator.next();
228
                Envelope envelope = feature.getDefaultEnvelope();           
229
                if(envelope!=null){
230
                    fullEnvelope.add(envelope);
231
                }
232
            }
233
            //Creating an empty envelope by default
234
            if (fullEnvelope == null){
235
                fullEnvelope = GeometryLocator.getGeometryManager().createEnvelope(
236
                    attr.getGeometrySubType());
237
            }
238
        } catch (ConcurrentModificationException e) {
239
            throw e;
240
        } catch (ConcurrentDataModificationException e) {
241
            throw e;
242
        } catch (Exception e) {
243
            throw new RuntimeException(e);
244
        } finally {
245
            if (iterator != null) {
246
                iterator.dispose();
247
            }
248
            if (set != null) {
249
                set.dispose();
250
            }
251
        }
252
        this.fullEnvelope = fullEnvelope;
253
        this.isFullExtentDirty = false;
254
        return fullEnvelope;
255
    }
256

  
257

  
258

  
259
    public void cancelModifies() {
260
        if (noSpatialData) {
261
            return;
262
        }
263
        if (featureIndex != null){
264
            for (int i = feaOperation.size()-1 ; i>=0 ; i--){
265
                try {
266
                    FeatureOperation fo = (FeatureOperation) feaOperation.get(i);
267
                    if (fo.getOperation() == FeatureOperation.INSERT){                     
268
                        featureIndex.delete(fo.getFeatureReference().getFeature());
269
                    }else if (fo.getOperation() == FeatureOperation.DELETE){
270
                        featureIndex.insert(fo.getFeatureReference().getFeature());
271
                    }
272
                } catch (DataException e) {
273
                    LOG.error("Error canceling the edition", e);
274
                }           
275
            }
276
        }
277
        if (originalEnvelope!=null){
278
            try {
279
                fullEnvelope = (Envelope) originalEnvelope.clone();
280
            } catch (CloneNotSupportedException e) {
281
                // Should never happen
282
                LOG.error("While cloning envelope", e);
283
            }
284
        } else {
285
            fullEnvelope = null;
286
        }
287
        isFullExtentDirty = false;
288
    }
289

  
290
    private class FeatureOperation{
291
        final static int INSERT=0;
292
        final static int DELETE=1;
293
        private FeatureReference ref;
294
        private int operation;
295
        public FeatureOperation(FeatureReference fe,int op){
296
            ref=fe;
297
            operation=op;
298
        }
299
        public FeatureReference getFeatureReference() {
300
            return ref;
301
        }
302
        public void setFeatureReference(FeatureReference ref) {
303
            this.ref = ref;
304
        }
305
        public int getOperation() {
306
            return operation;
307
        }
308
        public void setOperation(int operation) {
309
            this.operation = operation;
310
        }
311
    }
312

  
313
}
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/FeatureTypeManager.java
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 modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.feature.impl;
24

  
25
import java.lang.ref.WeakReference;
26
import java.util.ArrayList;
27
import java.util.Arrays;
28
import java.util.HashMap;
29
import java.util.Iterator;
30
import java.util.List;
31

  
32
import org.gvsig.fmap.dal.exception.DataException;
33
import org.gvsig.fmap.dal.feature.AbstractFeatureStoreTransform;
34
import org.gvsig.fmap.dal.feature.EditableFeature;
35
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
36
import org.gvsig.fmap.dal.feature.EditableFeatureType;
37
import org.gvsig.fmap.dal.feature.Feature;
38
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
39
import org.gvsig.fmap.dal.feature.FeatureStore;
40
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.feature.impl.expansionadapter.ExpansionAdapter;
43
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider.FeatureTypeChanged;
44
import org.gvsig.tools.persistence.PersistentState;
45
import org.gvsig.tools.persistence.exception.PersistenceException;
46

  
47
public class FeatureTypeManager {
48

  
49
    private ExpansionAdapter expansionAdapter;
50
    private ArrayList deleted = new ArrayList();// <FeatureID>
51
    private int deltaSize = 0;
52
    private HashMap added = new HashMap();
53
    private HashMap modifiedFromOriginal = new HashMap();
54
    private FeatureType originalType = null;
55
    private boolean first = true;
56
    private FeatureTypeManagerFeatureStoreTransforms transforms;
57
    private FeatureStore store;
58

  
59
    public FeatureTypeManager(FeatureStore store,
60
            ExpansionAdapter expansionAdapter) {
61
        this.expansionAdapter = expansionAdapter;
62
        this.store = store;
63
        this.transforms = new FeatureTypeManagerFeatureStoreTransforms();
64
        this.transforms.setFeatureStore(store);
65
    }
66

  
67
    public void dispose() {
68
        this.expansionAdapter.close();
69
        this.expansionAdapter = null;
70
        this.deleted.clear();
71
        this.deleted = null;
72
        this.transforms.clear();
73
    }
74

  
75
    public FeatureType getType(String id) throws DataException {
76
        Integer intNum = ((Integer) added.get(id));
77
        if (intNum == null) {
78
            intNum = ((Integer) modifiedFromOriginal.get(id));
79
            if (intNum == null) {
80
                return null;
81
            }
82
        }
83
        int num = intNum.intValue();
84

  
85
        if (num == -1) {
86
            /*
87
             * This happens for example when we are going back to the
88
             * original feature type which is not managed by
89
             * expansionAdapter
90
             */
91
            return null;
92
        }
93

  
94
        FeatureType type = (FeatureType) expansionAdapter.getObject(num);
95
        return type;
96
    }
97

  
98
    public int update(FeatureType type, FeatureType oldType) {
99
        // deleted.add(oldType.getId());
100
        if (first) {
101
            originalType = oldType;
102
            first = false;
103
        }
104
        int oldNum = -1;
105
        int num = expansionAdapter.addObject(type);
106
        String id = type.getId();
107

  
108
        if (added.containsKey(id)) {
109
            oldNum = ((Integer) added.get(id)).intValue();
110
            added.put(id, new Integer(num));
111
        } else {
112
            if (modifiedFromOriginal.get(id) != null) {
113
                oldNum = ((Integer) modifiedFromOriginal.get(id)).intValue();
114
            }
115
            modifiedFromOriginal.put(id, new Integer(num));
116
        }
117

  
118
        try {
119
            this.transforms.add(new UpdateFeatureTypeTransform(this.store,
120
                    oldType, type));
121
        } catch (DataException e) {
122
            throw new RuntimeException(); // FIXME (pero esto no deberia de
123
            // pasar nunca)
124
        }
125
        return oldNum;
126
    }
127

  
128
    private class UpdateFeatureTypeTransform extends AbstractFeatureStoreTransform {
129

  
130
        private FeatureType ftSource;
131

  
132
        private EditableFeatureType ftTarget_editable;
133
        private FeatureType ftTarget_non_editable;
134

  
135
        private WeakReference wkRefStore;
136
        private List ftypes = null;
137
        private List attrInSourceToUse;
138

  
139
        UpdateFeatureTypeTransform(FeatureStore featureStore,
140
                FeatureType ftSource, FeatureType ftTarget) {
141
            this.ftSource = ftSource;
142

  
143
            if (ftTarget instanceof EditableFeatureType) {
144

  
145
                ftTarget_editable = (EditableFeatureType) ftTarget;
146
                ftTarget_non_editable = ftTarget_editable.getNotEditableCopy();
147
            } else {
148
                ftTarget_non_editable = ftTarget;
149
            }
150

  
151
            this.wkRefStore = new WeakReference(featureStore);
152
            this.initializeAttributesToUse();
153
        }
154

  
155
        private void initializeAttributesToUse() {
156
            attrInSourceToUse = new ArrayList();
157

  
158
            Iterator iter = null;
159
            if (ftTarget_editable != null) {
160
                iter = ftTarget_editable.iterator();
161
            } else {
162
                iter = ftTarget_non_editable.iterator();
163
            }
164

  
165
            FeatureAttributeDescriptor tAttr, sAttr;
166
            EditableFeatureAttributeDescriptor ead = null;
167
            while (iter.hasNext()) {
168
                tAttr = (FeatureAttributeDescriptor) iter.next();
169
                sAttr = this.ftSource.getAttributeDescriptor(tAttr.getName());
170
                if (sAttr == null) {
171
                    if (tAttr instanceof EditableFeatureAttributeDescriptor) {
172
                        ead = (EditableFeatureAttributeDescriptor) tAttr;
173
                        if (ead.getOriginalName() != null) {
174
                            sAttr = this.ftSource.getAttributeDescriptor(ead.getOriginalName());
175
                            if (sAttr == null) {
176
                                continue;
177
                            }
178
                        } else {
179
                            continue;
180
                        }
181
                    } else {
182
                        continue;
183
                    }
184
                }
185
                if (tAttr.getType() != sAttr.getType()) {
186
                    /*
187
                     * Ignore if type is not the same (user removed field
188
                     * and added another with same name but different type)
189
                     */
190
                    continue;
191
                }
192
                attrInSourceToUse.add(sAttr.getName());
193
            }
194
        }
195

  
196
        @Override
197
        public void setUp() throws Exception {
198
            
199
        }
200

  
201
        public void applyTransform(Feature source, EditableFeature target)
202
                throws DataException {
203

  
204
            Iterator iter = target.getType().iterator();
205
            FeatureAttributeDescriptor tAttr;
206
            FeatureAttributeDescriptor tAttr_edi;
207
            FeatureAttributeDescriptor srcAtt;
208

  
209
            /*
210
             * field name in source feature
211
             */
212
            String s_name;
213

  
214
            /*
215
             * field name in target feature (the same as in source
216
             * except if renamed)
217
             */
218
            String t_name;
219

  
220
            EditableFeatureAttributeDescriptor eatd = null;
221
            while (iter.hasNext()) {
222
                tAttr = (FeatureAttributeDescriptor) iter.next();
223

  
224
                if (ftTarget_editable != null) {
225
                    /*
226
                     * If target FT is editable, try to get original name
227
                     */
228
                    t_name = tAttr.getName();
229
                    s_name = t_name;
230
                    tAttr_edi = ftTarget_editable.getAttributeDescriptor(t_name);
231
                    if (tAttr_edi instanceof EditableFeatureAttributeDescriptor) {
232
                        eatd = (EditableFeatureAttributeDescriptor) tAttr_edi;
233
                        s_name = eatd.getOriginalName();
234
                    }
235

  
236
                    /*
237
                     * If not found, use normal name
238
                     */
239
                    if (s_name == null) {
240
                        s_name = tAttr.getName();
241
                    }
242
                } else {
243
                    /*
244
                     * If target FT is not editable, use normal name
245
                     */
246
                    t_name = tAttr.getName();
247
                    s_name = t_name;
248
                }
249

  
250
                srcAtt = source.getType().getAttributeDescriptor(s_name);
251

  
252
                if (srcAtt != null
253
                        && /*
254
                         * This prevents the case when user has removed field and
255
                         * added new field with same name and different type.
256
                         * In that case, value will be the default value (else below)
257
                         */ srcAtt.getType() == tAttr.getType()) {
258

  
259
                    target.set(t_name, source.get(s_name));
260

  
261
                } else {
262
                    target.set(t_name, tAttr.getDefaultValue());
263
                }
264
            }
265
        }
266

  
267
        public FeatureType getDefaultFeatureType() throws DataException {
268
            return this.ftTarget_non_editable;
269
        }
270

  
271
        public FeatureStore getFeatureStore() {
272
            return (FeatureStore) this.wkRefStore.get();
273
        }
274

  
275
        public List getFeatureTypes() throws DataException {
276
            if (this.ftypes == null) {
277
                this.ftypes = Arrays
278
                        .asList(new FeatureType[]{this.ftTarget_non_editable});
279
            }
280
            return this.ftypes;
281
        }
282

  
283
        public FeatureType getSourceFeatureTypeFrom(
284
                FeatureType targetFeatureType) {
285
            EditableFeatureType orgType = ftSource.getEditable();
286
            Iterator iter = orgType.iterator();
287
            FeatureAttributeDescriptor attr;
288
            EditableFeatureAttributeDescriptor efad = null;
289

  
290
            while (iter.hasNext()) {
291
                attr = (FeatureAttributeDescriptor) iter.next();
292
                if (!attrInSourceToUse.contains(attr.getName())) {
293
                    if (attr instanceof EditableFeatureAttributeDescriptor) {
294
                        efad = (EditableFeatureAttributeDescriptor) attr;
295
                        if (efad.getOriginalName() != null
296
                                && !attrInSourceToUse.contains(efad.getOriginalName())) {
297
                            iter.remove();
298
                        }
299
                    } else {
300
                        iter.remove();
301
                    }
302
                }
303
            }
304
            return orgType.getNotEditableCopy();
305
        }
306

  
307
        public void setFeatureStore(FeatureStore featureStore) {
308
            this.wkRefStore = new WeakReference(featureStore);
309
        }
310

  
311
        public boolean isTransformsOriginalValues() {
312
            return false;
313
        }
314

  
315
    }
316

  
317
    public void restore(String id) {
318
        deleted.remove(id);
319
        deltaSize++;
320
    }
321

  
322
    public void restore(String id, int num) {
323
        if (added.containsKey(id)) {
324
            added.put(id, new Integer(num));
325
        } else {
326
            modifiedFromOriginal.put(id, new Integer(num));
327
        }
328
    }
329

  
330
    public boolean isDeleted(FeatureType type) {
331
        return deleted.contains(type.getId());
332
    }
333

  
334
    public boolean isDeleted(String id) {
335
        return deleted.contains(id);
336
    }
337

  
338
    public void clear() {
339
        added.clear();
340
        modifiedFromOriginal.clear();
341
        expansionAdapter.close();
342
        deleted.clear();// <FeatureID>
343
        deltaSize = 0;
344
    }
345

  
346
    public boolean hasChanges() {
347
        return added.size() > 0 || modifiedFromOriginal.size() > 0
348
                || deleted.size() > 0;
349
    }
350

  
351
    public Iterator newsIterator() {
352
        return added.values().iterator();
353
    }
354

  
355
    public boolean hasNews() {
356
        return !added.isEmpty();
357
    }
358

  
359
    public long getDeltaSize() {
360
        return deltaSize;
361
    }
362

  
363
    public FeatureType getOriginalFeatureType() {
364
        return originalType;
365
    }
366

  
367
    public DefaultFeatureStoreTransforms getTransforms() {
368
        return this.transforms;
369
    }
370

  
371
    public class FeatureTypeManagerFeatureStoreTransforms extends
372
            DefaultFeatureStoreTransforms {
373

  
374
        private FeatureTypeManagerFeatureStoreTransforms() {
375

  
376
        }
377

  
378
        protected void checkEditingMode() {
379
        }
380

  
381
        protected void notifyChangeToStore() {
382
        }
383

  
384
        public PersistentState getState() throws PersistenceException {
385
            // FIXME
386
            throw new UnsupportedOperationException();
387
        }
388

  
389
        public void loadState(PersistentState state)
390
                throws PersistenceException {
391
            // FIXME
392
            throw new UnsupportedOperationException();
393
        }
394

  
395
        public void loadFromState(PersistentState state) throws PersistenceException {
396
            // FIXME
397
            throw new UnsupportedOperationException();
398
        }
399

  
400
        public FeatureStoreTransform add(FeatureStoreTransform transform)
401
                throws DataException {
402
            if (!(transform instanceof UpdateFeatureTypeTransform)) {
403
                // FIXME
404
                throw new IllegalArgumentException();
405
            }
406
            return super.add(transform);
407
        }
408

  
409
    }
410

  
411
    public class FeatureTypesChangedItem implements FeatureTypeChanged {
412

  
413
        private FeatureType source;
414
        private FeatureType target;
415

  
416
        public FeatureTypesChangedItem(FeatureType source, FeatureType target) {
417
            this.source = source;
418
            this.target = target;
419
        }
420

  
421
        public FeatureType getSource() {
422
            return source;
423
        }
424

  
425
        public FeatureType getTarget() {
426
            return target;
427
        }
428

  
429
    }
430

  
431
    public Iterator getFeatureTypesChanged() throws DataException {
432
        // FIXME this don't work for Store.fType.size() > 1
433
        List list = new ArrayList();
434
        if (modifiedFromOriginal.size() > 0) {
435
            FeatureType src = this.getOriginalFeatureType();
436
            list.add(new FeatureTypesChangedItem(src, this.store
437
                    .getFeatureType(src.getId())));
438
        }
439
        return list.iterator();
440
    }
441

  
442
}
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
31 31
import org.gvsig.fmap.dal.feature.impl.DefaultFeature;
32 32
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureReference;
33 33
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
34
import org.gvsig.fmap.dal.feature.impl.FeatureManager;
34
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureManager;
35 35
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
36 36
import org.gvsig.tools.dispose.DisposableIterator;
37 37
import org.gvsig.tools.exception.BaseException;
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/DefaultFeatureStore.java
24 24

  
25 25
package org.gvsig.fmap.dal.feature.impl;
26 26

  
27
import org.gvsig.fmap.dal.feature.impl.editing.memory.SpatialManager;
28
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureTypeManager;
29
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureManager;
27 30
import org.gvsig.fmap.dal.feature.spi.SQLBuilderBase;
28 31

  
29 32
import java.util.ArrayList;
......
108 111
import org.gvsig.fmap.dal.feature.exception.StoreUpdateFeatureTypeException;
109 112
import org.gvsig.fmap.dal.feature.exception.ValidateFeaturesException;
110 113
import org.gvsig.fmap.dal.feature.exception.WriteNotAllowedException;
111
import org.gvsig.fmap.dal.feature.impl.expansionadapter.MemoryExpansionAdapter;
112 114
import org.gvsig.fmap.dal.feature.impl.featureset.DefaultFeatureSet;
113 115
import org.gvsig.fmap.dal.feature.impl.dynobjectutils.DynObjectFeatureFacade;
114 116
import org.gvsig.fmap.dal.feature.impl.undo.DefaultFeatureCommandsStack;
......
222 224
        private boolean broken;
223 225
        private Throwable breakingsCause;
224 226

  
227
        @SuppressWarnings("OverridableMethodCallInConstructor")
225 228
        public StateInformation() {
226 229
            this.clear();
227 230
        }
......
474 477
    }
475 478

  
476 479
    /**
480
     * @throws org.gvsig.fmap.dal.exception.DataException
477 481
     * @deprecated use getDefaultFeatureType().getDefaultSRS()
478 482
     */
479 483
    @Override
......
1072 1076
                }
1073 1077
                notifyChange(FeatureStoreNotification.BEFORE_STARTEDITING);
1074 1078
                invalidateIndexes();
1075
                featureManager =
1076
                    new FeatureManager(new MemoryExpansionAdapter());
1077
                featureTypeManager =
1078
                    new FeatureTypeManager(this, new MemoryExpansionAdapter());
1079
                spatialManager =
1080
                    new SpatialManager(this, provider.getEnvelope());
1079
                featureManager = new FeatureManager();
1080
                featureTypeManager = new FeatureTypeManager(this);
1081
                spatialManager = new SpatialManager(this, provider.getEnvelope());
1081 1082

  
1082
                commands =
1083
                    new DefaultFeatureCommandsStack(this, featureManager,
1083
                commands = new DefaultFeatureCommandsStack(
1084
                        this, featureManager,
1084 1085
                        spatialManager, featureTypeManager);
1085 1086
                this.mode = MODE_FULLEDIT;
1086 1087
                hasStrongChanges = false;
......
1512 1513
              featureTypeManager.getFeatureTypesChanged());
1513 1514
          }
1514 1515
          invalidateIndexes();
1515
          featureManager =
1516
            new FeatureManager(new MemoryExpansionAdapter());
1517
          featureTypeManager =
1518
            new FeatureTypeManager(this, new MemoryExpansionAdapter());
1519
          spatialManager =
1520
            new SpatialManager(this, provider.getEnvelope());
1516
          featureManager = new FeatureManager();
1517
          featureTypeManager = new FeatureTypeManager(this);
1518
          spatialManager = new SpatialManager(this, provider.getEnvelope());
1521 1519

  
1522 1520
          commands =
1523 1521
            new DefaultFeatureCommandsStack(this, featureManager,
......
1603 1601
            FeatureType targetType = target.getDefaultFeatureType();
1604 1602

  
1605 1603
            target.edit(MODE_APPEND);
1606
            FeatureAttributeDescriptor[] pk = type.getPrimaryKey();
1604
            FeatureAttributeDescriptor[] pkattrs = type.getPrimaryKey();
1607 1605
            if (featureSelection.getSize() > 0) {
1608 1606
                features = this.getFeatureSelection();
1609 1607
            } else {
1610
                if ((pk != null) && (pk.length > 0)) {
1608
                if ((pkattrs != null) && (pkattrs.length > 0)) {
1611 1609
                    FeatureQuery query = createFeatureQuery();
1612
                    for (int i = 0; i < pk.length; i++) {
1613
                        query.getOrder().add(pk[i].getName(), true);
1610
                    for (FeatureAttributeDescriptor pkattr : pkattrs) {
1611
                        query.getOrder().add(pkattr.getName(), true);
1614 1612
                    }
1615 1613
                    features = this.getFeatureSet(query);
1616 1614
                } else {
......
2435 2433
                try{
2436 2434
                    throw new IllegalStateException();
2437 2435
                } catch(IllegalStateException e) {
2438
                    LOG.info("Call DefaultFeatureStore.getFeatureCount editing in mode APPEND");
2439
                    e.printStackTrace();
2436
                    LOG.info("Call DefaultFeatureStore.getFeatureCount editing in mode APPEND",e);
2440 2437
                }
2441 2438
                return -1;
2442 2439
            } else {
......
2617 2614
    }
2618 2615

  
2619 2616
    @Override
2617
    @SuppressWarnings("CloneDoesntCallSuperClone")
2620 2618
    public Object clone() throws CloneNotSupportedException {
2621 2619

  
2622 2620
        DataStoreParameters dsp = getParameters();
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/EditingManager.java
1

  
2
package org.gvsig.fmap.dal.feature.impl;
3

  
4
import java.util.Iterator;
5
import org.gvsig.fmap.dal.exception.DataException;
6
import org.gvsig.fmap.dal.feature.Feature;
7
import org.gvsig.fmap.dal.feature.FeatureReference;
8
import org.gvsig.fmap.dal.feature.FeatureStore;
9
import org.gvsig.fmap.dal.feature.FeatureType;
10
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
11
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider.FeatureTypeChanged;
12

  
13

  
14
public interface EditingManager {
15
 
16
    public void dispose();
17
    
18
    public void delete(Feature feature);
19

  
20
    public void delete(FeatureReference featureReference);
21
    
22
    public void add(Feature newFeature);
23
    
24
    public int update(Feature newFeature, Feature oldFeature);
25
        
26
    public int update(FeatureType type, FeatureType oldType);
27
    
28
    public void restore(FeatureReference featureReference);
29

  
30
    public void restore(FeatureReference featureReference, int code);
31
    
32
    public void restore(String featureTypeId);
33

  
34
    public void restore(String featureTypeId, int code);
35
    
36
    public boolean isDeleted(Feature feature);
37

  
38
    public boolean isDeleted(FeatureReference featureReference);    
39
    
40
    public boolean isDeleted(FeatureType type);
41
    
42
    public boolean isDeleted(String featureTypeId);
43
    
44
    public boolean isSelectionCompromised();
45
    
46
    public Iterator<FeatureProvider> getDeletedFeatures();
47
    public Iterator<FeatureProvider> getInsertedFeatures();
48
    public Iterator<FeatureProvider> getUpdatedFeatures();
49
    
50
    public Iterator<FeatureTypeChanged> getFeatureTypesChanged() throws DataException;
51
    
52
    public FeatureType getFeatureType(String id) throws DataException ;
53
    
54
    public Feature getFeature(FeatureReference reference, FeatureStore store, FeatureType type) throws DataException;
55

  
56

  
57
    /*
58
it = featureTypeManager.newsIterator();
59

  
60
position =  expansionManager.update(type, oldType);
61

  
62
expansionManager.restore(oldType.getId(),position);
63

  
64
    spatialManager.cancelModifies();
65
*/
66
}
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/undo/command/AbstractFTypeCommand.java
25 25
package org.gvsig.fmap.dal.feature.impl.undo.command;
26 26

  
27 27
import org.gvsig.fmap.dal.feature.FeatureType;
28
import org.gvsig.fmap.dal.feature.impl.FeatureTypeManager;
28
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureTypeManager;
29 29
import org.gvsig.tools.undo.command.impl.AbstractCommand;
30 30

  
31 31
/**
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/undo/command/FTypeUpdateCommand.java
24 24
package org.gvsig.fmap.dal.feature.impl.undo.command;
25 25

  
26 26
import org.gvsig.fmap.dal.feature.FeatureType;
27
import org.gvsig.fmap.dal.feature.impl.FeatureTypeManager;
27
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureTypeManager;
28 28
import org.gvsig.tools.undo.RedoException;
29 29
import org.gvsig.tools.undo.UndoException;
30 30

  
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/undo/DefaultFeatureCommandsStack.java
30 30
import org.gvsig.fmap.dal.feature.FeatureType;
31 31
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureReferenceSelection;
32 32
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
33
import org.gvsig.fmap.dal.feature.impl.FeatureManager;
34
import org.gvsig.fmap.dal.feature.impl.FeatureTypeManager;
35
import org.gvsig.fmap.dal.feature.impl.SpatialManager;
33
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureManager;
34
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureTypeManager;
35
import org.gvsig.fmap.dal.feature.impl.editing.memory.SpatialManager;
36 36
import org.gvsig.fmap.dal.feature.impl.undo.command.FTypeUpdateCommand;
37 37
import org.gvsig.fmap.dal.feature.impl.undo.command.FeatureDeleteCommand;
38 38
import org.gvsig.fmap.dal.feature.impl.undo.command.FeatureInsertCommand;
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/editing/memory/ExpansionAdapter.java
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.editing.memory;
25

  
26
import java.util.HashMap;
27
import java.util.Iterator;
28

  
29

  
30
/**
31
 * Maneja el fichero de extensi?n en el que se almacenan las modificacionesy adici?nes
32
 * durante la edici?n. Los ?ndices que devuelve esta clase en sus m?todos
33
 * addFeature y modifyFeature son invariables, es decir, que si se invoca un
34
 * m?todo addFeature que retorna un 8, independientemente de las operaciones
35
 * que se realicen posteriormente, una llamada a getFeature(8) retornar?
36
 * dicha fila. Si esta geometr?a es eliminada posteriormente, se retornar? un
37
 * null. Esto ?ltimo se cumple mientras no se invoque el m?todo compact, mediante
38
 * el que se reorganizan las geometr?as dejando en el fichero s?lo las que tienen
39
 * validez en el momento de realizar la invocaci?n.
40
 *
41
 * @author Vicente Caballero Navarro
42
 *
43
 */
44
public interface ExpansionAdapter {
45
	/**
46
	 * A?ade una geometria al final del fichero y retorna el ?ndice que ocupa
47
	 * esta geometria en el mismo
48
	 *
49
	 * @param feature
50
	 * @param status TODO
51
	 * @param indexInternalFields fields that where valid when this feature was added.
52
	 *
53
	 * @return calculated index of the new feature.
54
	 */
55
	int addObject(Object obj);
56

  
57
	/**
58
	 * Modifica la index-?sima geometr?a del fichero devolviendo la posici?n en
59
	 * la que se pone la geometria modificada.
60
	 *
61
	 * @param calculated index of feature to be modified
62
	 * @param feature newFeature that replaces the old feature.
63
	 *
64
	 * @return new calculated index of the modified feature.
65
	 */
66
//	int updateObject(Object obj);
67

  
68
	/**
69
	 * Obtiene la geometria que hay en el ?ndice 'index' o null si la geometr?a
70
	 * ha sido invalidada.
71
	 *
72
	 * @param index caculatedIndex of the feature to be read.
73
	 * @return feature
74
	 */
75
	Object getObject(int index);
76

  
77
	/**
78
	 * Realiza una compactaci?n del fichero que maneja esta clase
79
	 *
80
	 * @param relations DOCUMENT ME!
81
	 */
82
	void compact(HashMap relations);
83

  
84
	/**
85
     * Mueve el puntero de escritura de manera que las siguientes escrituras
86
     * machacar?n la ?ltima fila
87
     */
88
    void deleteLastObject();
89

  
90
    /**
91
     * Abre el fichero de expansi?n para comenzar la edici?n
92
     */
93
    void open();
94

  
95
    /**
96
     * Cierra el fichero de expansi?n al terminar la edici?n
97
     */
98
    void close();
99

  
100
    int getSize();
101

  
102
    Iterator iterator();
103
}
0 104

  
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/editing/memory/FeatureManager.java
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.
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff