[java-metadata-aggregator] branch main updated: Refactor entity name prefixing; improve SAMLStringElementCheckingStage

Ian Young ian at iay.org.uk
Wed Apr 5 15:12:28 UTC 2023


This is an automated email from the git hooks/post-receive script.

iay pushed a commit to branch main
in repository java-metadata-aggregator.

View the commit online:
http://git.shibboleth.net/view/?p=java-metadata-aggregator.git;a=commit;h=12b0b4ae7b23c2ecc463b52bc3510a98ed6fec8a

The following commit(s) were added to refs/heads/main by this push:
     new 12b0b4a  Refactor entity name prefixing; improve SAMLStringElementCheckingStage
12b0b4a is described below

commit 12b0b4ae7b23c2ecc463b52bc3510a98ed6fec8a
Author: Ian Young <ian at iay.org.uk>
AuthorDate: Wed Apr 5 16:11:41 2023 +0100

    Refactor entity name prefixing; improve SAMLStringElementCheckingStage
---
 .../metadata/dom/AbstractDOMTraversalStage.java    |  2 +-
 .../dom/saml/AbstractSAMLTraversalStage.java       | 40 ++--------------------
 .../dom/saml/SAMLStringElementCheckingStage.java   | 30 +++++-----------
 .../shibboleth/metadata/dom/saml/SAMLSupport.java  | 39 +++++++++++++++++++++
 4 files changed, 51 insertions(+), 60 deletions(-)

diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMTraversalStage.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMTraversalStage.java
index 9196d42..cdc3761 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMTraversalStage.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMTraversalStage.java
@@ -129,7 +129,7 @@ public abstract class AbstractDOMTraversalStage<C extends DOMTraversalContext>
      * @param element {@link Element} forming the context for the prefix
      * @return a prefix for the error message
      */
