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;