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 ea7344752e Fix information lost: - In source file when parameters are 
copied. - In root object name when WKT formatting has warnings.
ea7344752e is described below

commit ea7344752e796e7335511ce6723a32cc7fbd0f09
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Thu Dec 28 19:05:13 2023 +0100

    Fix information lost:
    - In source file when parameters are copied.
    - In root object name when WKT formatting has warnings.
---
 .../main/org/apache/sis/io/wkt/FormattableObject.java   | 17 ++++++++++-------
 .../main/org/apache/sis/io/wkt/Warnings.java            |  2 ++
 .../main/org/apache/sis/parameter/Parameters.java       |  4 ++++
 .../sis/referencing/operation/gridded/GridFile.java     |  9 +++++++++
 .../provider/FranceGeocentricInterpolation.java         |  2 +-
 .../bind/referencing/CC_GeneralOperationParameter.java  |  1 +
 .../sis/xml/bind/referencing/CC_OperationMethod.java    |  7 +++++--
 .../sis/referencing/operation/provider/NTv2Test.java    |  2 +-
 8 files changed, 33 insertions(+), 11 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/FormattableObject.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/FormattableObject.java
index 893cf1ccf3..9dd15b6d67 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/FormattableObject.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/FormattableObject.java
@@ -195,13 +195,16 @@ public abstract class FormattableObject implements 
Printable {
         final String wkt;
         try {
             formatter.append(this);
-            if (strict) {
-                /*
-                 * If a warning occurred, consider the object as 
non-formattable.
-                 * We take the last message since it is more likely to be 
about the enclosing element.
-                 */
-                final Warnings warnings = formatter.getWarnings();
-                if (warnings != null) {
+            final Warnings warnings = formatter.getWarnings();
+            if (warnings != null) {
+                if (warnings.getRootElement() == null) {
+                    warnings.setRoot(this);
+                }
+                if (strict) {
+                    /*
+                     * If a warning occurred, consider the object as 
non-formattable.
+                     * We take the last message since it is more likely to be 
about the enclosing element.
+                     */
                     final int n = warnings.getNumMessages() - 1;
                     throw new 
UnformattableObjectException(warnings.getMessage(n), warnings.getException(n));
                 }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Warnings.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Warnings.java
index 22051537a6..baf08d84d3 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Warnings.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Warnings.java
@@ -161,6 +161,8 @@ public final class Warnings implements Localized, 
Serializable {
      * parsed or formatted. Defined as a separated method instead of as an 
argument for the constructor
      * because this information is more easily provided by {@link WKTFormat} 
rather than by the parser or
      * formatter that created the {@code Warnings} object.
+     *
+     * @see #getRootElement()
      */
     final void setRoot(final Object obj) {
         if (obj instanceof IdentifiedObject) {
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/Parameters.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/Parameters.java
index c4257787bb..1df706d81c 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/Parameters.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/Parameters.java
@@ -938,6 +938,10 @@ public abstract class Parameters implements 
ParameterValueGroup, Cloneable, Prin
                     throw new InvalidParameterValueException(Errors.format(
                             Errors.Keys.IllegalArgumentValue_2, name, v), 
name, v);
                 }
+                if (source instanceof DefaultParameterValue<?> && target 
instanceof DefaultParameterValue<?>) {
+                    ((DefaultParameterValue<?>) 
source).getSourceFile().ifPresent((file) ->
+                            ((DefaultParameterValue<?>) 
target).setSourceFile(file));
+                }
             }
             occurrences.put(name, occurrence + 1);
         }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/gridded/GridFile.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/gridded/GridFile.java
index c6fc045fa4..239c7b8f52 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/gridded/GridFile.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/gridded/GridFile.java
@@ -27,6 +27,7 @@ import java.nio.file.Path;
 import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.FileSystemNotFoundException;
+import java.util.Optional;
 import java.util.logging.Level;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.opengis.util.FactoryException;
@@ -203,6 +204,14 @@ public final class GridFile {
         return resolved;
     }
 
+    /**
+     * {@return the resolved URI as a path if possible}.
+     * A use case for this method is grids to open as a {@link 
org.apache.sis.storage.DataStore}.
+     */
+    public Optional<Path> path() {
+        return Optional.ofNullable(asPath);
+    }
+
     /**
      * Creates a channel for reading bytes from the file at the path specified 
at construction time.
      * This method tries to open using the file system before to open from the 
URL.
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/FranceGeocentricInterpolation.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/FranceGeocentricInterpolation.java
index 44585f67ed..c4022a3982 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/FranceGeocentricInterpolation.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/FranceGeocentricInterpolation.java
@@ -274,7 +274,7 @@ public final class FranceGeocentricInterpolation extends 
GeodeticOperation {
      * @return {@code true} if the given file looks like a fie from the French 
mapping agency.
      */
     public static boolean isRecognized(final GridFile file) {
-        final String filename = file.resolved().getPath();
+        final String filename = file.parameter.getPath();
         final int s = filename.lastIndexOf('/') + 1;
         return filename.regionMatches(true, s, DEFAULT, 0, 5);
     }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_GeneralOperationParameter.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_GeneralOperationParameter.java
index 57366a788e..b73edf5231 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_GeneralOperationParameter.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_GeneralOperationParameter.java
@@ -136,6 +136,7 @@ public final class CC_GeneralOperationParameter extends 
PropertyType<CC_GeneralO
      */
     @XmlElementRef
     public AbstractParameterDescriptor getElement() {
+        @SuppressWarnings("LocalVariableHidesMemberVariable")
         final GeneralParameterDescriptor metadata = this.metadata;
         if (metadata instanceof AbstractParameterDescriptor) {
             return (AbstractParameterDescriptor) metadata;
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_OperationMethod.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_OperationMethod.java
index 95ddfab6bf..c66eafed8d 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_OperationMethod.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CC_OperationMethod.java
@@ -213,8 +213,8 @@ public final class CC_OperationMethod extends 
PropertyType<CC_OperationMethod, O
             final GeneralParameterDescriptor replacement = 
replacements.get(p.getDescriptor());
             if (replacement != null) {
                 if (p instanceof ParameterValue<?>) {
-                    final ParameterValue<?> source = (ParameterValue<?>) p;
-                    final ParameterValue<?> target = new 
DefaultParameterValue<>((ParameterDescriptor<?>) replacement);
+                    final var source = (ParameterValue<?>) p;
+                    final var target = new 
DefaultParameterValue<>((ParameterDescriptor<?>) replacement);
                     final Object value = source.getValue();
                     final Unit<?> unit = source.getUnit();
                     if (unit == null) {
@@ -224,6 +224,9 @@ public final class CC_OperationMethod extends 
PropertyType<CC_OperationMethod, O
                     } else {
                         target.setValue(((Number) value).doubleValue(), unit);
                     }
+                    if (source instanceof DefaultParameterValue<?>) {
+                        ((DefaultParameterValue<?>) 
source).getSourceFile().ifPresent(target::setSourceFile);
+                    }
                     p = target;
                 } else if (p instanceof ParameterValueGroup) {
                     final ParameterValueGroup source = (ParameterValueGroup) p;
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/NTv2Test.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/NTv2Test.java
index 0d803d1d5c..d6ac4eb852 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/NTv2Test.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/NTv2Test.java
@@ -193,7 +193,7 @@ public final class NTv2Test extends DatumShiftTestCase {
         final Parameters pg = Parameters.castOrWrap(new 
NTv2().getParameters().createValue());
         pg.getOrCreate(NTv2.FILE).setValue(new URI(MULTIGRID_TEST_FILE));
         final GridFile file = new GridFile(pg, NTv2.FILE);
-        assumeTrue(Files.exists(Path.of(file.resolved())));
+        assumeTrue(Files.exists(file.path().orElseThrow()));
 
         final LoadedGrid<Angle,Angle> grid = NTv2.getOrLoad(NTv2.class, file, 
2);
         assertInstanceOf("Should contain many grids.", GridGroup.class, grid);

Reply via email to