From b2f08ed0a7b77bea0e3010eea7c4e8f8acf50c75 Mon Sep 17 00:00:00 2001 From: Jody Garnett Date: Mon, 18 Feb 2019 14:25:38 -0800 Subject: [PATCH] Ask enforceArrayConsistency to copy provided array on modification --- .../geom/impl/CoordinateArraySequence.java | 41 ++++++++++++++----- .../impl/CoordinateArraySequenceTest.java | 4 +- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/modules/core/src/main/java/org/locationtech/jts/geom/impl/CoordinateArraySequence.java b/modules/core/src/main/java/org/locationtech/jts/geom/impl/CoordinateArraySequence.java index fef7107f73..d6134d68a2 100644 --- a/modules/core/src/main/java/org/locationtech/jts/geom/impl/CoordinateArraySequence.java +++ b/modules/core/src/main/java/org/locationtech/jts/geom/impl/CoordinateArraySequence.java @@ -12,6 +12,7 @@ package org.locationtech.jts.geom.impl; import java.io.Serializable; +import java.lang.reflect.Array; import org.locationtech.jts.geom.*; @@ -82,13 +83,14 @@ public CoordinateArraySequence(Coordinate[] coordinates, int dimension) { */ public CoordinateArraySequence(Coordinate[] coordinates, int dimension, int measures) { - this.coordinates = coordinates; this.dimension = dimension; this.measures = measures; if (coordinates == null) { this.coordinates = new Coordinate[0]; } - enforceArrayConsistency( this.coordinates ); + else { + this.coordinates = enforceArrayConsistency(coordinates); + } } /** @@ -158,23 +160,42 @@ public CoordinateArraySequence(CoordinateSequence coordSeq) /** * Ensure array contents of the same type, making use of {@link #createCoordinate()} as needed. + *

+ * A new array will be created if needed to return a consistent result. + *

* - * @param array array is modified in place as needed + * @param array array containing consistent coordinate instances */ - protected void enforceArrayConsistency(Coordinate[] array) + protected Coordinate[] enforceArrayConsistency(Coordinate[] array) { Coordinate sample = createCoordinate(); Class type = sample.getClass(); + boolean isConsistent=true; for( int i = 0; i < array.length; i++) { Coordinate coordinate = array[i]; - if( coordinate == null ) { - array[i] = createCoordinate(); + if( coordinate != null && !coordinate.getClass().equals(type)) { + isConsistent = false; + break; } - else if(!coordinate.getClass().equals(type)) { - Coordinate duplicate = createCoordinate(); - duplicate.setCoordinate(coordinate); - array[i] = duplicate; + } + if( isConsistent ){ + return array; + } + else { + Class coordinateType = sample.getClass(); + Coordinate copy[] = (Coordinate[]) Array.newInstance(coordinateType, array.length); + for ( int i = 0; i < copy.length; i++){ + Coordinate coordinate = array[i]; + if( coordinate != null && !coordinate.getClass().equals(type)){ + Coordinate duplicate = createCoordinate(); + duplicate.setCoordinate(coordinate); + copy[i] = duplicate; + } + else { + copy[i] = coordinate; + } } + return copy; } } diff --git a/modules/core/src/test/java/org/locationtech/jts/geom/impl/CoordinateArraySequenceTest.java b/modules/core/src/test/java/org/locationtech/jts/geom/impl/CoordinateArraySequenceTest.java index a2e5f9176c..6aa19a96fa 100644 --- a/modules/core/src/test/java/org/locationtech/jts/geom/impl/CoordinateArraySequenceTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/geom/impl/CoordinateArraySequenceTest.java @@ -178,13 +178,15 @@ public void testMixedCoordinates() Coordinate coord1 = new Coordinate(1.0,1.0,1.0); CoordinateXY coord2 = new CoordinateXY(2.0,2.0); CoordinateXYM coord3 = new CoordinateXYM(3.0,3.0,3.0); - Coordinate[] array = new Coordinate[] {coord1, coord2, coord3}; + + Coordinate[] array = new Coordinate[] {coord1, coord2, coord3, null}; CoordinateSequence seq = factory.create(array); assertEquals( 3, seq.getDimension()); assertEquals( 1, seq.getMeasures()); assertTrue( coord1.equals( seq.getCoordinate(0))); assertTrue( coord2.equals( seq.getCoordinate(1))); assertTrue( coord3.equals( seq.getCoordinate(2))); + assertNull( seq.getCoordinate(3)); } private void initProgression(CoordinateSequence seq) {