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")

Reply via email to