Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / trunk / org.gvsig.geoprocess / org.gvsig.geoprocess.algorithm / org.gvsig.geoprocess.algorithm.base / src / main / java / org / gvsig / geoprocess / algorithm / base / core / DALFeaturePersister.java @ 994

History | View | Annotate | Download (27.3 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 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 2
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.geoprocess.algorithm.base.core;
25

    
26
import java.util.ArrayList;
27
import java.util.List;
28

    
29
import org.gvsig.fmap.dal.exception.DataException;
30
import org.gvsig.fmap.dal.exception.ReadException;
31
import org.gvsig.fmap.dal.feature.EditableFeature;
32
import org.gvsig.fmap.dal.feature.Feature;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.feature.FeatureType;
36
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
37
import org.gvsig.fmap.geom.Geometry.TYPES;
38
import org.gvsig.fmap.geom.GeometryLocator;
39
import org.gvsig.fmap.geom.GeometryManager;
40
import org.gvsig.fmap.geom.aggregate.MultiCurve;
41
import org.gvsig.fmap.geom.aggregate.MultiPoint;
42
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
43
import org.gvsig.fmap.geom.aggregate.MultiSurface;
44
import org.gvsig.fmap.geom.exception.CreateGeometryException;
45
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
46
import org.gvsig.fmap.geom.operation.GeometryOperationException;
47
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
48
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
49
import org.gvsig.fmap.geom.primitive.Curve;
50
import org.gvsig.fmap.geom.primitive.Point;
51
import org.gvsig.fmap.geom.primitive.Primitive;
52
import org.gvsig.fmap.geom.primitive.Surface;
53
import org.gvsig.fmap.geom.type.GeometryType;
54
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
55

    
56
import com.vividsolutions.jts.geom.Geometry;
57
import com.vividsolutions.jts.geom.GeometryCollection;
58

    
59
import es.unex.sextante.core.Sextante;
60

    
61
/**
62
 * Writes features in a FeatureStore
63
 * @author Nacho Brodin (nachobrodin@gmail.com)
64
 */
65
public class DALFeaturePersister {
66
        private FeatureStore              store             = null;
67
        private String[]                  fieldNames        = null;
68
        private GeometryManager           geometryManager   = null;
69

    
70
        /**
71
         * Sets the output FeatureType
72
         * @param out
73
         * @throws DataException
74
         */
75
        public DALFeaturePersister(FeatureStore out, String[] fieldNames) {
76
                this.store = out;
77
                this.fieldNames = fieldNames;
78
                try {
79
                        if(!store.isEditing())
80
                                store.edit();
81
                } catch (DataException e) {
82
                } catch (NullPointerException e) {
83
                }
84
                geometryManager = GeometryLocator.getGeometryManager();
85
        }
86

    
87
        /**
88
         * Gets the list of field names
89
         * @return
90
         */
91
        public String[] getFieldNames() {
92
                try {
93
                        FeatureAttributeDescriptor[] attrs = store.getDefaultFeatureType().getAttributeDescriptors();
94
                        String[] fieldNames = new String[attrs.length];
95
                        for (int i = 0; i < attrs.length; i++) {
96
                                fieldNames[i] = attrs[i].getName();
97
                        }
98
                        return fieldNames;
99
                } catch (DataException e) {
100
                        Sextante.addErrorToLog(e);
101
                }
102
                return null;
103
        }
104

    
105
        /**
106
         * Gets the list of field names
107
         * @return
108
         */
109
        public String[] getFieldNamesWithoutGeom() {
110
                try {
111
                        FeatureAttributeDescriptor[] attrs = store.getDefaultFeatureType().getAttributeDescriptors();
112
                        int nFields = attrs.length;
113
                        for (int j = 0; j < nFields; j++) {
114
                                if(attrs[j].getName().compareTo("GEOMETRY") == 0) {
115
                                        nFields --;
116
                                        break;
117
                                }
118
                        }
119

    
120
                        int cont = 0;
121
                        String[] fieldNames = new String[nFields];
122
                        for (int i = 0; i < attrs.length; i++) {
123
                                if(attrs[i].getName().compareTo("GEOMETRY") != 0) {
124
                                        fieldNames[cont] = attrs[i].getName();
125
                                        cont ++;
126
                                }
127
                        }
128
                        return fieldNames;
129
                } catch (DataException e) {
130
                        Sextante.addErrorToLog(e);
131
                }
132
                return null;
133
        }
134

    
135
        /**
136
         * Adds a JTS feature to the FeatureStore
137
         * @param entry
138
         * @param newGeom
139
         * @throws CreateGeometryException
140
         * @throws DataException
141
         */
142
        public EditableFeature addFeature(Feature feature1, Feature feature2, Geometry newGeom)
143
                throws CreateGeometryException, DataException {
144

    
145
                int outPutType = getOutputFeatureStore().getDefaultFeatureType()
146
                                                                .getDefaultGeometryAttribute().getGeomType().getType();
147

    
148
                //Si el objeto que viene es un GeometryCollection hay que convertirlo a una lista de geometrias
149
                //solo del tipo que pueda salvarse en la capa eliminando el resto. Esto sucede sobre todo en la intersecci?n
150
                //que devuelve tipos mezclados. Cada uno debe salvarse en el tipo de capa de salida apropiado
151
                ArrayList<org.gvsig.fmap.geom.Geometry> dalGeomList = null;
152
                try {
153
                        dalGeomList = convertGeometryCollection2GeometryList(newGeom, outPutType);
154
                } catch (GeometryOperationNotSupportedException e1) {
155
                        Sextante.addErrorToLog(e1);
156
                } catch (GeometryOperationException e1) {
157
                        Sextante.addErrorToLog(e1);
158
                }
159
                org.gvsig.fmap.geom.Geometry newDalGeom = null;
160

    
161
                //Si lo que venia no era un GeometryCollection se convierte a geometr?a de DAL
162
                if(dalGeomList == null) {
163
                        GeometryOperationContext ctx = new GeometryOperationContext();
164
                        ctx.setAttribute(FromJTS.PARAM, newGeom);
165
                        try {
166
                                newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
167
                        } catch (GeometryOperationNotSupportedException e) {
168
                                Sextante.addErrorToLog(e);
169
                                return null;
170
                        } catch (GeometryOperationException e) {
171
                                Sextante.addErrorToLog(e);
172
                                return null;
173
                        }
174
                }
175

    
176
                EditableFeature feat = store.createNewFeature();
177

    
178
                int globalIndex = 0;
179
                int localIndex = 0;
180
                Object value = feature1.get(localIndex);
181
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
182
                        feat.set(globalIndex, value);
183
                        value = feature1.get(++localIndex);
184
                        globalIndex ++;
185
                }
186

    
187
                localIndex = 0;
188
                value = feature2.get(localIndex);
189
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
190
                        feat.set(globalIndex, value);
191
                        value = feature2.get(++localIndex);
192
                        globalIndex ++;
193
                }
194

    
195
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
196
            org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newDalGeom);
