Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / edition / VectorialEditableDBAdapter.java @ 12148

History | View | Annotate | Download (15.9 KB)

1 4159 fjp
/**
2 5115 caballero
 *
3 4159 fjp
 */
4
package com.iver.cit.gvsig.fmap.edition;
5
6
import java.awt.geom.Rectangle2D;
7
import java.util.ArrayList;
8
import java.util.Hashtable;
9
import java.util.List;
10
11 11287 azabala
import org.cresques.cts.IProjection;
12
13 6856 fjp
import com.hardcode.driverManager.Driver;
14 10627 caballero
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
15
import com.iver.cit.gvsig.exceptions.commands.EditionCommandException;
16
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
17
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileWriteException;
18
import com.iver.cit.gvsig.exceptions.expansionfile.OpenExpansionFileException;
19 11468 caballero
import com.iver.cit.gvsig.exceptions.layers.CancelEditingLayerException;
20 10627 caballero
import com.iver.cit.gvsig.exceptions.visitors.StartWriterVisitorException;
21 11468 caballero
import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException;
22 4159 fjp
import com.iver.cit.gvsig.fmap.core.IFeature;
23 4181 fjp
import com.iver.cit.gvsig.fmap.core.IRow;
24 4159 fjp
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
25 4171 fjp
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
26 4159 fjp
import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator;
27 11971 caballero
import com.iver.cit.gvsig.fmap.drivers.IVectorialDatabaseDriver;
28 11880 azabala
import com.iver.cit.gvsig.fmap.drivers.featureiterators.AttrQueryFeatureIterator;
29
import com.iver.cit.gvsig.fmap.drivers.featureiterators.DefaultFeatureIterator;
30
import com.iver.cit.gvsig.fmap.drivers.featureiterators.IndexedSptQueryFeatureIterator;
31
import com.iver.cit.gvsig.fmap.drivers.featureiterators.SpatialQueryFeatureIterator;
32 4171 fjp
import com.iver.cit.gvsig.fmap.layers.ISpatialDB;
33
import com.iver.cit.gvsig.fmap.layers.VectorialDBAdapter;
34 4159 fjp
import com.vividsolutions.jts.geom.Envelope;
35 4171 fjp
import com.vividsolutions.jts.index.quadtree.Quadtree;
36 4159 fjp
37
/**
38
 * @author fjp
39 5115 caballero
 *
40 4159 fjp
 */
