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 553f9f4f8708a56ba72c1d5a6e310a98648825ea
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Wed Aug 3 16:47:04 2022 +0200

    Avoid an `AssertionError` when sub-classing a `Builder` subclass.
    Allow subclassing of `GeodeticObjectBuilder`.
---
 .../internal/referencing/GeodeticObjectBuilder.java    | 18 +++++++++++-------
 .../main/java/org/apache/sis/referencing/Builder.java  |  6 ++++--
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
index 30f63540a5..62ef1b36ee 100644
--- 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
+++ 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 import javax.measure.Unit;
 import javax.measure.quantity.Time;
 import javax.measure.quantity.Length;
+import org.opengis.util.GenericName;
 import org.opengis.util.FactoryException;
 import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.parameter.ParameterNotFoundException;
@@ -63,11 +64,11 @@ import org.apache.sis.referencing.IdentifiedObjects;
  * However this class may move in a public package later if we feel confident 
that its API is mature enough.</p>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.3
  * @since   0.6
  * @module
  */
-public final class GeodeticObjectBuilder extends 
Builder<GeodeticObjectBuilder> {
+public class GeodeticObjectBuilder extends Builder<GeodeticObjectBuilder> {
     /**
      * The geodetic datum, or {@code null} if none.
      */
@@ -517,8 +518,7 @@ public final class GeodeticObjectBuilder extends 
Builder<GeodeticObjectBuilder>
     /**
      * Replaces the component starting at given index by the given component. 
This method can be used for replacing
      * e.g. the horizontal component of a CRS, or the vertical component, 
<i>etc.</i>. If a new compound CRS needs
-     * to be created and a {@linkplain #addName(org.opengis.util.GenericName) 
name has been specified}, that name
-     * will be used.
+     * to be created and a {@linkplain #addName(GenericName) name has been 
specified}, that name will be used.
      *
      * <h4>Limitations</h4>
      * Current implementation can replace exactly one component of {@link 
CompoundCRS}.
@@ -538,7 +538,11 @@ public final class GeodeticObjectBuilder extends 
Builder<GeodeticObjectBuilder>
         final int srcDim = ReferencingUtilities.getDimension(source);
         final int repDim = ReferencingUtilities.getDimension(replacement);
         if (firstDimension == 0 && srcDim == repDim) {
-            return replacement;
+            /*
+             * conceptually return the replacement. But returning the original 
instance if applicable
+             * allows the caller to detect that a compound CRS does not need 
to be replaced.
+             */
+            return source.equals(replacement) ? source : replacement;
         }
         ArgumentChecks.ensureValidIndex(srcDim - repDim, firstDimension);
         if (source instanceof CompoundCRS) {
@@ -556,8 +560,8 @@ public final class GeodeticObjectBuilder extends 
Builder<GeodeticObjectBuilder>
                     Object ids   = 
properties.remove(IdentifiedObject.IDENTIFIERS_KEY);
                     final CoordinateReferenceSystem nc = replaceComponent(c, 
firstDimension - lower, replacement);
                     /*
-                     * Restore the names and identifiers before to create the 
final CompoundCRS. If no name was specified,
-                     * reuse the primary name of existing CRS but not the 
identifiers.
+                     * Restore the names and identifiers before to create the 
final CompoundCRS.
+                     * If no name was specified, reuse the primary name of 
existing CRS but not the identifiers.
                      */
                     if (name == null) {
                         name = source.getName();
diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java 
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java
index 81e054b5c2..50eb32159a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/Builder.java
@@ -42,7 +42,7 @@ import static org.apache.sis.util.ArgumentChecks.*;
 
 
 /**
- * Base class of builders for various kind of {@link IdentifiedObject}. This 
class provides convenience methods
+ * Base class of builders for various kinds of {@link IdentifiedObject}. This 
class provides convenience methods
  * for filling the {@link #properties} map to be given to an {@link 
org.opengis.referencing.ObjectFactory}.
  * The main properties are:
  *
@@ -230,7 +230,7 @@ public abstract class Builder<B extends Builder<B>> {
      * Verifies that {@code B} in {@code <B extends Builder<B>} is the 
expected class.
      * This method is for assertion purposes only.
      */
-    private static boolean verifyParameterizedType(final Class<?> expected) {
+    private static boolean verifyParameterizedType(Class<?> expected) {
         for (Class<?> c = expected; c != null; c = c.getSuperclass()) {
             Type type = c.getGenericSuperclass();
             if (type instanceof ParameterizedType) {
@@ -240,6 +240,8 @@ public abstract class Builder<B extends Builder<B>> {
                     if (type == expected) return true;
                     throw new AssertionError(type);
                 }
+            } else {
+                expected = c.getSuperclass();
             }
         }
         return false;

Reply via email to