Revision 313

View differences:

org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.lib/org.gvsig.vectorediting.lib.prov/org.gvsig.vectorediting.lib.prov.join/src/main/java/org/gvsig/vectorediting/lib/prov/join/JoinEditingProvider.java
37 37
import org.gvsig.fmap.dal.feature.FeatureStore;
38 38
import org.gvsig.fmap.dal.feature.FeatureType;
39 39
import org.gvsig.fmap.geom.Geometry;
40
import org.gvsig.fmap.geom.GeometryLocator;
41
import org.gvsig.fmap.geom.GeometryManager;
42
import org.gvsig.fmap.geom.aggregate.MultiCurve;
43
import org.gvsig.fmap.geom.aggregate.MultiPoint;
44
import org.gvsig.fmap.geom.aggregate.MultiSurface;
45
import org.gvsig.fmap.geom.primitive.Curve;
46 40
import org.gvsig.fmap.geom.primitive.Point;
47
import org.gvsig.fmap.geom.primitive.Surface;
48 41
import org.gvsig.fmap.geom.type.GeometryType;
49 42
import org.gvsig.tools.dataTypes.DataTypes;
50 43
import org.gvsig.tools.dispose.DisposableIterator;
......
199 192
    public Geometry finish() throws FinishServiceException {
200 193

  
201 194
        if (featureSelection != null) {
202

  
203 195
            DisposableIterator it = null;
204
            GeometryManager geometryManager =
205
                GeometryLocator.getGeometryManager();
206
            EditingProviderServices editingProviderServices =
207
                (EditingProviderServices) getProviderServices();
196
            Geometry joinedGeometry;
208 197

  
209 198
            try {
210
                int subtype = editingProviderServices.getSubType(featureStore);
211 199
                it = featureSelection.fastIterator();
212 200
                Feature feature = (Feature) it.next();
201
                joinedGeometry = feature.getDefaultGeometry();
213 202

  
214
                // Restart iterator
215
                it.dispose();
216
                it = featureSelection.fastIterator();
203
                while (it.hasNext()) {
217 204

  
218
                Geometry deafultGeometry = feature.getDefaultGeometry();
219
                GeometryType geometryType = deafultGeometry.getGeometryType();
220

  
221
                // Checks type of first feature.
222
                if (geometryType.isTypeOf(CURVE)
223
                    || geometryType.isTypeOf(MULTICURVE)) {
224

  
225
                    MultiCurve multiCurve =
226
                        geometryManager.createMultiCurve(subtype);
227

  
228
                    // Iterate over selected features
229
                    while (it.hasNext()) {
230
                        feature = (Feature) it.next();
231

  
232
                        // If feature is type of curve add it to final geometry
233
                        if (feature.getDefaultGeometry().getGeometryType()
234
                            .isTypeOf(CURVE)) {
235

  
236
                            multiCurve.addCurve((Curve) feature
237
                                .getDefaultGeometry());
238

  
239
                        } else {
240
                            // Else iterate over multicurve primitives and add
241
                            // it to final geometry
242
                            MultiCurve tmpMultiCurve =
243
                                (MultiCurve) feature.getDefaultGeometry();
244

  
245
                            for (int i = 0; i < tmpMultiCurve
246
                                .getPrimitivesNumber(); i++) {
247
                                multiCurve
248
                                    .addCurve(tmpMultiCurve.getCurveAt(i));
249
                            }
250
                        }
251
                    }
252

  
253
                    // Return final geometry
254
                    return multiCurve;
255

  
256
                } else if (geometryType.isTypeOf(SURFACE)
257
                    || geometryType.isTypeOf(MULTISURFACE)) {
258

  
259
                    MultiSurface multiSurface =
260
                        geometryManager.createMultiSurface(subtype);
261

  
262
                    // Iterate over selected features
263
                    while (it.hasNext()) {
264
                        feature = (Feature) it.next();
265
                        // If feature is type of surface add it to final
266
                        // geometry
267
                        if (feature.getDefaultGeometry().getGeometryType()
268
                            .isTypeOf(SURFACE)) {
269

  
270
                            multiSurface.addSurface((Surface) feature
271
                                .getDefaultGeometry());
272

  
273
                        } else {
274
                            // Else iterate over multisurface primitives and add
275
                            // it to final geometry
276
                            MultiSurface tmpMultiSurface =
277
                                (MultiSurface) feature.getDefaultGeometry();
278

  
279
                            for (int i = 0; i < tmpMultiSurface
280
                                .getPrimitivesNumber(); i++) {
281
                                multiSurface.addSurface(tmpMultiSurface
282
                                    .getSurfaceAt(i));
283
                            }
284
                        }
285
                    }
286

  
287
                    // Return final geometry
288
                    return multiSurface;
289

  
290
                } else if (geometryType.isTypeOf(MULTIPOINT)) {
291

  
292
                    MultiPoint multiPoint =
293
                        geometryManager.createMultiPoint(subtype);
294

  
295
                    // Iterate over selected features
296
                    while (it.hasNext()) {
297
                        feature = (Feature) it.next();
298
                        MultiPoint tmpMultiPoint =
299
                            (MultiPoint) feature.getDefaultGeometry();
300

  
301
                        // Iterate over multipoint and add each primitive to
302
                        // final geometry
303
                        for (int i = 0; i < tmpMultiPoint.getPrimitivesNumber(); i++) {
304
                            multiPoint.addPoint(tmpMultiPoint.getPointAt(i));
305
                        }
306
                    }
307

  
308
                    // Return final geometry
309
                    return multiPoint;
205
                    Feature tmpFeature = (Feature) it.next();
206
                    joinedGeometry =
207
                        joinedGeometry.union(tmpFeature.getDefaultGeometry());
310 208
                }
209

  
311 210
            } catch (BaseException e) {
312 211
                throw new FinishServiceException(e);
313 212
            } finally {
314 213
                it.dispose();
315 214
            }
215

  
216
            return joinedGeometry;
316 217
        }
317 218
        return null;
318 219
    }
319
    
220

  
320 221
    @SuppressWarnings("rawtypes")
321 222
    public void finishAndStore() throws FinishServiceException {
322 223
        Geometry geometry = finish();
......
361 262
                    // Compare first value with the rest of features. If values
362 263
                    // are different, break bucle and don't insert value at new
363 264
                    // feature.
364
                    while (featureIterator.hasNext()) {
365
                        Feature nextFeature = (Feature) featureIterator.next();
366
                        Object nextValue = nextFeature.get(attribute.getName());
265
                    if (value != null) {
367 266

  
368
                        switch (type) {
369
                        case DataTypes.STRING:
370
                            String string1 = (String) value;
371
                            String string2 = (String) nextValue;
267
                        while (featureIterator.hasNext()) {
268
                            Feature nextFeature =
269
                                (Feature) featureIterator.next();
270
                            Object nextValue =
271
                                nextFeature.get(attribute.getName());
372 272

  
373
                            if (!string1.equals(string2)) {
374
                                insertValue = false;
375
                            }
376
                            break;
377
                        case DataTypes.INT:
378
                            int int1 = (Integer) value;
379
                            int int2 = (Integer) nextValue;
273
                            switch (type) {
274
                            case DataTypes.STRING:
275
                                String string1 = (String) value;
276
                                String string2 = (String) nextValue;
380 277

  
381
                            if (int1 != int2) {
382
                                insertValue = false;
383
                            }
384
                            break;
385
                        case DataTypes.FLOAT:
386
                            float float1 = (Float) value;
387
                            float float2 = (Float) nextValue;
278
                                if (!string1.equals(string2)) {
279
                                    insertValue = false;
280
                                }
281
                                break;
282
                            case DataTypes.INT:
283
                                int int1 = (Integer) value;
284
                                int int2 = (Integer) nextValue;
388 285

  
389
                            if (float1 != float2) {
390
                                insertValue = false;
391
                            }
392
                            break;
393
                        case DataTypes.LONG:
394
                            long long1 = (Long) value;
395
                            long long2 = (Long) nextValue;
286
                                if (int1 != int2) {
287
                                    insertValue = false;
288
                                }
289
                                break;
290
                            case DataTypes.FLOAT:
291
                                float float1 = (Float) value;
292
                                float float2 = (Float) nextValue;
396 293

  
397
                            if (long1 != long2) {
398
                                insertValue = false;
399
                            }
400
                            break;
401
                        case DataTypes.DOUBLE:
402
                            double double1 = (Double) value;
403
                            double double2 = (Double) nextValue;
294
                                if (float1 != float2) {
295
                                    insertValue = false;
296
                                }
297
                                break;
298
                            case DataTypes.LONG:
299
                                long long1 = (Long) value;
300
                                long long2 = (Long) nextValue;
404 301

  
405
                            if (double1 != double2) {
302
                                if (long1 != long2) {
303
                                    insertValue = false;
304
                                }
305
                                break;
306
                            case DataTypes.DOUBLE:
307
                                double double1 = (Double) value;
308
                                double double2 = (Double) nextValue;
309

  
310
                                if (double1 != double2) {
311
                                    insertValue = false;
312
                                }
313
                                break;
314
                            case DataTypes.DATE:
315
                                Date date1 = (Date) value;
316
                                Date date2 = (Date) nextValue;
317

  
318
                                if (date1.compareTo(date2) != 0) {
319
                                    insertValue = false;
320
                                }
321
                                break;
322
                            default:
406 323
                                insertValue = false;
324
                                break;
407 325
                            }
408
                            break;
409
                        case DataTypes.DATE:
410
                            Date date1 = (Date) value;
411
                            Date date2 = (Date) nextValue;
412 326

  
413
                            if (date1.compareTo(date2) != 0) {
414
                                insertValue = false;
327
                            if (insertValue == false) {
328
                                break;
415 329
                            }
416
                            break;
417
                        default:
418
                            insertValue = false;
419
                            break;
420 330
                        }
421 331

  
422
                        if (insertValue == false) {
423
                            break;
332
                        if (insertValue) {
333
                            eFeature.set(attribute.getName(), value);
424 334
                        }
425 335
                    }
426 336

  
427
                    if (insertValue) {
428
                        eFeature.set(attribute.getName(), value);
429
                    }
430

  
431 337
                } catch (DataException e) {
432 338
                    throw new FinishServiceException(e);
433 339
                } finally {
......
435 341
                }
436 342
            }
437 343
        }
438
        
344

  
439 345
        // Inserts new feature
440 346
        eFeature.setDefaultGeometry(geometry);
441 347
        editingProviderServices.insertFeatureIntoFeatureStore(eFeature,
442 348
            featureStore);
443
        
349

  
444 350
        // Deletes selected features
445 351
        try {
446 352
            featureSelection.accept(new Visitor() {

Also available in: Unified diff