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);