This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit c560a142446309987d39b3c8a740953ca8ddd15e Author: Martin Desruisseaux <[email protected]> AuthorDate: Mon Jan 10 18:12:30 2022 +0100 Add a safety check against `NullPointerException` if a concatenated operation contains a defining operation. --- .../java/org/apache/sis/internal/referencing/Resources.java | 5 +++++ .../org/apache/sis/internal/referencing/Resources.properties | 1 + .../apache/sis/internal/referencing/Resources_fr.properties | 1 + .../referencing/operation/DefaultConcatenatedOperation.java | 12 +++++++++--- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java index 5d523d6..b3e451d 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java @@ -496,6 +496,11 @@ public final class Resources extends IndexedResourceBundle { public static final short NotFormalProjectionParameter_1 = 60; /** + * Operation “{1}” of class ‘{0}’ has no mathematical transform. + */ + public static final short OperationHasNoTransform_2 = 101; + + /** * No parameter named “{1}” has been found in “{0}”. */ public static final short ParameterNotFound_2 = 61; diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties index ad2e8c7..59a3282 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties +++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties @@ -111,6 +111,7 @@ NotASkewSymmetricMatrix = Matrix is not skew-symmetric. NoSuchAuthorityCode_3 = No \u2018{1}\u2019 object found for code \u201c{2}\u201d in the \u201c{0}\u201d geodetic dataset. NoSuchAuthorityCodeInSubset_4 = No \u2018{1}\u2019 object found for code \u201c{2}\u201d. However only a subset of the {0} geodetic dataset has been queried. See {3} for instruction about how to install the full {0} database. NoSuchOperationMethod_1 = No operation method found for name or identifier \u201c{0}\u201d. +OperationHasNoTransform_2 = Operation \u201c{1}\u201d of class \u2018{0}\u2019 has no mathematical transform. ParameterNotFound_2 = No parameter named \u201c{1}\u201d has been found in \u201c{0}\u201d. PointsAreNotOnRegularGrid = Points are not on a regular grid. RecursiveCreateCallForCode_2 = Recursive call while creating an object of type \u2018{0}\u2019 for code \u201c{1}\u201d. diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties index b647712..6ef6d37 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties +++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties @@ -116,6 +116,7 @@ NotASkewSymmetricMatrix = La matrice n\u2019est pas antisym\u00e9triqu NoSuchAuthorityCode_3 = Aucun objet de type \u2018{1}\u2019 n\u2019a \u00e9t\u00e9 trouv\u00e9 pour le code \u00ab\u202f{2}\u202f\u00bb dans la base de donn\u00e9es g\u00e9od\u00e9siques \u00ab\u202f{0}\u202f\u00bb. NoSuchAuthorityCodeInSubset_4 = Aucun objet de type \u2018{1}\u2019 n\u2019a \u00e9t\u00e9 trouv\u00e9 pour le code \u00ab\u202f{2}\u202f\u00bb. Toutefois seul un sous-ensemble de la base de donn\u00e9es g\u00e9od\u00e9siques {0} a \u00e9t\u00e9 interrog\u00e9. Voir {3} pour des instructions d\u2019installation de la base de donn\u00e9es {0} compl\u00e8te. NoSuchOperationMethod_1 = Aucune m\u00e9thode n\u2019a \u00e9t\u00e9 trouv\u00e9e pour le nom ou l\u2019identifiant \u00ab\u202f{0}\u202f\u00bb. +OperationHasNoTransform_2 = L\u2019op\u00e9ration \u00ab\u202f{1}\u202f\u00bb de classe \u2018{0}\u2019 n\u2019a pas de transformation math\u00e9matique. ParameterNotFound_2 = Aucun param\u00e8tre nomm\u00e9 \u00ab\u202f{1}\u202f\u00bb n\u2019a \u00e9t\u00e9 trouv\u00e9 dans \u00ab\u202f{0}\u202f\u00bb. PointsAreNotOnRegularGrid = Les points ne sont pas sur une grille r\u00e9guli\u00e8re. RecursiveCreateCallForCode_2 = Appels r\u00e9cursifs lors de la cr\u00e9ation d\u2019un objet de type \u2018{0}\u2019 pour le code \u00ab\u202f{1}\u202f\u00bb. diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java index ee26406..3899107 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultConcatenatedOperation.java @@ -35,6 +35,7 @@ import org.opengis.referencing.operation.Transformation; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.MathTransformFactory; import org.apache.sis.internal.referencing.PositionalAccuracyConstant; +import org.apache.sis.internal.referencing.Resources; import org.apache.sis.internal.system.DefaultFactories; import org.apache.sis.internal.util.UnmodifiableArrayList; import org.apache.sis.util.ComparisonMode; @@ -53,7 +54,7 @@ import static org.apache.sis.util.Utilities.deepEquals; * reference system associated with the concatenated operation. * * @author Martin Desruisseaux (IRD, Geomatys) - * @version 0.8 + * @version 1.2 * @since 0.6 * @module */ @@ -105,7 +106,7 @@ final class DefaultConcatenatedOperation extends AbstractCoordinateOperation imp * @param mtFactory the math transform factory to use for math transforms concatenation. * @throws FactoryException if the factory can not concatenate the math transforms. */ - public DefaultConcatenatedOperation(final Map<String,?> properties, CoordinateOperation[] operations, + public DefaultConcatenatedOperation(final Map<String,?> properties, final CoordinateOperation[] operations, final MathTransformFactory mtFactory) throws FactoryException { super(properties); @@ -226,7 +227,12 @@ final class DefaultConcatenatedOperation extends AbstractCoordinateOperation imp * however that we traverse nested concatenated operations unconditionally at least for checking * its consistency. */ - MathTransform step = op.getMathTransform(); + final MathTransform step = op.getMathTransform(); + if (step == null) { + // May happen if the operation is a defining operation. + throw new IllegalArgumentException(Resources.format( + Resources.Keys.OperationHasNoTransform_2, op.getClass(), op.getName())); + } if (op instanceof ConcatenatedOperation) { final List<? extends CoordinateOperation> children = ((ConcatenatedOperation) op).getOperations(); @SuppressWarnings("SuspiciousToArrayCall")