197
            if(multiGeometry!=null && acceptType(store, multiGeometry)){
198
                feat.setGeometry("GEOMETRY", multiGeometry);
199
            } else {
200
                feat.setGeometry("GEOMETRY", newDalGeom);
201
            }
202
                        store.insert(feat);
203
                        return feat;
204
                } else if(dalGeomList != null) {
205
                        for (int i = 0; i < dalGeomList.size(); i++) {
206
                                if(acceptType(store, dalGeomList.get(i))) {
207
                            org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(dalGeomList.get(i));
208
                            if(multiGeometry!=null && acceptType(store, multiGeometry)){
209
                                feat.setGeometry("GEOMETRY", multiGeometry);
210
                            } else {
211
                                feat.setGeometry("GEOMETRY", dalGeomList.get(i));
212
                            }
213
                            store.insert(feat);
214
                                }
215
                        }
216
                        return feat;
217
                }
218
                return null;
219
        }
220

    
221
        public EditableFeature addFeature(Feature feature1, Feature feature2, org.gvsig.fmap.geom.Geometry newDalGeom)
222
                throws CreateGeometryException, DataException {
223
                EditableFeature feat = store.createNewFeature();
224

    
225
                int globalIndex = 0;
226
                int localIndex = 0;
227
                Object value = feature1.get(localIndex);
228
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
229
                        feat.set(globalIndex, value);
230
                        value = feature1.get(++localIndex);
231
                        globalIndex ++;
232
                }
