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 918e07bcbc Avoid usage of the deprecated `AxisDirection.OTHER` code 
list value.
918e07bcbc is described below

commit 918e07bcbc1c2787cfffb8a124151932599e199d
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Fri Apr 19 11:31:58 2024 +0200

    Avoid usage of the deprecated `AxisDirection.OTHER` code list value.
---
 .../apache/sis/coverage/grid/GridExtentCRS.java    |  6 ++---
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  5 ++--
 .../org/apache/sis/referencing/cs/AbstractCS.java  |  4 +--
 .../main/org/apache/sis/referencing/cs/Codes.java  | 24 +++++++++--------
 .../org/apache/sis/referencing/cs/Normalizer.java  |  9 ++++---
 .../sis/referencing/factory/sql/TableInfo.java     |  1 -
 .../apache/sis/referencing/internal/Legacy.java    | 16 +++++++++---
 .../referencing/operation/DefaultConversion.java   |  3 ++-
 .../sis/referencing/operation/matrix/Matrices.java |  2 +-
 .../sis/referencing/privy/AxisDirections.java      | 24 ++++++++++++++---
 .../org/apache/sis/io/wkt/TransliteratorTest.java  | 12 ++++-----
 .../apache/sis/referencing/cs/HardCodedAxes.java   |  4 +--
 .../apache/sis/referencing/cs/NormalizerTest.java  |  5 ++--
 .../sis/referencing/privy/AxisDirectionsTest.java  | 30 ++++++++++++++--------
 .../org/apache/sis/storage/netcdf/base/Axis.java   |  2 +-
 .../sis/util/collection/CodeListSetTest.java       | 26 +++++++++----------
 geoapi/snapshot                                    |  2 +-
 17 files changed, 108 insertions(+), 67 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridExtentCRS.java
 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridExtentCRS.java
index cacfa9b7fa..95020e45e4 100644
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridExtentCRS.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridExtentCRS.java
@@ -299,7 +299,7 @@ final class GridExtentCRS {
                     abbreviation = "t"; direction = AxisDirection.FUTURE; 
hasTime = true;
                 } else {
                     abbreviation = abbreviation(target);
-                    direction = AxisDirection.OTHER;
+                    direction = AxisDirection.UNSPECIFIED;
                     hasOther = true;
                 }
                 /*
@@ -311,7 +311,7 @@ final class GridExtentCRS {
                     final CoordinateSystemAxis previous = axes[k];
                     if (previous != null) {
                         if 
(direction.equals(AxisDirections.absolute(previous.getDirection()))) {
-                            direction = AxisDirection.OTHER;
+                            direction = AxisDirection.UNSPECIFIED;
                             hasOther = true;
                         }
                         if (abbreviation.equals(previous.getAbbreviation())) {
@@ -334,7 +334,7 @@ final class GridExtentCRS {
             if (axes[j] == null) {
                 final String name = 
Vocabulary.forLocale(locale).getString(Vocabulary.Keys.Dimension_1, j);
                 final String abbreviation = abbreviation(j);
-                axes[j] = axis(csFactory, name, abbreviation, 
AxisDirection.OTHER);
+                axes[j] = axis(csFactory, name, abbreviation, 
AxisDirection.UNSPECIFIED);
             }
         }
         /*
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java
index f0678cf713..2ab59defc8 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java
@@ -867,7 +867,7 @@ class GeodeticObjectParser extends MathTransformParser 
implements Comparator<Coo
                     if (defaultUnit == null) {
                         throw 
parent.missingComponent(WKTKeywords.ParametricUnit);
                     }
-                    direction = AxisDirection.OTHER;
+                    direction = AxisDirection.UNSPECIFIED;
                     nz = "Parametric";
                     z = "p";
                     break;
@@ -2213,7 +2213,6 @@ class GeodeticObjectParser extends MathTransformParser 
implements Comparator<Coo
      * @return the {@code "FITTED_CS"} element as a {@link CompoundCRS} object.
      * @throws ParseException if the {@code "COMPD_CS"} element cannot be 
parsed.
      */
-    @SuppressWarnings("deprecation")
     private DerivedCRS parseFittedCS(final int mode, final Element parent) 
