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;

Reply via email to