233

    
234
                localIndex = 0;
235
                value = feature2.get(localIndex);
236
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
237
                        feat.set(globalIndex, value);
238
                        value = feature2.get(++localIndex);
239
                        globalIndex ++;
240
                }
241

    
242
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
243
                  org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newDalGeom);
244
                    if(multiGeometry!=null && acceptType(store, multiGeometry)){
245
                        feat.setGeometry("GEOMETRY", multiGeometry);
246
                    } else {
247
                        feat.setGeometry("GEOMETRY", newDalGeom);
248
                    }
249
                        store.insert(feat);
250
                        return feat;
251
                }
252
                return null;
253
        }
254

    
255
        /**
256
         * Converts a geometry collection from JTS to a list of geometries of the selected type.
257
         * The GeometryCollection is converted only when it is a heterogeneous collection of geometries
258
         * @param col
259
         * @param type
260
         * @return
261
         * @throws CreateGeometryException
262
         * @throws GeometryOperationException
263
         * @throws GeometryOperationNotSupportedException
264
         */
265
        public ArrayList<org.gvsig.fmap.geom.Geometry> convertGeometryCollection2GeometryList(Geometry g, int type) throws GeometryOperationNotSupportedException, GeometryOperationException {
266
                if( g instanceof GeometryCollection &&
267
                        !(g instanceof com.vividsolutions.jts.geom.MultiLineString) &&
268
                        !(g instanceof com.vividsolutions.jts.geom.MultiPoint) &&
269
                        !(g instanceof com.vividsolutions.jts.geom.MultiPolygon)) {
270
                        GeometryCollection col = (GeometryCollection)g;
271
                        ArrayList<org.gvsig.fmap.geom.Geometry> geometries = new ArrayList<org.gvsig.fmap.geom.Geometry>();
272

    
273
                        if(type == TYPES.MULTIPOINT || type == TYPES.POINT) {
274
                                for (int i = 0; i < col.getNumGeometries(); i++) {
275
                                        Geometry gx = col.getGeometryN(i);
276
                                        if( gx instanceof com.vividsolutions.jts.geom.Point ||
277
                                                gx instanceof com.vividsolutions.jts.geom.MultiPoint) {
278
                                                GeometryOperationContext ctx = new GeometryOperationContext();
279
                                                ctx.setAttribute(FromJTS.PARAM, gx);
280
                                                org.gvsig.fmap.geom.Geometry newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
281
                                                geometries.add(newDalGeom);
282
                                        }
283
                                }
284
                        }
285

    
286
                        if(type == TYPES.MULTICURVE || type == TYPES.CURVE) {
287
                                for (int i = 0; i < col.getNumGeometries(); i++) {
288
                                        Geometry gx = col.getGeometryN(i);
289
                                        if( gx instanceof com.vividsolutions.jts.geom.LineString ||
290
                                                gx instanceof com.vividsolutions.jts.geom.MultiLineString) {
291
                                                GeometryOperationContext ctx = new GeometryOperationContext();
292
                                                ctx.setAttribute(FromJTS.PARAM, gx);
293
                                                org.gvsig.fmap.geom.Geometry newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
294
                                                geometries.add(newDalGeom);
295
                                        }
296
                                }
297
                        }
298
                        if(type == TYPES.MULTISURFACE || type == TYPES.SURFACE) {
299
                                for (int i = 0; i < col.getNumGeometries(); i++) {
300
                                        Geometry gx = col.getGeometryN(i);
301
                                        if( gx instanceof com.vividsolutions.jts.geom.Polygon ||
302
                                                gx instanceof com.vividsolutions.jts.geom.MultiPolygon) {
303
                                                GeometryOperationContext ctx = new GeometryOperationContext();
304
                                                ctx.setAttribute(FromJTS.PARAM, gx);
305
                                                org.gvsig.fmap.geom.Geometry newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
306
                                                geometries.add(newDalGeom);
307
                                        }
308
                                }
309
                        }
310
                        return geometries;
311
                }
312
                return null;
313
        }
