[java-metadata-aggregator] branch main updated: MDA-302 - More consistent context indication from validators

Ian Young ian at iay.org.uk
Fri Feb 2 11:44:38 UTC 2024


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=6a711723a67d46410e0327f154d6df3d4107abb4

The following commit(s) were added to refs/heads/main by this push:
     new 6a71172  MDA-302 - More consistent context indication from validators
6a71172 is described below

commit 6a711723a67d46410e0327f154d6df3d4107abb4
Author: Ian Young <ian at iay.org.uk>
AuthorDate: Fri Feb 2 11:44:26 2024 +0000

    MDA-302 - More consistent context indication from validators
    
    https://shibboleth.atlassian.net/browse/MDA-302
---
 .../metadata/validate/AcceptAllValidator.java      |  2 +-
 .../metadata/validate/BaseAsValidator.java         | 21 ++--------
 .../metadata/validate/BaseValidator.java           | 46 ++++++++++------------
 .../metadata/validate/RejectAllValidator.java      |  4 +-
 .../shibboleth/metadata/validate/Validator.java    | 29 +++++++++-----
 .../metadata/validate/ValidatorSequence.java       |  4 +-
 ...ectDomainNameNotUnderPublicSuffixValidator.java |  4 +-
 .../net/RejectDomainNamePublicSuffixValidator.java |  4 +-
 .../string/AcceptStringRegexValidator.java         |  2 +-
 .../string/AcceptStringValueValidator.java         |  2 +-
 .../string/RejectStringRegexValidator.java         |  4 +-
 .../string/RejectStringValueValidator.java         |  4 +-
 .../validate/url/EmptyPortURLValidator.java        |  4 +-
 .../validate/url/HTTPSProtocolURLValidator.java    |  4 +-
 .../validate/url/MissingHostURLValidator.java      |  4 +-
 .../validate/x509/AbstractX509Validator.java       |  9 ++---
 .../metadata/validate/x509/X509DSADetector.java    |  4 +-
 .../metadata/validate/x509/X509ROCAValidator.java  |  4 +-
 .../validate/x509/X509RSAExponentValidator.java    |  8 ++--
 .../validate/x509/X509RSAKeyLengthValidator.java   |  6 +--
 .../x509/X509RSAOpenSSLBlacklistValidator.java     |  4 +-
 .../dom/AbstractDOMValidationStageTest.java        |  6 +--
 .../metadata/validate/BaseAsValidatorTest.java     | 39 ++++++++++++++++--
 .../metadata/validate/BaseValidatorTest.java       | 20 ++--------
 .../string/AsDomainNameStringValidatorTest.java    |  2 +-
 .../string/AsLiteralTailStringValidatorTest.java   |  2 +-
 .../metadata/validate/testing/BoomValidator.java}  | 21 +++++-----
 .../validate/testing/CollectingValidator.java      |  2 +-
 .../validate/x509/X509ROCAValidatorTest.java       |  3 ++
 29 files changed, 139 insertions(+), 129 deletions(-)

diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/AcceptAllValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/AcceptAllValidator.java
index ebe1c49..bfbab0f 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/AcceptAllValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/AcceptAllValidator.java
@@ -32,7 +32,7 @@ import net.shibboleth.metadata.Item;
 public class AcceptAllValidator<V> extends BaseValidator implements Validator<V> {
 
     @Override
-    public @Nonnull Action validate(@Nonnull final V e, @Nonnull final Item<?> item, @Nonnull final String stageId) {
+    public @Nonnull Action validate(@Nonnull final V e, @Nonnull final Item<?> item, @Nonnull final String callerId) {
         return Action.DONE;
     }
 
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseAsValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseAsValidator.java
index 62154b7..7349366 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseAsValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseAsValidator.java
@@ -98,21 +98,6 @@ public abstract class BaseAsValidator<V, A> extends BaseValidator implements Val
         return conversionRequired;
     }
 
-    /**
-     * Apply each of the configured validators in turn to the provided object.
-     *
-     * @param value object to be validated
-     * @param item the {@link Item} context for the validation
-     *
-     * @return the result of applying the validators to the value
-     *
-     * @throws StageProcessingException if errors occur during processing
-     */
-    protected @Nonnull Action applyValidators(@Nonnull final A value, @Nonnull final Item<?> item)
-            throws StageProcessingException {
-        return validators.validate(value, item, ensureId());
-    }
-
     /**
      * Convert from the old value type to the new.
      *
@@ -123,14 +108,14 @@ public abstract class BaseAsValidator<V, A> extends BaseValidator implements Val
     protected abstract @Nonnull A convert(@Nonnull final V from) throws IllegalArgumentException;
 
     @Override
-    public @Nonnull Action validate(@Nonnull final V t, @Nonnull final Item<?> item, @Nonnull final String stageId)
+    public @Nonnull Action validate(@Nonnull final V t, @Nonnull final Item<?> item, @Nonnull final String callerId)
             throws StageProcessingException {
         try {
             final A v = convert(t);
-            return applyValidators(v, item);
+            return validators.validate(v, item, makeComponentId(callerId));
         } catch (final IllegalArgumentException e) {
             if (isConversionRequired()) {
-                addErrorMessage(t, item, stageId, e);
+                addErrorMessage(t, item, callerId, e);
                 return Action.DONE;
             } else {
                 return Action.CONTINUE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseValidator.java
index 6a624ec..4166816 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/BaseValidator.java
@@ -74,19 +74,15 @@ public abstract class BaseValidator extends AbstractIdentifiableInitializableCom
     }
 
     /**
-     * Construct a modified component identifier from the stage identifier and the
-     * validator identifier.
+     * Construct a modified component identifier by combining the identifier for the caller
+     * with the validator's own identifier.
      * 
-     * @param stageId identifier for the calling stage
+     * @param callerId a {@link String} identifying the caller
      * 
      * @return composite component identifier
      */
-    private @Nonnull String makeComponentId(@Nonnull final String stageId) {
-        final String id = getId();
-        if (id == null) {
-            return stageId;
-        }
-        return stageId + "/" + getId();
+    protected @Nonnull String makeComponentId(final @Nonnull String callerId) {
+        return callerId + "/" + ensureId();
     }
 
     /**
@@ -94,11 +90,11 @@ public abstract class BaseValidator extends AbstractIdentifiableInitializableCom
      * 
      * @param mess message to include in the status metadata
      * @param item {@link Item} to add the status metadata to
-     * @param stageId component identifier for the calling stage
+     * @param callerId a {@link String} identifying the caller
      */
     protected void addError(@Nonnull final String mess, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
-        item.getItemMetadata().put(new ErrorStatus(makeComponentId(stageId), mess));
+            @Nonnull final String callerId) {
+        item.getItemMetadata().put(new ErrorStatus(makeComponentId(callerId), mess));
     }
     
     /**
@@ -106,11 +102,11 @@ public abstract class BaseValidator extends AbstractIdentifiableInitializableCom
      * 
      * @param mess message to include in the status metadata
      * @param item {@link Item} to add the status metadata to
-     * @param stageId component identifier for the calling stage
+     * @param callerId a {@link String} identifying the caller
      */
     protected void addWarning(@Nonnull final String mess, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
-        item.getItemMetadata().put(new WarningStatus(makeComponentId(stageId), mess));
+            @Nonnull final String callerId) {
+        item.getItemMetadata().put(new WarningStatus(makeComponentId(callerId), mess));
     }
     
     /**
@@ -119,14 +115,14 @@ public abstract class BaseValidator extends AbstractIdentifiableInitializableCom
      * @param error <code>true</code> if an {@link ErrorStatus} should be added
      * @param mess message to include in the status metadata
      * @param item {@link Item} to add the status metadata to
-     * @param stageId component identifier for the calling stage
+     * @param callerId a {@link String} identifying the caller
      */
     protected void addStatus(final boolean error, @Nonnull final String mess, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         if (error) {
-            addError(mess, item, stageId);
+            addError(mess, item, callerId);
         } else {
-            addWarning(mess, item, stageId);
+            addWarning(mess, item, callerId);
         }
     }
 
@@ -180,13 +176,13 @@ public abstract class BaseValidator extends AbstractIdentifiableInitializableCom
      *
      * @param extra extra value to include in the status metadata
      * @param item {@link Item} to add the status metadata to
-     * @param stageId component identifier for the calling stage
+     * @param callerId a {@link String} identifying the caller
      *
      * @since 0.10.0
      */
     protected void addErrorMessage(@Nonnull final Object extra, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
-        addError(formatMessage(extra), item, stageId);
+            @Nonnull final String callerId) {
+        addError(formatMessage(extra), item, callerId);
     }
 
     /**
@@ -199,13 +195,13 @@ public abstract class BaseValidator extends AbstractIdentifiableInitializableCom
      *
      * @param extra extra value to include in the status metadata
      * @param item {@link Item} to add the status metadata to
-     * @param stageId component identifier for the calling stage
+     * @param callerId a {@link String} identifying the caller
      * @param cause reason for the validation failure, as a {@link Throwable}
      *
      * @since 0.10.0
      */
     protected void addErrorMessage(@Nonnull final Object extra, @Nonnull final Item<?> item,
-            @Nonnull final String stageId, @Nonnull final Throwable cause) {
-        addError(formatMessage(extra, cause), item, stageId);
+            @Nonnull final String callerId, @Nonnull final Throwable cause) {
+        addError(formatMessage(extra, cause), item, callerId);
     }
 }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/RejectAllValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/RejectAllValidator.java
index acc7d03..be7aead 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/RejectAllValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/RejectAllValidator.java
@@ -35,8 +35,8 @@ import net.shibboleth.metadata.Item;
 public class RejectAllValidator<V> extends BaseValidator implements Validator<V> {
 
     @Override
-    public @Nonnull Action validate(@Nonnull final V e, @Nonnull final Item<?> item, @Nonnull final String stageId) {
-        addErrorMessage(e, item, stageId);
+    public @Nonnull Action validate(@Nonnull final V e, @Nonnull final Item<?> item, @Nonnull final String callerId) {
+        addErrorMessage(e, item, callerId);
         return Action.DONE;
     }
 
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/Validator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/Validator.java
index 2cafbab..f4dddf4 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/Validator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/Validator.java
@@ -24,13 +24,13 @@ import net.shibboleth.shared.component.IdentifiableComponent;
 import net.shibboleth.shared.component.InitializableComponent;
 
 /**
- * Interface for a validator to be applied to an object in the context of a given {@link Item}.
+ * Interface for a validator to be applied to an value in the context of a given {@link Item}.
  *
  * <p>
  * {@code Validator}s <strong>must</strong> be thread-safe.
  * </p>
  *
- * @param <V> type of the object to be validated
+ * @param <V> type of the value to be validated
  *
  * @since 0.9.0
  */
@@ -56,18 +56,29 @@ public interface Validator<V> extends DestructableComponent, IdentifiableCompone
     }
 
     /**
-     * Apply the validator to the object in the given {@link Item} context.
-     * 
+     * Apply the validator to a value in the context of the given {@link Item}.
+     *
+     * <p>
      * The validator influences future processing by adding item metadata to the {@link Item}.
-     * 
-     * @param e the object to be validated
+     * </p>
+     *
+     * <p>
+     * A common case is that the validator will add a {@link net.shibboleth.metadata.StatusMetadata}
+     * to the {@link Item}, for example a {@link net.shibboleth.metadata.ErrorStatus}.
+     * In this case, the convention is that the {@code componentId} of the
+     * {@link net.shibboleth.metadata.ErrorStatus} would be created by combining the
+     * {@code callerId} with a <code>/</code> and the validator's own identifier.
+     * For example, a validator {@code val} called by a stage {@code stage} would
+     * normally use a {@code componentId} of <code>stage/val</code>.
+     * </p>
+     *
+     * @param value the value to be validated
      * @param item the {@link Item} context for the validation
-     * @param stageId the identifier for the stage that is requesting the validation, for
-     *      inclusion in status metadata
+     * @param callerId a {@link String} identifying the caller
      * @return an indication of whether to process additional validators
      * @throws StageProcessingException if an error occurs during validation
      */
-    @Nonnull Action validate(@Nonnull V e, @Nonnull Item<?> item, @Nonnull String stageId)
+    @Nonnull Action validate(@Nonnull V value, @Nonnull Item<?> item, @Nonnull String callerId)
         throws StageProcessingException;
     
 }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/ValidatorSequence.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/ValidatorSequence.java
index 409ddda..a5f681e 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/ValidatorSequence.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/ValidatorSequence.java
@@ -68,10 +68,10 @@ public class ValidatorSequence<V> extends BaseValidator implements Validator<V>
     }
 
     @Override
