[java-metadata-aggregator] 02/04: MDA-231 - Refactor class hierarchy around DOM node validators

Ian Young ian at iay.org.uk
Mon Oct 24 10:07:32 UTC 2022


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=bd43b4d1d017753bbac8134d7235e6a78cf430c8

commit bd43b4d1d017753bbac8134d7235e6a78cf430c8
Author: Ian Young <ian at iay.org.uk>
AuthorDate: Mon Oct 24 10:50:34 2022 +0100

    MDA-231 - Refactor class hierarchy around DOM node validators
    
    https://shibboleth.atlassian.net/browse/MDA-231
---
 .../dom/AbstractAttributeValidationStage.java      |  7 +-
 .../metadata/dom/AbstractDOMTraversalStage.java    | 14 +++-
 .../metadata/dom/AbstractDOMValidationStage.java   |  5 +-
 .../dom/AbstractElementValidationStage.java        | 78 +---------------------
 ...=> AbstractElementVisitingValidationStage.java} | 54 +++++++--------
 .../dom/AbstractDOMValidationStageTest.java        |  6 ++
 6 files changed, 51 insertions(+), 113 deletions(-)

diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractAttributeValidationStage.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractAttributeValidationStage.java
index a24bf05..d330e75 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractAttributeValidationStage.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractAttributeValidationStage.java
@@ -42,7 +42,7 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
  *
  * @since 0.10.0
  */