314

    
315
        /**
316
         * Converts a geometry into a multigeometry
317
         * @param g
318
         * @return
319
         * @throws CreateGeometryException
320
         */
321
        private org.gvsig.fmap.geom.Geometry convertGeometryList2MultiGeometry(List<org.gvsig.fmap.geom.Geometry> list) throws CreateGeometryException {
322
                if(list.size() == 0)
323
                        return null;
324
                MultiPrimitive primitive = null;
325

    
326
                if(list.get(0) instanceof Point || list.get(0) instanceof MultiPoint) {
327
                        primitive = (MultiPrimitive)geometryManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
328
                }
329
                if(list.get(0) instanceof Curve || list.get(0) instanceof MultiCurve) {
330
                        primitive = (MultiPrimitive)geometryManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
331
                }
332
                if(list.get(0) instanceof Surface || list.get(0) instanceof MultiSurface) {
333
                        primitive = (MultiPrimitive)geometryManager.create(TYPES.MULTISURFACE, SUBTYPES.GEOM2D);
334
                }
335

    
336
                for (int i = 0; i < list.size(); i++) {
337
                        org.gvsig.fmap.geom.Geometry geom = list.get(i);
338
                        if(geom instanceof MultiPrimitive) {
339
                                MultiPrimitive multi = (MultiPrimitive)geom;
340
                                for (int j = 0; j < multi.getPrimitivesNumber(); j++) {
341
                                        primitive.addPrimitive((Primitive)multi.getPrimitiveAt(j));
342
                                }
343
                        } else
344
                                primitive.addPrimitive((Primitive)list.get(i));
345
                }
346

    
347
                return primitive;
348
        }
349

    
350
        /**
351
         * Converts a geometry into a multigeometry
352
         * @param g
353
         * @return
354
         * @throws CreateGeometryException
355
         */
356
        private org.gvsig.fmap.geom.Geometry convertGeometry2MultiGeometry(org.gvsig.fmap.geom.Geometry g) throws CreateGeometryException {
357
                if(g instanceof MultiPrimitive)
358
                        return g;
359
                if(g instanceof Point) {
360
                        MultiPoint pNew = (MultiPoint)geometryManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
361
                        pNew.addPoint((Point)g);
362
                        return pNew;
363
                }
364
                if(g instanceof Curve) {
365
                        MultiCurve cNew = (MultiCurve)geometryManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
366
                        cNew.addCurve((Curve)g);
367
                        return cNew;
368
                }
369
                if(g instanceof Surface) {
370
                        MultiSurface cNew = (MultiSurface)geometryManager.create(TYPES.MULTISURFACE, SUBTYPES.GEOM2D);
371
                        cNew.addSurface((Surface)g);
372
                        return cNew;
373
                }
374
                return g;
375
        }
376

    
377
        /**
378
         * Checks if the type of the feature store and the geometry are compatibles.
379
         * @param store
380
         * @param geom
381
         * @return
382
         * @throws ReadException
383
         */
384
        private boolean acceptType(FeatureStore store, org.gvsig.fmap.geom.Geometry geom) throws ReadException {
385
                int fType = getShapeType(store);
386
                GeometryType geomType = geom.getGeometryType();
387
                GeometryManager geomManager = GeometryLocator.getGeometryManager();
388

    
389
                if(geomType.isTypeOf(fType))
390
                        return true;
391

    
392
                if( geomManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE, fType) &&
393
                        geomType.isTypeOf(org.gvsig.fmap.geom.Geometry.TYPES.CURVE))