throws ParseException {
         final Element element = parent.pullElement(mode, 
WKTKeywords.Fitted_CS);
         if (element == null) {
@@ -2243,7 +2242,7 @@ class GeodeticObjectParser extends MathTransformParser 
implements Comparator<Coo
                 buffer.append(number);
                 axes[i] = csFactory.createCoordinateSystemAxis(
                         singletonMap(CoordinateSystemAxis.NAME_KEY, 
buffer.toString()),
-                        number, AxisDirection.OTHER, Units.UNITY);
+                        number, AxisDirection.UNSPECIFIED, Units.UNITY);
             }
             final Map<String,Object> properties = 
parseMetadataAndClose(element, name, baseCRS);
             final Map<String,Object> axisName = 
singletonMap(CoordinateSystem.NAME_KEY, AxisDirections.appendTo(new 
StringBuilder("CS"), axes));
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java
index a7a8ca7b3b..f69e8f1555 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java
@@ -228,11 +228,11 @@ public class AbstractCS extends AbstractIdentifiedObject 
implements CoordinateSy
              * more than one time axis. Such case happen in meteorological 
models.
              */
             final AxisDirection dir = AxisDirections.absolute(direction);
-            if (!dir.equals(AxisDirection.OTHER)) {
+            if (dir != AxisDirection.UNSPECIFIED && 
!AxisDirections.isLegacyOther(dir)) {
                 for (int j=i; --j>=0;) {
                     final AxisDirection other = axes[j].getDirection();
                     final AxisDirection abs = AxisDirections.absolute(other);
-                    if (dir.equals(abs) && !abs.equals(AxisDirection.FUTURE)) {
+                    if (dir == abs && abs != AxisDirection.FUTURE) {
                         throw new 
IllegalArgumentException(Resources.forProperties(properties).getString(
                                 Resources.Keys.ColinearAxisDirections_2, 
direction, other));
                     }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Codes.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Codes.java
index 9cfd4e8c53..c85db0b272 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Codes.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Codes.java
@@ -18,6 +18,7 @@ package org.apache.sis.referencing.cs;
 
 import java.util.Map;
 import java.util.HashMap;
+import java.util.OptionalInt;
 import javax.measure.Unit;
 import org.opengis.referencing.cs.AxisDirection;
 import org.apache.sis.measure.Units;
@@ -66,21 +67,21 @@ final class Codes {
     /**
      * Packs the given axis directions in a single integer.
      *
-     * @return the packed directions, or 0 if the given directions cannot be 
packed.
+     * @return the packed directions, or empty if the given directions cannot 
be packed.
      */
-    private static int pack(final AxisDirection[] directions) {
+    private static OptionalInt pack(final AxisDirection[] directions) {
         int packed = 0;
         int i = directions.length;
         if (i <= Integer.BYTES) {
             while (--i >= 0) {
                 final int ordinal = directions[i].ordinal();
-                if (ordinal <= 0 || ordinal > Byte.MAX_VALUE) {
-                    return 0;
+                if (ordinal < 0 || ordinal > Byte.MAX_VALUE) {
+                    return OptionalInt.empty();
                 }
                 packed = (packed << Byte.SIZE) | ordinal;
             }
         }
-        return packed;
+        return OptionalInt.of(packed);
     }
 
     /**
@@ -92,9 +93,9 @@ final class Codes {
     static short lookup(final Unit<?> unit, final AxisDirection[] directions) {
         final Integer uc = Units.getEpsgCode(unit, true);
         if (uc != null) {
-            final int p = pack(directions);
-            if (p != 0) {
-                Codes m = new Codes(p, uc.shortValue(), (short) 0);
+            final OptionalInt p = pack(directions);
+            if (p.isPresent()) {
+                Codes m = new Codes(p.getAsInt(), uc.shortValue(), (short) 0);
                 m = EPSG.get(m);
                 if (m != null) {
                     return m.epsg;
@@ -133,7 +134,7 @@ final class Codes {
     static {
         final AxisDirection[] directions = new AxisDirection[] 
{AxisDirection.EAST, AxisDirection.NORTH};
         final int addVertical = AxisDirection.UP.ordinal() << (2 * Byte.SIZE);
-        int packed = pack(directions);
+        OptionalInt packed = pack(directions);
         short unit = EPSG_METRE;
 loop:   for (int i=0; ; i++) {
             final short epsg;
@@ -168,7 +169,8 @@ loop:   for (int i=0; ; i++) {
                          epsg = 6501; break;                                   
          //  Cartesian [S,W] in metres
                 default: break loop;
             }
-            Codes m = new Codes(packed, unit, epsg);
+            final int p = packed.getAsInt();
+            Codes m = new Codes(p, unit, epsg);
             if (EPSG.put(m, m) != null) {
                 throw new AssertionError(m.epsg);
             }
@@ -177,7 +179,7 @@ loop:   for (int i=0; ; i++) {
              * (this is encoded in CodesTest.VERTICAL_UNIT constant).
              */
             if (to3D != 0) {
-                m = new Codes(packed | addVertical, unit, to3D);
+                m = new Codes(p | addVertical, unit, to3D);
                 if (EPSG.put(m, m) != null) {
                     throw new AssertionError(m.epsg);
                 }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Normalizer.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Normalizer.java
index cb93b937f7..0f64309fdd 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Normalizer.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/Normalizer.java
@@ -97,7 +97,7 @@ final class Normalizer implements Comparable<Normalizer> {
 
     /**
      * Number of bits by which to shift the {@link AxisDirection#ordinal()} 
value in order to make room for
-     * inserting intermediate values between them. A shift of 2 make room for 
{@literal 1 << 2} intermediate
+     * inserting intermediate values between them. A shift of 3 makes room for 
{@literal 1 << 3} intermediate
      * values. Those intermediate values are declared in the {@link #ORDER} 
map.
      *
      * @see #order(AxisDirection)
@@ -109,7 +109,7 @@ final class Normalizer implements Comparable<Normalizer> {
      *
      * @see #order(AxisDirection)
      */
-    private static final Map<AxisDirection,Integer> ORDER = new HashMap<>();
+    private static final Map<AxisDirection,Integer> ORDER = new HashMap<>(12);
     static {
         // Get ordinal of last compass direction defined by GeoAPI. We will 
continue on the horizontal plane.
         int code = (AxisDirection.NORTH.ordinal() + 
(AxisDirections.COMPASS_COUNT - 1)) << SHIFT;
@@ -156,10 +156,13 @@ final class Normalizer implements Comparable<Normalizer> {
 
     /**
      * Returns the order of the given axis direction.
+     * The returned value may be negative.
      */
     private static int order(final AxisDirection dir) {
         final Integer p = ORDER.get(dir);
-        return (p != null) ? p : (dir.ordinal() << SHIFT);
+        if (p != null) return p;
+        if (AxisDirections.isLegacyOther(dir)) return -1;
+        return dir.ordinal() << SHIFT;
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java
index 61f0df5aab..7ac34d28a2 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java
@@ -142,7 +142,6 @@ final class TableInfo {
                 new Class<?>[] { Conversion.class, Transformation.class},
                 new String[]   {"conversion",     "transformation"},
                 "SHOW_OPERATION"),
-                // Note: Projection is handled in a special way.
 
         new TableInfo(OperationMethod.class,
                 "[Coordinate_Operation Method]",
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java
index 79324f86ba..9707a27c18 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java
@@ -65,6 +65,14 @@ public final class Legacy {
      */
     public static final String DERIVED_TYPE_KEY = "derivedType";
 
+    /**
+     * The "other" direction used in WKT 1 definition of geocentric CRS.
+     * It was used for meaning "toward prime meridian".
+     *
+     * @see 
org.apache.sis.referencing.privy.AxisDirections#isLegacyOther(AxisDirection)
+     */
+    public static final AxisDirection OTHER = AxisDirection.valueOf("OTHER");
+
     /**
      * A three-dimensional Cartesian CS with the legacy set of geocentric axes.
      * OGC 01-009 defines the default geocentric axes as:
@@ -77,8 +85,8 @@ public final class Legacy {
      * the ISO 19111's ones (ISO names are "Geocentric X", "Geocentric Y" and 
"Geocentric Z"). This constant uses
      * the invalid names and directions for WKT 1 parsing/formatting purposes.
      */
-    private static final CartesianCS LEGACY = new 
DefaultCartesianCS(Map.of(NAME_KEY, "Legacy geocentric"),
-            new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, "X"), "X", 
AxisDirection.OTHER, Units.METRE),
+    private static final CartesianCS GEOCENTRIC = new 
DefaultCartesianCS(Map.of(NAME_KEY, "Legacy geocentric"),
+            new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, "X"), "X",        
       OTHER, Units.METRE),
             new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, "Y"), "Y", 
AxisDirection.EAST,  Units.METRE),
             new DefaultCoordinateSystemAxis(Map.of(NAME_KEY, "Z"), "Z", 
AxisDirection.NORTH, Units.METRE));
 
@@ -109,7 +117,7 @@ public final class Legacy {
      *         or {@code cs} if the CS axes should be used as-is.
      */
     public static CartesianCS forGeocentricCRS(final CartesianCS cs, final 
boolean toLegacy) {
-        final CartesianCS check = toLegacy ? standard(null) : LEGACY;
+        final CartesianCS check = toLegacy ? standard(null) : GEOCENTRIC;
         final int dimension = check.getDimension();
         if (cs.getDimension() != dimension) {
             return cs;
@@ -120,7 +128,7 @@ public final class Legacy {
             }
         }
         final Unit<?> unit = ReferencingUtilities.getUnit(cs);
-        return toLegacy ? replaceUnit(LEGACY, unit) : standard(unit);
+        return toLegacy ? replaceUnit(GEOCENTRIC, unit) : standard(unit);
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
index 90cf08b7bd..58fa818fc6 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
@@ -326,8 +326,9 @@ public class DefaultConversion extends 
AbstractSingleOperation implements Conver
     public static DefaultConversion castOrCopy(final Conversion object) {
         if (object == null || object instanceof DefaultConversion) {
             return (DefaultConversion) object;
+        } else {
+            return new DefaultConversion(object);
         }
-        return new DefaultConversion(object);
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/matrix/Matrices.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/matrix/Matrices.java
index 294001201b..ef9bf28036 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/matrix/Matrices.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/matrix/Matrices.java
@@ -451,7 +451,7 @@ public final class Matrices extends Static {
         if (Arrays.equals(srcAxes, dstAxes)) {
             /*
              * createTransform(…) may fail if the arrays contain two axes with 
the same direction, for example
-             * AxisDirection.OTHER. This check prevents that failure for the 
common case of an identity transform.
+             * AxisDirection.UNSPECIFIED. This check prevents that failure for 
the case of identity transform.
              * The returned matrix must use extended precision for reason 
documented in `createTransform(…)`.
              */
             final int n = srcAxes.length + 1;
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/AxisDirections.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/AxisDirections.java
index 9a42c857f1..aa443b4110 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/AxisDirections.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/AxisDirections.java
@@ -72,9 +72,9 @@ public final class AxisDirections extends Static {
      * For each direction, the opposite direction.
      * This map shall be immutable after construction.
      */
-    private static final Map<AxisDirection,AxisDirection> OPPOSITES = new 
HashMap<>(20);
+    private static final Map<AxisDirection,AxisDirection> OPPOSITES = new 
HashMap<>(24);
     static {
-        put(OTHER,             OTHER);
+        put(UNSPECIFIED,       UNSPECIFIED);
         put(NORTH,             SOUTH);
         put(NORTH_NORTH_EAST,  SOUTH_SOUTH_WEST);
         put(NORTH_EAST,        SOUTH_WEST);
@@ -109,7 +109,7 @@ public final class AxisDirections extends Static {
             ROW_POSITIVE,      "j",
             DISPLAY_RIGHT,     "x",
             DISPLAY_UP,        "y",
-            OTHER,             "z",     // Arbitrary abbreviation, may change 
in any future SIS version.
+            UNSPECIFIED,       "m",     // Arbitrary abbreviation, may change 
in any future SIS version.
             AWAY_FROM,         "r",
             COUNTER_CLOCKWISE, "θ");
 
@@ -256,6 +256,21 @@ public final class AxisDirections extends Static {
         return dir == GEOCENTRIC_X || dir == GEOCENTRIC_Y || dir == 
GEOCENTRIC_Z;
     }
 
+    /**
+     * Returns {@code true} if the given direction is the legacy "other" code 
list value.
+     * The "other" direction was used in Well Known Text (WKT) 1 but is no 
longer declared
+     * in recent standards.
+     *
+     * @param  dir  the direction to test, or {@code null}.
+     * @return {@code true} if the given direction is the legacy "other" 
direction.
+     *
+     * @see org.apache.sis.referencing.internal.Legacy#OTHER
+     */
+    public static boolean isLegacyOther(final AxisDirection dir) {
+        // Compare "other" as string for avoiding class loading.
+        return (dir != null) && "OTHER".equalsIgnoreCase(dir.name());
+    }
+
     /**
      * Returns {@code true} if the given direction is a spatial axis direction 
(including vertical and geocentric axes).
      * The current implementation conservatively returns {@code true} for 
every non-null directions except a hard-coded
@@ -713,6 +728,9 @@ next:       for (int i=0; i <= limit; i++) {
             if (abbreviation != null) {
                 return abbreviation;
             }
+            if (isLegacyOther(direction)) {
+                return "m";             // Arbitrary abbreviation, may change 
in any future SIS version.
+            }
         }
         final String id = direction.identifier();   // UML identifier, or null 
if none.
         return camelCaseToAcronym(id != null ? id : 
direction.name()).toString().intern();
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/TransliteratorTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/TransliteratorTest.java
index 31c0786c52..3ba62d844f 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/TransliteratorTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/io/wkt/TransliteratorTest.java
@@ -98,12 +98,12 @@ public final class TransliteratorTest extends TestCase {
     @Test
     public void testToUnicodeAbbreviation() {
         final Transliterator t = Transliterator.DEFAULT;
-        assertEquals("φ",  t.toUnicodeAbbreviation("ellipsoidal", 
AxisDirection.NORTH, "P"), "P");
-        assertEquals("φ",  t.toUnicodeAbbreviation("ellipsoidal", 
AxisDirection.NORTH, "B"), "B");
-        assertEquals("λ",  t.toUnicodeAbbreviation("ellipsoidal", 
AxisDirection.EAST,  "L"), "L");
-        assertEquals("θ",  t.toUnicodeAbbreviation("polar",       
AxisDirection.OTHER, "U"), "U");
-        assertEquals("Ω",  t.toUnicodeAbbreviation("spherical",   
AxisDirection.NORTH, "U"), "U");
-        assertEquals("θ",  t.toUnicodeAbbreviation("spherical",   
AxisDirection.EAST,  "V"), "V");
+        assertEquals("φ",  t.toUnicodeAbbreviation("ellipsoidal", 
AxisDirection.NORTH,     "P"), "P");
+        assertEquals("φ",  t.toUnicodeAbbreviation("ellipsoidal", 
AxisDirection.NORTH,     "B"), "B");
+        assertEquals("λ",  t.toUnicodeAbbreviation("ellipsoidal", 
AxisDirection.EAST,      "L"), "L");
+        assertEquals("θ",  t.toUnicodeAbbreviation("polar",       
AxisDirection.CLOCKWISE, "U"), "U");
+        assertEquals("Ω",  t.toUnicodeAbbreviation("spherical",   
AxisDirection.NORTH,     "U"), "U");
+        assertEquals("θ",  t.toUnicodeAbbreviation("spherical",   
AxisDirection.EAST,      "V"), "V");
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/HardCodedAxes.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/HardCodedAxes.java
index fe5edb9942..b7b43a955b 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/HardCodedAxes.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/HardCodedAxes.java
@@ -468,8 +468,8 @@ public final class HardCodedAxes {
      * and the unit is dimensionless. This constant is sometimes used as a 
placeholder
      * for axes that were not properly defined.
      */
-    public static final DefaultCoordinateSystemAxis UNDEFINED = 
create("Undefined", "z",
-            AxisDirection.OTHER, Units.UNITY, Double.NEGATIVE_INFINITY, 
Double.POSITIVE_INFINITY, null);
+    public static final DefaultCoordinateSystemAxis UNDEFINED = 
create("Undefined", "m",
+            AxisDirection.UNSPECIFIED, Units.UNITY, Double.NEGATIVE_INFINITY, 
Double.POSITIVE_INFINITY, null);
 
     /**
      * Creates a new axis of the given name, abbreviation, direction and unit.
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/NormalizerTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/NormalizerTest.java
index 3a6b0585e8..28ff4bb908 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/NormalizerTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/cs/NormalizerTest.java
@@ -24,6 +24,7 @@ import org.opengis.referencing.cs.CoordinateSystemAxis;
 import static org.opengis.referencing.cs.CoordinateSystem.NAME_KEY;
 import org.apache.sis.referencing.ImmutableIdentifier;
 import org.apache.sis.referencing.IdentifiedObjects;
+import org.apache.sis.referencing.internal.Legacy;
 import org.apache.sis.util.resources.Vocabulary;
 import org.apache.sis.measure.Units;
 
@@ -115,12 +116,12 @@ public final class NormalizerTest extends TestCase {
     @Test
     public void testSortWKT1() {
         assertOrdered(new AxisDirection[] {
-            AxisDirection.OTHER,
+            Legacy.OTHER,
             AxisDirection.EAST,
             AxisDirection.NORTH
         }, new AxisDirection[] {
             AxisDirection.NORTH,
-            AxisDirection.OTHER,
+            Legacy.OTHER,
             AxisDirection.EAST
         });
     }
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/privy/AxisDirectionsTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/privy/AxisDirectionsTest.java
index 4a347861f2..db2480f1af 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/privy/AxisDirectionsTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/privy/AxisDirectionsTest.java
@@ -23,6 +23,7 @@ import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.cs.CoordinateSystem;
 import org.opengis.referencing.cs.CoordinateSystemAxis;
 import static org.opengis.referencing.cs.AxisDirection.*;
+import org.apache.sis.referencing.internal.Legacy;
 import org.apache.sis.measure.Units;
 
 // Test dependencies
@@ -102,15 +103,15 @@ public final class AxisDirectionsTest extends TestCase {
      */
     @Test
     public void testIsOpposite() {
-        assertFalse(AxisDirections.isOpposite(NORTH ));
-        assertTrue (AxisDirections.isOpposite(SOUTH ));
-        assertFalse(AxisDirections.isOpposite(EAST  ));
-        assertTrue (AxisDirections.isOpposite(WEST  ));
-        assertFalse(AxisDirections.isOpposite(UP    ));
-        assertTrue (AxisDirections.isOpposite(DOWN  ));
+        assertFalse(AxisDirections.isOpposite(NORTH));
+        assertTrue (AxisDirections.isOpposite(SOUTH));
+        assertFalse(AxisDirections.isOpposite(EAST));
+        assertTrue (AxisDirections.isOpposite(WEST));
+        assertFalse(AxisDirections.isOpposite(UP));
+        assertTrue (AxisDirections.isOpposite(DOWN));
         assertFalse(AxisDirections.isOpposite(FUTURE));
-        assertTrue (AxisDirections.isOpposite(PAST  ));
-        assertFalse(AxisDirections.isOpposite(OTHER ));
+        assertTrue (AxisDirections.isOpposite(PAST));
+        assertFalse(AxisDirections.isOpposite(UNSPECIFIED));
     }
 
     /**
@@ -136,7 +137,7 @@ public final class AxisDirectionsTest extends TestCase {
         assertFalse(AxisDirections.isCardinal(NORTH_NORTH_WEST));
         assertFalse(AxisDirections.isCardinal(UP));
         assertFalse(AxisDirections.isCardinal(FUTURE));
-        assertFalse(AxisDirections.isCardinal(OTHER));
+        assertFalse(AxisDirections.isCardinal(UNSPECIFIED));
     }
 
     /**
@@ -162,7 +163,7 @@ public final class AxisDirectionsTest extends TestCase {
         assertTrue (AxisDirections.isIntercardinal(NORTH_NORTH_WEST));
         assertFalse(AxisDirections.isIntercardinal(UP));
         assertFalse(AxisDirections.isIntercardinal(FUTURE));
-        assertFalse(AxisDirections.isIntercardinal(OTHER));
+        assertFalse(AxisDirections.isIntercardinal(UNSPECIFIED));
     }
 
     /**
@@ -199,6 +200,15 @@ public final class AxisDirectionsTest extends TestCase {
         assertFalse(AxisDirections.isGeocentric(FUTURE));
     }
 
+    /**
+     * Tests {@link AxisDirections#isLegacyOther(AxisDirection)}.
+     */
+    @Test
+    public void testIsLegacyOther() {
+        assertFalse(AxisDirections.isLegacyOther(NORTH));
+        assertTrue (AxisDirections.isLegacyOther(Legacy.OTHER));
+    }
+
     /**
      * Tests {@link AxisDirections#isSpatialOrUserDefined(AxisDirection, 
boolean)} and
      * {@link AxisDirections#isGrid(AxisDirection)}.
diff --git 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
index c0ccbf3514..8bff2968de 100644
--- 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
+++ 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Axis.java
@@ -630,7 +630,7 @@ public final class Axis extends NamedElement {
             } else switch (order) {
                 case 0:  dir = AxisDirection.COLUMN_POSITIVE; break;
                 case 1:  dir = AxisDirection.ROW_POSITIVE;    break;
-                default: dir = AxisDirection.OTHER;           break;
+                default: dir = AxisDirection.UNSPECIFIED;     break;
             }
         }
         final String abbr;
diff --git 
a/endorsed/src/org.apache.sis.util/test/org/apache/sis/util/collection/CodeListSetTest.java
 
b/endorsed/src/org.apache.sis.util/test/org/apache/sis/util/collection/CodeListSetTest.java
index 6f449ee356..e6ecb333bf 100644
--- 
a/endorsed/src/org.apache.sis.util/test/org/apache/sis/util/collection/CodeListSetTest.java
+++ 
b/endorsed/src/org.apache.sis.util/test/org/apache/sis/util/collection/CodeListSetTest.java
@@ -46,7 +46,7 @@ public final class CodeListSetTest extends TestCase {
 
     /**
      * Creates a new set filled with up to 4 axis directions.
-     * The directions are (NORTH, EAST, UP, FUTURE) in that order.
+     * The directions are (NORTH_NORTH_EAST, EAST, UP, FUTURE) in that order.
      *
      * @param n Number of code list to add.
      */
@@ -59,7 +59,7 @@ public final class CodeListSetTest extends TestCase {
             case 4: assertTrue(c.add(FUTURE));              // Fallthrough 
everywhere.
             case 3: assertTrue(c.add(UP));
             case 2: assertTrue(c.add(EAST));
-            case 1: assertTrue(c.add(NORTH));
+            case 1: assertTrue(c.add(NORTH_NORTH_EAST));
             case 0: break;
         }
         assertEquals(n, c.size());
@@ -68,12 +68,12 @@ public final class CodeListSetTest extends TestCase {
 
     /**
      * Creates a code list of another kind. The returned set contains a code 
list having
-     * the same ordinal value as {@link AxisDirection#NORTH}, so we can detect 
if the
-     * {@code SortedSet} confuses the code list types.
+     * the same ordinal value as {@link AxisDirection#NORTH_NORTH_EAST}, so we 
can detect
+     * if the {@code SortedSet} confuses the code list types.
      */
     private CodeListSet<OnLineFunction> createOtherKind() {
         // For the validity of the tests, ordinal value must be the same.
-        assertEquals(NORTH.ordinal(), OnLineFunction.INFORMATION.ordinal());
+        assertEquals(NORTH_NORTH_EAST.ordinal(), 
OnLineFunction.INFORMATION.ordinal());
         final CodeListSet<OnLineFunction> c = new 
CodeListSet<>(OnLineFunction.class);
         assertTrue(c.add(OnLineFunction.INFORMATION));
         return c;
@@ -86,7 +86,7 @@ public final class CodeListSetTest extends TestCase {
     @Test
     public void testToArray() {
         final CodeListSet<AxisDirection> c = create(4);
-        assertArrayEquals(new Object[] {NORTH, EAST, UP, FUTURE}, c.toArray());
+        assertArrayEquals(new Object[] {NORTH_NORTH_EAST, EAST, UP, FUTURE}, 
c.toArray());
     }
 
     /**
@@ -106,7 +106,7 @@ public final class CodeListSetTest extends TestCase {
     @Test
     public void testContains() {
         final CodeListSet<AxisDirection> c = create(4);
-        assertTrue (c.contains(NORTH));
+        assertTrue (c.contains(NORTH_NORTH_EAST));
         assertFalse(c.contains(SOUTH));
         assertTrue (c.contains(FUTURE));
         assertFalse(c.contains(PAST));
@@ -128,9 +128,9 @@ public final class CodeListSetTest extends TestCase {
         assertFalse(c.remove(null), "Should be null-safe.");
         assertFalse(c.remove(OnLineFunction.INFORMATION), "Code list of other 
kind should not be included.");
 
-        assertTrue (c.remove  (NORTH));
+        assertTrue (c.remove  (NORTH_NORTH_EAST));
         assertFalse(c.remove  (SOUTH));
-        assertFalse(c.contains(NORTH));
+        assertFalse(c.contains(NORTH_NORTH_EAST));
         assertEquals(3, c.size());
 
         assertTrue (c.remove  (FUTURE));
@@ -151,7 +151,7 @@ public final class CodeListSetTest extends TestCase {
         final CodeListSet<AxisDirection> c = create(4);
         final CodeListSet<AxisDirection> o = create(4);
         assertTrue (c.containsAll(o));
-        assertTrue (o.remove(NORTH));
+        assertTrue (o.remove(NORTH_NORTH_EAST));
         assertTrue (o.remove(FUTURE));
         assertTrue (c.containsAll(o));
         assertTrue (o.add(NORTH_EAST));
@@ -185,7 +185,7 @@ public final class CodeListSetTest extends TestCase {
         assertTrue(o.add(NORTH_EAST));      // Extra value shall be ignored.
 
         assertTrue(c.retainAll(o));
-        assertArrayEquals(new Object[] {NORTH, EAST}, c.toArray());
+        assertArrayEquals(new Object[] {NORTH_NORTH_EAST, EAST}, c.toArray());
         assertFalse(c.retainAll(o));        // Invoking a second time should 
not make any difference.
         assertEquals(2, c.size());
         assertTrue(c.retainAll(createOtherKind()));
@@ -202,7 +202,7 @@ public final class CodeListSetTest extends TestCase {
         assertTrue(c.add(NORTH_EAST));
 
         assertTrue(c.addAll(o));
-        assertArrayEquals(new Object[] {NORTH, NORTH_EAST, EAST, UP}, 
c.toArray());
+        assertArrayEquals(new Object[] {NORTH_NORTH_EAST, NORTH_EAST, EAST, 
UP}, c.toArray());
         assertFalse(c.addAll(o));       // Invoking a second time should not 
make any difference.
     }
 
@@ -213,7 +213,7 @@ public final class CodeListSetTest extends TestCase {
     public void testFill() {
         final CodeListSet<AxisDirection> c = new 
CodeListSet<>(AxisDirection.class, true);
         assertTrue(c.size() >= 32, "Expect at least 32 elements as of GeoAPI 
3.0.");
-        assertTrue(c.toString().startsWith("[AxisDirection.OTHER, 
AxisDirection.NORTH, "));
+        assertTrue(c.toString().startsWith("[AxisDirection.NORTH, 
AxisDirection.NORTH_NORTH_EAST, "));
         /*
          * Testing the full array would be too long and may change in future 
GeoAPI version
          * anyway. Actually the main interest of this test is to ensure that 
the toString()
diff --git a/geoapi/snapshot b/geoapi/snapshot
index 1dd682e1b3..792044359e 160000
--- a/geoapi/snapshot
+++ b/geoapi/snapshot
@@ -1 +1 @@
-Subproject commit 1dd682e1b3950d7024b17f6639673b896f701441
+Subproject commit 792044359e4e5e2140678ba89bd126f0ca6b57ce


Reply via email to