41 4181 fjp
public class VectorialEditableDBAdapter extends VectorialEditableAdapter
42
                implements ISpatialDB {
43
        private class MyIterator implements IFeatureIterator {
44 4171 fjp
                private Rectangle2D extent = null;
45 4181 fjp
46 4171 fjp
                private VectorialDBAdapter orig;
47 4181 fjp
48 4171 fjp
                private IFeature feat;
49 4181 fjp
50 4171 fjp
                private IFeatureIterator featIt;
51 4181 fjp
52 4171 fjp
                private String epsg;
53 4181 fjp
54 11971 caballero
                private IVectorialDatabaseDriver dbDriver;
55 4181 fjp
56 4171 fjp
                Hashtable alreadyDone = new Hashtable();
57 4181 fjp
58 4171 fjp
                private int idFromExpansion = 0;
59 4181 fjp
60 4171 fjp
                private List listFromExpansion;
61 4181 fjp
62
                private boolean bOriginalCursorOpened = true;
63
64 10627 caballero
                public MyIterator(Rectangle2D r, String strEPSG) throws ReadDriverException {
65 4171 fjp
                        extent = r;
66
                        epsg = strEPSG;
67
                        orig = (VectorialDBAdapter) ova;
68
                        featIt = orig.getFeatureIterator(extent, epsg);
69 11971 caballero
                        dbDriver = (IVectorialDatabaseDriver) getOriginalDriver();
70 4171 fjp
                        getFeaturesFromExpansionFile();
71
                }
72 11468 caballero
73
74 11287 azabala
                /*
75 11468 caballero
                 * azo: these new constructors must be tested
76 11287 azabala
                 * */
77 11468 caballero
78 11287 azabala
                public MyIterator(String[] fields, IProjection newProjection) throws ReadDriverException{
79
                        epsg = newProjection.getAbrev();
80
                        orig = (VectorialDBAdapter) ova;
81
                        featIt = orig.getFeatureIterator(fields, newProjection);
82 11971 caballero
                        dbDriver = (IVectorialDatabaseDriver) getOriginalDriver();
83 11287 azabala
                        getFeaturesFromExpansionFile();
84
                }
85 11468 caballero
86 11287 azabala
                public MyIterator(String sql, IProjection newProjection) throws ReadDriverException{
87
                        epsg = newProjection.getAbrev();
88
                        orig = (VectorialDBAdapter) ova;
89
                        featIt = orig.getFeatureIterator(sql, newProjection);
90 11971 caballero
                        dbDriver = (IVectorialDatabaseDriver) getOriginalDriver();
91 11287 azabala
                        getFeaturesFromExpansionFile();
92
                }
93 11468 caballero
94 11287 azabala
                public MyIterator(Rectangle2D rect, String[] fields, IProjection newProjection) throws ReadDriverException{
95
                        extent = rect;
96
                        epsg = newProjection.getAbrev();
97
                        orig = (VectorialDBAdapter) ova;
98 11880 azabala
                        featIt = orig.getFeatureIterator(extent, fields, newProjection, true);
99 11971 caballero
                        dbDriver = (IVectorialDatabaseDriver) getOriginalDriver();
100 11287 azabala
                        getFeaturesFromExpansionFile();
101
                }
102 4181 fjp
103 11468 caballero
104
105 10627 caballero
                public boolean hasNext() throws ReadDriverException, ExpansionFileReadException {
106 4171 fjp
                        feat = null;
107 4181 fjp
                        int calculatedIndex = -1;
108
                        if (bOriginalCursorOpened) // Si hay originales (Es porque si se ha
109
                                                                                // llegado al final, se cierra el
110
                                                                                // iterador y salta un fallo
111 4171 fjp
                        {
112 4181 fjp
                                bOriginalCursorOpened = featIt.hasNext();
113
                                if (bOriginalCursorOpened) {
114
                                        feat = featIt.next();
115
                                        int originalIndex = dbDriver.getRowIndexByFID(feat);
116 5115 caballero
117 4182 fjp
                                        // Iteramos hasta que encontremos alguno no borrado.
118 4191 fjp
                                        // Aqu? suponemos que el orden es el original. Si no, no funcionar?.
119
                                        if (delRows.get(originalIndex)) // Si est? borrado
120 4182 fjp
                                        {
121
                                                feat = null;
122
                                                boolean bFound = false;
123
                                                while (featIt.hasNext())
124
                                                {
125
                                                        feat = featIt.next();
126
                                                        originalIndex = dbDriver.getRowIndexByFID(feat);
127 4191 fjp
                                                        // calculatedIndex = getCalculatedIndex(originalIndex);
128
                                                        if (delRows.get(originalIndex) == false) // Si NO est? borrado
129 4182 fjp
                                                        {
130
                                                                bFound = true;
131
                                                                break;
132
                                                        }
133
                                                }
134
                                                if (bFound == false) // Todos los ?ltimos est?n borrados.
135
                                                {
136
                                                        bOriginalCursorOpened = false; // para que busque en el fichero de expansi?n
137 6025 fjp
                                                        feat = null;
138 4182 fjp
                                                }
139
                                        } // if delRows
140
                                        if (bOriginalCursorOpened) // Si todav?a quedan features por leer, y no est?n borradas
141
                                        {
142 4191 fjp
                                                calculatedIndex = originalIndex; //getCalculatedIndex(originalIndex);
143 4182 fjp
                                                Integer integer = new Integer(calculatedIndex);
144
                                                if (!relations.containsKey(integer)) { // Si no est? en el
145
                                                                                                                                // fichero de
146
                                                                                                                                // expansi?n
147 4181 fjp
                                                        alreadyDone.put(integer, feat);
148 4182 fjp
                                                } else { // Si est? en el fichero de expansi?n
149
                                                        int num = ((Integer) relations.get(integer)).intValue();
150
                                                        IRowEdited auxR;
151 10627 caballero
                                                        auxR = expansionFile.getRow(num);
152
                                                        feat = (IFeature) auxR.getLinkedRow().cloneRow();
153
                                                        // feat = (IFeature) auxR.getLinkedRow();
154
                                                        alreadyDone.put(integer, feat);
155 4182 fjp
                                                } // else
156
                                        } // if tercer bOriginalCursorOpened
157
                                } // if segundo bOriginalCursorOpened
158
                        } // if primer bOriginalCursorOpened
159 4181 fjp
                        if (!bOriginalCursorOpened) {
160
                                // Si ya no hay m?s de las originales, todav?a tenemos
161 4191 fjp
                                // que revisar las a?adidas que hay en el fichero
162 4181 fjp
                                // de expansi?n
163 4191 fjp
                                        while ((idFromExpansion < expansionFile.getSize()) && (feat == null))
164 4182 fjp
                                        {
165 4191 fjp
                                                IRowEdited rowEd = expansionFile.getRow(idFromExpansion);
166 4195 fjp
                                                IFeature aux = (IFeature) rowEd.getLinkedRow();
167 4191 fjp
                                                Integer calculated = (Integer) mapFID2index.get(aux.getID());
168
                                                calculatedIndex = calculated.intValue();
169
                                                System.out.println("El elemento idFromExpansion = " + idFromExpansion + " es " + aux.getID());
170 5115 caballero
171 4191 fjp
                                                // Revisamos los borrados
172
                                                if (delRows.get(calculatedIndex) == true)
173 4182 fjp
                                                {
174 4191 fjp
                                                        boolean bFound = false;
175 4193 fjp
                                                        while ((!bFound) && (idFromExpansion < expansionFile.getSize()-1))
176 4182 fjp
                                                        {
177 4195 fjp
                                                                // calculatedIndex++;
178 4191 fjp
                                                                idFromExpansion++;
179 4195 fjp
                                                                rowEd = expansionFile.getRow(idFromExpansion);
180
                                                                aux = (IFeature) rowEd.getLinkedRow();
181 5115 caballero
182
183
184 4195 fjp
                                                                Integer auxCalculated = (Integer) mapFID2index.get(aux.getID());
185
                                                                calculatedIndex = auxCalculated.intValue();
186 4193 fjp
                                                                // Si no est? borrado y es una entidad v?lida, que est? siendo usada (no es algo que est? en el expansionFile sin usarse)
187
                                                                if ((delRows.get(calculatedIndex) == false) && (relations.containsKey(auxCalculated)))
188 4191 fjp
                                                                {
189
                                                                        bFound = true;
190 4193 fjp
                                                                        calculated = auxCalculated;
191 4191 fjp
                                                                        break;
192
                                                                }
193
                                                                else
194
                                                                {
195 5115 caballero
                                                                        System.out.println("El elemento idFromExpansion = " + idFromExpansion + " est? borrado");
196 4191 fjp
                                                                }
197 4182 fjp
                                                        }
198 4191 fjp
                                                        if (bFound)
199
                                                        {
200
                                                                calculated = new Integer(calculatedIndex);
201
                                                                rowEd = expansionFile.getRow(idFromExpansion);
202 5115 caballero
                                                                aux = (IFeature) rowEd.getLinkedRow();
203 4191 fjp
                                                        }
204
                                                        else
205
                                                        {
206
                                                                return false; // El resto est?n borrados
207
                                                        }
208
                                                } // if primer borrado
209
                                                if (relations.containsKey(calculated))
210 4182 fjp
                                                {
211 4191 fjp
                                                        Integer realExpansionIndex = (Integer) relations.get(calculated);
212
                                                        if (realExpansionIndex.intValue() == idFromExpansion)
213
                                                        {
214 4195 fjp
                                                                feat = (IFeature) aux.cloneRow();
215 4181 fjp
                                                        }
216
                                                }
217 4191 fjp
                                                idFromExpansion++;
218 4181 fjp
                                        }
219 4171 fjp
                        }
220 4181 fjp
221
                        if (calculatedIndex == -1)
222 4171 fjp
                                return false;
223 4181 fjp
                        else {
224 4191 fjp
                                if (feat == null)
225
                                {
226
                                        if (idFromExpansion == expansionFile.getSize())
227
                                                return false;
228
                                        else
229
                                                System.err.println("ERROR DE ENTREGA DE FEATURE EN hasNext del Iterador");
230
                                }
231
                                /* if (delRows.get(calculatedIndex))
232
                                        feat = null; */
233 4171 fjp
                                return true;
234 4181 fjp
                        }
235
236 4171 fjp
                }
237
238 10627 caballero
                public IFeature next() {
239 4171 fjp
                        return feat;
240
                }
241
242 10627 caballero
                public void closeIterator() throws ReadDriverException {
243 4171 fjp
                        // TODO Auto-generated method stub
244 4181 fjp
245 4171 fjp
                }
246 4181 fjp
247
                private void getFeaturesFromExpansionFile() {
248
                        Envelope e = FConverter.convertRectangle2DtoEnvelope(extent);
249
                        listFromExpansion = index.query(e);
250 4171 fjp
                }
251
        }
252 4181 fjp
253 5115 caballero
254 4191 fjp
        private Hashtable mapFID2index = new Hashtable();
255 12148 caballero
//        private Hashtable mapIndex2FID = new Hashtable();
256 4159 fjp
        /**
257 5115 caballero
         *
258 4159 fjp
         */
259
        public VectorialEditableDBAdapter() {
260
                super();
261
        }
262
263 4181 fjp
        /*
264
         * (non-Javadoc)
265 5115 caballero
         *
266 4181 fjp
         * @see com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter#getFeatures(java.awt.geom.Rectangle2D,
267
         *      java.lang.String)
268 4159 fjp
         */
269 10627 caballero
        public IRowEdited[] getFeatures(Rectangle2D r, String strEPSG) throws ReadDriverException, ExpansionFileReadException {
270 4159 fjp
                ArrayList aux = new ArrayList();
271 4181 fjp
                IFeatureIterator featIt = getFeatureIterator(r, strEPSG, null);
272 4191 fjp
                int numEntities = 0;
273 4181 fjp
                while (featIt.hasNext()) {
274
                        IFeature feat = featIt.next();
275
                        // TODO:
276 4191 fjp
                        assert(feat !=null);
277 4181 fjp
                        int index = getRowIndexByFID(feat);
278
                        IRowEdited edRow = new DefaultRowEdited(feat, IRowEdited.STATUS_ORIGINAL, index);
279
                        aux.add(edRow);
280 4191 fjp
                        numEntities++;
281 4171 fjp
                }
282
283 4181 fjp
                return (IRowEdited[]) aux.toArray(new IRowEdited[0]);
284
                // return (IFeature[]) aux.toArray(new IFeature[0]);
285
286 4159 fjp
        }
287
288 4181 fjp
        /*
289
         * (non-Javadoc)
290 5115 caballero
         *
291 4159 fjp
         * @see com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter#startEdition()
292
         */
293 10627 caballero
        public void startEdition(int sourceType) throws StartWriterVisitorException {
294 4171 fjp
                isEditing = true;
295 6856 fjp
                Driver drv = ova.getDriver();
296
                if (drv instanceof IWriteable)
297
                {
298
                        setWriter(((IWriteable) drv).getWriter());
299
                }
300
301 4181 fjp
                try {
302
                        expansionFile.open();
303 4171 fjp
304 4181 fjp
                        // TODO: Si la capa dispone de un ?ndice espacial, hacer
305
                        // algo aqu? para que se use ese ?ndice espacial.
306
                        index = new Quadtree();
307
                        // No metemos ninguna entidad de las originales dentro
308
                        // de la base de datos porque esa consulta ya la
309
                        // hace getFeatures sin tener en cuenta el ?ndice local.
310 4191 fjp
                         for (int i = 0; i < ova.getShapeCount(); i++)
311
                         {
312
                                 IFeature feat = ova.getFeature(i);
313
                                 Integer calculatedIndex = new Integer(i);
314
                                 mapFID2index.put(feat.getID(), calculatedIndex);
315 12148 caballero
//                                 mapIndex2FID.put(calculatedIndex, feat.getID());
316 4191 fjp
                         }
317 4171 fjp
318 4181 fjp
                        /*
319
                         * for (int i = 0; i < ova.getShapeCount(); i++) { IGeometry g=null;
320
                         * try { g = ((DefaultFeature) ova.getFeature(i)).getGeometry(); }
321
                         * catch (DriverException e1) { // TODO Auto-generated catch block
322
                         * e1.printStackTrace(); }
323 5115 caballero
                         *
324 4181 fjp
                         * if (g == null) { continue; }
325 5115 caballero
                         *
326 4181 fjp
                         * Rectangle2D r = g.getBounds2D(); Envelope e = new
327
                         * Envelope(r.getX(), r.getX() + r.getWidth(), r.getY(), r.getY() +
328
                         * r.getHeight()); index.insert(e, new Integer(i)); } } catch
329
                         * (DriverIOException e) { throw new EditionException(e);
330
                         */
331 10627 caballero
                } catch (ReadDriverException e) {
332
                        throw new StartWriterVisitorException(writer.getName(),e);
333
                } catch (ExpansionFileReadException e) {
334
                        throw new StartWriterVisitorException(writer.getName(),e);
335
                } catch (OpenExpansionFileException e) {
336
                        throw new StartWriterVisitorException(writer.getName(),e);
337 4181 fjp
                }
338 4171 fjp
339 4181 fjp
                System.err.println("Se han metido en el ?ndice "
340
                                + index.queryAll().size() + " geometr?as");
341 4171 fjp
342 4159 fjp
        }
343
344 4181 fjp
        public IFeatureIterator getFeatureIterator(Rectangle2D r, String strEPSG)
345 10627 caballero
                        throws ReadDriverException {
346 4171 fjp
                return new MyIterator(r, strEPSG);
347
        }
348
349 4181 fjp
        public IFeatureIterator getFeatureIterator(Rectangle2D r, String strEPSG,
350 10627 caballero
                        String[] alphaNumericFieldsNeeded) throws ReadDriverException {
351 4171 fjp
                return new MyIterator(r, strEPSG);
352
        }
353 11468 caballero
354
        public IFeatureIterator getFeatureIterator(String[] fields, IProjection newProjection)
355 11287 azabala
        throws ReadDriverException{
356 11880 azabala
                //TODO make tests with these (unit test of vectorialeditableadapter)
357
                return new MyIterator(fields, newProjection);
358
//                return new DefaultFeatureIterator(this, projection, newProjection, fields);
359 11287 azabala
        }
360 11971 caballero
361 11880 azabala
        //TODO test this (azo)
362 11971 caballero
        public IFeatureIterator getFeatureIterator(Rectangle2D rect, String[] fields,
363
                        IProjection newProjection,
364 11880 azabala
                        boolean fastIteration) throws ReadDriverException{
365
                return getFeatureIterator(rect, newProjection.getAbrev(), fields);
366
        }
367 11468 caballero
368 11287 azabala
        /**
369
        * Return a feature iterator from a given sql statement.
370
        * <br>
371
        * In this case, the statement will have the "projection" operator
372
        * (select campo1, campo2, ...etc) and the "selection" operator (where ....)
373
        * @param sql statement which define a filter
374
        * @return feature iterator
375
        * */
376 11468 caballero
        public IFeatureIterator getFeatureIterator(String sql,
377 11287 azabala
                                                                IProjection newProjection) throws ReadDriverException{
378 11468 caballero
379 11287 azabala
                return new AttrQueryFeatureIterator(this, projection, newProjection, sql);
380
        }
381 11468 caballero
382 4171 fjp
        public DBLayerDefinition getLyrDef() {
383
                VectorialDBAdapter orig = (VectorialDBAdapter) ova;
384
                return orig.getLyrDef();
385
        }
386
387 4181 fjp
        public int getRowIndexByFID(IFeature feat) {
388 4191 fjp
                Integer calculatedIndex = (Integer) mapFID2index.get(feat.getID());
389
                return getInversedIndex(calculatedIndex.intValue());
390 4181 fjp
        }
391
392
        /* (non-Javadoc)
393
         * @see com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter#doAddRow(com.iver.cit.gvsig.fmap.core.IRow)
394
         */
395 10627 caballero
        public int doAddRow(IRow feat, int sourceType) throws ReadDriverException, ExpansionFileWriteException {
396 5184 caballero
                int calculatedIndex = super.doAddRow(feat, sourceType);
397 6313 fjp
                // Integer posInExpansionFile = (Integer) relations.get(new Integer(calculatedIndex));
398 4193 fjp
                Integer virtual = new Integer(calculatedIndex); // calculatedIndex es igual al numero de shapes originales + el numero de entidades a?adidas.
399 4191 fjp
                                        // es decir, virtual es el calculatedIndex (no tiene en cuenta los borrados)
400
                                        // calculatedIndex = indiceExterno + borrados hasta ese punto.
401
                mapFID2index.put(feat.getID(), virtual);
402 12148 caballero
//                mapIndex2FID.put(virtual, feat.getID());
403 4193 fjp
                return calculatedIndex;
404 5115 caballero
405 4181 fjp
        }
406
407
        /* (non-Javadoc)
408
         * @see com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter#doModifyRow(int, com.iver.cit.gvsig.fmap.core.IRow)
409
         */
410 10627 caballero
        public int doModifyRow(int calculatedIndex, IRow feat,int sourceType) throws ReadDriverException, ExpansionFileWriteException, ExpansionFileReadException{
411 5184 caballero
                int posAnteriorInExpansionFile = super.doModifyRow(calculatedIndex, feat, sourceType); // devolver? -1 si es original
412 4191 fjp
                // No hacemos nada con las modificaciones sobre los ?ndices.
413
                // Suponiendo que feat tenga la misma ID que la que hab?a antes.
414
                Integer virtual = new Integer(calculatedIndex);
415 12148 caballero
//                String theIDoriginal = (String) mapIndex2FID.get(virtual);
416
//                if (!theIDoriginal.equals(feat.getID()))
417
//                {
418
//                        AssertionError err = new AssertionError("Fallo al modificar la fila. ID viejo=" + theIDoriginal + " ID nuevo = " + feat.getID());
419
//                        err.printStackTrace();
420
//                }
421 4191 fjp
                // hashFIDtoExpansionFile.put(feat.getID(), new Integer(posInExpansionFile));
422 4195 fjp
                mapFID2index.put(feat.getID(), virtual);
423 12148 caballero
//                mapIndex2FID.put(virtual, feat.getID());
424 4191 fjp
                return posAnteriorInExpansionFile;
425 4181 fjp
        }
426
427
        /* (non-Javadoc)
428
         * @see com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter#doRemoveRow(int)
429
         */
430 10627 caballero
        public IRow doRemoveRow(int index,int sourceType) throws ReadDriverException, ExpansionFileReadException {
431 4182 fjp
                // Le entra un calculatedIndex, as? que delRows tiene guardados
432
                // los ?ndices internos, no los externos.
433 5184 caballero
                IFeature deletedFeat = (IFeature) super.doRemoveRow(index, sourceType);
434 4191 fjp
                // Lo borramos de hashFIDtoExpansionFile
435
                // hashFIDtoExpansionFile.remove(deletedFeat.getID());
436
                return deletedFeat;
437 4181 fjp
        }
438
439 4191 fjp
        /* (non-Javadoc)
440
         * @see com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter#undoAddRow(int)
441
         */
442 10627 caballero
        public void undoAddRow(int calculatedIndex, int sourceType) throws EditionCommandException {
443 4191 fjp
                // TODO Auto-generated method stub
444 5184 caballero
                super.undoAddRow(calculatedIndex,sourceType);
445 4195 fjp
                Integer calculated = new Integer(calculatedIndex);
446 12148 caballero
//                String theID = (String) mapIndex2FID.get(calculated);
447 4195 fjp
                mapFID2index.remove(calculated);
448 12148 caballero
//                mapIndex2FID.remove(theID);
449 5115 caballero
450 4191 fjp
        }
451 11468 caballero
        public void cancelEdition(int sourceType) throws CancelEditingLayerException {
452
                super.cancelEdition(sourceType);
453
                mapFID2index.clear();
454 12148 caballero
//                mapIndex2FID.clear();
455 11468 caballero
        }
456 4191 fjp
457 11468 caballero
        public void stopEdition(IWriter writer, int sourceType) throws StopWriterVisitorException{
458
                super.stopEdition(writer, sourceType);
459
                mapFID2index.clear();
460 12148 caballero
//                mapIndex2FID.clear();
461 11468 caballero
        }
462 4159 fjp
}