394
                        return true;
395
                if( geomManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE, fType) &&
396
                    geomType.isTypeOf(org.gvsig.fmap.geom.Geometry.TYPES.SURFACE))
397
                        return true;
398
                if( geomManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT, fType) &&
399
                    geomType.isTypeOf(org.gvsig.fmap.geom.Geometry.TYPES.POINT))
400
                        return true;
401
                if( geomManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTISOLID, fType) &&
402
                    geomType.isTypeOf(org.gvsig.fmap.geom.Geometry.TYPES.SOLID))
403
                                return true;
404
                return false;
405
        }
406

    
407
        /**
408
         * Adds a JTS feature to the FeatureStore
409
         * @param entry
410
         * @param newGeom
411
         * @throws CreateGeometryException
412
         * @throws DataException
413
         */
414
        public EditableFeature addFeature(Feature feature, Geometry newGeom) throws CreateGeometryException, DataException {
415
                int outPutType = getOutputFeatureStore().getDefaultFeatureType()
416
                        .getDefaultGeometryAttribute().getGeomType().getType();
417
                //Si el objeto que viene es un GeometryCollection hay que convertirlo a una lista de geometrias
418
                //solo del tipo que pueda salvarse en la capa eliminando el resto. Esto sucede sobre todo en la intersecci?n
419
                //que devuelve tipos mezclados. Cada uno debe salvarse en el tipo de capa de salida apropiado
420
                ArrayList<org.gvsig.fmap.geom.Geometry> dalGeomList = null;
421
                try {
422
                        dalGeomList = convertGeometryCollection2GeometryList(newGeom, outPutType);
423
                } catch (GeometryOperationNotSupportedException e1) {
424
                        Sextante.addErrorToLog(e1);
425
                } catch (GeometryOperationException e1) {
426
                        Sextante.addErrorToLog(e1);
427
                }
428

    
429
                //No era un GeometryCollection
430
                if(dalGeomList == null) {
431
                        org.gvsig.fmap.geom.Geometry newDalGeom = null;
432
                        GeometryOperationContext ctx = new GeometryOperationContext();
433
                        ctx.setAttribute(FromJTS.PARAM, newGeom);
434
                        try {
435
                                newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
436
                        } catch (GeometryOperationNotSupportedException e) {
437
                                Sextante.addErrorToLog(e);
438
                        } catch (GeometryOperationException e) {
439
                                Sextante.addErrorToLog(e);
440
                        }
441
                        insertFeatureIntoStore(feature, newDalGeom);
442
                } else {
443
                        for (int i = 0; i < dalGeomList.size(); i++) {
444
                                insertFeatureIntoStore(feature, dalGeomList.get(i));
445
                        }
446
                }
447
                return null;
448
        }
449

    
450
        private EditableFeature insertFeatureIntoStore(Feature feature, org.gvsig.fmap.geom.Geometry newDalGeom) throws DataException {
451
                if(acceptType(store, newDalGeom)) {
452
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), true);
453
                        FeatureAttributeDescriptor[] attrDesc = feature.getType().getAttributeDescriptors();
454
                        for (int i = 0; i < attrDesc.length; i++) {
455
                                String name = attrDesc[i].getName();
456
                                if(name.compareTo("GEOMETRY") != 0) {
457
                                        Object value = feature.get(name);
458
                                        if(value != null) {
459
                                                feat.set(name, value);
460
                                        }
461
                                }
462
                        }
463

    
464
                        org.gvsig.fmap.geom.Geometry multiGeometry = null;
465
                        try {
466
                            multiGeometry = convertGeometry2MultiGeometry(newDalGeom);
467
            } catch (CreateGeometryException e) {
468
                Sextante.addErrorToLog(e);
469
            }
470

    
471
                        if(multiGeometry!=null && acceptType(store, multiGeometry)){
472
                            feat.setGeometry("GEOMETRY", multiGeometry);
473
                        } else {
474
                            feat.setGeometry("GEOMETRY", newDalGeom);
475
                        }
