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 8032c960ae `ControlledVocabulary.identifier()` become optional. This 
change helped to see potential NullPointerException.
8032c960ae is described below

commit 8032c960ae4f14c19b8e4dadf784f22ff1f1934a
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Tue Jun 25 16:05:59 2024 +0200

    `ControlledVocabulary.identifier()` become optional.
    This change helped to see potential NullPointerException.
---
 .../main/org/apache/sis/coverage/grid/PixelInCell.java           | 5 +++--
 .../main/org/apache/sis/temporal/DefaultInstant.java             | 2 +-
 .../main/org/apache/sis/util/iso/Types.java                      | 9 +++------
 .../main/org/apache/sis/xml/bind/gml/TimePeriodBound.java        | 5 ++++-
 .../main/org/apache/sis/geometry/CoordinateFormat.java           | 4 ++--
 .../main/org/apache/sis/referencing/privy/AxisDirections.java    | 3 +--
 .../main/org/apache/sis/util/privy/MetadataServices.java         | 2 +-
 geoapi/snapshot                                                  | 2 +-
 .../main/org/apache/sis/cql/FilterToCQLVisitor.java              | 4 ++--
 .../test/org/apache/sis/cql/FilterReadingTest.java               | 4 ++--
 10 files changed, 20 insertions(+), 20 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/PixelInCell.java
 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/PixelInCell.java
index 5b2b7a1f8d..13ebad22fd 100644
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/PixelInCell.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/PixelInCell.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.coverage.grid;
 
+import java.util.Optional;
 import org.opengis.metadata.spatial.PixelOrientation;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