-public abstract class AbstractAttributeValidationStage<T> extends AbstractElementValidationStage<T> {
+public abstract class AbstractAttributeValidationStage<T> extends AbstractElementVisitingValidationStage<T, Attr> {
 
     /**
      * Collection of attribute names for those attributes we will be visiting.
@@ -122,11 +122,6 @@ public abstract class AbstractAttributeValidationStage<T> extends AbstractElemen
         attributeNames = Set.of(name);
     }
     
-    @Override
-    protected @Nonnull T convert(final @Nonnull Element element) {
-        throw new UnsupportedOperationException();
-    }
-
     @Override
     protected void visit(@Nonnull final Element element, @Nonnull final DOMTraversalContext context)
             throws StageProcessingException {
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 7c44beb..b3b622d 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
@@ -35,15 +35,27 @@ import net.shibboleth.utilities.java.support.xml.ElementSupport;
 /**
  * An abstract DOM traversal class using the template method pattern.
  *
+ * <p>
  * A context object, extending {@link DOMTraversalContext}, is created by the
  * implementing subclass and passed to the {@link #visit} method when
  * each applicable {@link Element} is visited. In very simple cases, the
  * {@link SimpleDOMTraversalContext} may suffice, but more complicated
  * behaviour can be built up by extending or re-implementing that class.
- *
+ * </p>
+ * 
+ * <p>
+ * Which {@link Element} nodes are visited during the traversal is controlled
+ * by n {@link #applicable} method implemented by subclasses. Traversal within
+ * elements to DOM attributes is not supported directly.
+ * </p>
+ * 
+ * <p>
  * At the end of the traversal, the context's {@link DOMTraversalContext#end()}
  * method is called to perform any post-processing required.
+ * </p>
  *
+ * <p>
+ * This {@link Stage} 
  * @param <C> the context to carry through the traversal
  *
  * @since 0.9.0
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMValidationStage.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMValidationStage.java
index 0ceda53..df9d623 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMValidationStage.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractDOMValidationStage.java
@@ -30,9 +30,10 @@ import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 /**
- * An abstract stage to apply a collection of validators to each object from each item.
+ * An abstract stage extending {@link AbstractDOMTraversalStage} to manage a collection of
+ * {@link net.shibboleth.metadata.validate.Validator}s to individual values.
  *
- * @param <V> type of the object to be validated
+ * @param <V> type of the values to be validated
  * @param <C> the context to carry through the traversal
  *
  * @since 0.9.0
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java
index 1a731c4..6998834 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java
@@ -17,22 +17,12 @@
 
 package net.shibboleth.metadata.dom;
 
-import java.util.Collection;
-import java.util.Set;
-
 import javax.annotation.Nonnull;
-import javax.annotation.concurrent.GuardedBy;
 import javax.annotation.concurrent.ThreadSafe;
-import javax.xml.namespace.QName;
 
 import org.w3c.dom.Element;
 
-import net.shibboleth.metadata.Item;
 import net.shibboleth.metadata.pipeline.StageProcessingException;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
-import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /**
  * Abstract base class allowing a selected subset of {@link Element}s in a DOM document
@@ -43,58 +33,7 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
  * @since 0.10.0
  */
 @ThreadSafe
-public abstract class AbstractElementValidationStage<T> extends AbstractDOMValidationStage<T, DOMTraversalContext> {
-
-    /** Collection of element names for those elements we will be visiting. */
-    @Nonnull @NonnullElements @Unmodifiable @GuardedBy("this")
-    private Set<QName> elementNames = Set.of();
-
-    /**
-     * Gets the collection of element names to visit.
-     * 
-     * @return collection of element names to visit.
-     */
-    @Nonnull public final synchronized Collection<QName> getElementNames() {
-        return elementNames;
-    }
-
-    /**
-     * Sets the collection of element names to visit.
-     * 
-     * @param names collection of element names to visit.
-     */
-    public final synchronized void setElementNames(@Nonnull final Collection<QName> names) {
-        checkSetterPreconditions();
-        Constraint.isNotNull(names, "elementNames may not be null");
-        elementNames = Set.copyOf(names);
-    }
-    
-    /**
-     * Sets a single element name to be visited.
-     * 
-     * <p>Shorthand for {@link #setElementNames} with a singleton set.</p>
-     * 
-     * @param name {@link QName} for the element to be visited.
-     */
-    public final synchronized void setElementName(@Nonnull final QName name) {
-        checkSetterPreconditions();
-        Constraint.isNotNull(name, "elementName may not be null");
-        elementNames = Set.of(name);
-    }
-    
-    @Override
-    protected boolean applicable(@Nonnull final Element e, @Nonnull final DOMTraversalContext context) {
-        final QName q = new QName(e.getNamespaceURI(), e.getLocalName());
-        return getElementNames().contains(q);
-    }
-
-    /**
-     * Convert the visited {@link Element} to the type to be validated.
-     *
-     * @param element {@link Element} being validated
-     * @return converted value
-     */
-    protected abstract @Nonnull T convert(@Nonnull final Element element);
+public abstract class AbstractElementValidationStage<T> extends AbstractElementVisitingValidationStage<T, Element> {
 
     @Override
     protected void visit(@Nonnull final Element element, @Nonnull final DOMTraversalContext context)
@@ -102,19 +41,4 @@ public abstract class AbstractElementValidationStage<T> extends AbstractDOMValid
         applyValidators(convert(element), context);
     }
     
-    @Override
-    @Nonnull
-    protected DOMTraversalContext buildContext(@Nonnull final Item<Element> item) {
-        return new SimpleDOMTraversalContext(item);
-    }
-
-    @Override
-    protected synchronized void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-
-        if (elementNames.isEmpty()) {
-            throw new ComponentInitializationException("elementNames may not be empty");
-        }
-    }
-
 }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementVisitingValidationStage.java
similarity index 74%
copy from mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java
copy to mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementVisitingValidationStage.java
index 1a731c4..0550abb 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementValidationStage.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/dom/AbstractElementVisitingValidationStage.java
@@ -22,32 +22,39 @@ import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.GuardedBy;
-import javax.annotation.concurrent.ThreadSafe;
 import javax.xml.namespace.QName;
 
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 
 import net.shibboleth.metadata.Item;
-import net.shibboleth.metadata.pipeline.StageProcessingException;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /**
- * Abstract base class allowing a selected subset of {@link Element}s in a DOM document
- * to be validated as a given type.
+ * Abstract parent class for validation of DOM nodes within a DOM traversal.
+ * 
+ * <p>
+ * Note that the nodes being validated may be either elements or attributes;
+ * this class is parameterised by that type and a subclass must implement an
+ * appropriate conversion.
+ * </p>
+ * 
+ * <p>
+ * This class manages the set of {@link Element} names for the traversal.
+ * </p>
  *
- * @param <T> type to convert each {@link Element} to for validation
- *
- * @since 0.10.0
+ * @param <V> type of the values to be validated
+ * @param <N> type of node being visited during the traversal
  */
- at ThreadSafe
-public abstract class AbstractElementValidationStage<T> extends AbstractDOMValidationStage<T, DOMTraversalContext> {
+public abstract class AbstractElementVisitingValidationStage<V, N>
+    extends AbstractDOMValidationStage<V, DOMTraversalContext> {
 
     /** Collection of element names for those elements we will be visiting. */
-    @Nonnull @NonnullElements @Unmodifiable @GuardedBy("this")
-    private Set<QName> elementNames = Set.of();
+    @NonnullElements @Unmodifiable @GuardedBy("this")
+    private @Nonnull Set<QName> elementNames = Set.of();
 
     /**
      * Gets the collection of element names to visit.
@@ -81,7 +88,12 @@ public abstract class AbstractElementValidationStage<T> extends AbstractDOMValid
         Constraint.isNotNull(name, "elementName may not be null");
         elementNames = Set.of(name);
     }
-    
+
+    @Override
+    protected @Nonnull DOMTraversalContext buildContext(@Nonnull final Item<Element> item) {
+        return new SimpleDOMTraversalContext(item);
+    }
+
     @Override
     protected boolean applicable(@Nonnull final Element e, @Nonnull final DOMTraversalContext context) {
         final QName q = new QName(e.getNamespaceURI(), e.getLocalName());
@@ -89,24 +101,12 @@ public abstract class AbstractElementValidationStage<T> extends AbstractDOMValid
     }
 
     /**
-     * Convert the visited {@link Element} to the type to be validated.
+     * Convert the visited {@link Node} to the type to be validated.
      *
-     * @param element {@link Element} being validated
+     * @param node being validated
      * @return converted value
      */
-    protected abstract @Nonnull T convert(@Nonnull final Element element);
-
-    @Override
-    protected void visit(@Nonnull final Element element, @Nonnull final DOMTraversalContext context)
-            throws StageProcessingException {
-        applyValidators(convert(element), context);
-    }
-    
-    @Override
-    @Nonnull
-    protected DOMTraversalContext buildContext(@Nonnull final Item<Element> item) {
-        return new SimpleDOMTraversalContext(item);
-    }
+    protected abstract @Nonnull V convert(@Nonnull final N node);
 
     @Override
     protected synchronized void doInitialize() throws ComponentInitializationException {
diff --git a/mda-framework/src/test/java/net/shibboleth/metadata/dom/AbstractDOMValidationStageTest.java b/mda-framework/src/test/java/net/shibboleth/metadata/dom/AbstractDOMValidationStageTest.java
index 31c69bf..4c7cf43 100644
--- a/mda-framework/src/test/java/net/shibboleth/metadata/dom/AbstractDOMValidationStageTest.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/dom/AbstractDOMValidationStageTest.java
@@ -46,6 +46,7 @@ public class AbstractDOMValidationStageTest extends BaseDOMTest {
             return "checkedElement".equals(element.getLocalName());
         }
 
+        @SuppressWarnings("null")
         @Override
         protected void visit(final @Nonnull Element element, final @Nonnull DOMTraversalContext context)
                 throws StageProcessingException {
@@ -110,4 +111,9 @@ public class AbstractDOMValidationStageTest extends BaseDOMTest {
         Assert.assertEquals(errors.get(1).getStatusMessage(), "element contains two");
     }
 
+    @Test
+    public void noValidatorsByDefault() throws Exception {
+        var stage = new StringValidationStage();
+        Assert.assertEquals(stage.getValidators().size(), 0);
+    }
 }

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


More information about the commits mailing list