476
                        store.insert(feat);
477
                        return feat;
478
                }
479
                return null;
480
        }
481

    
482
        /**
483
         * Adds a JTS feature to the FeatureStore
484
         * @param entry
485
         * @param newGeom
486
         * @throws CreateGeometryException
487
         * @throws DataException
488
         */
489
        public EditableFeature addFeature(Geometry newGeom, int id, double value) throws CreateGeometryException, DataException {
490
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
491

    
492
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
493
                        EditableFeature feat = store.createNewFeature();
494
                        feat.set(0, id);
495
                        feat.set(1, value);
496
                   org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newDalGeom);
497
               if(multiGeometry!=null && acceptType(store, multiGeometry)){
498
                   feat.setGeometry("GEOMETRY", multiGeometry);
499
               } else {
500
                   feat.setGeometry("GEOMETRY", newDalGeom);
501
               }
502
                        store.insert(feat);
503
                        return feat;
504
                }
505
                return null;
506
        }
507

    
508
        /**
509
         * Adds a JTS feature to the FeatureStore
510
         * @param entry
511
         * @param newGeom
512
         * @throws CreateGeometryException
513
         * @throws DataException
514
         */
515
        public EditableFeature addFeature(Feature feature, List<Geometry> newJTSListGeom) throws CreateGeometryException, DataException {
516
                List<org.gvsig.fmap.geom.Geometry> newDalListGeom = new ArrayList<org.gvsig.fmap.geom.Geometry>();
517

    
518
                for (int i = 0; i < newJTSListGeom.size(); i++) {
519
                        newDalListGeom.add(GeometryUtil.jtsToGeom(newJTSListGeom.get(i)));
520
                }
521

    
522
                org.gvsig.fmap.geom.Geometry newMultiGeom = convertGeometryList2MultiGeometry(newDalListGeom);
523
                insertFeatureIntoStore(feature, newMultiGeom);
524
                return null;
525
        }
526

    
527
        /**
528
         * Adds a JTS feature to the FeatureStore
529
         * @param entry
530
         * @param newGeom
531
         * @throws CreateGeometryException
532
         * @throws DataException
533
         */
534
        public EditableFeature addFeature(Geometry newGeom, String name, Object value) throws CreateGeometryException, DataException {
535
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
536

    
537
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
538
                        EditableFeature feat = store.createNewFeature();
539
                        feat.set(name, value);
540
                   org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newDalGeom);
541
               if(multiGeometry!=null && acceptType(store, multiGeometry)){
542
                   feat.setGeometry("GEOMETRY", multiGeometry);
543
               } else {
544
                   feat.setGeometry("GEOMETRY", newDalGeom);
545
               }
546
                        store.insert(feat);
547
                        return feat;
548
                }
549
                return null;
550
        }
551

    
552
        /**
553
         * Adds a geometry feature to the FeatureStore
554
         * @param entry
555
         * @param newGeom
556
         * @throws CreateGeometryException
557
         * @throws DataException
558
         */
559
        public EditableFeature addFeature(org.gvsig.fmap.geom.Geometry newGeom, String name, Object value) throws CreateGeometryException, DataException {
560
                if(newGeom != null && acceptType(store, newGeom)) {
561
                        EditableFeature feat = store.createNewFeature();
562
                        feat.set(name, value);
563
                   org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newGeom);
564
               if(multiGeometry!=null && acceptType(store, multiGeometry)){
565
                   feat.setGeometry("GEOMETRY", multiGeometry);
566
               } else {
567
                   feat.setGeometry("GEOMETRY", newGeom);
568
               }
569
                        store.insert(feat);
570
                        return feat;
571
                }
572
                return null;
573
        }
574

    
575
        /**
576
         * Adds a geometry feature to the FeatureStore
577
         * @param entry
578
         * @param newGeom
579
         * @throws CreateGeometryException
580
         * @throws DataException
581
         */
