You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2022/04/27 22:34:23 UTC

[sis] branch geoapi-4.0 updated: Reduce the use of `null` as an enumeration value.

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


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new d5b9780190 Reduce the use of `null` as an enumeration value.
d5b9780190 is described below

commit d5b9780190c0f8da45c3bc6b727ff7bb4a2eed53
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Thu Apr 28 00:34:00 2022 +0200

    Reduce the use of `null` as an enumeration value.
---
 .../internal/referencing/provider/CassiniSoldner.java  |  9 ++++++++-
 .../provider/LambertCylindricalEqualArea.java          |  9 +++++++--
 .../internal/referencing/provider/ObliqueMercator.java |  6 ++++--
 .../operation/projection/CassiniSoldner.java           | 12 ++++++++----
 .../operation/projection/CylindricalEqualArea.java     | 18 ++++++++++++------
 .../operation/projection/NormalizedProjection.java     |  2 +-
 .../operation/projection/ObliqueMercator.java          |  2 +-
 .../operation/projection/ProjectionVariant.java        |  2 +-
 8 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/CassiniSoldner.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/CassiniSoldner.java
index 262f91be62..307b019cd8 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/CassiniSoldner.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/CassiniSoldner.java
@@ -43,6 +43,13 @@ public class CassiniSoldner extends MapProjection {
      */
     private static final long serialVersionUID = 7280273456465057368L;
 
+    /**
+     * The EPSG identifier, to be preferred to the name when available.
+     * The {@code IDENTIFIER_OF_BASE} name is for avoiding confusion with
+     * the {@code IDENTIFIER} name used in subclasses.
+     */
+    public static final String IDENTIFIER_OF_BASE = "9806";
+
     /**
      * The operation parameter descriptor for the <cite>Latitude of natural origin</cite> (φ₀) parameter value.
      * Valid values range is [-90 … 90]° and default value is 0°.
@@ -135,7 +142,7 @@ public class CassiniSoldner extends MapProjection {
     private static final ParameterDescriptorGroup PARAMETERS;
     static {
         PARAMETERS = builder()
-                .addIdentifier(              "9806")
+                .addIdentifier(              IDENTIFIER_OF_BASE)
                 .addName(                    "Cassini-Soldner")
                 .addName(Citations.OGC,      "Cassini_Soldner")
                 .addName(Citations.ESRI,     "Cassini_Soldner")
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/LambertCylindricalEqualArea.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/LambertCylindricalEqualArea.java
index 2124c04c7b..1491426773 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/LambertCylindricalEqualArea.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/LambertCylindricalEqualArea.java
@@ -30,7 +30,7 @@ import org.apache.sis.referencing.operation.projection.CylindricalEqualArea;
  * The provider for <cite>"Lambert Cylindrical Equal Area"</cite> projection (EPSG:9835).
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.2
  *
  * @see <a href="http://geotiff.maptools.org/proj_list/cylindrical_equal_area.html">GeoTIFF parameters for Cylindrical Equal Area</a>
  *
@@ -44,6 +44,11 @@ public final class LambertCylindricalEqualArea extends MapProjection {
      */
     private static final long serialVersionUID = -672278344635217838L;
 
+    /**
+     * The EPSG identifier, to be preferred to the name when available.
+     */
+    public static final String IDENTIFIER = "9835";
+
     /**
      * The operation parameter descriptor for the <cite>Latitude of 1st standard parallel</cite> (φ₁) parameter value.
      * Valid values range is (-90 … 90)° and default value is 0°.
@@ -140,7 +145,7 @@ public final class LambertCylindricalEqualArea extends MapProjection {
     private static final ParameterDescriptorGroup PARAMETERS;
     static {
         PARAMETERS = builder()
-                .addIdentifier(             "9835")
+                .addIdentifier(             IDENTIFIER)
                 .addName(                   "Lambert Cylindrical Equal Area")
                 .addName(Citations.OGC,     "Cylindrical_Equal_Area")
                 .addName(Citations.ESRI,    "Cylindrical_Equal_Area")
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ObliqueMercator.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ObliqueMercator.java
index 323cddde7a..6a8ded58f9 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ObliqueMercator.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ObliqueMercator.java
@@ -50,8 +50,10 @@ public class ObliqueMercator extends AbstractMercator {
     /**
      * The {@value} EPSG identifier for <cite>"Hotine Oblique Mercator (variant A)"</cite>.
      * Should be preferred to the name when available.
+     * The {@code IDENTIFIER_OF_BASE} name is for avoiding confusion with
+     * the {@code IDENTIFIER} name used in subclasses.
      */
-    public static final String IDENTIFIER_A = "9812";
+    public static final String IDENTIFIER_OF_BASE = "9812";
 
     /**
      * The operation parameter descriptor for the <cite>Latitude of projection centre</cite> (φc) parameter value.
@@ -199,7 +201,7 @@ public class ObliqueMercator extends AbstractMercator {
                 .rename    (Citations.NETCDF));                                 // Remove the netCDF name.
 
         PARAMETERS_A = builder
-                .addIdentifier(IDENTIFIER_A)
+                .addIdentifier(IDENTIFIER_OF_BASE)
                 .addName("Hotine Oblique Mercator (variant A)")                 // Starting from EPSG version 7.6
                 .addName("Hotine Oblique Mercator")                             // Prior to EPSG version 7.6
                 .addName      (Citations.OGC,     "Hotine_Oblique_Mercator")
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CassiniSoldner.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CassiniSoldner.java
index 143fe0a8e5..aadd54246e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CassiniSoldner.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CassiniSoldner.java
@@ -68,6 +68,9 @@ public class CassiniSoldner extends MeridianArcBased {
      * @see #variant
      */
     private enum Variant implements ProjectionVariant {
+        /** The <cite>Cassini-Soldner</cite> projection. */
+        DEFAULT(null, IDENTIFIER_OF_BASE),
+
         /**
          * The <cite>"Hyperbolic Cassini-Soldner"</cite> variant, which is non-invertible.
          */
@@ -147,7 +150,7 @@ public class CassiniSoldner extends MeridianArcBased {
      */
     @Workaround(library="JDK", version="1.7")
     private static Initializer initializer(final OperationMethod method, final Parameters parameters) {
-        final Variant variant = variant(method, new Variant[] {Variant.HYPERBOLIC}, null);
+        final Variant variant = variant(method, new Variant[] {Variant.HYPERBOLIC}, Variant.DEFAULT);
         final EnumMap<ParameterRole, ParameterDescriptor<Double>> roles = new EnumMap<>(ParameterRole.class);
         roles.put(ParameterRole.CENTRAL_MERIDIAN, LONGITUDE_OF_ORIGIN);
         roles.put(ParameterRole.SCALE_FACTOR,     SCALE_FACTOR);
@@ -163,14 +166,15 @@ public class CassiniSoldner extends MeridianArcBased {
         super(initializer);
         final double φ0 = toRadians(initializer.getAndStore(LATITUDE_OF_ORIGIN));
         M0 = distance(φ0, sin(φ0), cos(φ0));
-        if (initializer.variant == null) {
+        if (initializer.variant == Variant.DEFAULT) {
             final MatrixSIS denormalize = getContextualParameters().getMatrix(ContextualParameters.MatrixRole.DENORMALIZATION);
             denormalize.convertBefore(1, null, -distance(φ0, sin(φ0), cos(φ0)));
+            variant = null;
         } else if (abs(φ0 - VANUA_LATITUDE) <= ANGULAR_TOLERANCE) {
             variant = Variant.VANUA;
-            return;
+        } else {
+            variant = (Variant) initializer.variant;
         }
-        variant = (Variant) initializer.variant;
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java
index 5d5c9ef337..a7f808b015 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/CylindricalEqualArea.java
@@ -74,16 +74,22 @@ public class CylindricalEqualArea extends EqualAreaProjection {
      * See {@link #variant} for the list of possible values.
      */
     private enum Variant implements ProjectionVariant {
+        /**
+         * The "Lambert Cylindrical Equal Area" case.
+         */
+        ELLIPSOIDAL(null, IDENTIFIER),
+
         /**
          * The "Lambert Cylindrical Equal Area (Spherical)" case.
          */
-        SPHERICAL(".*\\bSpherical\\b.*", LambertCylindricalEqualAreaSpherical.IDENTIFIER);
+        SPHERICAL(Pattern.compile(".*\\bSpherical\\b.*", Pattern.CASE_INSENSITIVE),
+                  LambertCylindricalEqualAreaSpherical.IDENTIFIER);
 
         /** Name pattern for this variant.    */ private final Pattern operationName;
         /** EPSG identifier for this variant. */ private final String  identifier;
         /** Creates a new enumeration value.  */
-        private Variant(final String operationName, final String identifier) {
-            this.operationName = Pattern.compile(operationName, Pattern.CASE_INSENSITIVE);
+        private Variant(final Pattern operationName, final String identifier) {
+            this.operationName = operationName;
             this.identifier    = identifier;
         }
 
@@ -99,7 +105,7 @@ public class CylindricalEqualArea extends EqualAreaProjection {
 
         /** Requests the use of authalic radius. */
         @Override public boolean useAuthalicRadius() {
-            return true;
+            return this == SPHERICAL;
         }
     }
 
@@ -107,7 +113,7 @@ public class CylindricalEqualArea extends EqualAreaProjection {
      * The type of Cylindrical Equal Area projection. Possible values are:
      *
      * <ul>
-     *   <li>{@code null} if this projection is a default variant.</li>
+     *   <li>{@link Variant#ELLIPSOIDAL}  if this projection is a default variant.</li>
      *   <li>{@link Variant#SPHERICAL} if this projection is the "Lambert Cylindrical Equal Area (Spherical)" case,
      *       in which case the semi-major and semi-minor axis lengths should be replaced by the authalic radius
      *       (this replacement is performed by the {@link Initializer} constructor).</li>
@@ -134,7 +140,7 @@ public class CylindricalEqualArea extends EqualAreaProjection {
     @SuppressWarnings("fallthrough")
     @Workaround(library="JDK", version="1.7")
     private static Initializer initializer(final OperationMethod method, final Parameters parameters) {
-        final Variant variant = variant(method, Variant.values(), null);
+        final Variant variant = variant(method, Variant.values(), Variant.ELLIPSOIDAL);
         final EnumMap<ParameterRole, ParameterDescriptor<Double>> roles = new EnumMap<>(ParameterRole.class);
         /*
          * "Longitude of origin" and "scale factor" are intentionally omitted from this map because they will
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java
index 9682cd4207..e56e70dbbd 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/NormalizedProjection.java
@@ -472,7 +472,7 @@ public abstract class NormalizedProjection extends AbstractMathTransform2D imple
         final String name = method.getName().getCode().replace('_',' ');
         for (final V variant : variants) {
             final Pattern regex = variant.getOperationNamePattern();
-            if (regex.matcher(name).matches()) {
+            if (regex != null && regex.matcher(name).matches()) {
                 return variant;
             }
         }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueMercator.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueMercator.java
index 528763f215..061f58659f 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueMercator.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueMercator.java
@@ -77,7 +77,7 @@ public class ObliqueMercator extends ConformalProjection {
      */
     private enum Variant implements ProjectionVariant {
         /** The <cite>Hotine Oblique Mercator (variant A)</cite> projection. */
-        DEFAULT(".*\\bvariant\\s*A\\b.*", IDENTIFIER_A, false, false),
+        DEFAULT(".*\\bvariant\\s*A\\b.*", IDENTIFIER_OF_BASE, false, false),
 
         /** The <cite>Hotine Oblique Mercator (variant B)</cite> projection. */
         CENTER(".*\\bvariant\\s*B\\b.*", IDENTIFIER, false, true),
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionVariant.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionVariant.java
index 9fa591ca68..82e0365463 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionVariant.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ProjectionVariant.java
@@ -33,7 +33,7 @@ interface ProjectionVariant {
      * Returns the regular expression pattern to use for determining if the name of an operation method
      * identifies this variant.
      *
-     * @return the operation name pattern for this variant.
+     * @return the operation name pattern for this variant, or {@code null} if none.
      */
     Pattern getOperationNamePattern();