@@ -103,8 +104,8 @@ public enum PixelInCell implements ControlledVocabulary {
      * @return the legacy ISO/OGC identifier for this constant.
      */
     @Override
-    public String identifier() {
-        return identifier;
+    public Optional<String> identifier() {
+        return Optional.of(identifier);
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/temporal/DefaultInstant.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/temporal/DefaultInstant.java
index 0eb5682cbe..77cdcc2d1c 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/temporal/DefaultInstant.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/temporal/DefaultInstant.java
@@ -324,7 +324,7 @@ cmp:    if (canTestBefore | canTestAfter | canTestEqual) {
     public String toString() {
         final var s = new StringBuilder();
         if (indeterminate != null) {
-            s.append(indeterminate.identifier());
+            s.append(indeterminate.identifier().orElse(indeterminate.name()));
             if (position != null) {
                 s.append(' ').append(position);
             }
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java
index fabfd4b0d5..1214ab578d 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java
@@ -222,8 +222,8 @@ public final class Types extends Static {
         if (code == null) {
             return null;
         }
-        final String id = code.identifier();
-        return (id != null && !id.isEmpty()) ? id : code.name();
+        String id = code.identifier().orElse("");
+        return id.isEmpty() ? code.name() : id;
     }
 
     /**
@@ -254,11 +254,8 @@ public final class Types extends Static {
         if (code == null) {
             return null;
         }
-        String id = code.identifier();
         final String name = code.name();
-        if (id == null) {
-            id = name;
-        }
+        String id = code.identifier().orElse(name);
         for (final String candidate : code.names()) {
             if (!candidate.equals(name) && candidate.length() >= id.length()) {
                 id = candidate;
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java
index 5b51345ec5..cf94c7a1c9 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gml/TimePeriodBound.java
@@ -23,6 +23,7 @@ import jakarta.xml.bind.annotation.XmlAttribute;
 import jakarta.xml.bind.annotation.XmlTransient;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
+import org.opengis.temporal.IndeterminateValue;
 import org.opengis.temporal.Instant;
 
 
@@ -104,7 +105,9 @@ public abstract class TimePeriodBound {
             if (instant != null) {
                 value = TimeInstant.toXML(instant.getPosition());
                 if (value == null) {
-                    instant.getIndeterminatePosition().ifPresent((p) -> 
indeterminatePosition = p.identifier());
+                    instant.getIndeterminatePosition()
+                            .flatMap(IndeterminateValue::identifier)
+                            .ifPresent((p) -> indeterminatePosition = p);
                 }
             }
             if (value == null && indeterminatePosition == null) {
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/geometry/CoordinateFormat.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/geometry/CoordinateFormat.java
index 7ffd22a0b4..b5752a0760 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/geometry/CoordinateFormat.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/geometry/CoordinateFormat.java
@@ -631,8 +631,8 @@ public class CoordinateFormat extends 
CompoundFormat<DirectPosition> {
      * Returns the symbol ("E", "N", "SW", <i>etc.</i>) for given axis 
direction.
      */
     private static String symbol(final AxisDirection direction) {
-        // Following cast uses or knowledge of `camelCaseToAcronym` 
implementation.
-        return ((StringBuilder) 
CharSequences.camelCaseToAcronym(direction.identifier()))
+        // Following cast uses our knowledge of `camelCaseToAcronym` 
implementation.
+        return ((StringBuilder) 
CharSequences.camelCaseToAcronym(direction.identifier().orElse(direction.name())))
                 .insert(0, Characters.NO_BREAK_SPACE).toString();
     }
 
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 414d1a7a54..0b756d9f7c 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
@@ -702,8 +702,7 @@ next:       for (int i=0; i <= limit; i++) {
                 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();
+        return 
camelCaseToAcronym(direction.identifier().orElse(direction.name())).toString().intern();
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/privy/MetadataServices.java
 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/privy/MetadataServices.java
index e3684de28a..c20f80d7c5 100644
--- 
a/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/privy/MetadataServices.java
+++ 
b/endorsed/src/org.apache.sis.util/main/org/apache/sis/util/privy/MetadataServices.java
@@ -138,7 +138,7 @@ public class MetadataServices extends OptionalDependency {
              * to pass.
              */
         }
-        return CharSequences.camelCaseToSentence(code.identifier()).toString();
+        return 
CharSequences.camelCaseToSentence(code.identifier().orElse(code.name())).toString();
     }
 
     /**
diff --git a/geoapi/snapshot b/geoapi/snapshot
index 2c16f9a1d5..a012f57760 160000
--- a/geoapi/snapshot
+++ b/geoapi/snapshot
@@ -1 +1 @@
-Subproject commit 2c16f9a1d5c2bd2b7c4b1666f877232f162bbc30
+Subproject commit a012f5776018987a7e9aaf5125a8286ded7de414
diff --git 
a/incubator/src/org.apache.sis.cql/main/org/apache/sis/cql/FilterToCQLVisitor.java
 
b/incubator/src/org.apache.sis.cql/main/org/apache/sis/cql/FilterToCQLVisitor.java
index 9dc909eff5..8e07c44d27 100644
--- 
a/incubator/src/org.apache.sis.cql/main/org/apache/sis/cql/FilterToCQLVisitor.java
+++ 
b/incubator/src/org.apache.sis.cql/main/org/apache/sis/cql/FilterToCQLVisitor.java
@@ -142,14 +142,14 @@ final class FilterToCQLVisitor extends 
Visitor<Feature,StringBuilder> {
         });
         for (final SpatialOperatorName type : SpatialOperatorName.values()) {
             if (type != SpatialOperatorName.BBOX) {
-                function(type, type.identifier().toUpperCase(Locale.US));
+                function(type, 
type.identifier().orElse(type.name()).toUpperCase(Locale.US));
                 if (type == SpatialOperatorName.OVERLAPS) break;
             }
         }
         function(DistanceOperatorName.WITHIN, "DWITHIN");
         function(DistanceOperatorName.BEYOND, "BEYOND");
         for (final TemporalOperatorName type : TemporalOperatorName.values()) {
-            function(type, type.identifier().toUpperCase(Locale.US));
+            function(type, 
type.identifier().orElse(type.name()).toUpperCase(Locale.US));
             if (type == TemporalOperatorName.ANY_INTERACTS) break;
         }
         /*
diff --git 
a/incubator/src/org.apache.sis.cql/test/org/apache/sis/cql/FilterReadingTest.java
 
b/incubator/src/org.apache.sis.cql/test/org/apache/sis/cql/FilterReadingTest.java
index fcedc82f40..e220fe4b6c 100644
--- 
a/incubator/src/org.apache.sis.cql/test/org/apache/sis/cql/FilterReadingTest.java
+++ 
b/incubator/src/org.apache.sis.cql/test/org/apache/sis/cql/FilterReadingTest.java
@@ -352,7 +352,7 @@ public final class FilterReadingTest extends CQLTestCase {
     }
 
     private Filter<?> testSpatialOperators(final CodeList<?> operator, final 
String suffix) throws CQLException {
-        final String name = operator.identifier().toUpperCase(Locale.US);
+        final String name = operator.identifier().get().toUpperCase(Locale.US);
         final String cql = name + "(\"att\", POLYGON((10 20, 30 40, 50 60, 10 
20))" + suffix + ')';
         final Filter<?> filter = CQL.parseFilter(cql);
         assertInstanceOf(SpatialOperator.class, filter, name);
@@ -429,7 +429,7 @@ public final class FilterReadingTest extends CQLTestCase {
     @Test
     public void testTemporalOperators() throws CQLException, ParseException {
         for (final TemporalOperatorName operator : 
TemporalOperatorName.values()) {
-            final String name = operator.identifier().toUpperCase(Locale.US);
+            final String name = 
operator.identifier().get().toUpperCase(Locale.US);
             final String cql  = "att " + name + " 2012-03-21T05:42:36Z";
             final Filter<?> filter = CQL.parseFilter(cql);
             assertInstanceOf(TemporalOperator.class, filter, name);

Reply via email to