582
        public EditableFeature addFeature(org.gvsig.fmap.geom.Geometry newGeom, ArrayList<String> names, ArrayList<Object> values) throws CreateGeometryException, DataException {
583
                if(newGeom != null && acceptType(store, newGeom)) {
584
                        EditableFeature feat = store.createNewFeature();
585
                        for (int i = 0; i < values.size(); i++) {
586
                                feat.set(names.get(i), values.get(i));
587
                        }
588
                   org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newGeom);
589
               if(multiGeometry!=null && acceptType(store, multiGeometry)){
590
                   feat.setGeometry("GEOMETRY", multiGeometry);
591
               } else {
592
                   feat.setGeometry("GEOMETRY", newGeom);
593
               }
594
                        store.insert(feat);
595
                        return feat;
596
                }
597
                return null;
598
        }
599

    
600
        /**
601
         * Adds a JTS feature to the FeatureStore
602
         * @param entry
603
         * @param newGeom
604
         * @throws CreateGeometryException
605
         * @throws DataException
606
         */
607
        public EditableFeature addFeature(Geometry newGeom, ArrayList<String> names, ArrayList<Object> values) throws CreateGeometryException, DataException {
608
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
609

    
610
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
611
                        EditableFeature feat = store.createNewFeature();
612
                        for (int i = 0; i < values.size(); i++) {
613
                                feat.set(names.get(i), values.get(i));
614
                        }
615
                   org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newDalGeom);
616
               if(multiGeometry!=null && acceptType(store, multiGeometry)){
617
                   feat.setGeometry("GEOMETRY", multiGeometry);
618
               } else {
619
                   feat.setGeometry("GEOMETRY", newDalGeom);
620
               }
621
                        store.insert(feat);
622
                        return feat;
623
                }
624
                return null;
625
        }
626

    
627
        /**
628
         * Adds a JTS feature to the FeatureStore
629
         * @param entry
630
         * @param newGeom
631
         * @throws CreateGeometryException
632
         * @throws DataException
633
         */
634
        public EditableFeature addFeature(Geometry newGeom, int id, double value1, double value2) throws CreateGeometryException, DataException {
635
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
636

    
637
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
638
                        EditableFeature feat = store.createNewFeature();
639
                        feat.set(0, id);
640
                        feat.set(1, value1);
641
                        feat.set(2, value2);
642
                   org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newDalGeom);
643
               if(multiGeometry!=null && acceptType(store, multiGeometry)){
644
                   feat.setGeometry("GEOMETRY", multiGeometry);
645
               } else {
646
                   feat.setGeometry("GEOMETRY", newDalGeom);
647
               }
648
                        store.insert(feat);
649
                        return feat;
650
                }
651
                return null;
652
        }
653

    
654
        /**
655
         * Adds a DAL feature to the FeatureStore when the field structure in the new feature
656
         * is different to the source field structure.
657
         * @param entry
658
         * @param newGeom
659
         * @throws CreateGeometryException
660
         * @throws DataException
661
         */
662
        public EditableFeature addDifferentFieldFeature(Feature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
663
                if(acceptType(store, newGeom)) {
664
                        //Builds a new empty feature
665
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), true);
666

    
667
                        //Writes only values with the same name and data type in both features
668
                        for (int i = 0; i < fieldNames.length; i++) {
669
                                if(feature.getType().getIndex(fieldNames[i]) != -1) {
670
                                        Object obj1 = feature.get(fieldNames[i]);
671
                                        if(feat.getType().getIndex(fieldNames[i]) != -1) {
672
                                                Object obj2 = feat.get(fieldNames[i]);
673
                                                if(obj1 != null && obj2 != null && obj1.getClass() == obj2.getClass())
674
                                                        feat.set(i, obj1);
675
                                        }
676
                                }
677
                        }
678

    
679
                        //Sets the geometry
680
                        org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newGeom);
