Revision 313 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
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