-    public @Nonnull Action validate(@Nonnull final V value, @Nonnull final Item<?> item, @Nonnull final String stageId)
+    public @Nonnull Action validate(@Nonnull final V value, @Nonnull final Item<?> item, @Nonnull final String callerId)
             throws StageProcessingException {
         for (final Validator<V> validator: getValidators()) {
-            final Action action = validator.validate(value, item, stageId);
+            final Action action = validator.validate(value, item, callerId);
             if (action == Action.DONE) {
                 return action;
             }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNameNotUnderPublicSuffixValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNameNotUnderPublicSuffixValidator.java
index ddca7cd..4885fb1 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNameNotUnderPublicSuffixValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNameNotUnderPublicSuffixValidator.java
@@ -39,11 +39,11 @@ public class RejectDomainNameNotUnderPublicSuffixValidator extends BaseValidator
 
     @Override
     public @Nonnull Action validate(@Nonnull final InternetDomainName domain, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         if (domain.isUnderPublicSuffix()) {
             return Action.CONTINUE;
         } else {
-            addErrorMessage(domain, item, stageId);
+            addErrorMessage(domain, item, callerId);
             return Action.DONE;
         }
     }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNamePublicSuffixValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNamePublicSuffixValidator.java
index 16f2436..84748ef 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNamePublicSuffixValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/net/RejectDomainNamePublicSuffixValidator.java
@@ -34,9 +34,9 @@ public class RejectDomainNamePublicSuffixValidator extends BaseValidator
 
     @Override
     public @Nonnull Action validate(@Nonnull final InternetDomainName domain, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         if (domain.isPublicSuffix()) {
-            addErrorMessage(domain, item, stageId);
+            addErrorMessage(domain, item, callerId);
             return Action.DONE;
         } else {
             return Action.CONTINUE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringRegexValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringRegexValidator.java
index fa50803..56cac3b 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringRegexValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringRegexValidator.java
@@ -35,7 +35,7 @@ public class AcceptStringRegexValidator extends BaseStringRegexValidator impleme
 
     @Override
     public @Nonnull Action validate(@Nonnull final String e, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         final Matcher matcher = getPattern().matcher(e);
         if (matcher.matches()) {
             return Action.DONE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringValueValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringValueValidator.java
index 55e1fed..7bd2fab 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringValueValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/AcceptStringValueValidator.java
@@ -33,7 +33,7 @@ public class AcceptStringValueValidator extends BaseStringValueValidator impleme
 
     @Override
     public @Nonnull Action validate(@Nonnull final String e, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         if (e.equals(getValue())) {
             return Action.DONE;
         }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringRegexValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringRegexValidator.java
index e82dd5a..6af2965 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringRegexValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringRegexValidator.java
@@ -35,10 +35,10 @@ public class RejectStringRegexValidator extends BaseStringRegexValidator impleme
 
     @Override
     public @Nonnull Action validate(@Nonnull final String e, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         final Matcher matcher = getPattern().matcher(e);
         if (matcher.matches()) {
-            addErrorMessage(e, item, stageId);
+            addErrorMessage(e, item, callerId);
             return Action.DONE;
         }
         return Action.CONTINUE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringValueValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringValueValidator.java
index e163de1..1847879 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringValueValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/string/RejectStringValueValidator.java
@@ -33,9 +33,9 @@ public class RejectStringValueValidator extends BaseStringValueValidator impleme
 
     @Override
     public @Nonnull Action validate(@Nonnull final String e, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         if (e.equals(getValue())) {
-            addErrorMessage(e, item, stageId);
+            addErrorMessage(e, item, callerId);
             return Action.DONE;
         }
         return Action.CONTINUE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/EmptyPortURLValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/EmptyPortURLValidator.java
index 321596c..88a1f0c 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/EmptyPortURLValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/EmptyPortURLValidator.java
@@ -30,11 +30,11 @@ public class EmptyPortURLValidator extends BaseValidator implements Validator<UR
 
     @Override
     public @Nonnull Action validate(final @Nonnull URL url, final @Nonnull Item<?> item,
-            final @Nonnull String stageId) throws StageProcessingException {
+            final @Nonnull String callerId) throws StageProcessingException {
         final String authority = url.getAuthority();
         if (authority != null && !authority.isEmpty()) {
             if (authority.charAt(authority.length() - 1) == ':') {
-                addError("libxml2: port present but empty", item, stageId);
+                addError("libxml2: port present but empty", item, callerId);
                 return Action.DONE;
             }
         }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/HTTPSProtocolURLValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/HTTPSProtocolURLValidator.java
index 8394535..6e83204 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/HTTPSProtocolURLValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/HTTPSProtocolURLValidator.java
@@ -31,10 +31,10 @@ public class HTTPSProtocolURLValidator extends BaseValidator implements Validato
 
     @Override
     public @Nonnull Action validate(final @Nonnull URL url, final @Nonnull Item<?> item,
-            final @Nonnull String stageId) throws StageProcessingException {
+            final @Nonnull String callerId) throws StageProcessingException {
         final var protocol = url.getProtocol();
         if (!"https".equals(protocol)) {
-            addError("protocol '" + protocol + "' must be https", item, stageId);
+            addError("protocol '" + protocol + "' must be https", item, callerId);
             return Action.DONE;
         }
         return Action.CONTINUE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/MissingHostURLValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/MissingHostURLValidator.java
index b540795..d082d6c 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/MissingHostURLValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/url/MissingHostURLValidator.java
@@ -30,9 +30,9 @@ public class MissingHostURLValidator extends BaseValidator implements Validator<
 
     @Override
     public @Nonnull Action validate(final @Nonnull URL url, final @Nonnull Item<?> item,
-            final @Nonnull String stageId) throws StageProcessingException {
+            final @Nonnull String callerId) throws StageProcessingException {
         if ("".equals(url.getHost())) {
-            addError("host name not present", item, stageId);
+            addError("host name not present", item, callerId);
             return Action.DONE;
         }
         return Action.CONTINUE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/AbstractX509Validator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/AbstractX509Validator.java
index d22a095..81a6e32 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/AbstractX509Validator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/AbstractX509Validator.java
@@ -42,17 +42,16 @@ public abstract class AbstractX509Validator extends BaseValidator implements Val
      * 
      * @param cert the certificate to be validated
      * @param item the {@link Item} context for the validation
-     * @param stageId the identifier for the stage that is requesting the validation, for
-     *      inclusion in status metadata
+     * @param callerId a {@link String} identifying the caller
      * @throws StageProcessingException if an error occurs during validation
      */
     protected abstract void doValidate(@Nonnull final X509Certificate cert, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) throws StageProcessingException;
+            @Nonnull final String callerId) throws StageProcessingException;
 
     @Override
     public @Nonnull Action validate(@Nonnull final X509Certificate cert, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) throws StageProcessingException {
-        doValidate(cert, item, stageId);
+            @Nonnull final String callerId) throws StageProcessingException {
+        doValidate(cert, item, callerId);
         return Action.CONTINUE;
     }
 
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509DSADetector.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509DSADetector.java
index bdcdd1b..b0a4139 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509DSADetector.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509DSADetector.java
@@ -102,10 +102,10 @@ public class X509DSADetector extends BaseValidator implements Validator<X509Cert
 
     @Override
     public @Nonnull Action validate(@Nonnull final X509Certificate cert, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         final PublicKey key = cert.getPublicKey();
         if ("DSA".equals(key.getAlgorithm())) {
-            addStatus(isError(), "certificate contains a DSA key", item, stageId);
+            addStatus(isError(), "certificate contains a DSA key", item, callerId);
             return getAction();
         }
         return Action.CONTINUE;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509ROCAValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509ROCAValidator.java
index c601b6c..d0f5485 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509ROCAValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509ROCAValidator.java
@@ -119,14 +119,14 @@ public class X509ROCAValidator extends AbstractX509Validator {
 
     @Override
     public void doValidate(@Nonnull final X509Certificate cert, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         final PublicKey key = cert.getPublicKey();
         if ("RSA".equals(key.getAlgorithm())) {
             final RSAPublicKey rsaKey = (RSAPublicKey) key;
             final var modulus = rsaKey.getModulus();
             assert modulus != null;
             if (BrokenKey.isAffected(modulus)) {
-                addError("RSA public key is vulnerable to ROCA", item, stageId);
+                addError("RSA public key is vulnerable to ROCA", item, callerId);
             }
         }
     }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAExponentValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAExponentValidator.java
index ea31e3c..e9a3ed3 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAExponentValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAExponentValidator.java
@@ -119,19 +119,19 @@ public class X509RSAExponentValidator extends AbstractX509Validator {
     
     @Override
     public void doValidate(@Nonnull final X509Certificate cert, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         final PublicKey key = cert.getPublicKey();
         if ("RSA".equals(key.getAlgorithm())) {
             final RSAPublicKey rsaKey = (RSAPublicKey) key;
             final BigInteger exponent = rsaKey.getPublicExponent();
             if (!exponent.testBit(0)) {
-                addError("RSA public exponent of " + exponent + " must be odd", item, stageId);
+                addError("RSA public exponent of " + exponent + " must be odd", item, callerId);
             } else if (exponent.compareTo(getErrorBoundary()) < 0) {
                 addError("RSA public exponent of " + exponent + " is less than required " + getErrorBoundary(),
-                        item, stageId);
+                        item, callerId);
             } else if (exponent.compareTo(getWarningBoundary()) < 0) {
                 addWarning("RSA public exponent of " + exponent + " is less than recommended " + getWarningBoundary(),
-                        item, stageId);
+                        item, callerId);
             }
         }
     }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAKeyLengthValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAKeyLengthValidator.java
index 1f46110..dfa22d1 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAKeyLengthValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAKeyLengthValidator.java
@@ -83,17 +83,17 @@ public class X509RSAKeyLengthValidator extends AbstractX509Validator {
     
     @Override
     public void doValidate(@Nonnull final X509Certificate cert, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) {
+            @Nonnull final String callerId) {
         final PublicKey key = cert.getPublicKey();
         if ("RSA".equals(key.getAlgorithm())) {
             final RSAPublicKey rsaKey = (RSAPublicKey) key;
             final int keyLen = rsaKey.getModulus().bitLength();
             if (keyLen < getErrorBoundary()) {
                 addError("RSA key length of " + keyLen + " bits is less than required " + getErrorBoundary(),
-                        item, stageId);
+                        item, callerId);
             } else if (keyLen < getWarningBoundary()) {
                 addWarning("RSA key length of " + keyLen + " bits is less than recommended " + getWarningBoundary(),
-                        item, stageId);
+                        item, callerId);
             }
         }
     }
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAOpenSSLBlacklistValidator.java b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAOpenSSLBlacklistValidator.java
index 39b2867..d1f5e22 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAOpenSSLBlacklistValidator.java
+++ b/mda-framework/src/main/java/net/shibboleth/metadata/validate/x509/X509RSAOpenSSLBlacklistValidator.java
@@ -158,7 +158,7 @@ public class X509RSAOpenSSLBlacklistValidator extends AbstractX509Validator {
     
     @Override
     public void doValidate(@Nonnull final X509Certificate cert, @Nonnull final Item<?> item,
-            @Nonnull final String stageId) throws StageProcessingException {
+            @Nonnull final String callerId) throws StageProcessingException {
         checkComponentActive();
         final PublicKey key = cert.getPublicKey();
 
@@ -178,7 +178,7 @@ public class X509RSAOpenSSLBlacklistValidator extends AbstractX509Validator {
                 final String value = openSSLDigest(modulus);
                 if (values.contains(value)) {
                     addError("RSA modulus included in key blacklist (" + value + ")",
-                            item, stageId);
+                            item, callerId);
                 }
             }
         }
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 77741c7..9aaa2e6 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
@@ -61,9 +61,9 @@ public class AbstractDOMValidationStageTest extends BaseDOMTest {
     private static class FirstStringValidator extends BaseValidator implements Validator<String> {
 
         @Override
-        public @Nonnull Action validate(final @Nonnull String e, final @Nonnull Item<?> item, final @Nonnull String stageId)
+        public @Nonnull Action validate(final @Nonnull String e, final @Nonnull Item<?> item, final @Nonnull String callerId)
                 throws StageProcessingException {
-            addError("element contains " + e, item, stageId);
+            addError("element contains " + e, item, callerId);
             return Action.DONE; // once per value checked
         }
         
@@ -73,7 +73,7 @@ public class AbstractDOMValidationStageTest extends BaseDOMTest {
 
         @Override
         public @Nonnull Action validate(final @Nonnull String e, final @Nonnull Item<?> item,
-                final @Nonnull String stageId)
+                final @Nonnull String callerId)
                 throws StageProcessingException {
             Assert.fail("should not execute this");
             return Action.CONTINUE;
diff --git a/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseAsValidatorTest.java b/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseAsValidatorTest.java
index bea4466..98e0be0 100644
--- a/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseAsValidatorTest.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseAsValidatorTest.java
@@ -1,5 +1,8 @@
 package net.shibboleth.metadata.validate;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.annotation.Nonnull;
 
 import org.testng.Assert;
@@ -8,6 +11,7 @@ import org.testng.annotations.Test;
 import net.shibboleth.metadata.ErrorStatus;
 import net.shibboleth.metadata.testing.MockItem;
 import net.shibboleth.metadata.validate.Validator.Action;
+import net.shibboleth.metadata.validate.testing.BoomValidator;
 
 public class BaseAsValidatorTest {
 
@@ -15,7 +19,7 @@ public class BaseAsValidatorTest {
     /**
      * Test an "as" validator which always fails to convert.
      */
-    private class BoomValidator extends BaseAsValidator<String, String> {
+    private class BoomAsValidator extends BaseAsValidator<String, String> {
 
         @Override
         protected @Nonnull String convert(@Nonnull String from) throws IllegalArgumentException {
@@ -27,11 +31,20 @@ public class BaseAsValidatorTest {
         }
 
     }
+    
+    private class PassThroughAsValidator<T> extends BaseAsValidator<T, T> {
+
+        @Override
+        protected @Nonnull T convert(@Nonnull T from) throws IllegalArgumentException {
+            return from;
+        }
+        
+    }
 
     @Test
     public void convertTestNoDetail() throws Exception {
 
-        final var validator = new BoomValidator();
+        final var validator = new BoomAsValidator();
         validator.setId("test");
         validator.initialize();
 
@@ -50,7 +63,7 @@ public class BaseAsValidatorTest {
     @Test
     public void convertTestWithDetail() throws Exception {
 
-        final var validator = new BoomValidator();
+        final var validator = new BoomAsValidator();
         validator.setId("test");
         validator.initialize();
 
@@ -65,4 +78,24 @@ public class BaseAsValidatorTest {
         Assert.assertEquals(err.getStatusMessage(), "value rejected: 'not nothing' (something)");
         Assert.assertEquals(err.getComponentId(), "stage/test");
     }
+
+    @Test
+    public void nestedComponentId() throws Exception {
+        final var boomer = new BoomValidator<String>();
+        boomer.setId("boomer");
+        boomer.initialize();
+        final var passer = new PassThroughAsValidator<String>();
+        passer.setId("passer");
+        final @Nonnull List<Validator<String>> inners = new ArrayList<>();
+        inners.add(boomer);
+        passer.setValidators(inners);
+        passer.initialize();
+        final var item = new MockItem("data");
+        final var res = passer.validate("value", item, "outer");
+        Assert.assertEquals(res, Action.DONE);
+        final var errors = item.getItemMetadata().get(ErrorStatus.class);
+        Assert.assertEquals(errors.size(), 1);
+        Assert.assertEquals(errors.get(0).getComponentId(), "outer/passer/boomer");
+        Assert.assertEquals(errors.get(0).getStatusMessage(), "value rejected: 'value'");
+    }
 }
diff --git a/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseValidatorTest.java b/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseValidatorTest.java
index ec9fb95..a6242b3 100644
--- a/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseValidatorTest.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/validate/BaseValidatorTest.java
@@ -3,8 +3,6 @@ package net.shibboleth.metadata.validate;
 
 import java.util.List;
 
-import javax.annotation.Nonnull;
-
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -12,25 +10,13 @@ import net.shibboleth.metadata.ErrorStatus;
 import net.shibboleth.metadata.Item;
 import net.shibboleth.metadata.testing.MockItem;
 import net.shibboleth.metadata.validate.Validator.Action;
+import net.shibboleth.metadata.validate.testing.BoomValidator;
 
 public class BaseValidatorTest {
 
-    /**
-     * Test String validator which always rejects.
-     */
-    private class BoomValidator extends BaseValidator implements Validator<String> {
-
-        public @Nonnull Action validate(final @Nonnull String e, final @Nonnull Item<?> item,
-                final @Nonnull String stageId) {
-            addErrorMessage(e, item, stageId);
-            return Action.DONE;
-        }
-
-    }
-
     @Test
     public void getMessage() throws Exception {
-        final BoomValidator b = new BoomValidator();
+        final var b = new BoomValidator<String>();
         b.setId("test");
         b.initialize();
         Assert.assertEquals(b.getMessage(), "value rejected: '%s'");
@@ -43,7 +29,7 @@ public class BaseValidatorTest {
 
     @Test
     public void setMessage() throws Exception {
-        final BoomValidator b = new BoomValidator();
+        final var b = new BoomValidator<String>();
         b.setId("test");
         b.setMessage("%s is bad");
         b.initialize();
diff --git a/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsDomainNameStringValidatorTest.java b/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsDomainNameStringValidatorTest.java
index 02102fb..6b9dc97 100644
--- a/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsDomainNameStringValidatorTest.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsDomainNameStringValidatorTest.java
@@ -26,7 +26,7 @@ public class AsDomainNameStringValidatorTest {
         private final @Nonnull Action action;
 
         @Override
-        public @Nonnull Action validate(@Nonnull InternetDomainName e, @Nonnull Item<?> item, @Nonnull String stageId)
+        public @Nonnull Action validate(@Nonnull InternetDomainName e, @Nonnull Item<?> item, @Nonnull String callerId)
                 throws StageProcessingException {
             count++;
             return action;
diff --git a/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsLiteralTailStringValidatorTest.java b/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsLiteralTailStringValidatorTest.java
index 184e661..c9e2f13 100644
--- a/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsLiteralTailStringValidatorTest.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/validate/string/AsLiteralTailStringValidatorTest.java
@@ -26,7 +26,7 @@ public class AsLiteralTailStringValidatorTest {
         private final @Nonnull Action action;
 
         @Override
-        public @Nonnull Action validate(@Nonnull String e, @Nonnull Item<?> item, @Nonnull String stageId) throws StageProcessingException {
+        public @Nonnull Action validate(@Nonnull String e, @Nonnull Item<?> item, @Nonnull String callerId) throws StageProcessingException {
             count++;
             value = e;
             return action;
diff --git a/mda-framework/src/main/java/net/shibboleth/metadata/validate/AcceptAllValidator.java b/mda-framework/src/test/java/net/shibboleth/metadata/validate/testing/BoomValidator.java
similarity index 55%
copy from mda-framework/src/main/java/net/shibboleth/metadata/validate/AcceptAllValidator.java
copy to mda-framework/src/test/java/net/shibboleth/metadata/validate/testing/BoomValidator.java
index ebe1c49..aee9288 100644
--- a/mda-framework/src/main/java/net/shibboleth/metadata/validate/AcceptAllValidator.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/validate/testing/BoomValidator.java
@@ -12,27 +12,24 @@
  * limitations under the License.
  */
 
-package net.shibboleth.metadata.validate;
+package net.shibboleth.metadata.validate.testing;
 
 import javax.annotation.Nonnull;
-import javax.annotation.concurrent.Immutable;
 
 import net.shibboleth.metadata.Item;
+import net.shibboleth.metadata.validate.BaseValidator;
+import net.shibboleth.metadata.validate.Validator;
 
 /**
- * A {@link Validator} which accepts any value, returning
- * {@link net.shibboleth.metadata.validate.Validator.Action#DONE}
- * to terminate any validator sequence.
+ * Test validator which always rejects.
  *
- * @param <V> type of the object to be validated
- *
- * @since 0.10.0
+ * @param <T> type of object to validate
  */
- at Immutable
-public class AcceptAllValidator<V> extends BaseValidator implements Validator<V> {
+public class BoomValidator<T> extends BaseValidator implements Validator<T> {
 
-    @Override
-    public @Nonnull Action validate(@Nonnull final V e, @Nonnull final Item<?> item, @Nonnull final String stageId) {
+    public @Nonnull Action validate(final @Nonnull T e, final @Nonnull Item<?> item,
+            final @Nonnull String callerId) {
+        addErrorMessage(e, item, callerId);
         return Action.DONE;
     }
 
diff --git a/mda-framework/src/test/java/net/shibboleth/metadata/validate/testing/CollectingValidator.java b/mda-framework/src/test/java/net/shibboleth/metadata/validate/testing/CollectingValidator.java
index 0ca9e21..7de5cfe 100644
--- a/mda-framework/src/test/java/net/shibboleth/metadata/validate/testing/CollectingValidator.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/validate/testing/CollectingValidator.java
@@ -65,7 +65,7 @@ public class CollectingValidator<T> extends BaseValidator implements Validator<T
     }
 
     @Override
-    public @Nonnull Action validate(@Nonnull T e, @Nonnull Item<?> item, @Nonnull String stageId)
+    public @Nonnull Action validate(@Nonnull T e, @Nonnull Item<?> item, @Nonnull String callerId)
             throws StageProcessingException {
         values.add(e);
         return Action.CONTINUE;
diff --git a/mda-framework/src/test/java/net/shibboleth/metadata/validate/x509/X509ROCAValidatorTest.java b/mda-framework/src/test/java/net/shibboleth/metadata/validate/x509/X509ROCAValidatorTest.java
index 6f02ef1..e65d59a 100644
--- a/mda-framework/src/test/java/net/shibboleth/metadata/validate/x509/X509ROCAValidatorTest.java
+++ b/mda-framework/src/test/java/net/shibboleth/metadata/validate/x509/X509ROCAValidatorTest.java
@@ -14,12 +14,15 @@ public class X509ROCAValidatorTest extends BaseX509ValidatorTest {
     @Test
     public void test() throws Exception {
         final X509ROCAValidator val = new X509ROCAValidator();
+        val.setId("test");
+        val.initialize();
         testCert("cert01.pem", val, 0, 0);
         testCert("cert02.pem", val, 0, 0);
         testCert("cert03.pem", val, 0, 0);
         testCert("cert04.pem", val, 1, 0);
         testCert("cert05.pem", val, 1, 0);
         testCert("cert06.pem", val, 0, 0);
+        val.destroy();
     }
 
     @Test

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


More information about the commits mailing list