681
                        if(multiGeometry!=null && acceptType(store, multiGeometry)){
682
                            feat.setGeometry("GEOMETRY", multiGeometry);
683
                        } else {
684
                            feat.setGeometry("GEOMETRY", newGeom);
685
                        }
686
                        store.insert(feat);
687
                        return feat;
688
                }
689
                return null;
690
        }
691

    
692
        /**
693
         * Adds a DAL feature to the FeatureStore
694
         * @param entry
695
         * @param newGeom
696
         * @throws CreateGeometryException
697
         * @throws DataException
698
         */
699
        public EditableFeature addFeature(Feature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
700
                if(acceptType(store, newGeom)) {
701
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), feature);
702
                        org.gvsig.fmap.geom.Geometry multiGeometry = convertGeometry2MultiGeometry(newGeom);
703
                        if (multiGeometry!=null && acceptType(store, multiGeometry)){
704
                                feat.setGeometry(fieldNames.length, multiGeometry);
705
                        } else {
706
                                feat.setGeometry(fieldNames.length, newGeom);
707
                        }
708
                        store.insert(feat);
709
                        return feat;
710
                }
711
                return null;
712
        }
713

    
714
        /**
715
         * Adds a DAL feature to the FeatureStore
716
         * @param entry
717
         * @param newGeom
718
         * @throws CreateGeometryException
719
         * @throws DataException
720
         */
721
        public EditableFeature addGeometryToExistingFeature(EditableFeature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
722
                //Y esto para que c... sirve?
723
                for (int i = 0; i < fieldNames.length; i++)
724
                        feature.set(fieldNames[i], feature.get(i));
725

    
726
                if(acceptType(store, newGeom)) {
727
                        feature.setGeometry(fieldNames.length, newGeom);
728
                        store.update(feature);
729
                        return feature;
730
                }
731
                return null;
732
        }
733

    
734
        /**
735
         * Ends the edition and closes the FeatureStore
736
         */
737
        public void end() {
738
                try {
739
                        store.finishEditing();
740
                } catch (DataException e) {
741
                        Sextante.addErrorToLog(e);
742
                }
743
        // Si destruimos aqui el store ya no estara disponible en el postprocess,
744
        // donde se usa, y se vuelve a destruir.
745
//                store.dispose();
746
        }
747

    
748
        /**
749
         * Gets the shape type of the selected feature store
750
         * @param FeatureStore source
751
         * @return shape type
752
         * @throws ReadException
753
         */
754
        @SuppressWarnings("deprecation")
755
        public int getShapeType(FeatureStore storeLayer1) throws ReadException {
756
                FeatureType featureType;
757
                try {
758
                        featureType = storeLayer1.getDefaultFeatureType();
759
                } catch (DataException e) {
760
                        throw new ReadException(storeLayer1.getName(), e);
761
                }
762
                int indexGeom = featureType.getDefaultGeometryAttributeIndex();
763
                return featureType.getAttributeDescriptor(indexGeom).getGeometryType();
764
        }
765

    
766
        @SuppressWarnings("deprecation")
767
        public int getType() {
768
                if(store == null)
769
                        return org.gvsig.fmap.geom.Geometry.TYPES.NULL;
770
                FeatureType featureType;
771
                try {
772
                        featureType = store.getDefaultFeatureType();
773
                } catch (DataException e) {
774
                        return org.gvsig.fmap.geom.Geometry.TYPES.NULL;
775
                }
776
                int indexGeom = featureType.getDefaultGeometryAttributeIndex();
777
                return featureType.getAttributeDescriptor(indexGeom).getGeometryType();
778
        }
779

    
780
        public boolean isCompatibleType(org.gvsig.fmap.geom.Geometry geom) {
781
                if(store == null)
782
                        return false;
783
                try {
784
                        return acceptType(store, geom);
785
                } catch (ReadException e) {
786
                        return false;
787
                }
788
        }
789

    
790
        /**
791
         * Gets the output FeatureStore
792
         * @return
793
         */
794
        public FeatureStore getOutputFeatureStore() {
795
                return store;
796
        }
797
}
798