-    protected String errorPrefix(@Nonnull final Element element) {
+    protected @Nonnull String errorPrefix(@Nonnull final Element element) {
         return "";
     }
 
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/AbstractSAMLTraversalStage.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/AbstractSAMLTraversalStage.java
index 498cff2..6bd7893 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/AbstractSAMLTraversalStage.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/AbstractSAMLTraversalStage.java
@@ -18,12 +18,9 @@
 package net.shibboleth.metadata.dom.saml;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
-import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
-import org.w3c.dom.Node;
 
 import net.shibboleth.metadata.dom.AbstractDOMTraversalStage;
 import net.shibboleth.metadata.dom.DOMTraversalContext;
@@ -49,42 +46,9 @@ import net.shibboleth.metadata.dom.SimpleDOMTraversalContext;
 public abstract class AbstractSAMLTraversalStage <C extends DOMTraversalContext>
     extends AbstractDOMTraversalStage<C> {
 
-    /**
-     * Returns the {@link Element} representing the EntityDescriptor which is the
-     * closest-containing ancestor of the given element.
-     * 
-     * @param element {@link Element} to locate the ancestor Entity of.
-     * @return ancestor EntityDescriptor {@link Element}, or null.
-     */
-    private @Nullable Element ancestorEntity(@Nonnull final Element element) {
-        for (Node e = element; e != null && e.getNodeType() == Node.ELEMENT_NODE; e = e.getParentNode()) {
-            if (SAMLMetadataSupport.isEntityDescriptor((Element)e)) {
-                return (Element)e;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Computes a prefix to be put in front of the message in {@link #addError}.
-     *
-     * @param element {@link Element} forming the context for the prefix
-     * @return a prefix for the error message
-     */
     @Override
-    protected String errorPrefix(@Nonnull final Element element) {
-        final @Nullable Element entity = ancestorEntity(element);
-        if (entity != null) {
-            final Attr id = entity.getAttributeNode("ID");
-            if (id != null) {
-                return id.getTextContent() + ": ";
-            }
-            final Attr entityID = entity.getAttributeNode("entityID");
-            if (entityID != null) {
-                return entityID.getTextContent() + ": ";
-            }
-        }
-        return "";
+    protected @Nonnull String errorPrefix(@Nonnull final Element element) {
+        return SAMLSupport.errorPrefix(element);
     }
 
 }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLStringElementCheckingStage.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLStringElementCheckingStage.java
index bbad88a..522eca1 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLStringElementCheckingStage.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLStringElementCheckingStage.java
@@ -23,13 +23,13 @@ import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
 import net.shibboleth.metadata.dom.AbstractElementVisitingStage;
 import net.shibboleth.metadata.dom.DOMTraversalContext;
 import net.shibboleth.shared.xml.QNameSupport;
 
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
 /**
  * A Stage which checks the text content of the named elements to verify that
  * they meet the constraints of SAML string values.
@@ -42,22 +42,6 @@ public class SAMLStringElementCheckingStage extends AbstractElementVisitingStage
     /** Regular expression matching a string which contains no non-whitespace characters. */
     private static final Pattern ALL_WHITE_SPACE_PATTERN = Pattern.compile("^[ \\t\\r\\n\\x85\\u2028]*$");
 
-    /**
-     * Returns the {@link Element} representing the EntityDescriptor which is the
-     * closest-containing ancestor of the given element.
-     * 
-     * @param element {@link Element} to locate the ancestor Entity of.
-     * @return ancestor EntityDescriptor {@link Element}, or null.
-     */
-    private Element ancestorEntity(@Nonnull final Element element) {
-        for (Element e = element; e != null; e = (Element) e.getParentNode()) {
-            if (SAMLMetadataSupport.isEntityDescriptor(e)) {
-                return e;
-            }
-        }
-        return null;
-    }
-
     /**
      * Check that the string value is appropriate.
      * 
@@ -73,16 +57,20 @@ public class SAMLStringElementCheckingStage extends AbstractElementVisitingStage
         return matcher.matches();
     }
 
+    @Override
+    protected @Nonnull String errorPrefix(@Nonnull final Element element) {
+        return SAMLSupport.errorPrefix(element);
+    }
+
     @Override
     protected void visit(@Nonnull final Element e, @Nonnull final DOMTraversalContext context) {
         if (match(e)) {
             final StringBuilder b = new StringBuilder("element ");
             b.append(QNameSupport.getNodeQName(e));
             b.append(" must contain at least one non-whitespace character");
-            final Element entity = ancestorEntity(e);
             final var message = b.toString();
             assert message != null;
-            addError(context.getItem(), entity, message);
+            addError(context.getItem(), e, message);
         }
     }
 
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLSupport.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLSupport.java
index 7e3567e..697e7f4 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLSupport.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/saml/SAMLSupport.java
@@ -18,11 +18,13 @@
 package net.shibboleth.metadata.dom.saml;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 import javax.xml.namespace.QName;
 
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 
 import net.shibboleth.metadata.dom.Container;
 import net.shibboleth.metadata.dom.ElementMaker;
@@ -74,6 +76,43 @@ public final class SAMLSupport {
     private SAMLSupport() {
     }
 
+    /**
+     * Returns the {@link Element} representing the EntityDescriptor which is the
+     * closest-containing ancestor of the given element.
+     * 
+     * @param element {@link Element} to locate the ancestor Entity of.
+     * @return ancestor EntityDescriptor {@link Element}, or null.
+     */
+    private static @Nullable Element ancestorEntity(@Nonnull final Element element) {
+        for (Node e = element; e != null && e.getNodeType() == Node.ELEMENT_NODE; e = e.getParentNode()) {
+            if (SAMLMetadataSupport.isEntityDescriptor((Element)e)) {
+                return (Element)e;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Computes an entity-specific prefix to be put in front of a message.
+     *
+     * @param element {@link Element} forming the context for the prefix
+     * @return a prefix for the error message
+     */
+    public static @Nonnull String errorPrefix(@Nonnull final Element element) {
+        final @Nullable Element entity = ancestorEntity(element);
+        if (entity != null) {
+            final Attr id = entity.getAttributeNode("ID");
+            if (id != null) {
+                return id.getTextContent() + ": ";
+            }
+            final Attr entityID = entity.getAttributeNode("entityID");
+            if (entityID != null) {
+                return entityID.getTextContent() + ": ";
+            }
+        }
+        return "";
+    }
+
     /**
      * Extract an <code>Attribute</code> element's <code>NameFormat</code>, applying the
      * SAML standard's specified default if the XML attribute is not present.

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list