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
commit 186c01efb99922d744fc6c925b58c940b6e7ab04 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Tue Jan 17 18:55:34 2023 +0100 Handle characters for the "File reference" column of EPSG database that are illegal according URI syntax. --- .../sis/referencing/factory/sql/EPSGDataAccess.java | 13 +++++++++---- .../apache/sis/util/resources/IndexedResourceBundle.java | 15 +++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java index 46658ed855..aa33a6cbf6 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java @@ -2728,8 +2728,12 @@ next: while (r.next()) { String reference; if (Double.isNaN(value)) { /* - * If no numeric values were provided in the database, then the values should be - * in some external file. It may be a file in the $SIS_DATA/DatumChanges directory. + * If no numeric value was provided in the database, then the values should be in + * an external file. It may be a file in the "$SIS_DATA/DatumChanges" directory. + * The reference file should be relative and _not_ encoded for valid URI syntax. + * The encoding will be applied by invoking an `URI` multi-argument constructor. + * Note that we must use a multi-arguments constructor, not URI(String), because + * the latter assumes an encoded string (which is not the case in EPSG database). */ reference = getString(operation, result, 3); } else { @@ -2744,13 +2748,14 @@ next: while (r.next()) { } try { if (reference != null) { - param.setValue(reference); + param.setValue(new URI(null, reference, null)); // See above comment. } else if (unit != null) { param.setValue(value, unit); } else { param.setValue(value); } - } catch (RuntimeException exception) { // Catch InvalidParameterValueException, ArithmeticException and others. + } catch (RuntimeException | URISyntaxException exception) { + // Catch InvalidParameterValueException, ArithmeticException and others. throw new FactoryDataException(error().getString(Errors.Keys.CanNotSetParameterValue_1, name), exception); } } diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java b/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java index ef618c53a4..03c87279d1 100644 --- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java +++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/IndexedResourceBundle.java @@ -16,6 +16,7 @@ */ package org.apache.sis.util.resources; +import java.net.URI; import java.net.URL; import java.io.BufferedInputStream; import java.io.DataInputStream; @@ -424,12 +425,8 @@ public class IndexedResourceBundle extends ResourceBundle implements Localized { text = ((InternationalString) element).toString(getLocale()); } replacement = CharSequences.shortSentence(text, MAX_STRING_LENGTH); - } else if (element instanceof Throwable) { - String message = Exceptions.getLocalizedMessage((Throwable) element, getLocale()); - if (message == null) { - message = Classes.getShortClassName(element); - } - replacement = message; + } else if (element instanceof URI) { + replacement = ((URI) element).getPath(); // For decoding encoded characters. } else if (element instanceof Class<?>) { replacement = Classes.getShortName(getPublicType((Class<?>) element)); } else if (element instanceof ControlledVocabulary) { @@ -443,6 +440,12 @@ public class IndexedResourceBundle extends ResourceBundle implements Localized { replacement = s; } else if (element.getClass().isArray()) { replacement = Utilities.deepToString(element); + } else if (element instanceof Throwable) { + String message = Exceptions.getLocalizedMessage((Throwable) element, getLocale()); + if (message == null) { + message = Classes.getShortClassName(element); + } + replacement = message; } /* * No need to check for Numbers or Dates instances, since they are