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 95cdd7553d7a99413bd8f155c4d5dc978971e902 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Tue Dec 26 11:28:58 2023 +0100 Add a `MarshalContext.getDocumentURI()` method. --- .../main/org/apache/sis/xml/MarshalContext.java | 15 +++++- .../main/org/apache/sis/xml/Pooled.java | 2 +- .../main/org/apache/sis/xml/ReferenceResolver.java | 2 +- .../main/org/apache/sis/xml/bind/Context.java | 9 ++++ .../apache/sis/xml/util/ExternalLinkHandler.java | 60 +++++++++++++--------- 5 files changed, 61 insertions(+), 27 deletions(-) diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java index c2454965ff..4509ff7470 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/MarshalContext.java @@ -16,7 +16,9 @@ */ package org.apache.sis.xml; +import java.net.URI; import java.util.Locale; +import java.util.Optional; import java.util.TimeZone; import org.opengis.util.InternationalString; import org.apache.sis.util.Localized; @@ -103,5 +105,16 @@ public abstract class MarshalContext implements Localized { * @param prefix one of the above-cited prefix. * @return the version for the given schema, or {@code null} if unknown. */ - public abstract Version getVersion(final String prefix); + public abstract Version getVersion(String prefix); + + /** + * Returns the URI of the document being (un)marshalled, if this URI is known. + * The URI is generally unknown if the source of the XML document is, + * for example, an {@link java.io.InputStream}. + * + * @return the URI of the document being marshalled or unmarshalled. + * + * @since 1.5 + */ + public abstract Optional<URI> getDocumentURI(); } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java index 3473dc7d1c..6bfc282ffd 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/Pooled.java @@ -577,7 +577,7 @@ abstract class Pooled { public String toString() { final Context current = Context.current(); return Strings.toString(getClass(), - "baseURI", Context.linkHandler(current).getURI(), + "baseURI", Context.linkHandler(current).getBase(), "locale", locale, "timezone", timezone, "versionGML", versionGML, "versionMetadata", versionMetadata); } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/ReferenceResolver.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/ReferenceResolver.java index fc98dc2657..75a283c747 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/ReferenceResolver.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/ReferenceResolver.java @@ -195,7 +195,7 @@ public class ReferenceResolver { final ExternalLinkHandler handler = Context.linkHandler(c); Source source = null; if (externalSourceResolver != null) { - Object base = handler.getURI(); + Object base = handler.getBase(); if (base != null) { source = externalSourceResolver.resolve(href.toString(), base.toString()); } diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java index b4723f081c..85e11932f2 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/Context.java @@ -23,6 +23,7 @@ import java.util.IdentityHashMap; import java.util.Locale; import java.util.TimeZone; import java.util.Collections; +import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.LogRecord; @@ -380,6 +381,14 @@ public final class Context extends MarshalContext { return null; } + /** + * Returns the URI of the document being (un)marshalled, if this URI is known. + */ + @Override + public final Optional<URI> getDocumentURI() { + return (linkHandler != null) ? Optional.ofNullable(linkHandler.getURI()) : Optional.empty(); + } + diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/util/ExternalLinkHandler.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/util/ExternalLinkHandler.java index 06d85dd71e..6bd949f064 100644 --- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/util/ExternalLinkHandler.java +++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/util/ExternalLinkHandler.java @@ -119,10 +119,43 @@ public class ExternalLinkHandler { * {@return the base URI of the link handler}. The returned object may be an instance of * {@link String}, {@link File}, {@link URL} or {@link URI}, or it may be {@code null}. */ - public final Object getURI() { + public final Object getBase() { return base; } + /** + * {@return the base URI of the link handler}. This is the same value as {@link #getBase()}, + * but converted to an {@link URI} object when first invoked. + */ + public final URI getURI() { + final Object b = base; + if (b == null) { + return null; + } + final URI baseURI; + if (b instanceof URI) { // `instanceof` check of final classes are efficient. + baseURI = (URI) b; + } else { + base = null; // Clear first in case of failure, for avoiding to try again later. + try { + if (b instanceof String) { + baseURI = new URI((String) b); + } else if (b instanceof URL) { + baseURI = ((URL) b).toURI(); + } else if (b instanceof File) { + baseURI = ((File) b).toURI(); + } else { + return null; + } + } catch (URISyntaxException e) { + warningOccured(b, e); + return null; + } + base = baseURI; + } + return baseURI; + } + /** * Resolves the given path as an URI. This method behaves as specified in {@link URI#resolve(URI)}, * with the URI given at construction-time as the base URI. If the given path is relative and there @@ -134,29 +167,8 @@ public class ExternalLinkHandler { * @see URI#resolve(URI) */ final URI resolve(final URI path) { - final Object b = base; -valid: if (b != null) { - final URI baseURI; - if (b instanceof URI) { // `instanceof` check of final classes are efficient. - baseURI = (URI) b; - } else { - base = null; // Clear first in case of failure, for avoiding to try again later. - try { - if (b instanceof String) { - baseURI = new URI((String) b); - } else if (b instanceof URL) { - baseURI = ((URL) b).toURI(); - } else if (b instanceof File) { - baseURI = ((File) b).toURI(); - } else { - break valid; - } - } catch (URISyntaxException e) { - warningOccured(b, e); - break valid; - } - base = baseURI; - } + final URI baseURI = getURI(); + if (baseURI != null) { return baseURI.resolve(path); } return path.isAbsolute() ? path : null;