[java-shib-attribute] branch main updated: IDP-2083 - Treat NonnullElements as the default for collections

Scott Cantor cantor.2 at osu.edu
Wed May 3 14:38:34 UTC 2023


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

scantor pushed a commit to branch main
in repository java-shib-attribute.

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-attribute.git;a=commit;h=c143f88ad5a0902c0d033f34b7a26946a6ca5e44

The following commit(s) were added to refs/heads/main by this push:
     new c143f88ad IDP-2083 - Treat NonnullElements as the default for collections
c143f88ad is described below

commit c143f88ad5a0902c0d033f34b7a26946a6ca5e44
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed May 3 10:38:31 2023 -0400

    IDP-2083 - Treat NonnullElements as the default for collections
    
    https://shibboleth.atlassian.net/browse/IDP-2083
    
    Review attribute-api/impl, saml-attribute-api/impl, filter-api/impl.
---
 .../idp/attribute/AttributesMapContainer.java      |  9 ++-
 .../idp/attribute/ByteAttributeValue.java          | 10 +++-
 .../idp/attribute/DateTimeAttributeValue.java      |  2 +
 .../idp/attribute/EmptyAttributeValue.java         |  1 +
 .../net/shibboleth/idp/attribute/IdPAttribute.java | 12 ++--
 .../idp/attribute/IdPAttributeValue.java           |  5 +-
 .../idp/attribute/IdPRequestedAttribute.java       |  6 +-
 .../idp/attribute/ScopedStringAttributeValue.java  |  6 +-
 .../idp/attribute/XMLObjectAttributeValue.java     |  1 +
 ...tractCollectionConfigurationLookupStrategy.java | 41 +++++++-------
 ...tMetadataDrivenConfigurationLookupStrategy.java | 65 +++++++++++++---------
 .../config/BeanConfigurationLookupStrategy.java    | 34 ++++++-----
 .../config/BooleanConfigurationLookupStrategy.java | 33 ++++++-----
 .../config/DoubleConfigurationLookupStrategy.java  | 33 ++++++-----
 .../DurationConfigurationLookupStrategy.java       | 35 ++++++------
 .../config/IntegerConfigurationLookupStrategy.java | 37 ++++++------
 .../config/ListConfigurationLookupStrategy.java    | 10 ++--
 .../config/LongConfigurationLookupStrategy.java    | 41 +++++++-------
 .../config/SetConfigurationLookupStrategy.java     | 10 ++--
 .../config/StringConfigurationLookupStrategy.java  | 50 ++++++++---------
 .../idp/attribute/config/package-info.java         |  6 +-
 .../idp/attribute/context/AttributeContext.java    | 14 ++---
 .../idp/attribute/context/package-info.java        |  4 +-
 .../net/shibboleth/idp/attribute/package-info.java |  4 +-
 .../transcoding/AttributeTranscoderRegistry.java   | 12 ++--
 .../attribute/transcoding/TranscoderSupport.java   |  5 +-
 .../idp/attribute/transcoding/TranscodingRule.java | 21 ++++---
 .../idp/attribute/transcoding/package-info.java    |  4 +-
 .../idp/attribute/filter/AttributeFilter.java      |  4 +-
 .../attribute/filter/AttributeFilterPolicy.java    | 14 ++---
 .../idp/attribute/filter/AttributeRule.java        | 31 +----------
 .../idp/attribute/filter/BaseBridgingClass.java    | 32 +++++------
 .../shibboleth/idp/attribute/filter/Matcher.java   | 18 +++---
 .../filter/context/AttributeFilterContext.java     | 10 ++--
 .../filter/context/AttributeFilterWorkContext.java | 13 ++---
 .../idp/attribute/filter/context/package-info.java |  4 +-
 .../idp/attribute/filter/package-info.java         |  3 +-
 .../attribute/filter/impl/AttributeFilterImpl.java | 29 +++++-----
 .../idp/attribute/filter/impl/package-info.java    |  4 +-
 .../filter/matcher/impl/AbstractMatcher.java       |  3 +-
 .../matcher/impl/AbstractRegexpStringMatcher.java  | 22 ++++----
 .../filter/matcher/impl/AbstractStringMatcher.java |  5 +-
 .../matcher/impl/AttributeScopeRegexpMatcher.java  |  6 +-
 .../matcher/impl/AttributeValueRegexpMatcher.java  |  7 ++-
 .../matcher/impl/AttributeValueStringMatcher.java  |  9 +--
 .../filter/matcher/impl/ScriptedMatcher.java       | 18 +++---
 .../filter/matcher/impl/package-info.java          |  3 +-
 .../logic/impl/AbstractComposedMatcher.java        |  2 +-
 .../filter/matcher/logic/impl/AndMatcher.java      | 10 ++--
 .../filter/matcher/logic/impl/NotMatcher.java      |  5 +-
 .../filter/matcher/logic/impl/OrMatcher.java       | 10 ++--
 .../filter/matcher/logic/impl/package-info.java    |  2 +
 .../impl/AbstractMatchesShibMDScopeMatcher.java    |  9 +--
 .../saml/impl/AttributeInMetadataMatcher.java      | 19 +++----
 .../impl/AttributeScopeMatchesShibMDScope.java     | 11 ++--
 .../impl/AttributeValueMatchesShibMDScope.java     |  9 +--
 .../filter/matcher/saml/impl/package-info.java     |  5 +-
 .../impl/AttributeIssuerPolicyRule.java            |  1 -
 .../impl/AttributeIssuerRegexpPolicyRule.java      |  1 -
 .../impl/AttributeRequesterPolicyRule.java         |  1 -
 .../impl/AttributeRequesterRegexpPolicyRule.java   |  1 -
 .../impl/NumOfAttributeValuesPolicyRule.java       |  1 -
 .../filtercontext/impl/PredicatePolicyRule.java    |  5 +-
 .../impl/PrincipalNamePolicyRule.java              |  1 -
 .../impl/PrincipalNameRegexpPolicyRule.java        |  1 -
 .../filtercontext/impl/ProfilePolicyRule.java      |  1 -
 .../impl/ProxiedRequesterPolicyRule.java           |  1 -
 .../impl/ProxiedRequesterRegexpPolicyRule.java     |  1 -
 .../filtercontext/impl/package-info.java           |  3 +-
 .../filter/policyrule/impl/AbstractPolicyRule.java | 11 +++-
 .../policyrule/impl/AbstractRegexpPolicyRule.java  |  3 +-
 .../policyrule/impl/AbstractStringPolicyRule.java  |  5 +-
 .../policyrule/impl/DirectionPolicyRule.java       |  1 -
 .../filter/policyrule/impl/ScriptedPolicyRule.java | 26 ++-------
 .../filter/policyrule/impl/package-info.java       |  4 +-
 .../logic/impl/AbstractComposedPolicyRule.java     |  5 +-
 .../policyrule/logic/impl/AndPolicyRule.java       |  1 -
 .../policyrule/logic/impl/NotPolicyRule.java       |  4 +-
 .../filter/policyrule/logic/impl/OrPolicyRule.java |  1 -
 .../filter/policyrule/logic/impl/package-info.java |  4 +-
 .../AbstractEntityAttributeExactPolicyRule.java    |  4 +-
 .../impl/AbstractEntityAttributePolicyRule.java    | 51 ++++++++---------
 .../saml/impl/AbstractEntityGroupPolicyRule.java   |  1 -
 .../impl/AbstractNameIDFormatExactPolicyRule.java  |  4 +-
 .../AbstractRegistrationAuthorityPolicyRule.java   |  8 +--
 .../filter/policyrule/saml/impl/package-info.java  |  4 +-
 .../idp/attribute/impl/JDBCPairwiseIdStore.java    | 15 +++--
 .../idp/attribute/impl/package-info.java           |  4 +-
 .../impl/AttributeRegistryServiceStrategy.java     |  8 +--
 .../impl/AttributeTranscoderRegistryImpl.java      | 39 ++++++-------
 .../transcoding/impl/TranscodingRuleLoader.java    | 22 ++++----
 .../attribute/transcoding/impl/package-info.java   |  4 +-
 .../impl/testing/SAMLAttributeDataConnector.java   | 18 +++---
 .../resolver/dc/impl/testing/package-info.java     |  4 +-
 .../resolver/testing/MockDataConnector.java        | 16 ++----
 .../testing/MockStaticAttributeDefinition.java     | 20 +++----
 .../resolver/testing/MockStaticDataConnector.java  | 27 +++++----
 .../attribute/resolver/testing/TestSources.java    | 46 ++++++++-------
 .../attribute/resolver/testing/package-info.java   |  4 +-
 .../AbstractSAML1AttributeTranscoder.java          |  8 +--
 .../AbstractSAML2AttributeTranscoder.java          |  8 +--
 .../AbstractSAMLAttributeTranscoder.java           | 42 +++++++-------
 .../attribute/transcoding/SAMLEncoderSupport.java  |  4 +-
 .../saml/attribute/transcoding/package-info.java   |  4 +-
 .../impl/AttributeMappingNodeProcessor.java        | 10 ++--
 .../idp/saml/attribute/impl/package-info.java      |  4 +-
 .../SAML1NameIdentifierAttributeDefinition.java    | 16 +++---
 .../impl/SAML2NameIDAttributeDefinition.java       | 16 +++---
 .../saml/attribute/resolver/impl/package-info.java |  4 +-
 .../impl/SAML1ByteAttributeTranscoder.java         | 18 +++---
 .../impl/SAML1ScopedStringAttributeTranscoder.java | 18 +++---
 .../impl/SAML1StringAttributeTranscoder.java       | 18 +++---
 .../impl/SAML1XMLObjectAttributeTranscoder.java    |  8 +--
 .../impl/SAML2ByteAttributeTranscoder.java         | 17 +++---
 .../impl/SAML2DateTimeAttributeTranscoder.java     | 32 +++++------
 .../impl/SAML2ScopedStringAttributeTranscoder.java | 17 +++---
 .../impl/SAML2StringAttributeTranscoder.java       | 17 +++---
 .../impl/SAML2XMLObjectAttributeTranscoder.java    | 17 +++---
 .../attribute/transcoding/impl/package-info.java   |  4 +-
 119 files changed, 737 insertions(+), 755 deletions(-)

diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
index 1764c56d4..995847dd5 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
@@ -26,7 +26,6 @@ import javax.annotation.Nonnull;
 
 import com.google.common.collect.Multimap;
 
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -40,20 +39,20 @@ import net.shibboleth.shared.logic.Constraint;
 public final class AttributesMapContainer implements Supplier<Multimap<String,IdPAttribute>> {
 
     /** The map we are encapsulating.*/
-    @Nonnull @NonnullElements private final Multimap<String,IdPAttribute> providedValue;
+    @Nonnull private final Multimap<String,IdPAttribute> providedValue;
 
     /**
      * Constructor.
      * 
      * @param value the value to return.
      */
-    public AttributesMapContainer(@Nonnull @NonnullElements final Multimap<String,IdPAttribute> value) {
+    public AttributesMapContainer(@Nonnull final Multimap<String,IdPAttribute> value) {
         providedValue = Constraint.isNotNull(value, "Attribute Map cannot be null");
     }
 
     /** {@inheritDoc} */
     @Override
-    @Nonnull @NonnullElements public Multimap<String,IdPAttribute> get() {
+    @Nonnull public Multimap<String,IdPAttribute> get() {
         return providedValue;
     }
 
@@ -65,7 +64,7 @@ public final class AttributesMapContainer implements Supplier<Multimap<String,Id
      * 
      * @return unmodifiable collection of string values
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Collection<String> getStringValues(
+    @Nonnull @NotLive @Unmodifiable public Collection<String> getStringValues(
             @Nonnull @NotEmpty final String id) {
         
         return providedValue.get(id)
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ByteAttributeValue.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ByteAttributeValue.java
index b189af9ee..411445407 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ByteAttributeValue.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ByteAttributeValue.java
@@ -47,10 +47,12 @@ public final class ByteAttributeValue implements IdPAttributeValue {
         value = Constraint.isNotEmpty(attributeValue, "Attribute value cannot be null or empty");
     }
 
-    /** Return the value.
+    /**
+     * Return the value.
+     * 
      * @return the value
      */
-    public byte[] getValue() {
+    @Nonnull public byte[] getValue() {
         return value;
     }
 
@@ -69,6 +71,7 @@ public final class ByteAttributeValue implements IdPAttributeValue {
      * 
      * @return a hex-encoded string
      */
+    @SuppressWarnings("null")
     @Nonnull public String toHex() {
         final String result = Hex.encodeHexString(value);
         assert result != null;
@@ -129,4 +132,5 @@ public final class ByteAttributeValue implements IdPAttributeValue {
             return new ByteAttributeValue(value);
         }
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/DateTimeAttributeValue.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/DateTimeAttributeValue.java
index 56864ae90..7ccf43031 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/DateTimeAttributeValue.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/DateTimeAttributeValue.java
@@ -54,6 +54,7 @@ public class DateTimeAttributeValue implements IdPAttributeValue {
      * 
      * @param attributeValue the attribute value
      */
+    @SuppressWarnings("null")
     public DateTimeAttributeValue(
             @Nonnull @ParameterName(name="attributeValue") final ZonedDateTime attributeValue) {
         final Instant val = Constraint.isNotNull(attributeValue, "Attribute value cannot be null or empty").toInstant();
@@ -74,6 +75,7 @@ public class DateTimeAttributeValue implements IdPAttributeValue {
     }
 
     /** {@inheritDoc} */
+    @SuppressWarnings("null")
     @Nonnull @NotEmpty public String getDisplayValue() {
         final String result = value.toString();
         assert result != null;
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/EmptyAttributeValue.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/EmptyAttributeValue.java
index 9d22f51d5..6186a0d9c 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/EmptyAttributeValue.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/EmptyAttributeValue.java
@@ -74,6 +74,7 @@ public final class EmptyAttributeValue implements IdPAttributeValue {
     }
 
     /** {@inheritDoc} */
+    @SuppressWarnings("null")
     @Nonnull @NotEmpty public String getDisplayValue() {
         final String result = value.toString();
         assert result != null;
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
index 334d6e4dd..3acfe4ad5 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
@@ -33,7 +33,6 @@ import com.google.common.base.Objects;
 
 import net.shibboleth.idp.attribute.EmptyAttributeValue.EmptyType;
 import net.shibboleth.shared.annotation.ParameterName;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.NullableElements;
@@ -56,7 +55,8 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class IdPAttribute implements Comparable<IdPAttribute>, Cloneable {
     
     /** Value for testing illegal name. */
-    private static final Predicate<String> SPACE_CONTAINING = Pattern.compile("\\S*").asMatchPredicate();
+    @SuppressWarnings("null")
+    @Nonnull private static final Predicate<String> SPACE_CONTAINING = Pattern.compile("\\S*").asMatchPredicate();
 
     /** Logger - static. */
     @Nonnull private static final Logger LOG = LoggerFactory.getLogger(IdPAttribute.class);
@@ -121,19 +121,21 @@ public class IdPAttribute implements Comparable<IdPAttribute>, Cloneable {
      * 
      * @return values of the attribute
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public List<IdPAttributeValue> getValues() {
+    @Nonnull @Unmodifiable @NotLive public List<IdPAttributeValue> getValues() {
         return values;
     }
 
     /**
      * Replaces the existing values for this attribute with the given values.
      * 
+     * <p>Nulls are replaced inline by an {@link EmptyAttributeValue} suitably initialized.</p>
+     * 
      * @param newValues the new values for this attribute
      */
     public void setValues(@Nullable @NullableElements final List<IdPAttributeValue> newValues) {
         if (newValues != null) {
             values = newValues.stream().
-                     map(e -> e==null? new EmptyAttributeValue(EmptyType.NULL_VALUE) :e).
+                     map(e -> e == null ? new EmptyAttributeValue(EmptyType.NULL_VALUE) : e).
                      collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
                      get();
         } else {
@@ -211,4 +213,4 @@ public class IdPAttribute implements Comparable<IdPAttribute>, Cloneable {
         return result;
     }
     
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttributeValue.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttributeValue.java
index 141c91825..2e5ef40cb 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttributeValue.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttributeValue.java
@@ -51,9 +51,8 @@ public interface IdPAttributeValue extends Comparable<IdPAttributeValue> {
     @Nonnull @NotEmpty String getDisplayValue();
     
     /** {@inheritDoc} */
-    default int compareTo(IdPAttributeValue value) {
+    default int compareTo(final IdPAttributeValue value) {
         return getDisplayValue().compareTo(value.getDisplayValue());
     }
-
-    
+   
 }
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPRequestedAttribute.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPRequestedAttribute.java
index 672111d68..afe886262 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPRequestedAttribute.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPRequestedAttribute.java
@@ -19,10 +19,12 @@ package net.shibboleth.idp.attribute;
 
 import javax.annotation.Nonnull;
 
+import org.opensaml.saml.saml2.metadata.RequestedAttribute;
+
 import net.shibboleth.shared.annotation.ParameterName;
 
 /**
- * IdP Representation of the SAML2 RequestedAttribute.
+ * IdP representation of {@link RequestedAttribute}.
  */
 public final class IdPRequestedAttribute extends IdPAttribute {
 
@@ -34,7 +36,7 @@ public final class IdPRequestedAttribute extends IdPAttribute {
      *
      * @param attributeId the id
      */
-    public IdPRequestedAttribute(@Nonnull final @ParameterName(name="attributeId")  String attributeId) {
+    public IdPRequestedAttribute(@ParameterName(name="attributeId") @Nonnull final String attributeId) {
         super(attributeId);
     }
 
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java
index 4d0c9b71b..026a5c88c 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java
@@ -106,7 +106,8 @@ public final class ScopedStringAttributeValue extends StringAttributeValue {
      * @param scope of the value
      * @return {@link EmptyAttributeValue} or {@link ScopedStringAttributeValue}
      */
-    @Nonnull public static IdPAttributeValue valueOf(@Nullable final String value, @Nonnull @NotEmpty final String scope) {
+    @Nonnull public static IdPAttributeValue valueOf(@Nullable final String value,
+            @Nonnull @NotEmpty final String scope) {
         if (value == null) {
             return EmptyAttributeValue.NULL;
         } else if (value.length() == 0) {
@@ -115,4 +116,5 @@ public final class ScopedStringAttributeValue extends StringAttributeValue {
             return new ScopedStringAttributeValue(value, scope);
         }
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/XMLObjectAttributeValue.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/XMLObjectAttributeValue.java
index 0722772a5..204d15c82 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/XMLObjectAttributeValue.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/XMLObjectAttributeValue.java
@@ -111,4 +111,5 @@ public final class XMLObjectAttributeValue implements IdPAttributeValue {
     public String toString() {
         return MoreObjects.toStringHelper(this).add("value", value).toString();
     }
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractCollectionConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractCollectionConfigurationLookupStrategy.java
index cbf48d2d0..3c4b3314c 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractCollectionConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractCollectionConfigurationLookupStrategy.java
@@ -52,7 +52,8 @@ public abstract class AbstractCollectionConfigurationLookupStrategy<T1,T2>
     extends AbstractMetadataDrivenConfigurationLookupStrategy<T2> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractCollectionConfigurationLookupStrategy.class);
+    @Nonnull
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractCollectionConfigurationLookupStrategy.class);
 
     /** Type of bean in collection. */
     @NonnullAfterInit private Class<T1> propertyType;
@@ -95,7 +96,9 @@ public abstract class AbstractCollectionConfigurationLookupStrategy<T1,T2>
      * 
      * @throws ReflectiveOperationException if the attempt fails
      */
-    protected T1 createInstanceFromString(@Nonnull @NotEmpty final String input) throws ReflectiveOperationException {
+    @SuppressWarnings("null")
+    @Nonnull protected T1 createInstanceFromString(@Nonnull @NotEmpty final String input)
+            throws ReflectiveOperationException {
         if (propertyType.isAssignableFrom(input.getClass())) {
             return propertyType.cast(input);
         }
@@ -112,30 +115,30 @@ public abstract class AbstractCollectionConfigurationLookupStrategy<T1,T2>
      * @return the converted value, or null
      */
     @Nullable protected String xmlObjectToString(@Nonnull final XMLObject object) {
-        if (object instanceof XSString) {
-            return ((XSString) object).getValue();
-        } else if (object instanceof XSURI) {
-            return ((XSURI) object).getURI();
-        } else if (object instanceof XSBoolean) {
-            final XSBooleanValue value = ((XSBoolean) object).getValue();
+        if (object instanceof XSString val) {
+            return val.getValue();
+        } else if (object instanceof XSURI val) {
+            return val.getURI();
+        } else if (object instanceof XSBoolean val) {
+            final XSBooleanValue value = val.getValue();
             return value != null ? (value.getValue() ? "1" : "0") : null;
-        } else if (object instanceof XSInteger) {
-            final Integer value = ((XSInteger) object).getValue();
+        } else if (object instanceof XSInteger val) {
+            final Integer value = val.getValue();
             return value != null ? value.toString() : null;
-        } else if (object instanceof XSDateTime) {
-            final Instant dt = ((XSDateTime) object).getValue();
+        } else if (object instanceof XSDateTime val) {
+            final Instant dt = val.getValue();
             return dt != null ? Long.toString(dt.toEpochMilli()) : null;
-        } else if (object instanceof XSBase64Binary) {
-            return ((XSBase64Binary) object).getValue();
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                return wc.getTextContent();
+        } else if (object instanceof XSBase64Binary val) {
+            return val.getValue();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                return val.getTextContent();
             }
         }
         
-        log.debug("Unsupported conversion to String from XMLObject type ({})", object.getClass().getName());
+        LOG.debug("Unsupported conversion to String from XMLObject type ({})", object.getClass().getName());
         return null;
     }
 // Checkstyle: CyclomaticComplexity ON
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
index 2fa58b602..042604d5b 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
@@ -46,7 +46,6 @@ import net.shibboleth.idp.attribute.AttributesMapContainer;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LockableClassToInstanceMultiMap;
@@ -83,7 +82,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
 
     /** Class logger. */
     @Nonnull
-    private final Logger log = LoggerFactory.getLogger(AbstractMetadataDrivenConfigurationLookupStrategy.class);
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractMetadataDrivenConfigurationLookupStrategy.class);
     
     /** Require use of URI attribute name format. */
     private boolean strictNameFormat;
@@ -104,10 +103,10 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
     @Nullable @NotEmpty private String legacyPropertyName;
 
     /** The "full" property identifiers to support. */
-    @NonnullAfterInit @NonnullElements private Collection<String> propertyAliases;
+    @NonnullAfterInit private Collection<String> propertyAliases;
 
     /** Legacy "full" property identifiers to support. */
-    @Nullable @NonnullElements private Collection<String> legacyPropertyAliases;
+    @Nullable private Collection<String> legacyPropertyAliases;
 
     /** Default to return in the absence of a property. */
     @Nonnull private Function<BaseContext,T> defaultValueStrategy;
@@ -184,6 +183,20 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         explicitPropertyName = flag;
     }
     
+    /**
+     * Gets the "base" name of the property/setting to derive.
+     * 
+     * <p>Callable only after init.</p> 
+     * 
+     * @return property name
+     */
+    @SuppressWarnings("null")
+    @Nonnull private String ensurePropertyName() {
+        checkComponentActive();
+        
+        return propertyName;
+    }
+
     /**
      * Sets the "base" name of the property/setting to derive.
      * 
@@ -216,7 +229,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
      * 
      * @param aliases alternative profile IDs
      */
-    public void setProfileAliases(@Nonnull @NonnullElements final Collection<String> aliases) {
+    public void setProfileAliases(@Nonnull final Collection<String> aliases) {
         checkSetterPreconditions();
         
         Constraint.isNotNull(aliases, "Alias collection cannot be null");
@@ -312,6 +325,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
 
     // Checkstyle: CyclomaticComplexity|MethodLength|ReturnCount OFF    
     /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
     @Nullable public T apply(@Nullable final BaseContext input) {
         checkComponentActive();
         
@@ -320,8 +334,8 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         if (enableCaching && input != null) {
             cacheContext = input.ensureSubcontext(CachedConfigurationContext.class);
             if (cacheContext.getPropertyMap().containsKey(propertyName)) {
-                log.debug("Returning cached property '{}'", propertyName);
-                return (T) cacheContext.getPropertyMap().get(propertyName);
+                LOG.debug("Returning cached property '{}'", propertyName);
+                return (T) cacheContext.getPropertyMap().get(ensurePropertyName());
             }
         }
         
@@ -337,7 +351,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         }
             
         if (entity == null) {
-            log.debug("No metadata available for relying party, applying default strategy for '{}'", propertyName);
+            LOG.debug("No metadata available for relying party, applying default strategy for '{}'", propertyName);
             return defaultValueStrategy.apply(input);
         }
         
@@ -361,11 +375,11 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         
         // Look for "primary" tag name based on profile/property using mapped tags.
         IdPAttribute idpAttribute = findMatchingMappedTag(entity,
-                profileId != null ? profileId + '/' + propertyName : propertyName);
+                profileId != null ? profileId + '/' + ensurePropertyName() : ensurePropertyName());
         Optional<T> result = processMappedTag(idpAttribute, cacheContext);
         if (result != null) {
             assert idpAttribute != null;
-            log.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(), propertyName);
+            LOG.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(), propertyName);
             return result.orElse(null);
         }
         
@@ -376,7 +390,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
             result = processMappedTag(idpAttribute, cacheContext);
             if (result != null) {
                 assert idpAttribute != null;
-                log.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(), propertyName);
+                LOG.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(), propertyName);
                 return result.orElse(null);
             }
         }
@@ -390,7 +404,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
             result = processMappedTag(idpAttribute, cacheContext);
             if (result != null) {
                 assert idpAttribute != null;
-                log.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(), propertyName);
+                LOG.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(), propertyName);
                 DeprecationSupport.warnOnce(ObjectType.PROPERTY, legacy, "SAML Metadata EntityAttribute", propertyName);
                 return result.orElse(null);
             }
@@ -403,7 +417,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
                     result = processMappedTag(idpAttribute, cacheContext);
                     if (result != null) {
                         assert idpAttribute != null;
-                        log.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(),
+                        LOG.debug("Found matching mapped tag '{}' for property '{}'", idpAttribute.getId(),
                                 propertyName);
                         DeprecationSupport.warnOnce(ObjectType.PROPERTY, legacy, "SAML Metadata EntityAttribute",
                                 propertyName);
@@ -414,7 +428,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         }
         
         if (ignoreUnmappedEntityAttributes) {
-            log.debug("No applicable mapped tag, applying default strategy for '{}'", propertyName);
+            LOG.debug("No applicable mapped tag, applying default strategy for '{}'", propertyName);
             final T ret = defaultValueStrategy.apply(input);
             if (enableCaching) {
                 assert cacheContext != null;
@@ -425,21 +439,22 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         
         // Look for "primary" tag name based on profile/property.
         Attribute attribute = findMatchingTag(entity,
-                profileId != null ? profileId + '/' + propertyName : propertyName);
+                profileId != null ? profileId + '/' + ensurePropertyName() : ensurePropertyName());
         result = processTag(attribute, cacheContext);
         if (result != null) {
             assert attribute != null;
-            log.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
+            LOG.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
             return result.orElse(null);
         }
         
         // Check aliases.
         for (final String alias : propertyAliases) {
+            assert alias != null;
             attribute = findMatchingTag(entity, alias);
             result = processTag(attribute, cacheContext);
             if (result != null) {
                 assert attribute != null;
-                log.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
+                LOG.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
                 return result.orElse(null);
             }
         }
@@ -453,7 +468,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
             result = processTag(attribute, cacheContext);
             if (result != null) {
                 assert attribute != null;
-                log.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
+                LOG.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
                 DeprecationSupport.warnOnce(ObjectType.PROPERTY, legacy, "SAML Metadata EntityAttribute", propertyName);
                 return result.orElse(null);
             }
@@ -466,7 +481,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
                     result = processMappedTag(idpAttribute, cacheContext);
                     if (result != null) {
                         assert attribute != null;
-                        log.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
+                        LOG.debug("Found matching tag '{}' for property '{}'", attribute.getName(), propertyName);
                         DeprecationSupport.warnOnce(ObjectType.PROPERTY, legacy, "SAML Metadata EntityAttribute",
                                 propertyName);
                         return result.orElse(null);
@@ -475,7 +490,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
             }
         }
         
-        log.debug("No applicable tag, applying default strategy for '{}'", propertyName);
+        LOG.debug("No applicable tag, applying default strategy for '{}'", propertyName);
         final T ret = defaultValueStrategy.apply(input);
         if (enableCaching) {
             assert cacheContext != null;
@@ -496,7 +511,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values == null || values.isEmpty()) {
-            log.debug("Tag '{}' contained no values, no setting returned for '{}'", tag.getName(), propertyName);
+            LOG.debug("Tag '{}' contained no values, no setting returned for '{}'", tag.getName(), propertyName);
             return null;
         }
         
@@ -623,8 +638,8 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         Extensions exts = entity.getExtensions();
         if (exts != null) {
             final List<XMLObject> children = exts.getUnknownXMLObjects(EntityAttributes.DEFAULT_ELEMENT_NAME);
-            if (!children.isEmpty() && children.get(0) instanceof EntityAttributes) {
-                final Attribute tag = findMatchingTag((EntityAttributes) children.get(0), name);
+            if (!children.isEmpty() && children.get(0) instanceof EntityAttributes attr) {
+                final Attribute tag = findMatchingTag(attr, name);
                 if (tag != null) {
                     return tag;
                 }
@@ -636,8 +651,8 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
             exts = group.getExtensions();
             if (exts != null) {
                 final List<XMLObject> children = exts.getUnknownXMLObjects(EntityAttributes.DEFAULT_ELEMENT_NAME);
-                if (!children.isEmpty() && children.get(0) instanceof EntityAttributes) {
-                    final Attribute tag = findMatchingTag((EntityAttributes) children.get(0), name);
+                if (!children.isEmpty() && children.get(0) instanceof EntityAttributes attr) {
+                    final Attribute tag = findMatchingTag(attr, name);
                     if (tag != null) {
                         return tag;
                     }
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java
index 8c3eab15c..11e64611d 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BeanConfigurationLookupStrategy.java
@@ -55,7 +55,7 @@ public class BeanConfigurationLookupStrategy<T> extends AbstractMetadataDrivenCo
         implements ApplicationContextAware {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(BeanConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(BeanConfigurationLookupStrategy.class);
 
     /** Enclosing Spring context. */
     @NonnullAfterInit private ApplicationContext applicationContext;
@@ -100,23 +100,22 @@ public class BeanConfigurationLookupStrategy<T> extends AbstractMetadataDrivenCo
         
         final List<IdPAttributeValue> values = tag.getValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getId());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getId());
             return null;
         }
 
-        log.debug("Converting tag '{}' to Bean property of tyoe '{}'", tag.getId(), propertyType.getSimpleName());
+        LOG.debug("Converting tag '{}' to Bean property of tyoe '{}'", tag.getId(), propertyType.getSimpleName());
         
         final IdPAttributeValue value = values.get(0);
-        if (value instanceof StringAttributeValue) {
+        if (value instanceof StringAttributeValue strval) {
             try {
-                return applicationContext.getBean(((StringAttributeValue) value).getValue(), propertyType);
+                return applicationContext.getBean(strval.getValue(), propertyType);
             } catch (final BeansException e) {
-                log.error("Error locating appropriately typed bean named {}",
-                        ((StringAttributeValue) value).getValue(), e);
+                LOG.error("Error locating appropriately typed bean named {}", strval.getValue(), e);
                 return null;
             }
         }
-        log.error("Tag '{}' contained non-string value, returning null");
+        LOG.error("Tag '{}' contained non-string value, returning null");
         return null;
     }
     
@@ -126,11 +125,11 @@ public class BeanConfigurationLookupStrategy<T> extends AbstractMetadataDrivenCo
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getName());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getName());
             return null;
         }
         
-        log.debug("Converting tag '{}' to Bean property of tyoe '{}'", tag.getName(), propertyType.getSimpleName());
+        LOG.debug("Converting tag '{}' to Bean property of tyoe '{}'", tag.getName(), propertyType.getSimpleName());
         final XMLObject value = values.get(0);
         assert value != null;
         return xmlObjectToBean(value);
@@ -145,12 +144,11 @@ public class BeanConfigurationLookupStrategy<T> extends AbstractMetadataDrivenCo
      */
     @Nullable private T xmlObjectToBean(@Nonnull final XMLObject object) {
         String value = null;
-        if (object instanceof XSString) {
-            value = ((XSString) object).getValue();
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                value = wc.getTextContent();
+        if (object instanceof XSString val) {
+            value = val.getValue();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                value = val.getTextContent();
             }
         }
         
@@ -159,12 +157,12 @@ public class BeanConfigurationLookupStrategy<T> extends AbstractMetadataDrivenCo
                 assert propertyType != null;
                 return applicationContext.getBean(value, propertyType);
             } catch (final BeansException e) {
-                log.error("Error locating appropriately typed bean named {}", value, e);
+                LOG.error("Error locating appropriately typed bean named {}", value, e);
                 return null;
             }
         }
         
-        log.error("Unsupported conversion to Spring bean from XMLObject type ({})", object.getClass().getName());
+        LOG.error("Unsupported conversion to Spring bean from XMLObject type ({})", object.getClass().getName());
         return null;
     }
     
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BooleanConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BooleanConfigurationLookupStrategy.java
index b7052e45f..1c5ecae50 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BooleanConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/BooleanConfigurationLookupStrategy.java
@@ -45,7 +45,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenConfigurationLookupStrategy<Boolean> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(BooleanConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(BooleanConfigurationLookupStrategy.class);
 
     /** {@inheritDoc} */
     @Override
@@ -53,17 +53,17 @@ public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenCo
         
         final List<IdPAttributeValue> values = tag.getValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getId());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getId());
             return null;
         }
 
-        log.debug("Converting tag '{}' to Boolean property", tag.getId());
+        LOG.debug("Converting tag '{}' to Boolean property", tag.getId());
         
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             return XSBooleanValue.valueOf(((StringAttributeValue) value).getValue()).getValue();
         }
-        log.error("Tag '{}' contained non-string value, returning null");
+        LOG.error("Tag '{}' contained non-string value, returning null");
         return null;
     }
     
@@ -73,11 +73,11 @@ public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenCo
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getName());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getName());
             return null;
         }
         
-        log.debug("Converting tag '{}' to Boolean property", tag.getName());
+        LOG.debug("Converting tag '{}' to Boolean property", tag.getName());
         final XMLObject value = values.get(0);
         assert value != null;
         return xmlObjectToBoolean(value);
@@ -92,22 +92,21 @@ public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenCo
      * @return the converted value, or null
      */
     @Nullable private Boolean xmlObjectToBoolean(@Nonnull final XMLObject object) {
-        if (object instanceof XSString) {
-            final String value = ((XSString) object).getValue();
+        if (object instanceof XSString val) {
+            final String value = val.getValue();
             if (value != null) {
                 return XSBooleanValue.valueOf(value).getValue();
             }
             return null;
-        } else if (object instanceof XSBoolean) {
-            final XSBooleanValue value = ((XSBoolean) object).getValue();
+        } else if (object instanceof XSBoolean val) {
+            final XSBooleanValue value = val.getValue();
             return value != null ? value.getValue() : null;
-        } else if (object instanceof XSInteger) {
-            final Integer value = ((XSInteger) object).getValue();
+        } else if (object instanceof XSInteger val) {
+            final Integer value = val.getValue();
             return value != null ? value != 0 : null;
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                final String value = wc.getTextContent();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                final String value = val.getTextContent();
                 if (value != null) {
                     return XSBooleanValue.valueOf(value).getValue();
                 }
@@ -115,7 +114,7 @@ public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenCo
             }
         }
         
-        log.error("Unsupported conversion to Boolean from XMLObject type ({})", object.getClass().getName());
+        LOG.error("Unsupported conversion to Boolean from XMLObject type ({})", object.getClass().getName());
         return null;
     }
 // Checkstyle: CyclomaticComplexity ON
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DoubleConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DoubleConfigurationLookupStrategy.java
index 2f924d0b9..89c6a3283 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DoubleConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DoubleConfigurationLookupStrategy.java
@@ -45,7 +45,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class DoubleConfigurationLookupStrategy extends AbstractMetadataDrivenConfigurationLookupStrategy<Double> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(DoubleConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(DoubleConfigurationLookupStrategy.class);
 
     /** {@inheritDoc} */
     @Override
@@ -53,17 +53,17 @@ public class DoubleConfigurationLookupStrategy extends AbstractMetadataDrivenCon
         
         final List<IdPAttributeValue> values = tag.getValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getId());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getId());
             return null;
         }
 
-        log.debug("Converting tag '{}' to Double property", tag.getId());
+        LOG.debug("Converting tag '{}' to Double property", tag.getId());
         
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             return Double.valueOf(((StringAttributeValue) value).getValue());
         }
-        log.error("Tag '{}' contained non-string value, returning null");
+        LOG.error("Tag '{}' contained non-string value, returning null");
         return null;
     }
     
@@ -73,11 +73,11 @@ public class DoubleConfigurationLookupStrategy extends AbstractMetadataDrivenCon
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getName());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getName());
             return null;
         }
         
-        log.debug("Converting tag '{}' to Double property", tag.getName());
+        LOG.debug("Converting tag '{}' to Double property", tag.getName());
         final XMLObject value = values.get(0);
         assert value != null;
         return xmlObjectToDouble(value);
@@ -92,24 +92,23 @@ public class DoubleConfigurationLookupStrategy extends AbstractMetadataDrivenCon
      * @return the converted value, or null
      */
     @Nullable private Double xmlObjectToDouble(@Nonnull final XMLObject object) {
-        if (object instanceof XSString) {
-            final String value = ((XSString) object).getValue();
+        if (object instanceof XSString val) {
+            final String value = val.getValue();
             return value != null ? Double.valueOf(value) : null;
-        } else if (object instanceof XSBoolean) {
-            final XSBooleanValue value = ((XSBoolean) object).getValue();
+        } else if (object instanceof XSBoolean val) {
+            final XSBooleanValue value = val.getValue();
             return value != null ? (value.getValue() ? 1.0 : 0.0) : null;
-        } else if (object instanceof XSInteger) {
-            final Integer value = ((XSInteger) object).getValue(); 
+        } else if (object instanceof XSInteger val) {
+            final Integer value = val.getValue(); 
             return value != null ? value.doubleValue() : null;
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                final String value = wc.getTextContent();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                final String value = val.getTextContent();
                 return value != null ? Double.valueOf(value) : null;
             }
         }
         
-        log.error("Unsupported conversion to Double from XMLObject type ({})", object.getClass().getName());
+        LOG.error("Unsupported conversion to Double from XMLObject type ({})", object.getClass().getName());
         return null;
     }
 // Checkstyle: CyclomaticComplexity ON
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DurationConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DurationConfigurationLookupStrategy.java
index eee2769b2..ef37246cb 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DurationConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/DurationConfigurationLookupStrategy.java
@@ -47,7 +47,7 @@ import net.shibboleth.shared.spring.config.StringToDurationConverter;
 public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenConfigurationLookupStrategy<Duration> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(DurationConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(DurationConfigurationLookupStrategy.class);
 
     /** Converter to handle duration strings. */
     @Nonnull private final Converter<String,Duration> durationConverter;
@@ -63,22 +63,22 @@ public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenC
         
         final List<IdPAttributeValue> values = tag.getValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getId());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getId());
             return null;
         }
 
-        log.debug("Converting tag '{}' to Duration property", tag.getId());
+        LOG.debug("Converting tag '{}' to Duration property", tag.getId());
         
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             try {
                 return durationConverter.convert(((StringAttributeValue) value).getValue());
             } catch (final IllegalArgumentException e) {
-                log.error("Error converting duration", e);
+                LOG.error("Error converting duration", e);
                 return null;
             }
         }
-        log.error("Tag '{}' contained non-string value, returning null");
+        LOG.error("Tag '{}' contained non-string value, returning null");
         return null;
     }
     
@@ -88,11 +88,11 @@ public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenC
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getName());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getName());
             return null;
         }
         
-        log.debug("Converting tag '{}' to Duration property", tag.getName());
+        LOG.debug("Converting tag '{}' to Duration property", tag.getName());
         final XMLObject value = values.get(0);
         assert value != null;
         return xmlObjectToDuration(value);
@@ -107,29 +107,28 @@ public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenC
      * @return the converted value, or null
      */
     @Nullable private Duration xmlObjectToDuration(@Nonnull final XMLObject object) {
-        if (object instanceof XSString) {
-            final String value = ((XSString) object).getValue();
+        if (object instanceof XSString val) {
+            final String value = val.getValue();
             if (value != null) {
                 try {
                     return durationConverter.convert(value);
                 } catch (final IllegalArgumentException e) {
-                    log.error("Error converting duration", e);
+                    LOG.error("Error converting duration", e);
                     return null;
                 }
             }
             return null;
-        } else if (object instanceof XSInteger) {
-            final Integer value = ((XSInteger) object).getValue();
+        } else if (object instanceof XSInteger val) {
+            final Integer value = val.getValue();
             return value != null ? Duration.ofMillis(value.longValue()) : null;
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                final String value = wc.getTextContent();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                final String value = val.getTextContent();
                 if (value != null) {
                     try {
                         return durationConverter.convert(value);
                     } catch (final IllegalArgumentException e) {
-                        log.error("Error converting duration", e);
+                        LOG.error("Error converting duration", e);
                         return null;
                     }
                 }
@@ -137,7 +136,7 @@ public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenC
             }
         }
         
-        log.error("Unsupported conversion to Duration from XMLObject type ({})", object.getClass().getName());
+        LOG.error("Unsupported conversion to Duration from XMLObject type ({})", object.getClass().getName());
         return null;
     }
 // Checkstyle: CyclomaticComplexity ON
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/IntegerConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/IntegerConfigurationLookupStrategy.java
index 7297f8c7c..d912f9996 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/IntegerConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/IntegerConfigurationLookupStrategy.java
@@ -45,7 +45,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class IntegerConfigurationLookupStrategy extends AbstractMetadataDrivenConfigurationLookupStrategy<Integer> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(IntegerConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(IntegerConfigurationLookupStrategy.class);
 
     /** {@inheritDoc} */
     @Override
@@ -53,17 +53,17 @@ public class IntegerConfigurationLookupStrategy extends AbstractMetadataDrivenCo
         
         final List<IdPAttributeValue> values = tag.getValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getId());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getId());
             return null;
         }
 
-        log.debug("Converting tag '{}' to Integer property", tag.getId());
+        LOG.debug("Converting tag '{}' to Integer property", tag.getId());
         
         final IdPAttributeValue value = values.get(0);
-        if (value instanceof StringAttributeValue) {
-            return Integer.decode(((StringAttributeValue) value).getValue());
+        if (value instanceof StringAttributeValue strval) {
+            return Integer.decode(strval.getValue());
         }
-        log.error("Tag '{}' contained non-string value, returning null");
+        LOG.error("Tag '{}' contained non-string value, returning null");
         return null;
     }
     
@@ -73,11 +73,11 @@ public class IntegerConfigurationLookupStrategy extends AbstractMetadataDrivenCo
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getName());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getName());
             return null;
         }
         
-        log.debug("Converting tag '{}' to Integer property", tag.getName());
+        LOG.debug("Converting tag '{}' to Integer property", tag.getName());
         final XMLObject value = values.get(0);
         assert value != null;
 
@@ -93,23 +93,22 @@ public class IntegerConfigurationLookupStrategy extends AbstractMetadataDrivenCo
      * @return the converted value, or null
      */
     @Nullable private Integer xmlObjectToInteger(@Nonnull final XMLObject object) {
-        if (object instanceof XSString) {
-            final String value = ((XSString) object).getValue();
+        if (object instanceof XSString val) {
+            final String value = val.getValue();
             return value != null ? Integer.decode(value) : null;
-        } else if (object instanceof XSBoolean) {
-            final XSBooleanValue value = ((XSBoolean) object).getValue();
+        } else if (object instanceof XSBoolean val) {
+            final XSBooleanValue value = val.getValue();
             return value != null ? (value.getValue() ? 1 : 0) : null;
-        } else if (object instanceof XSInteger) {
-            return ((XSInteger) object).getValue();
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                final String value = wc.getTextContent();
+        } else if (object instanceof XSInteger val) {
+            return val.getValue();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                final String value = val.getTextContent();
                 return value != null ? Integer.decode(value) : null;
             }
         }
         
-        log.error("Unsupported conversion to Integer from XMLObject type ({})", object.getClass().getName());
+        LOG.error("Unsupported conversion to Integer from XMLObject type ({})", object.getClass().getName());
         return null;
     }
 // Checkstyle: CyclomaticComplexity ON
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/ListConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/ListConfigurationLookupStrategy.java
index ecccbb594..043603d02 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/ListConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/ListConfigurationLookupStrategy.java
@@ -44,13 +44,13 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class ListConfigurationLookupStrategy<T> extends AbstractCollectionConfigurationLookupStrategy<T,List<T>> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(ListConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(ListConfigurationLookupStrategy.class);
 
     /** {@inheritDoc} */
     @Override
     @Nullable protected List<T> doTranslate(@Nonnull final IdPAttribute tag) {
 
-        log.debug("Converting tag '{}' to List<{}> property", tag.getId(), getPropertyType().getSimpleName());
+        LOG.debug("Converting tag '{}' to List<{}> property", tag.getId(), getPropertyType().getSimpleName());
         
         final List<IdPAttributeValue> values = tag.getValues();
         final List<T> result = new ArrayList<>(values.size());
@@ -59,7 +59,7 @@ public class ListConfigurationLookupStrategy<T> extends AbstractCollectionConfig
                 try {
                     result.add(createInstanceFromString(sval.getValue()));
                 } catch (final Exception e) {
-                    log.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
+                    LOG.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
                 }
             } else if (value instanceof XMLObjectAttributeValue xmlValue) {
                 if (getPropertyType().isInstance(xmlValue.getValue())) {
@@ -74,7 +74,7 @@ public class ListConfigurationLookupStrategy<T> extends AbstractCollectionConfig
     @Override
     @Nullable protected List<T> doTranslate(@Nonnull final Attribute tag) {
 
-        log.debug("Converting tag '{}' to List<{}> property", tag.getName(), getPropertyType().getSimpleName());
+        LOG.debug("Converting tag '{}' to List<{}> property", tag.getName(), getPropertyType().getSimpleName());
         
         final List<XMLObject> values = tag.getAttributeValues();
         final List<T> result = new ArrayList<>(values.size());
@@ -86,7 +86,7 @@ public class ListConfigurationLookupStrategy<T> extends AbstractCollectionConfig
                 try {
                     result.add(createInstanceFromString(converted));
                 } catch (final Exception e) {
-                    log.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
+                    LOG.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
                 }
             } else if (getPropertyType().isInstance(value)) {
                 result.add(getPropertyType().cast(value));
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/LongConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/LongConfigurationLookupStrategy.java
index b8613dc71..e0d3d2500 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/LongConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/LongConfigurationLookupStrategy.java
@@ -47,7 +47,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class LongConfigurationLookupStrategy extends AbstractMetadataDrivenConfigurationLookupStrategy<Long> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(LongConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(LongConfigurationLookupStrategy.class);
 
     /** {@inheritDoc} */
     @Override
@@ -55,17 +55,17 @@ public class LongConfigurationLookupStrategy extends AbstractMetadataDrivenConfi
         
         final List<IdPAttributeValue> values = tag.getValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getId());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getId());
             return null;
         }
 
-        log.debug("Converting tag '{}' to Long property", tag.getId());
+        LOG.debug("Converting tag '{}' to Long property", tag.getId());
         
         final IdPAttributeValue value = values.get(0);
-        if (value instanceof StringAttributeValue) {
-            return Long.decode(((StringAttributeValue) value).getValue());
+        if (value instanceof StringAttributeValue strval) {
+            return Long.decode(strval.getValue());
         }
-        log.error("Tag '{}' contained non-string value, returning null");
+        LOG.error("Tag '{}' contained non-string value, returning null");
         return null;
     }
     
@@ -75,11 +75,11 @@ public class LongConfigurationLookupStrategy extends AbstractMetadataDrivenConfi
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getName());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getName());
             return null;
         }
         
-        log.debug("Converting tag '{}' to Long property", tag.getName());
+        LOG.debug("Converting tag '{}' to Long property", tag.getName());
         final XMLObject value = values.get(0);
         assert value != null;
         return xmlObjectToLong(value);
@@ -94,27 +94,26 @@ public class LongConfigurationLookupStrategy extends AbstractMetadataDrivenConfi
      * @return the converted value, or null
      */
     @Nullable private Long xmlObjectToLong(@Nonnull final XMLObject object) {
-        if (object instanceof XSString) {
-            final String value = ((XSString) object).getValue();
+        if (object instanceof XSString val) {
+            final String value = val.getValue();
             return value != null ? Long.decode(value) : null;
-        } else if (object instanceof XSBoolean) {
-            final XSBooleanValue value = ((XSBoolean) object).getValue();
+        } else if (object instanceof XSBoolean val) {
+            final XSBooleanValue value = val.getValue();
             return value != null ? (value.getValue() ? 1L : 0L) : null;
-        } else if (object instanceof XSInteger) {
-            final Integer value = ((XSInteger) object).getValue(); 
+        } else if (object instanceof XSInteger val) {
+            final Integer value = val.getValue(); 
             return value != null ? value.longValue() : null;
-        } else if (object instanceof XSDateTime) {
-            final Instant dt = ((XSDateTime) object).getValue();
+        } else if (object instanceof XSDateTime val) {
+            final Instant dt = val.getValue();
             return dt != null ? dt.toEpochMilli() : null;
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                final String value = wc.getTextContent();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                final String value = val.getTextContent();
                 return value != null ? Long.decode(value) : null;
             }
         }
         
-        log.error("Unsupported conversion to Long from XMLObject type ({})", object.getClass().getName());
+        LOG.error("Unsupported conversion to Long from XMLObject type ({})", object.getClass().getName());
         return null;
     }
 // Checkstyle: CyclomaticComplexity ON
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/SetConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/SetConfigurationLookupStrategy.java
index d8e423299..171cfba0b 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/SetConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/SetConfigurationLookupStrategy.java
@@ -45,13 +45,13 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class SetConfigurationLookupStrategy<T> extends AbstractCollectionConfigurationLookupStrategy<T,Set<T>> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(SetConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(SetConfigurationLookupStrategy.class);
 
     /** {@inheritDoc} */
     @Override
     @Nullable protected Set<T> doTranslate(@Nonnull final IdPAttribute tag) {
 
-        log.debug("Converting tag '{}' to Set<{}> property", tag.getId(), getPropertyType().getSimpleName());
+        LOG.debug("Converting tag '{}' to Set<{}> property", tag.getId(), getPropertyType().getSimpleName());
         
         final List<IdPAttributeValue> values = tag.getValues();
         final Set<T> result = new HashSet<>(values.size());
@@ -60,7 +60,7 @@ public class SetConfigurationLookupStrategy<T> extends AbstractCollectionConfigu
                 try {
                     result.add(createInstanceFromString(sval.getValue()));
                 } catch (final Exception e) {
-                    log.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
+                    LOG.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
                 }
             } else if (value instanceof XMLObjectAttributeValue xmlValue) {
                 if (getPropertyType().isInstance(xmlValue.getValue())) {
@@ -75,7 +75,7 @@ public class SetConfigurationLookupStrategy<T> extends AbstractCollectionConfigu
     @Override
     @Nullable protected Set<T> doTranslate(@Nonnull final Attribute tag) {
         
-        log.debug("Converting tag '{}' to Set<> property", tag.getName());
+        LOG.debug("Converting tag '{}' to Set<> property", tag.getName());
         
         final List<XMLObject> values = tag.getAttributeValues();
         final Set<T> result = new HashSet<>(values.size());
@@ -87,7 +87,7 @@ public class SetConfigurationLookupStrategy<T> extends AbstractCollectionConfigu
                 try {
                     result.add(createInstanceFromString(converted));
                 } catch (final Exception e) {
-                    log.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
+                    LOG.error("Error converting tag value into {}", getPropertyType().getSimpleName(), e);
                 }
             } else if (getPropertyType().isInstance(value)) {
                 result.add(getPropertyType().cast(value));
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/StringConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/StringConfigurationLookupStrategy.java
index 688fafe65..b1688668a 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/StringConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/StringConfigurationLookupStrategy.java
@@ -49,7 +49,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class StringConfigurationLookupStrategy extends AbstractMetadataDrivenConfigurationLookupStrategy<String> {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(StringConfigurationLookupStrategy.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(StringConfigurationLookupStrategy.class);
 
     /** {@inheritDoc} */
     @Override
@@ -57,17 +57,17 @@ public class StringConfigurationLookupStrategy extends AbstractMetadataDrivenCon
         
         final List<IdPAttributeValue> values = tag.getValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getId());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getId());
             return null;
         }
 
-        log.debug("Converting tag '{}' to String property", tag.getId());
+        LOG.debug("Converting tag '{}' to String property", tag.getId());
         
         final IdPAttributeValue value = values.get(0);
-        if (value instanceof StringAttributeValue) {
-            return ((StringAttributeValue) value).getValue();
+        if (value instanceof StringAttributeValue strval) {
+            return strval.getValue();
         }
-        log.error("Tag '{}' contained non-string value, returning null");
+        LOG.error("Tag '{}' contained non-string value, returning null");
         return null;
     }
     
@@ -77,11 +77,11 @@ public class StringConfigurationLookupStrategy extends AbstractMetadataDrivenCon
         
         final List<XMLObject> values = tag.getAttributeValues();
         if (values.size() != 1) {
-            log.error("Tag '{}' contained multiple values, returning none", tag.getName());
+            LOG.error("Tag '{}' contained multiple values, returning none", tag.getName());
             return null;
         }
         
-        log.debug("Converting tag '{}' to String property", tag.getName());
+        LOG.debug("Converting tag '{}' to String property", tag.getName());
         final XMLObject value = values.get(0);
         assert value != null;
         return xmlObjectToString(value);
@@ -96,32 +96,30 @@ public class StringConfigurationLookupStrategy extends AbstractMetadataDrivenCon
      * @return the converted value, or null
      */
     @Nullable private String xmlObjectToString(@Nonnull final XMLObject object) {
-        if (object instanceof XSString) {
-            return ((XSString) object).getValue();
-        } else if (object instanceof XSURI) {
-            return ((XSURI) object).getURI();
-        } else if (object instanceof XSBoolean) {
-            final XSBooleanValue value = ((XSBoolean) object).getValue();
+        if (object instanceof XSString val) {
+            return val.getValue();
+        } else if (object instanceof XSURI val) {
+            return val.getURI();
+        } else if (object instanceof XSBoolean val) {
+            final XSBooleanValue value = val.getValue();
             return value != null ? (value.getValue() ? "1" : "0") : null;
-        } else if (object instanceof XSInteger) {
-            final Integer value = ((XSInteger) object).getValue();
+        } else if (object instanceof XSInteger val) {
+            final Integer value = val.getValue();
             return value != null ? value.toString() : null;
-        } else if (object instanceof XSDateTime) {
-            final Instant dt = ((XSDateTime) object).getValue();
+        } else if (object instanceof XSDateTime val) {
+            final Instant dt = val.getValue();
             return dt != null ? Long.toString(dt.toEpochMilli()) : null;
-        } else if (object instanceof XSBase64Binary) {
-            return ((XSBase64Binary) object).getValue();
-        } else if (object instanceof XSAny) {
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                return wc.getTextContent();
+        } else if (object instanceof XSBase64Binary val) {
+            return val.getValue();
+        } else if (object instanceof XSAny val) {
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                return val.getTextContent();
             }
         }
         
-        log.error("Unsupported conversion to String from XMLObject type ({})", object.getClass().getName());
+        LOG.error("Unsupported conversion to String from XMLObject type ({})", object.getClass().getName());
         return null;
     }
 // Checkstyle: CyclomaticComplexity ON
 
-    
 }
\ No newline at end of file
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/package-info.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/package-info.java
index 978a9c840..aa92cfede 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/package-info.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/package-info.java
@@ -15,9 +15,11 @@
  * limitations under the License.
  */
 
-/**
 /**
  * Configuration support for leveraging {@link net.shibboleth.idp.attribute.IdPAttribute} objects
  * decoded from SAML metadata for access to settings.
  */
-package net.shibboleth.idp.attribute.config;
\ No newline at end of file
+ at NonnullElements
+package net.shibboleth.idp.attribute.config;
+
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java
index 15e832d53..a74514a51 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/AttributeContext.java
@@ -28,7 +28,6 @@ import javax.annotation.concurrent.NotThreadSafe;
 import org.opensaml.messaging.context.BaseContext;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -41,10 +40,10 @@ import net.shibboleth.shared.collection.CollectionSupport;
 public final class AttributeContext extends BaseContext {
 
     /** The attributes tracked by this context. */
-    @Nonnull @NonnullElements private Map<String,IdPAttribute> attributes;
+    @Nonnull private Map<String,IdPAttribute> attributes;
     
     /** The attributes tracked by this context prior to filtering. */
-    @Nonnull @NonnullElements private Map<String,IdPAttribute> unfilteredAttributes;
+    @Nonnull private Map<String,IdPAttribute> unfilteredAttributes;
     
     /** Whether attribute release consent was obtained from the subject. */
     private boolean consented;
@@ -60,7 +59,7 @@ public final class AttributeContext extends BaseContext {
      * 
      * @return the collection of attributes indexed by attribute ID
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, IdPAttribute> getIdPAttributes() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, IdPAttribute> getIdPAttributes() {
         return attributes;
     }
 
@@ -71,8 +70,7 @@ public final class AttributeContext extends BaseContext {
      * 
      * @return this context
      */
-    @Nonnull public AttributeContext setIdPAttributes(
-            @Nullable @NonnullElements final Collection<IdPAttribute> newAttributes) {
+    @Nonnull public AttributeContext setIdPAttributes(@Nullable final Collection<IdPAttribute> newAttributes) {
         
         if (newAttributes != null) {
             attributes = newAttributes.
@@ -93,7 +91,7 @@ public final class AttributeContext extends BaseContext {
      * 
      * @return the collection of attributes indexed by attribute ID
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, IdPAttribute> getUnfilteredIdPAttributes() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, IdPAttribute> getUnfilteredIdPAttributes() {
         return unfilteredAttributes;
     }
 
@@ -105,7 +103,7 @@ public final class AttributeContext extends BaseContext {
      * @return this context
      */
     @Nonnull public AttributeContext setUnfilteredIdPAttributes(
-            @Nullable @NonnullElements final Collection<IdPAttribute> newAttributes) {
+            @Nullable final Collection<IdPAttribute> newAttributes) {
         if (null != newAttributes) {
             unfilteredAttributes = newAttributes.
                     stream().
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/package-info.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/package-info.java
index 7af005d32..fb173c1b8 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/package-info.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/context/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Context to do with Attribute Manipulation.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.context;
 
-package net.shibboleth.idp.attribute.context;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/package-info.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/package-info.java
index 9d9a6cc23..43d64de44 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/package-info.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/package-info.java
@@ -21,5 +21,7 @@
  * their values are encoded in to protocol-specific formats by means of 
  * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder}s.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute;
 
-package net.shibboleth.idp.attribute;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
index 330395cc4..4ba2b4685 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
@@ -26,7 +26,6 @@ import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -72,8 +71,7 @@ public interface AttributeTranscoderRegistry extends IdentifiedComponent {
      * 
      * @return map of locale-based names
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDisplayNames(
-            @Nonnull final IdPAttribute attribute);
+    @Nonnull @NotLive @Unmodifiable public Map<Locale,String> getDisplayNames(@Nonnull final IdPAttribute attribute);
 
     /**
      * Get the localized descriptions for an {@link IdPAttribute}.
@@ -82,8 +80,7 @@ public interface AttributeTranscoderRegistry extends IdentifiedComponent {
      * 
      * @return map of locale-based descriptions
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDescriptions(
-            @Nonnull final IdPAttribute attribute);
+    @Nonnull @NotLive @Unmodifiable public Map<Locale,String> getDescriptions(@Nonnull final IdPAttribute attribute);
     
     /**
      * Obtains a set of instructions for encoding an input {@link IdPAttribute} into a target type.
@@ -97,7 +94,7 @@ public interface AttributeTranscoderRegistry extends IdentifiedComponent {
      * 
      * @return a collection of {@link TranscodingRule} objects, possibly empty
      */
-    @Nonnull @NonnullElements @Unmodifiable
+    @Nonnull @Unmodifiable @NotLive
     Collection<TranscodingRule> getTranscodingRules(@Nonnull final IdPAttribute from, @Nonnull final Class<?> to);
 
     /**
@@ -112,8 +109,7 @@ public interface AttributeTranscoderRegistry extends IdentifiedComponent {
      * 
      * @return a collection of {@link TranscodingRule} objects, possibly empty
      */
-    @Nonnull @NonnullElements @Unmodifiable <T> Collection<TranscodingRule> getTranscodingRules(
-            @Nonnull final T from);
+    @Nonnull @Unmodifiable @NotLive <T> Collection<TranscodingRule> getTranscodingRules(@Nonnull final T from);
 
     /**
      * Interface to a naming function that allows an object to be turned into a unique string name.
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscoderSupport.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscoderSupport.java
index 64f93d515..57e2716f3 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscoderSupport.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscoderSupport.java
@@ -28,9 +28,7 @@ import net.shibboleth.shared.logic.ConstraintViolationException;
 public final class TranscoderSupport {
 
     /** Constructor. */
-    private TranscoderSupport() {
-        
-    }
+    private TranscoderSupport() {}
 
     /**
      * Pull an {@link AttributeTranscoder} object out of the rule provided.
@@ -46,6 +44,7 @@ public final class TranscoderSupport {
             throws ConstraintViolationException {
         Constraint.isNotNull(rule, "Transcoding rule cannot be null");
         
+        @SuppressWarnings("unchecked")
         final AttributeTranscoder<T> transcoder =
                 rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER, AttributeTranscoder.class);
         return Constraint.isNotNull(transcoder, "AttributeTranscoder not found in properties");
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
index c37bd1493..fc5a0940f 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
@@ -35,7 +35,6 @@ import com.google.common.collect.ImmutableMap;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.annotation.constraint.Live;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -48,13 +47,13 @@ import net.shibboleth.shared.primitive.StringSupport;
 public final class TranscodingRule {
 
     /** Underlying map containing the rule. */
-    @Nonnull @NonnullElements private final Map<String,Object> rule;
+    @Nonnull private final Map<String,Object> rule;
     
     /** Map of locale-specific display names. */
-    @Nonnull @NonnullElements private Map<Locale,String> displayNames;
+    @Nonnull private Map<Locale,String> displayNames;
     
     /** Map of locale-specific descriptions. */
-    @Nonnull @NonnullElements private Map<Locale,String> descriptions;
+    @Nonnull private Map<Locale,String> descriptions;
     
     /**
      * Constructor.
@@ -71,7 +70,7 @@ public final class TranscodingRule {
      *  </li>
      * </ul>
      */
-    public TranscodingRule(@Nonnull @NonnullElements @ParameterName(name="map") final Map<String,Object> map) {
+    public TranscodingRule(@Nonnull @ParameterName(name="map") final Map<String,Object> map) {
         rule = new HashMap<>(map);
         displayNames = processDisplayNames();
         descriptions = processDescriptions();
@@ -92,7 +91,7 @@ public final class TranscodingRule {
      *  </li>
      * </ul>
      */
-    public TranscodingRule(@Nonnull @NonnullElements @ParameterName(name="properties") final Properties properties) {
+    public TranscodingRule(@Nonnull @ParameterName(name="properties") final Properties properties) {
         rule = new HashMap<>(properties.size());
         properties.forEach(
                 (k,v) -> {
@@ -109,7 +108,7 @@ public final class TranscodingRule {
      * 
      * @return the map representing the rule
      */
-    @Nonnull @NonnullElements @Live public Map<String,Object> getMap() {
+    @Nonnull @Live public Map<String,Object> getMap() {
         return rule;
     }
     
@@ -158,7 +157,7 @@ public final class TranscodingRule {
      * 
      * @return map of locale-based names
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDisplayNames() {
+    @Nonnull @NotLive @Unmodifiable public Map<Locale,String> getDisplayNames() {
         return displayNames;
     }
 
@@ -167,7 +166,7 @@ public final class TranscodingRule {
      * 
      * @return map of locale-based descriptions
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDescriptions() {
+    @Nonnull @NotLive @Unmodifiable public Map<Locale,String> getDescriptions() {
         return descriptions;
     }
     
@@ -177,7 +176,7 @@ public final class TranscodingRule {
      * 
      * @return the map of display names
      */
-    @Nonnull @NonnullElements private Map<Locale,String> processDisplayNames() {
+    @Nonnull @NotLive @Unmodifiable private Map<Locale,String> processDisplayNames() {
         
         final ImmutableMap.Builder<Locale,String> builder = ImmutableMap.builder();
         final HashSet<Locale> inserted = new HashSet<>();
@@ -210,7 +209,7 @@ public final class TranscodingRule {
      * 
      * @return the map of descriptions
      */
-    @Nonnull @NonnullElements private Map<Locale,String> processDescriptions() {
+    @Nonnull @NotLive @Unmodifiable private Map<Locale,String> processDescriptions() {
         
         final ImmutableMap.Builder<Locale,String> builder = ImmutableMap.builder();
         final HashSet<Locale> inserted = new HashSet<>();
diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/package-info.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/package-info.java
index ca23131bd..2f72b1ad4 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/package-info.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/package-info.java
@@ -18,5 +18,7 @@
 /**
  * APIs for transcoding of attributes.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.transcoding;
 
-package net.shibboleth.idp.attribute.transcoding;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilter.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilter.java
index e82d102c4..f82ffa3d8 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilter.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilter.java
@@ -23,7 +23,7 @@ import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.IdentifiedComponent;
 
@@ -36,7 +36,7 @@ public interface AttributeFilter extends IdentifiedComponent {
      * 
      * @return immutable collection of filter policies
      */
-    @Nonnull @NonnullElements @Unmodifiable List<AttributeFilterPolicy> getFilterPolicies();
+    @Nonnull @Unmodifiable @NotLive List<AttributeFilterPolicy> getFilterPolicies();
 
     /**
      * Filters attributes and values. This filtering process may remove attributes and values but must never add them.
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java
index 546117001..3f5d87f00 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicy.java
@@ -16,6 +16,7 @@
  */
 
 package net.shibboleth.idp.attribute.filter;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -30,8 +31,8 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule.Tristate;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.ParameterName;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent;
@@ -58,7 +59,7 @@ public final class AttributeFilterPolicy extends AbstractIdentifiedInitializable
     @Nonnull private final PolicyRequirementRule rule;
 
     /** Filters to be used on attribute values. */
-    @Nonnull @NonnullElements private final List<AttributeRule> valuePolicies;
+    @Nonnull private final List<AttributeRule> valuePolicies;
 
     /** Log prefix. */
     @Nullable private String logPrefix;
@@ -72,8 +73,7 @@ public final class AttributeFilterPolicy extends AbstractIdentifiedInitializable
      */
     public AttributeFilterPolicy(@Nonnull @NotEmpty @ParameterName(name="policyId") final String policyId,
             @Nonnull final @ParameterName(name="requirementRule") PolicyRequirementRule requirementRule,
-            @Nullable @NonnullElements final @ParameterName(name="attributeRules")
-    Collection<AttributeRule> attributeRules) {
+            @Nullable final @ParameterName(name="attributeRules") Collection<AttributeRule> attributeRules) {
         setId(policyId);
 
         rule = Constraint.isNotNull(requirementRule, "Attribute filter policy activiation criterion can not be null");
@@ -99,7 +99,7 @@ public final class AttributeFilterPolicy extends AbstractIdentifiedInitializable
      * 
      * @return attribute rules that are in effect if this policy is in effect
      */
-    @Nonnull @NonnullElements @Unmodifiable public List<AttributeRule> getAttributeRules() {
+    @Nonnull @Unmodifiable @NotLive public List<AttributeRule> getAttributeRules() {
         return valuePolicies;
     }
 
@@ -173,9 +173,7 @@ public final class AttributeFilterPolicy extends AbstractIdentifiedInitializable
      * @return Returns the logPrefix.
      */
     public String getLogPrefix() {
-        String result;
-
-        result = logPrefix;
+        String result = logPrefix;
         if (null == result) {
             result = new StringBuffer("Attribute Filter Policy '").append(getId()).append("' ").toString();
             logPrefix = result;
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeRule.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeRule.java
index c03174709..b2e680c84 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeRule.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/AttributeRule.java
@@ -38,22 +38,9 @@ import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
-// Checkstyle: Javadoc OFF
-// See https://github.com/checkstyle/checkstyle/issues/3351
 /**
  * Represents a value filtering rule for a particular attribute.
- *
- * <pre>
- * {@code
- * <element name="AttributeRule" type="afp:AttributeRuleType">
- *     <annotation>
- *         <documentation>A rule that describes how values of an attribute will be filtered.</documentation>
- *     </annotation>
- * </element>
- * }
- * </pre>
  */
-//Checkstyle: Javadoc ON
 @ThreadSafe
 public final class AttributeRule extends AbstractIdentifiableInitializableComponent implements
         UnmodifiableComponent {
@@ -64,23 +51,7 @@ public final class AttributeRule extends AbstractIdentifiableInitializableCompon
     /** Log prefix. */
     @Nullable private String logPrefix;
 
-    // Checkstyle: Javadoc OFF
-    // See https://github.com/checkstyle/checkstyle/issues/3351
-    /**
-     * Unique ID of the attribute this rule applies to.
-     *
-     * <pre>
-     * {@code
-     * <attribute name="attributeID" type="string" use="required">
-     *     <annotation>
-     *         <documentation>The ID of the attribute to which this rule applies.</documentation>
-     *     </annotation>
-     * </attribute>
-     * }
-     * </pre>
-     */
-    // Checkstyle: Javadoc ON
-
+    /** Unique ID of the attribute this rule applies to. */
     @NonnullAfterInit private String attributeId;
 
     /**
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/BaseBridgingClass.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/BaseBridgingClass.java
index 1ec196470..2a1be194a 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/BaseBridgingClass.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/BaseBridgingClass.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.filter;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
@@ -38,10 +39,10 @@ public abstract class BaseBridgingClass extends AbstractIdentifiableInitializabl
         IdentifiableComponent, DestructableComponent {
 
     /** The object we are bridging to. */
-    private final Object bridgedObject;
+    @Nonnull private final Object bridgedObject;
 
     /** Log prefix. */
-    private String logPrefix;
+    @Nullable private String logPrefix;
 
     /**
      * Constructor.
@@ -51,15 +52,6 @@ public abstract class BaseBridgingClass extends AbstractIdentifiableInitializabl
         bridgedObject = Constraint.isNotNull(base, "base rule can not be null");
     }
 
-    /** {@inheritDoc} */
-    @Override
-    protected void doDestroy() {
-        if (bridgedObject instanceof DestructableComponent) {
-            ((DestructableComponent) bridgedObject).destroy();
-        }
-        super.doDestroy();
-    }
-
     /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
@@ -69,6 +61,15 @@ public abstract class BaseBridgingClass extends AbstractIdentifiableInitializabl
         super.doInitialize();
         logPrefix = null;
     }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void doDestroy() {
+        if (bridgedObject instanceof DestructableComponent) {
+            ((DestructableComponent) bridgedObject).destroy();
+        }
+        super.doDestroy();
+    }
     
     /**
      * Get the prefix for logging.
@@ -76,15 +77,12 @@ public abstract class BaseBridgingClass extends AbstractIdentifiableInitializabl
      * @return Returns the logPrefix.
      */
     protected String getLogPrefix() {
-        String result;
-
-        result = logPrefix;
+        String result = logPrefix;
         if (null == result) {
             result = new StringBuffer("Bridging for class '").append(getId()).append("' ").toString();
             logPrefix = result;
         }
         return result;
     }
-
-    
-}
+   
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
index a336bd7bb..6793d05be 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
@@ -26,7 +26,6 @@ import javax.annotation.concurrent.ThreadSafe;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -40,9 +39,8 @@ public interface Matcher extends IdentifiedComponent {
     @Nonnull static final Matcher MATCHES_ALL = new Matcher() {
 
         /** {@inheritDoc} */
-        @Nullable @NonnullElements @Unmodifiable @NotLive
-        public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
-                @Nonnull final AttributeFilterContext filterContext) {
+        @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+                @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
             return CollectionSupport.copyToSet(attribute.getValues());
         }
 
@@ -57,9 +55,8 @@ public interface Matcher extends IdentifiedComponent {
     @Nonnull static final Matcher MATCHES_NONE = new Matcher() {
 
         /** {@inheritDoc} */
-        @Nullable @NonnullElements @Unmodifiable @NotLive
-        public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
-                @Nonnull final AttributeFilterContext filterContext) {
+        @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+                @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
             return CollectionSupport.emptySet();
         }
 
@@ -74,9 +71,8 @@ public interface Matcher extends IdentifiedComponent {
     @Nonnull static final Matcher MATCHER_FAILS = new Matcher() {
 
         /** {@inheritDoc} */
-        @Nullable @NonnullElements @Unmodifiable @NotLive
-        public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
-                @Nonnull final AttributeFilterContext filterContext) {
+        @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+                @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
             return null;
         }
 
@@ -94,7 +90,7 @@ public interface Matcher extends IdentifiedComponent {
      * @param filterContext the filter context
      * @return The result of this rule. Null if we failed.
      */
-    @Nullable @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+    @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext);
 
 }
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
index d7d3b82fe..241fa2c4c 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.filter.context;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -38,7 +37,6 @@ import org.slf4j.Logger;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.filter.AttributeFilter;
 import net.shibboleth.idp.attribute.filter.AttributeFilterException;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -192,7 +190,7 @@ public final class AttributeFilterContext extends BaseContext {
      * 
      * @return attributes to be filtered
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<String,IdPAttribute> getPrefilteredIdPAttributes() {
+    @Nonnull @NotLive @Unmodifiable public Map<String,IdPAttribute> getPrefilteredIdPAttributes() {
         return prefilteredAttributes;
     }
 
@@ -204,7 +202,7 @@ public final class AttributeFilterContext extends BaseContext {
      * @return this context;
      */
     @Nonnull public AttributeFilterContext setPrefilteredIdPAttributes(
-            @Nullable @NonnullElements final Collection<IdPAttribute> attributes) {
+            @Nullable final Collection<IdPAttribute> attributes) {
 
         if (attributes != null) {
             prefilteredAttributes = attributes.
@@ -224,7 +222,7 @@ public final class AttributeFilterContext extends BaseContext {
      * 
      * @return attributes left after the filtering process has run
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, IdPAttribute> getFilteredIdPAttributes() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, IdPAttribute> getFilteredIdPAttributes() {
         return filteredAttributes;
     }
 
@@ -236,7 +234,7 @@ public final class AttributeFilterContext extends BaseContext {
      * @return this context
      */
     @Nonnull public AttributeFilterContext setFilteredIdPAttributes(
-            @Nullable @NonnullElements final Collection<IdPAttribute> attributes) {
+            @Nullable final Collection<IdPAttribute> attributes) {
 
         if (attributes != null) {
             filteredAttributes = attributes.
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
index 341b40be0..c0be53155 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
@@ -32,7 +32,6 @@ import org.opensaml.messaging.context.BaseContext;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.AttributeFilterException;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -68,8 +67,7 @@ public final class AttributeFilterWorkContext extends BaseContext {
      * 
      * @return collection of attribute values, indexed by ID, that are permitted to be released,
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive
-    public Map<String, Set<IdPAttributeValue>> getPermittedIdPAttributeValues() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, Set<IdPAttributeValue>> getPermittedIdPAttributeValues() {
         return CollectionSupport.copyToMap(permittedValues);
     }
 
@@ -86,8 +84,7 @@ public final class AttributeFilterWorkContext extends BaseContext {
      * not actually values of the attribute.
      */
     public void addPermittedIdPAttributeValues(@Nonnull @NotEmpty final String attributeId,
-            @Nullable @NonnullElements final Collection<IdPAttributeValue> attributeValues)
-                    throws AttributeFilterException {
+            @Nullable final Collection<IdPAttributeValue> attributeValues) throws AttributeFilterException {
         
         final BaseContext parent = getParent();
         if (!(parent instanceof AttributeFilterContext)) {
@@ -129,8 +126,7 @@ public final class AttributeFilterWorkContext extends BaseContext {
      * 
      * @return collection of attribute values, indexed by ID, that are not permitted to be released
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive
-    public Map<String, Set<IdPAttributeValue>> getDeniedAttributeValues() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, Set<IdPAttributeValue>> getDeniedAttributeValues() {
         return CollectionSupport.copyToMap(deniedValues);
     }
 
@@ -147,8 +143,7 @@ public final class AttributeFilterWorkContext extends BaseContext {
      *  values of the attribute
      */
     public void addDeniedIdPAttributeValues(@Nonnull @NotEmpty final String attributeId,
-            @Nullable @NonnullElements final Collection<IdPAttributeValue> attributeValues)
-                    throws AttributeFilterException {
+            @Nullable final Collection<IdPAttributeValue> attributeValues) throws AttributeFilterException {
         
         final BaseContext parent = getParent();
         if (!(parent instanceof AttributeFilterContext)) {
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/package-info.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/package-info.java
index 490b1d1f6..ac9763318 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/package-info.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/package-info.java
@@ -18,5 +18,7 @@
 /**
  * The contexts to do with attribute filtering.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.context;
 
-package net.shibboleth.idp.attribute.filter.context;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/package-info.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/package-info.java
index 2ccd144b1..5c1f95509 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/package-info.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/package-info.java
@@ -23,6 +23,7 @@
  * objects which retain or remove values for the attributes in the 
  * collection.
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.filter;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java
index 970462dbe..3557780a6 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java
@@ -41,8 +41,8 @@ import net.shibboleth.idp.attribute.filter.AttributeFilterException;
 import net.shibboleth.idp.attribute.filter.AttributeFilterPolicy;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterWorkContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
@@ -58,7 +58,7 @@ public class AttributeFilterImpl extends AbstractIdentifiableInitializableCompon
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeFilterImpl.class);
 
     /** Filter policies used by this engine. */
-    @Nonnull @NonnullElements private final List<AttributeFilterPolicy> filterPolicies;
+    @Nonnull private final List<AttributeFilterPolicy> filterPolicies;
 
     /** Log prefix. */
     @Nullable private String logPrefix;
@@ -73,13 +73,13 @@ public class AttributeFilterImpl extends AbstractIdentifiableInitializableCompon
      * @param policies filter policies used by this engine
      */
     public AttributeFilterImpl(@Nonnull @NotEmpty final String engineId,
-            @Nullable @NonnullElements final Collection<AttributeFilterPolicy> policies) {
+            @Nullable final Collection<AttributeFilterPolicy> policies) {
         setId(engineId);
         assert policies!=null;
         filterPolicies = CollectionSupport.copyToList(policies);
-        final Function<AttributeFilterContext,MetricContext> mcls
-            = new ChildContextLookup<>(MetricContext.class).compose(new RootContextLookup<>());
-        assert mcls!= null;
+        final Function<AttributeFilterContext,MetricContext> mcls =
+                new ChildContextLookup<>(MetricContext.class).compose(new RootContextLookup<>());
+        assert mcls != null;
         metricContextLookupStrategy = mcls;
     }
 
@@ -88,7 +88,8 @@ public class AttributeFilterImpl extends AbstractIdentifiableInitializableCompon
      * 
      * @return immutable collection of filter policies
      */
-    @Override @Nonnull @NonnullElements @Unmodifiable public List<AttributeFilterPolicy> getFilterPolicies() {
+    @Override
+    @Nonnull @Unmodifiable @NotLive public List<AttributeFilterPolicy> getFilterPolicies() {
         return filterPolicies;
     }
 
@@ -100,8 +101,8 @@ public class AttributeFilterImpl extends AbstractIdentifiableInitializableCompon
      * 
      * @throws AttributeFilterException thrown if there is a problem retrieving or applying the attribute filter policy
      */
-    @Override public void filterAttributes(@Nonnull final AttributeFilterContext filterContext)
-            throws AttributeFilterException {
+    @Override
+    public void filterAttributes(@Nonnull final AttributeFilterContext filterContext) throws AttributeFilterException {
         checkComponentActive();
 
         Constraint.isNotNull(filterContext, "Attribute filter context cannot be null");
@@ -127,7 +128,8 @@ public class AttributeFilterImpl extends AbstractIdentifiableInitializableCompon
                 assert key!=null;
                 final Collection<IdPAttributeValue> filteredAttributeValues = 
                         getFilteredValues(key, filterContext);
-                final Map<String, IdPAttribute> allFilteredAttributes = new HashMap<>(filterContext.getFilteredIdPAttributes());
+                final Map<String, IdPAttribute> allFilteredAttributes =
+                        new HashMap<>(filterContext.getFilteredIdPAttributes());
                 if (null != filteredAttributeValues && !filteredAttributeValues.isEmpty()) {
                     final IdPAttribute filteredAttribute;
                     try {
@@ -206,14 +208,13 @@ public class AttributeFilterImpl extends AbstractIdentifiableInitializableCompon
      * 
      * @return Returns the logPrefix.
      */
-    protected String getLogPrefix() {
-        String result;
-
-        result = logPrefix;
+    @Nonnull protected String getLogPrefix() {
+        String result = logPrefix;
         if (null == result) {
             result = new StringBuffer("Attribute filtering engine '").append(getId()).append("' ").toString();
             logPrefix = result;
         }
+        assert result != null;
         return result;
     }
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/package-info.java
index 7b86f3bed..5b32f9dbb 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/package-info.java
@@ -16,5 +16,7 @@
  */
 
 /** Implementations of core attribute filter functionality. */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.impl;
 
-package net.shibboleth.idp.attribute.filter.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java
index a8d34e714..bad141bec 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java
@@ -29,7 +29,6 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -59,7 +58,7 @@ public abstract class AbstractMatcher extends AbstractIdentifiableInitializableC
     /**
      * {@inheritDoc}
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+    @Nonnull @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
 
         final Set<IdPAttributeValue> matchedValues = new LinkedHashSet<>();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcher.java
index fdda2daeb..7ee78c1ce 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcher.java
@@ -17,6 +17,7 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import javax.annotation.Nonnull;
@@ -27,8 +28,7 @@ import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 
 /**
- * General {@link net.shibboleth.idp.attribute.filter.Matcher} for regexp comparison of strings in Attribute
- * Filters.
+ * General {@link Matcher} for regexp comparison of strings in Attribute Filters.
  */
 public abstract class AbstractRegexpStringMatcher extends AbstractMatcher {
 
@@ -54,6 +54,15 @@ public abstract class AbstractRegexpStringMatcher extends AbstractMatcher {
         pattern = Constraint.isNotNull(thePattern, "Pattern supplied to setPattern but not be null");
     }
 
+    /** {@inheritDoc} */
+    @Override
+    protected void doInitialize() throws ComponentInitializationException {
+        super.doInitialize();
+        if (null == pattern) {
+            throw new ComponentInitializationException(getLogPrefix() + " No regular expression provided"); 
+        }
+    }
+
     /**
      * Matches the given value against the provided regular expression.
      * 
@@ -73,14 +82,5 @@ public abstract class AbstractRegexpStringMatcher extends AbstractMatcher {
 
         return false;
     }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-        if (null == pattern) {
-            throw new ComponentInitializationException(getLogPrefix() + " No regular expression provided"); 
-        }
-    }
     
 }
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java
index 684812342..6586be0aa 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java
@@ -27,7 +27,7 @@ import net.shibboleth.idp.attribute.filter.Matcher;
 public abstract class AbstractStringMatcher extends AbstractMatcher implements Matcher {
 
     /** String to match for a positive evaluation. */
-    private String matchString;
+    @Nullable private String matchString;
 
     /** Whether the match evaluation is case sensitive. */
     private boolean caseSensitive;
@@ -86,4 +86,5 @@ public abstract class AbstractStringMatcher extends AbstractMatcher implements M
         }
         return value.equalsIgnoreCase(matchString);
     }
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java
index 33070f762..52eba3f89 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java
@@ -17,6 +17,7 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
@@ -35,9 +36,10 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class AttributeScopeRegexpMatcher extends AbstractRegexpStringMatcher {
 
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(AttributeScopeRegexpMatcher.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeScopeRegexpMatcher.class);
 
     /** {@inheritDoc} */
+    @Override
     public boolean compareAttributeValue(@Nullable final IdPAttributeValue value) {
 
         if (null == value) {
@@ -54,4 +56,4 @@ public class AttributeScopeRegexpMatcher extends AbstractRegexpStringMatcher {
         return false;
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueRegexpMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueRegexpMatcher.java
index 16a9488b2..08f7ce0fc 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueRegexpMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueRegexpMatcher.java
@@ -17,6 +17,7 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
@@ -37,7 +38,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class AttributeValueRegexpMatcher extends AbstractRegexpStringMatcher {
 
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(AttributeValueRegexpMatcher.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeValueRegexpMatcher.class);
 
     /** {@inheritDoc} */
     public boolean compareAttributeValue(@Nullable final IdPAttributeValue value) {
@@ -46,8 +47,8 @@ public class AttributeValueRegexpMatcher extends AbstractRegexpStringMatcher {
             return false;
         } else if (value instanceof EmptyAttributeValue) {
             return false;
-        } else if (value instanceof StringAttributeValue) {
-            return regexpCompare(((StringAttributeValue) value).getValue());
+        } else if (value instanceof StringAttributeValue strval) {
+            return regexpCompare(strval.getValue());
 
         } else {
             final String valueAsString = value.getNativeValue().toString();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueStringMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueStringMatcher.java
index 25ff88735..d8e5ebd40 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueStringMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeValueStringMatcher.java
@@ -45,8 +45,8 @@ public class AttributeValueStringMatcher extends AbstractStringMatcher {
 
         if (null == value) {
             return false;
-        } else if (value instanceof EmptyAttributeValue) {
-            switch (((EmptyAttributeValue) value).getValue()) {
+        } else if (value instanceof EmptyAttributeValue empty) {
+            switch (empty.getValue()) {
                 case NULL_VALUE:
                     return super.stringCompare(null);
                 case ZERO_LENGTH_VALUE:
@@ -55,8 +55,8 @@ public class AttributeValueStringMatcher extends AbstractStringMatcher {
                     throw new IllegalArgumentException("Unknown empty attribute value type " + value.getNativeValue());
             }
             
-        } else if (value instanceof StringAttributeValue) {
-            return super.stringCompare(((StringAttributeValue) value).getValue());
+        } else if (value instanceof StringAttributeValue strval) {
+            return super.stringCompare(strval.getValue());
         } else {
             final String valueAsString = value.getNativeValue().toString();
             log.warn("{} Object supplied to StringAttributeValue comparison"
@@ -65,4 +65,5 @@ public class AttributeValueStringMatcher extends AbstractStringMatcher {
             return super.stringCompare(valueAsString);
         }
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
index 073432e9a..3cb2c0ef4 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
@@ -38,7 +38,6 @@ import net.shibboleth.idp.attribute.filter.FilterScriptContextExtender;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -51,8 +50,7 @@ import net.shibboleth.shared.scripting.AbstractScriptEvaluator;
 import net.shibboleth.shared.scripting.EvaluableScript;
 
 /**
- * A {@link net.shibboleth.idp.attribute.filter.Matcher} that delegates to a JSR-223 script for its actual processing.
- * 
+ * A {@link Matcher} that delegates to a JSR-223 script for its actual processing.
  */
 @ThreadSafe
 public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent implements Matcher,
@@ -68,7 +66,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
     @NonnullAfterInit private MatcherScriptEvaluator scriptEvaluator;
 
     /** Extenders for script context. */
-    @Nonnull @NonnullElements private Collection<FilterScriptContextExtender> contextExtenders;
+    @Nonnull private Collection<FilterScriptContextExtender> contextExtenders;
 
     /** Custom object for script. */
     @Nullable private Object customObject;
@@ -125,8 +123,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
      * 
      * @since 5.0.0
      */
-    public void setScriptContextExtenders(
-            @Nullable @NonnullElements final Collection<FilterScriptContextExtender> extenders) {
+    public void setScriptContextExtenders(@Nullable final Collection<FilterScriptContextExtender> extenders) {
         checkSetterPreconditions();
 
         if (extenders != null) {
@@ -173,8 +170,9 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
      * 
      * {@inheritDoc}
      */
-    @Override @Nullable @NonnullElements @Unmodifiable public Set<IdPAttributeValue> getMatchingValues(
-            @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
+    @Override
+    @Nullable @Unmodifiable public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
+            @Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(attribute, "Attribute to be filtered cannot be null");
         Constraint.isNotNull(filterContext, "AttributeFilterContext cannot be null");
         
@@ -237,8 +235,8 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
          * 
          * @return script result
          */
-        @Nullable @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> execute(
-                @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
+        @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> execute(@Nonnull final IdPAttribute attribute,
+                @Nonnull final AttributeFilterContext filterContext) {
             final Object result = evaluate(attribute, filterContext);
             if (null == result) {
                 log.error("{} Matcher script did not return a result", getLogPrefix());
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/package-info.java
index 154e3946f..f68eda3ad 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/package-info.java
@@ -20,6 +20,7 @@
  * 
  * The classes in this package all implement {@link net.shibboleth.idp.attribute.filter.Matcher} 
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
index 3e7d6de65..d3bd0bc31 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
@@ -69,7 +69,7 @@ public abstract class AbstractComposedMatcher extends AbstractIdentifiableInitia
      * 
      * @return the composed matchers
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public List<Matcher> getComposedMatchers() {
+    @Nonnull @Unmodifiable @NotLive public List<Matcher> getComposedMatchers() {
         assert matchers != null;
         return matchers;
     }
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java
index 582880153..d633aad90 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java
@@ -32,8 +32,8 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -52,9 +52,9 @@ public class AndMatcher extends AbstractComposedMatcher {
      * If any of the matchers fail then failure is returned
      * {@link Matcher}. {@inheritDoc}
      */
-    @Override @Nullable @NonnullElements @NotLive
-    public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
-            @Nonnull final AttributeFilterContext filterContext) {
+    @Override
+    @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+            @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(attribute, "Attribute to be filtered can not be null");
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
         
@@ -98,4 +98,4 @@ public class AndMatcher extends AbstractComposedMatcher {
         return MoreObjects.toStringHelper(this).add("Composed Matchers : ", getComposedMatchers()).toString();
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java
index cc1e3c59a..fe0531a9e 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java
@@ -31,8 +31,8 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -76,7 +76,8 @@ public final class NotMatcher extends AbstractIdentifiableInitializableComponent
      * A given attribute value is considered to have matched if it is not returned by the composed {@link Matcher}.
      * {@inheritDoc}
      */
-    @Override @Nullable @NonnullElements @NotLive public Set<IdPAttributeValue> getMatchingValues(
+    @Override
+    @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(attribute, "Attribute to be filtered can not be null");
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java
index 67f9aaf43..1daeb2821 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java
@@ -29,8 +29,8 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -44,9 +44,9 @@ import net.shibboleth.shared.logic.Constraint;
 public class OrMatcher extends AbstractComposedMatcher {
 
     /** {@inheritDoc} */
-    @Override @Nullable @NonnullElements @NotLive
-    public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
-            @Nonnull final AttributeFilterContext filterContext) {
+    @Override
+    @Nullable @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+            @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(attribute, "Attribute to be filtered can not be null");
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
 
@@ -75,4 +75,4 @@ public class OrMatcher extends AbstractComposedMatcher {
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/package-info.java
index a99d9be06..10ca9ce28 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/package-info.java
@@ -21,5 +21,7 @@
  * The classes in this package all implement {@link net.shibboleth.idp.attribute.filter.Matcher} 
  */
 
+ at NonnullElements
 package net.shibboleth.idp.attribute.filter.matcher.logic.impl;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
index f124f37cb..f26e99c83 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
@@ -34,7 +34,6 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.saml.metadata.ScopesContainer;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -67,7 +66,7 @@ public abstract class AbstractMatchesShibMDScopeMatcher
      * {@inheritDoc}
      */
 // CheckStyle: CyclomaticComplexity OFF
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
+    @Nonnull @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
 
         final SAMLMetadataContext issuerContext = filterContext.getIssuerMetadataContext();
@@ -106,6 +105,7 @@ public abstract class AbstractMatchesShibMDScopeMatcher
         }
         
         for (final IdPAttributeValue value : attribute.getValues()) {
+            assert value != null;
             final String compareString = getCompareString(value);
             
             if (compareString == null) {
@@ -128,14 +128,14 @@ public abstract class AbstractMatchesShibMDScopeMatcher
      * @param value the vaue we are interested.
      * @return the string, or null if empty of not relevant.
      */
-    @Nullable @NotEmpty protected abstract String getCompareString(IdPAttributeValue value);
+    @Nullable @NotEmpty protected abstract String getCompareString(@Nonnull final IdPAttributeValue value);
 
     /**
      * Return a string which is to be prepended to all log messages.
      * 
      * @return "Attribute Filter '<filterID>' :"
      */
-    protected String getLogPrefix() {
+    @Nonnull protected String getLogPrefix() {
         // local cache of cached entry to allow unsynchronised clearing.
         String prefix = logPrefix;
         if (null == prefix) {
@@ -145,6 +145,7 @@ public abstract class AbstractMatchesShibMDScopeMatcher
                 logPrefix = prefix;
             }
         }
+        assert prefix != null;
         return prefix;
     }
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
index 8cdf93694..2be5310e5 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
@@ -52,8 +52,8 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
@@ -61,7 +61,6 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.xml.DOMTypeSupport;
 
-
 /**
  * Matcher that checks whether an attribute is enumerated in an SP's metadata as a required or optional attribute. Also
  * supports simple value filtering.
@@ -177,7 +176,8 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
 
 // Checkstyle: CyclomaticComplexity|ReturnCount|MethodLength OFF
     /** {@inheritDoc} */
-    @Override @Nonnull public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
+    @Override
+    @Nonnull public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
             @Nonnull final AttributeFilterContext filterContext) {
         checkComponentActive();
 
@@ -291,7 +291,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
      * 
      * @return the extracted map of requested attributes or null
      */
-    @Nullable @NonnullElements private Multimap<String,IdPAttribute> getMappedRequestedAttributes(
+    @Nullable private Multimap<String,IdPAttribute> getMappedRequestedAttributes(
             @Nonnull final AttributeConsumingService service) {
         
         final List<AttributesMapContainer> containerList =
@@ -342,7 +342,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
      * @return the result of the filter
      */
     @Nonnull private Set<IdPAttributeValue> filterValues(@Nonnull final IdPAttribute attribute,
-            @Nonnull @NonnullElements final List<IdPAttributeValue> requestedValues) {
+            @Nonnull final List<IdPAttributeValue> requestedValues) {
 
         if (null == requestedValues || requestedValues.isEmpty()) {
             log.debug("{} Attribute {} found in metadata and no values specified", getLogPrefix(), attribute.getId());
@@ -366,10 +366,8 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
      * 
      * @return the result of the filter
      */
-    @Nonnull @Unmodifiable @NonnullElements private Set<IdPAttributeValue> filterValues(
-            @Nonnull final String attributeToLog,
-            @Nonnull final IdPAttribute attribute, 
-            @Nonnull @NonnullElements final List<XMLObject> requestedValues) {
+    @Nonnull @Unmodifiable @NotLive private Set<IdPAttributeValue> filterValues(@Nonnull final String attributeToLog,
+            @Nonnull final IdPAttribute attribute, @Nonnull final List<XMLObject> requestedValues) {
 
         if (requestedValues.isEmpty()) {
             log.debug("{} Attribute {} found in metadata and no values specified", getLogPrefix(), attributeToLog);
@@ -381,6 +379,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
         for (final IdPAttributeValue attributeValue : attribute.getValues()) {
             if (attributeValue instanceof StringAttributeValue) {
                 for (final XMLObject xmlObj : requestedValues) {
+                    assert xmlObj != null;
                     if (match(xmlObj, ((StringAttributeValue) attributeValue).getValue())) {
                         result.add(attributeValue);
                     }
@@ -403,7 +402,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
      * @param attributeValue the candidate value to match against
      * @return true iff the two parameters are non-null and match
      */
-    private boolean match(final XMLObject xmlObj, final String attributeValue) {
+    private boolean match(@Nonnull final XMLObject xmlObj, @Nonnull final String attributeValue) {
         // This is a substitute for a decoder layer that can generate
         // internal comparable value objects out of AttributeValue elements.
         // Short of that, some kind of pluggable comparison object with
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeScopeMatchesShibMDScope.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeScopeMatchesShibMDScope.java
index 1b6215f45..ac071eb83 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeScopeMatchesShibMDScope.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeScopeMatchesShibMDScope.java
@@ -17,6 +17,7 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.saml.impl;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
@@ -31,16 +32,16 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class AttributeScopeMatchesShibMDScope extends AbstractMatchesShibMDScopeMatcher {
 
     /** Class logger. */
-    private static final Logger LOG = LoggerFactory.getLogger(AttributeScopeMatchesShibMDScope.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(AttributeScopeMatchesShibMDScope.class);
 
     /** {@inheritDoc} */
-    @Nullable @NotEmpty protected String getCompareString(final IdPAttributeValue value) {
-        if (value instanceof ScopedStringAttributeValue) {
-            return StringSupport.trimOrNull(((ScopedStringAttributeValue) value).getScope());
+    @Nullable @NotEmpty protected String getCompareString(@Nonnull final IdPAttributeValue value) {
+        if (value instanceof ScopedStringAttributeValue scoped) {
+            return StringSupport.trimOrNull(scoped.getScope());
         }
         LOG.warn( "{} value of type {} and value {} not suitable for filtering",
                 getLogPrefix(), value.getClass(), value.getNativeValue());
         return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeValueMatchesShibMDScope.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeValueMatchesShibMDScope.java
index 77d988d23..65b720960 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeValueMatchesShibMDScope.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeValueMatchesShibMDScope.java
@@ -17,6 +17,7 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.saml.impl;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
@@ -32,11 +33,10 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class AttributeValueMatchesShibMDScope extends AbstractMatchesShibMDScopeMatcher {
 
     /** Class logger. */
-    private static final Logger LOG = LoggerFactory.getLogger(AttributeValueMatchesShibMDScope.class);
-
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(AttributeValueMatchesShibMDScope.class);
     
     /** {@inheritDoc} */
-    @Nullable @NotEmpty protected String getCompareString(final IdPAttributeValue value) {
+    @Nullable @NotEmpty protected String getCompareString(@Nonnull final IdPAttributeValue value) {
         if (value instanceof ScopedStringAttributeValue) {
             LOG.warn("{} lossy test of AttributeValueMatchesShibMDScope against scoped Attribute value {}",
                     getLogPrefix(), value.getNativeValue());
@@ -49,4 +49,5 @@ public class AttributeValueMatchesShibMDScope extends AbstractMatchesShibMDScope
                     getLogPrefix(), value.getClass(), value.getNativeValue());
         return null;
     }
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/package-info.java
index 182cc2f47..9613e6aa7 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/package-info.java
@@ -18,6 +18,7 @@
 /**
  * This is where the attribute matchers that understand SAML live. 
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.matcher.saml.impl;
 
-
-package net.shibboleth.idp.attribute.filter.matcher.saml.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerPolicyRule.java
index 43139cf93..345ac794f 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerPolicyRule.java
@@ -34,7 +34,6 @@ public class AttributeIssuerPolicyRule extends AbstractStringPolicyRule {
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeIssuerPolicyRule.class);
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
 
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerRegexpPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerRegexpPolicyRule.java
index 5f3770ba3..d5fccbbb6 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerRegexpPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeIssuerRegexpPolicyRule.java
@@ -34,7 +34,6 @@ public class AttributeIssuerRegexpPolicyRule extends AbstractRegexpPolicyRule {
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeIssuerRegexpPolicyRule.class);
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
 
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterPolicyRule.java
index f13641e41..9e6b4ca08 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterPolicyRule.java
@@ -34,7 +34,6 @@ public class AttributeRequesterPolicyRule extends AbstractStringPolicyRule {
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeRequesterPolicyRule.class);
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
 
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterRegexpPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterRegexpPolicyRule.java
index cafee4d95..2c5587086 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterRegexpPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/AttributeRequesterRegexpPolicyRule.java
@@ -34,7 +34,6 @@ public class AttributeRequesterRegexpPolicyRule extends AbstractRegexpPolicyRule
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeRequesterRegexpPolicyRule.class);
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
 
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRule.java
index e39894a12..b869b6c1b 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRule.java
@@ -71,7 +71,6 @@ public class NumOfAttributeValuesPolicyRule extends AbstractPolicyRule {
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         checkComponentActive();
         
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java
index 1ac4c7653..e6c127d59 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.filter.policyrule.filtercontext.impl;
 import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
@@ -55,15 +56,15 @@ public class PredicatePolicyRule extends AbstractPolicyRule {
      * 
      * @param predicate what to set.
      */
-    public void setRulePredicate(final Predicate<ProfileRequestContext> predicate) {
+    public void setRulePredicate(@Nullable final Predicate<ProfileRequestContext> predicate) {
         rulePredicate = predicate;
     }
 
     /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
+        
         if (null == getRulePredicate()) {
-            log.error("{} Provided Rule Predicate was null", getLogPrefix());
             throw new ComponentInitializationException("Provided Rule Predicate was null");
         }
     }
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNamePolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNamePolicyRule.java
index c863ca26b..baedd49be 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNamePolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNamePolicyRule.java
@@ -34,7 +34,6 @@ public class PrincipalNamePolicyRule extends AbstractStringPolicyRule {
     @Nonnull private final Logger log = LoggerFactory.getLogger(PrincipalNamePolicyRule.class);
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
 
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNameRegexpPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNameRegexpPolicyRule.java
index 9b3f365ef..f6320e4e8 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNameRegexpPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PrincipalNameRegexpPolicyRule.java
@@ -34,7 +34,6 @@ public class PrincipalNameRegexpPolicyRule extends AbstractRegexpPolicyRule {
     @Nonnull private final Logger log = LoggerFactory.getLogger(PrincipalNameRegexpPolicyRule.class);
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
 
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRule.java
index 6ea8851f5..5a85d6e7b 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRule.java
@@ -37,7 +37,6 @@ public class ProfilePolicyRule extends AbstractStringPolicyRule {
     @Nonnull private final Logger log = LoggerFactory.getLogger(ProfilePolicyRule.class);
     
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         checkComponentActive();
         final ProfileRequestContext pc = filterContext.getProfileRequestContextLookupStrategy().apply(filterContext);
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
index de23a26b4..edc592407 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
@@ -32,7 +32,6 @@ import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractStringPolicyR
 public class ProxiedRequesterPolicyRule extends AbstractStringPolicyRule {
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         checkComponentActive();
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java
index b34e5d34d..0674440b6 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRule.java
@@ -32,7 +32,6 @@ import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractRegexpPolicyR
 public class ProxiedRequesterRegexpPolicyRule extends AbstractRegexpPolicyRule {
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         checkComponentActive();
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/package-info.java
index e962ddcd4..60589c478 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/package-info.java
@@ -22,6 +22,7 @@
  * {@link net.shibboleth.idp.attribute.filter.context.AttributeFilterContext} and
  * implement {@link net.shibboleth.idp.attribute.filter.Matcher}. 
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.filter.policyrule.filtercontext.impl;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractPolicyRule.java
index 3c09d7c25..d84ddc7ea 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractPolicyRule.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.attribute.filter.policyrule.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -28,12 +31,13 @@ public abstract class AbstractPolicyRule extends AbstractIdentifiableInitializab
         PolicyRequirementRule {
 
     /** The String used to prefix log message. */
-    private String logPrefix;
+    @Nullable private String logPrefix;
 
     /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
+        
         // Id is now definitive, reset log prefix
         logPrefix = null;
 
@@ -44,7 +48,7 @@ public abstract class AbstractPolicyRule extends AbstractIdentifiableInitializab
      * 
      * @return "Attribute Filter '<filterID>' :"
      */
-    protected String getLogPrefix() {
+    @Nonnull protected String getLogPrefix() {
         // local cache of cached entry to allow unsynchronised clearing.
         String prefix = logPrefix;
         if (null == prefix) {
@@ -54,6 +58,9 @@ public abstract class AbstractPolicyRule extends AbstractIdentifiableInitializab
                 logPrefix = prefix;
             }
         }
+        
+        assert prefix != null;
         return prefix;
     }
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractRegexpPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractRegexpPolicyRule.java
index a243e44cc..2bda4a585 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractRegexpPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractRegexpPolicyRule.java
@@ -32,7 +32,7 @@ import net.shibboleth.shared.logic.Constraint;
 public abstract class AbstractRegexpPolicyRule extends AbstractPolicyRule {
 
     /** Regular expression to match. */
-    private Pattern pattern;
+    @NonnullAfterInit private Pattern pattern;
 
     /**
      * Gets the regular expression to match.
@@ -56,6 +56,7 @@ public abstract class AbstractRegexpPolicyRule extends AbstractPolicyRule {
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
+        
         if (null == pattern) {
             throw new ComponentInitializationException(getLogPrefix() + " No regular expression provided");
         }
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractStringPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractStringPolicyRule.java
index 1f9075123..bb5286f21 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractStringPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/AbstractStringPolicyRule.java
@@ -28,7 +28,7 @@ import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 public abstract class AbstractStringPolicyRule extends AbstractPolicyRule implements PolicyRequirementRule {
 
     /** String to match for a positive evaluation. */
-    private String matchString;
+    @Nullable private String matchString;
 
     /** Whether the match evaluation is case sensitive. */
     private boolean caseSensitive = true;
@@ -92,4 +92,5 @@ public abstract class AbstractStringPolicyRule extends AbstractPolicyRule implem
         }
         return Tristate.FALSE;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/DirectionPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/DirectionPolicyRule.java
index 7aaa76c1c..037b8cddb 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/DirectionPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/DirectionPolicyRule.java
@@ -61,7 +61,6 @@ public class DirectionPolicyRule extends AbstractPolicyRule {
     }
     
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         return matchDirection.equals(filterContext.getDirection()) ? Tristate.TRUE : Tristate.FALSE;
     }
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
index 26aee03e4..9451094e8 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
@@ -34,7 +34,6 @@ import net.shibboleth.idp.attribute.filter.FilterScriptContextExtender;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -63,7 +62,7 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
     @NonnullAfterInit private PolicyRuleScriptEvaluator scriptEvaluator;
 
     /** Extenders for script context. */
-    @Nonnull @NonnullElements private Collection<FilterScriptContextExtender> contextExtenders;
+    @Nonnull private Collection<FilterScriptContextExtender> contextExtenders;
 
     /** The custom object we inject into all scripts. */
     @Nullable private Object customObject;
@@ -119,8 +118,7 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
      * 
      * @since 5.0.0
      */
-    public void setScriptContextExtenders(
-            @Nullable @NonnullElements final Collection<FilterScriptContextExtender> extenders) {
+    public void setScriptContextExtenders(@Nullable final Collection<FilterScriptContextExtender> extenders) {
         checkSetterPreconditions();
         if (extenders != null) {
             contextExtenders = CollectionSupport.copyToList(extenders);
@@ -128,24 +126,8 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
             contextExtenders = CollectionSupport.emptyList();
         }
     }
-    
-    /**
-     * Calculate the PolicyRule.
-     * <p>
-     * When the script is evaluated, the following property will be available via the {@link ScriptContext}:
-     * </p>
-     * 
-     * <ul>
-     * <li><code>filterContext</code> - the current instance of {@link AttributeFilterContext}</li>
-     * </ul>
-     * 
-     * <p>
-     * The script <strong>MUST</strong> return a {@link java.lang.Boolean}
-     * </p>
-     *
-     * {@inheritDoc}
-     */
-    @Override
+
+    /** {@inheritDoc} */
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(filterContext, "Attribute filter context cannot be null");
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/package-info.java
index 32cccb0b5..5b8b6626f 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Classes which implement{@link net.shibboleth.idp.attribute.filter.PolicyRequirementRule}.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.policyrule.impl;
 
-package net.shibboleth.idp.attribute.filter.policyrule.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java
index 2eb47c586..becafc3f8 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java
@@ -25,7 +25,6 @@ import javax.annotation.Nullable;
 import com.google.common.base.MoreObjects;
 
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -46,7 +45,7 @@ public abstract class AbstractComposedPolicyRule extends AbstractIdentifiableIni
      * Called "subsidiaries" to allow easier parsing.
      * @param theRules the rules to be composed.
      */
-    public void setSubsidiaries(@Nullable @NonnullElements final List<PolicyRequirementRule> theRules) {
+    public void setSubsidiaries(@Nullable final List<PolicyRequirementRule> theRules) {
         checkSetterPreconditions();
         if (theRules != null) {
             rules = CollectionSupport.copyToList(theRules);
@@ -60,7 +59,7 @@ public abstract class AbstractComposedPolicyRule extends AbstractIdentifiableIni
      * 
      * @return the composed matchers
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public List<PolicyRequirementRule> getComposedRules() {
+    @Nonnull @Unmodifiable @NotLive public List<PolicyRequirementRule> getComposedRules() {
         return rules;
     }
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRule.java
index d4e92bf25..f755c58ec 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRule.java
@@ -52,7 +52,6 @@ public class AndPolicyRule extends AbstractComposedPolicyRule {
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/NotPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/NotPolicyRule.java
index 2654da52c..30838926b 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/NotPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/NotPolicyRule.java
@@ -69,7 +69,6 @@ public final class NotPolicyRule extends AbstractIdentifiableInitializableCompon
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
         checkComponentActive();
@@ -88,4 +87,5 @@ public final class NotPolicyRule extends AbstractIdentifiableInitializableCompon
     @Override public String toString() {
         return MoreObjects.toStringHelper(this).add("Negated Policy Rule", negatedRule).toString();
     }
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRule.java
index 1de50cad3..379a46fff 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRule.java
@@ -52,7 +52,6 @@ public class OrPolicyRule extends AbstractComposedPolicyRule {
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
         checkComponentActive();
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/package-info.java
index 66fc254d5..e17aef922 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/package-info.java
@@ -20,5 +20,7 @@
  * 
  * The classes in this package all implement {@link net.shibboleth.idp.attribute.filter.Matcher} 
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.policyrule.logic.impl;
 
-package net.shibboleth.idp.attribute.filter.policyrule.logic.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributeExactPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributeExactPolicyRule.java
index faefe54ad..591f8abca 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributeExactPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributeExactPolicyRule.java
@@ -22,7 +22,6 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -64,8 +63,7 @@ public abstract class AbstractEntityAttributeExactPolicyRule extends AbstractEnt
 
     /** {@inheritDoc} */
     @Override
-    protected boolean entityAttributeValueMatches(
-            @Nonnull @NotEmpty @NonnullElements final Set<String> entityAttributeValues) {
+    protected boolean entityAttributeValueMatches(@Nonnull @NotEmpty final Set<String> entityAttributeValues) {
         return entityAttributeValues.contains(value);
     }
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributePolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributePolicyRule.java
index 9b27d747f..19c471206 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributePolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityAttributePolicyRule.java
@@ -52,8 +52,8 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractPolicyRule;
 import net.shibboleth.idp.saml.xmlobject.ScopedValue;
+import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -161,7 +161,6 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
 
         Constraint.isNotNull(filterContext, "Context must be supplied");
@@ -214,8 +213,7 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
      * 
      * @return true if the value matches, false if not
      */
-    protected abstract boolean entityAttributeValueMatches(
-            @Nonnull @NotEmpty @NonnullElements final Set<String> entityAttributeValues);
+    protected abstract boolean entityAttributeValueMatches(@Nonnull @NotEmpty final Set<String> entityAttributeValues);
 
     /**
      * Gets the entity attribute values from the given metadata.
@@ -229,7 +227,7 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
      */
 // Checkstyle: CyclomaticComplexity OFF
     private void getEntityAttributeValues(@Nonnull final XMLObject metadataObject,
-            @Nullable @NotEmpty final String name, @Nonnull @NonnullElements final Set<String> valueAccumulator) {
+            @Nullable @NotEmpty final String name, @Nonnull @Live final Set<String> valueAccumulator) {
         
         if (nameFormat == null) {
             getMappedEntityAttributeValues(metadataObject, valueAccumulator);
@@ -278,8 +276,8 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
                         new Object[] {getLogPrefix(), name, getAttributeName(), getNameFormat(),});
                 
                 valueAccumulator.addAll(
-                        entityAttribute.getAttributeValues().stream().filter(v -> v != null).map(
-                                this::getStringValue).collect(Collectors.toList()));
+                        entityAttribute.getAttributeValues().stream().map(
+                                this::getStringValue).collect(Collectors.toUnmodifiableList()));
             }
         }
     }
@@ -292,7 +290,7 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
      * @param valueAccumulator stores values of the designated attribute
      */
     private void getMappedEntityAttributeValues(@Nonnull final XMLObject metadataObject,
-            @Nonnull @NonnullElements final Set<String> valueAccumulator) {
+            @Nonnull @Live final Set<String> valueAccumulator) {
         
         final Multimap<String, IdPAttribute> mappedAttributes = getMappedRequestedAttributes(metadataObject);
         if (mappedAttributes == null || mappedAttributes.isEmpty()) {
@@ -325,7 +323,7 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
      * 
      * @return the extracted map of requested attributes or null
      */
-    @Nullable @NonnullElements private Multimap<String,IdPAttribute> getMappedRequestedAttributes(
+    @Nullable private Multimap<String,IdPAttribute> getMappedRequestedAttributes(
             @Nonnull final XMLObject metadataObject) {
         
         final List<AttributesMapContainer> containerList =
@@ -354,17 +352,17 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
     @Nullable private String getStringValue(@Nonnull final XMLObject object) {
         String retVal = null;
 
-        if (object instanceof XSString) {
+        if (object instanceof XSString val) {
 
-            retVal = ((XSString) object).getValue();
+            retVal = val.getValue();
 
-        } else if (object instanceof XSURI) {
+        } else if (object instanceof XSURI val) {
 
-            retVal = ((XSURI) object).getURI();
+            retVal = val.getURI();
 
-        } else if (object instanceof XSBoolean) {
+        } else if (object instanceof XSBoolean val) {
 
-            final XSBooleanValue bval = ((XSBoolean) object).getValue();
+            final XSBooleanValue bval = val.getValue();
             if (bval != null) {
                 final Boolean flag = bval.getValue();
                 if (flag != null) {
@@ -372,35 +370,34 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
                 }
             }
 
-        } else if (object instanceof XSInteger) {
+        } else if (object instanceof XSInteger val) {
 
-            final Integer ival =  ((XSInteger) object).getValue();
+            final Integer ival =  val.getValue();
             if (ival != null) {
                 retVal = ival.toString();
             }
 
-        } else if (object instanceof XSDateTime) {
+        } else if (object instanceof XSDateTime val) {
 
-            final Instant dt = ((XSDateTime) object).getValue();
+            final Instant dt = val.getValue();
             if (dt != null) {
                 retVal = DOMTypeSupport.instantToString(dt);
             } else {
                 retVal = null;
             }
 
-        } else if (object instanceof XSBase64Binary) {
+        } else if (object instanceof XSBase64Binary val) {
 
-            retVal = ((XSBase64Binary) object).getValue();
+            retVal = val.getValue();
             
-        } else if (object instanceof ScopedValue) {
+        } else if (object instanceof ScopedValue val) {
             
-            retVal = ((ScopedValue) object).getValue();
+            retVal = val.getValue();
 
-        } else if (object instanceof XSAny) {
+        } else if (object instanceof XSAny val) {
 
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                retVal = wc.getTextContent();
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                retVal = val.getTextContent();
             } else {
                 retVal = null;
             }
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java
index a950be914..c6887fbae 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java
@@ -116,7 +116,6 @@ public abstract class AbstractEntityGroupPolicyRule extends AbstractPolicyRule {
             @Nonnull final AttributeFilterContext filterContext);
     
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext input) {
         checkComponentActive();
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractNameIDFormatExactPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractNameIDFormatExactPolicyRule.java
index 9db2fe6a6..5ecbf4dc3 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractNameIDFormatExactPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractNameIDFormatExactPolicyRule.java
@@ -84,9 +84,7 @@ public abstract class AbstractNameIDFormatExactPolicyRule extends AbstractPolicy
             @Nonnull final AttributeFilterContext filterContext);
 
     /** {@inheritDoc} */
-    @Override
-    @Nonnull
-    public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
+    @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         checkComponentActive();
         
         final SSODescriptor role = getEntitySSODescriptor(filterContext);
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
index a13f25764..3cb5ff50b 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
@@ -33,7 +33,6 @@ import org.slf4j.Logger;
 
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractPolicyRule;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -50,7 +49,7 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
     @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractRegistrationAuthorityPolicyRule.class);
 
     /** The registrars to match against. */
-    @Nonnull @NonnullElements private Set<String> registrars;
+    @Nonnull private Set<String> registrars;
 
     /** What to say if no MDRPI is present. */
     private boolean matchIfMetadataSilent;
@@ -67,7 +66,7 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
      * 
      * @return the issuers
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<String> getRegistrars() {
+    @Nonnull @Unmodifiable @NotLive public Set<String> getRegistrars() {
         return CollectionSupport.copyToSet(registrars);
     }
 
@@ -76,7 +75,7 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
      * 
      * @param theIssuers candidate registrars
      */
-    public void setRegistrars(@Nonnull @NonnullElements final Collection<String> theIssuers) {
+    public void setRegistrars(@Nonnull final Collection<String> theIssuers) {
         Constraint.isNotNull(theIssuers, "Registrar collection cannot be null");
         
         registrars = new LinkedHashSet<>(theIssuers.size());
@@ -157,7 +156,6 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
         final RegistrationInfo info = getRegistrationInfo(filterContext);
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/package-info.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/package-info.java
index c8ced5ea8..89777651b 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/package-info.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * This is where the attribute policy rules that understand SAML live. 
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 
-package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java
index 4de6117b8..cc081641b 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java
@@ -46,7 +46,6 @@ import net.shibboleth.idp.attribute.PairwiseIdStore;
 import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.annotation.constraint.NonNegative;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -98,7 +97,7 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
     private int transactionIsolation = Connection.TRANSACTION_SERIALIZABLE;
 
     /** Error messages that signal a transaction should be retried. */
-    @Nonnull @NonnullElements private Collection<String> retryableErrors;
+    @Nonnull private Collection<String> retryableErrors;
 
     /** If non-null we doing local locking. */
     private ReadWriteLock readWriteLock;
@@ -273,7 +272,7 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
      * 
      * @return retryable messages
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Collection<String> getRetryableErrors() {
+    @Nonnull @NotLive @Unmodifiable public Collection<String> getRetryableErrors() {
         return retryableErrors;
     }
     
@@ -283,7 +282,7 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
      * 
      * @param errors retryable messages
      */
-    public void setRetryableErrors(@Nullable @NonnullElements final Collection<String> errors) {
+    public void setRetryableErrors(@Nullable final Collection<String> errors) {
         checkSetterPreconditions();
         
         retryableErrors = CollectionSupport.copyToList(StringSupport.normalizeStringCollection(errors));
@@ -910,8 +909,8 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
      * 
      * @throws SQLException thrown if there is a problem reading the information from the database
      */
-    @Nonnull @NonnullElements @Live private List<PairwiseId> buildIdentifierEntries(
-            @Nonnull final ResultSet resultSet) throws SQLException {
+    @Nonnull @Live private List<PairwiseId> buildIdentifierEntries(@Nonnull final ResultSet resultSet)
+            throws SQLException {
         
         final ArrayList<PairwiseId> entries = new ArrayList<>();
     
@@ -987,7 +986,7 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
          * @return what the encapsulated {@link Connection} returns
          * @throws SQLException if encapsulated {@link Connection} does
          */
-        public PreparedStatement prepareStatement(final String sql) throws SQLException {
+        @Nonnull public PreparedStatement prepareStatement(final String sql) throws SQLException {
             final PreparedStatement statement = connection.prepareStatement(sql);
             statement.setQueryTimeout((int) queryTimeout.toSeconds());
             return statement;
@@ -1000,7 +999,7 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
             connection.commit();
         }
 
-        @Override
+        /** {@inheritDoc} */
         public void close()  {
             try {
                 connection.close();
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/package-info.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/package-info.java
index 550f2e3ea..18ded67a9 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/package-info.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implementations of general attribute functionality.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.impl;
 
-package net.shibboleth.idp.attribute.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
index 105b76562..7b600d908 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.transcoding.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -34,7 +33,6 @@ import org.springframework.context.ApplicationContext;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry.NamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -50,7 +48,7 @@ public class AttributeRegistryServiceStrategy extends AbstractIdentifiableInitia
         NonnullFunction<ApplicationContext,AbstractServiceableComponent<AttributeTranscoderRegistry>> {
 
     /** Name of bean to supply naming function registry property. */
-    @Nullable @NonnullElements private Collection<NamingFunction<?>> namingRegistry;
+    @Nullable private Collection<NamingFunction<?>> namingRegistry;
     
     /** Optional factory function for building extended activation conditions. */
     @Nullable private Function<Map<String,Object>,Predicate<ProfileRequestContext>> extendedConditionFactory;
@@ -64,11 +62,11 @@ public class AttributeRegistryServiceStrategy extends AbstractIdentifiableInitia
      * @param namingFunctions collection of functions to install
      */
     @Autowired
-    public void setNamingRegistry(@Nullable @NonnullElements final Collection<NamingFunction<?>> namingFunctions) {
+    public void setNamingRegistry(@Nullable final Collection<NamingFunction<?>> namingFunctions) {
         checkSetterPreconditions();
         
         if (namingFunctions != null) {
-            namingRegistry = List.copyOf(namingFunctions);
+            namingRegistry = CollectionSupport.copyToList(namingFunctions);
         } else {
             namingRegistry = CollectionSupport.emptyList();
         }
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
index 18624c7d1..fe6b0970b 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
@@ -63,16 +63,16 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeTranscoderRegistryImpl.class);
     
     /** Registry of transcoding instructions for a given "name" and type of object. */
-    @Nonnull @NonnullElements private final Map<String,Multimap<Class<?>,TranscodingRule>> transcodingRegistry;
+    @Nonnull private final Map<String,Multimap<Class<?>,TranscodingRule>> transcodingRegistry;
     
     /** Registry of display name mappings associated with internal attribute IDs. */
-    @Nonnull @NonnullElements private final Map<String,Map<Locale,String>> displayNameRegistry;
+    @Nonnull private final Map<String,Map<Locale,String>> displayNameRegistry;
     
     /** Registry of description mappings associated with internal attribute IDs. */
-    @Nonnull @NonnullElements private final Map<String,Map<Locale,String>> descriptionRegistry;
+    @Nonnull private final Map<String,Map<Locale,String>> descriptionRegistry;
     
     /** Registry of naming functions for supported object types. */
-    @Nonnull @NonnullElements private final Map<Class<?>,Function<?,String>> namingFunctionRegistry;
+    @Nonnull private final Map<Class<?>,Function<?,String>> namingFunctionRegistry;
     
     /** Optional factory function for building extended activation conditions. */
     @Nullable private Function<Map<String,Object>,Predicate<ProfileRequestContext>> extendedConditionFactory;
@@ -109,15 +109,13 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
      * 
      * @param registry collection of naming functions for indexing
      */
-    public void setNamingRegistry(@Nullable @NonnullElements final Collection<NamingFunction<?>> registry) {
+    public void setNamingRegistry(@Nullable final Collection<NamingFunction<?>> registry) {
         checkSetterPreconditions();
         
         namingFunctionRegistry.clear();
         
         if (registry != null) {
-            registry.forEach(nf -> {
-                namingFunctionRegistry.put(nf.getType(), nf.getFunction());
-                });
+            registry.forEach(nf -> namingFunctionRegistry.put(nf.getType(), nf.getFunction()));
         }
     }
 
@@ -162,7 +160,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
                 
                 final Collection<AttributeTranscoder<?>> transcoders = getAttributeTranscoders(mapping);
                 for (final AttributeTranscoder<?> transcoder : transcoders) {
-                    assert transcoder!=null;
+                    assert transcoder != null;
                     addMapping(internalId, transcoder, mapping.getMap());
                 }
             } else {
@@ -187,33 +185,31 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
     }
     
     /** {@inheritDoc} */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDisplayNames(
-            @Nonnull final IdPAttribute attribute) {
+    @Nonnull @NotLive @Unmodifiable public Map<Locale,String> getDisplayNames(@Nonnull final IdPAttribute attribute) {
         checkComponentActive();
         Constraint.isNotNull(attribute, "IdPAttribute cannot be null");
      
         final Map<Locale, String> map = displayNameRegistry.get(attribute.getId()); 
-        if (map!=null) {
+        if (map != null) {
             return map;
         }
         return CollectionSupport.emptyMap();
     }
 
     /** {@inheritDoc} */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Map<Locale,String> getDescriptions(
-            @Nonnull final IdPAttribute attribute) {
+    @Nonnull @NotLive @Unmodifiable public Map<Locale,String> getDescriptions(@Nonnull final IdPAttribute attribute) {
         checkComponentActive();
         Constraint.isNotNull(attribute, "IdPAttribute cannot be null");
         
         final Map<Locale, String> map = descriptionRegistry.get(attribute.getId()); 
-        if (map!=null) {
+        if (map != null) {
             return map;
         }
         return CollectionSupport.emptyMap();
     }
     
     /** {@inheritDoc} */
-    @Nonnull @NonnullElements @Unmodifiable public Collection<TranscodingRule> getTranscodingRules(
+    @Nonnull @Unmodifiable @NotLive public Collection<TranscodingRule> getTranscodingRules(
             @Nonnull final IdPAttribute from, @Nonnull final Class<?> to) {
         checkComponentActive();
         Constraint.isNotNull(from, "IdPAttribute cannot be null");
@@ -236,8 +232,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
     }
 
     /** {@inheritDoc} */
-    @Nonnull @NonnullElements @Unmodifiable public <T> Collection<TranscodingRule> getTranscodingRules(
-            @Nonnull final T from) {
+    @Nonnull @Unmodifiable @NotLive public <T> Collection<TranscodingRule> getTranscodingRules(@Nonnull final T from) {
         checkComponentActive();
         Constraint.isNotNull(from, "Input object cannot be null");
         
@@ -252,7 +247,8 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         final Function<?,String> namingFunction = namingFunctionRegistry.get(effectiveType);
         
         // Don't know if we can work around this cast or not.
-        @SuppressWarnings("unchecked") final String id = ((Function<? super T,String>) namingFunction).apply(from);
+        @SuppressWarnings("unchecked")
+        final String id = ((Function<? super T,String>) namingFunction).apply(from);
         if (id != null) {
             final Multimap<Class<?>,TranscodingRule> propertyCollections = transcodingRegistry.get(id);
             
@@ -271,8 +267,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
      * 
      * @return transcoders to install under a copy of each ruleset's {@link #PROP_TRANSCODER} property
      */
-    @Nonnull @NonnullElements private Collection<AttributeTranscoder<?>> getAttributeTranscoders(
-            @Nonnull final TranscodingRule rule) {
+    @Nonnull private Collection<AttributeTranscoder<?>> getAttributeTranscoders(@Nonnull final TranscodingRule rule) {
         
         AttributeTranscoder<?> transcoder = rule.get(PROP_TRANSCODER, AttributeTranscoder.class);
         if (transcoder != null) {
@@ -290,8 +285,8 @@ public class AttributeTranscoderRegistryImpl extends AbstractIdentifiableInitial
         final ApplicationContext appContext = getApplicationContext();
         if (appContext != null) {
             for (final String id : StringSupport.stringToList(beanNames, " ")) {
-                assert id!=null;
                 try {
+                    assert id != null;
                     transcoder = appContext.getBean(id, AttributeTranscoder.class);
                     transcoder.initialize();
                     transcoders.add(transcoder);
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java
index f0642b8f2..c5a0974d5 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/TranscodingRuleLoader.java
@@ -35,7 +35,8 @@ import org.springframework.core.io.FileSystemResource;
 
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.shared.annotation.ParameterName;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.PredicateSupport;
@@ -51,7 +52,7 @@ public class TranscodingRuleLoader {
     @Nonnull private Logger log = LoggerFactory.getLogger(TranscodingRuleLoader.class);
     
     /** Rules loaded. */
-    private @Nonnull @NonnullElements final Collection<TranscodingRule> rules;
+    @Nonnull private final Collection<TranscodingRule> rules;
     
     /**
      * Load rules from all files found below a directory root.
@@ -69,17 +70,17 @@ public class TranscodingRuleLoader {
      * @throws IOException if an error occurs
      */
     public TranscodingRuleLoader(@Nonnull @ParameterName(name="dir") final Path dir,
-            @Nullable @NonnullElements @ParameterName(name="extensions") final Collection<String> extensions)
+            @Nullable @ParameterName(name="extensions") final Collection<String> extensions)
                     throws IOException {
         log.debug("Loading rules from directory ({})", dir);
-        rules = new ArrayList<>();
+        final Collection<TranscodingRule> holder = new ArrayList<>();
         
         try (final DirectoryStream<Path> dirstream  = Files.newDirectoryStream(dir)) {
             for (final Path child : dirstream) {
                 final File file =  child.toFile();
                 if (file.isDirectory()) {
                     try {
-                        rules.addAll(new TranscodingRuleLoader(child, extensions).getRules());
+                        holder.addAll(new TranscodingRuleLoader(child, extensions).getRules());
                     } catch (final IOException e) {
                         log.error("Failed to load rules from directory ({})", file, e);
                     }
@@ -91,7 +92,7 @@ public class TranscodingRuleLoader {
                         if (rule.getMap().isEmpty()) {
                             log.info("Transcoding file {} contained no rules", child);
                         } else {
-                            rules.add(rule);
+                            holder.add(rule);
                         }
                     } catch (final IOException e) {
                         log.error("Failed to load rule from file ({})", file, e);
@@ -101,6 +102,8 @@ public class TranscodingRuleLoader {
                 }
             }
         }
+        
+        rules = CollectionSupport.copyToList(holder);
     }
 
     /**
@@ -123,8 +126,7 @@ public class TranscodingRuleLoader {
      *
      * @param maps a collection of maps to build rules around directly.
      */
-    public TranscodingRuleLoader(
-            @Nonnull @NonnullElements @ParameterName(name="maps") final Collection<Map<String,Object>> maps) {
+    public TranscodingRuleLoader(@Nonnull @ParameterName(name="maps") final Collection<Map<String,Object>> maps) {
         Constraint.isNotNull(maps, "Input collection cannot be null");
         
         rules = maps
@@ -133,7 +135,7 @@ public class TranscodingRuleLoader {
                     assert m!= null;
                     return new TranscodingRule(m);
                     })
-                .collect(CollectionSupport.nonnullCollector(Collectors.toList()))
+                .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList()))
                 .get();
     }
 
@@ -142,7 +144,7 @@ public class TranscodingRuleLoader {
      * 
      * @return collection of rules
      */
-    @Nonnull @NonnullElements public Collection<TranscodingRule> getRules() {
+    @Nonnull @Unmodifiable @NotLive public Collection<TranscodingRule> getRules() {
         return rules;
     }
     
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/package-info.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/package-info.java
index b0a62a206..76a2b39a9 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/package-info.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implementation classes for attribute transcoding.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.transcoding.impl;
 
-package net.shibboleth.idp.attribute.transcoding.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java
index e8af0f030..0ee8cc712 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/SAMLAttributeDataConnector.java
@@ -41,6 +41,8 @@ import net.shibboleth.idp.attribute.resolver.AbstractDataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -52,19 +54,19 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class SAMLAttributeDataConnector extends AbstractDataConnector {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(SAMLAttributeDataConnector.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(SAMLAttributeDataConnector.class);
 
     /**
      * The way to get the list of (SAML) attributes from the resolution context.
      */
-    private Function<AttributeResolutionContext, List<Attribute>> attributesStrategy;
+    @NonnullAfterInit private Function<AttributeResolutionContext, List<Attribute>> attributesStrategy;
 
     /**
      * Gets the strategy for finding the (SAML) Attributes from the resolution context.
      * 
      * @return the required strategy.
      */
-    public Function<AttributeResolutionContext, List<Attribute>> getAttributesStrategy() {
+    @NonnullAfterInit public Function<AttributeResolutionContext, List<Attribute>> getAttributesStrategy() {
         return attributesStrategy;
     }
 
@@ -98,7 +100,7 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
      * @param object the object to encode
      * @return an {@link IdPAttributeValue}, or null if no encoding exists.
      */
-    protected IdPAttributeValue encodeValue(XMLObject object) {
+    @Nullable protected IdPAttributeValue encodeValue(XMLObject object) {
         if (null == object) {
             return null;
         } else if (object instanceof XSString) {
@@ -114,7 +116,7 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
      * @param inputString string to encode
      * @return encoded attribute value
      */
-    private IdPAttributeValue encodeString(@Nonnull final XSString inputString) {
+    @Nonnull private IdPAttributeValue encodeString(@Nonnull final XSString inputString) {
         final String value = inputString.getValue();
         assert(value != null);
         int separator = value.indexOf('@');
@@ -131,10 +133,10 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
      * @param attributeValues the input values
      * @return a list of values, Possibly empty.
      */
-    @Nullable protected List<IdPAttributeValue> encodeValues(final List<XMLObject> attributeValues) {
+    @Nonnull @Live protected List<IdPAttributeValue> encodeValues(final List<XMLObject> attributeValues) {
         final ArrayList<IdPAttributeValue> result = new ArrayList<>(attributeValues.size());
 
-        for (XMLObject object : attributeValues) {
+        for (final XMLObject object : attributeValues) {
             IdPAttributeValue val = encodeValue(object);
 
             result.add(val);
@@ -172,4 +174,4 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
         return retVal;
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/package-info.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/package-info.java
index 02b321159..6ce692c4a 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/package-info.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/testing/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Testing utility classes.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.dc.impl.testing;
 
-package net.shibboleth.idp.attribute.resolver.dc.impl.testing;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java
index 85ff85bdd..3d1fda86f 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockDataConnector.java
@@ -31,7 +31,6 @@ import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependen
 import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -47,7 +46,7 @@ public class MockDataConnector extends AbstractDataConnector {
     private int initializeCount;
 
     /** Static collection of values returned by this connector. */
-    @Nullable @NonnullElements private final Map<String, IdPAttribute> values;
+    @Nullable private final Map<String, IdPAttribute> values;
 
     /** Exception thrown by resolution. */
     @Nullable private ResolutionException resolutionException;
@@ -60,8 +59,7 @@ public class MockDataConnector extends AbstractDataConnector {
      * 
      * @throws ComponentInitializationException ...
      */
-    public MockDataConnector(@Nonnull @NotEmpty String id,
-            @Nullable @NonnullElements Map<String, IdPAttribute> connectorValues)
+    public MockDataConnector(@Nonnull @NotEmpty String id, @Nullable Map<String, IdPAttribute> connectorValues)
                     throws ComponentInitializationException {
         setId(id);
         values = connectorValues;
@@ -76,11 +74,9 @@ public class MockDataConnector extends AbstractDataConnector {
      * @param dcDepends The DC dependencies
      * @throws ComponentInitializationException if initialization failed
      */
-    public MockDataConnector(@Nonnull @NotEmpty String id, 
-            @Nullable @NonnullElements Map<String, IdPAttribute> connectorValues, 
-            @Nullable @NonnullElements Set<ResolverAttributeDefinitionDependency> attrDepends, 
-            @Nullable @NonnullElements Set<ResolverDataConnectorDependency> dcDepends
-            ) throws ComponentInitializationException {
+    public MockDataConnector(@Nonnull @NotEmpty String id, @Nullable Map<String, IdPAttribute> connectorValues, 
+            @Nullable Set<ResolverAttributeDefinitionDependency> attrDepends,
+            @Nullable Set<ResolverDataConnectorDependency> dcDepends) throws ComponentInitializationException {
         setAttributeDependencies(attrDepends == null? CollectionSupport.emptySet() : attrDepends);
         setDataConnectorDependencies(dcDepends == null? CollectionSupport.emptySet() : dcDepends);
         setId(id);
@@ -103,7 +99,7 @@ public class MockDataConnector extends AbstractDataConnector {
 
     /** {@inheritDoc} */
     @Override
-    @Nullable protected Map<String, IdPAttribute> doDataConnectorResolve(
+    @Nullable protected Map<String,IdPAttribute> doDataConnectorResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
         if (resolutionException != null) {
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticAttributeDefinition.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticAttributeDefinition.java
index baf6f1bc1..278dec6ad 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticAttributeDefinition.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticAttributeDefinition.java
@@ -62,16 +62,6 @@ public class MockStaticAttributeDefinition extends AbstractAttributeDefinition {
         return value;
     }
 
-    /** {@inheritDoc} */
-    @Override
-    @Nullable protected IdPAttribute doAttributeDefinitionResolve(
-            @Nonnull final AttributeResolutionContext resolutionContext,
-            @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
-        checkComponentActive();
-        log.debug("Attribute definition '{}': Resolving static attribute {}", getId(), value);
-        return value;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
@@ -82,5 +72,15 @@ public class MockStaticAttributeDefinition extends AbstractAttributeDefinition {
                     + " does not have an attribute set up.");
         }
     }
+
+    /** {@inheritDoc} */
+    @Override
+    @Nullable protected IdPAttribute doAttributeDefinitionResolve(
+            @Nonnull final AttributeResolutionContext resolutionContext,
+            @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
+        checkComponentActive();
+        log.debug("Attribute definition '{}': Resolving static attribute {}", getId(), value);
+        return value;
+    }
     
 }
\ No newline at end of file
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticDataConnector.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticDataConnector.java
index 2a672e5d5..61eee308f 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticDataConnector.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockStaticDataConnector.java
@@ -32,7 +32,6 @@ import net.shibboleth.idp.attribute.resolver.AbstractDataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -45,14 +44,14 @@ public class MockStaticDataConnector extends AbstractDataConnector {
     @Nonnull private final Logger log = LoggerFactory.getLogger(MockStaticDataConnector.class);
 
     /** Static collection of values returned by this connector. */
-    @Nullable @NonnullElements private Map<String, IdPAttribute> attributes;
+    @Nullable private Map<String, IdPAttribute> attributes;
 
     /**
      * Get the static values returned by this connector.
      * 
      * @return static values returned by this connector
      */
-    @Nullable @NonnullElements public Map<String, IdPAttribute> getAttributes() {
+    @Nullable public Map<String, IdPAttribute> getAttributes() {
         return attributes;
     }
 
@@ -61,7 +60,7 @@ public class MockStaticDataConnector extends AbstractDataConnector {
      * 
      * @param newValues static values returned by this connector
      */
-    public void setValues(@Nullable @NonnullElements Collection<IdPAttribute> newValues) {
+    public void setValues(@Nullable Collection<IdPAttribute> newValues) {
         checkSetterPreconditions();
 
         if (null == newValues) {
@@ -80,16 +79,6 @@ public class MockStaticDataConnector extends AbstractDataConnector {
         attributes = Map.copyOf(map);
     }
 
-    /** {@inheritDoc} */
-    @Override
-    @Nullable protected Map<String, IdPAttribute> doDataConnectorResolve(
-            @Nonnull final AttributeResolutionContext resolutionContext,
-            @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
-        checkComponentActive();
-        log.debug("Data connector '{}': Resolving static attribute {}", getId(), attributes);
-        return attributes;
-    }
-
     /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
@@ -100,5 +89,15 @@ public class MockStaticDataConnector extends AbstractDataConnector {
                     + " does not have values set up.");
         }
     }
+
+    /** {@inheritDoc} */
+    @Override
+    @Nullable protected Map<String, IdPAttribute> doDataConnectorResolve(
+            @Nonnull final AttributeResolutionContext resolutionContext,
+            @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
+        checkComponentActive();
+        log.debug("Data connector '{}': Resolving static attribute {}", getId(), attributes);
+        return attributes;
+    }
     
 }
\ No newline at end of file
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java
index 575f308bd..b03c9d9fc 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/TestSources.java
@@ -50,6 +50,7 @@ import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Basic data sources for testing the attribute generators. */
 public final class TestSources {
+    
     /** The name we use in this test for the static connector. */
     @Nonnull @NotEmpty public static final String STATIC_CONNECTOR_NAME = "staticCon";
 
@@ -95,8 +96,8 @@ public final class TestSources {
     @Nonnull @NotEmpty public static final String CONNECTOR_ATTRIBUTE_VALUE_REGEXP = "at1-(.+)or";
 
     /** Regexp. for CONNECTOR_ATTRIBUTE_VALUE (for map and regexp testing). */
-    @Nonnull public static final Pattern CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN = Pattern
-            .compile(CONNECTOR_ATTRIBUTE_VALUE_REGEXP);
+    @Nonnull public static final Pattern CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN =
+            Pattern.compile(CONNECTOR_ATTRIBUTE_VALUE_REGEXP);
 
     /** Result from a regexp. */
     @Nonnull public static final StringAttributeValue CONNECTOR_ATTRIBUTE_VALUE_REGEXP_RESULT = new StringAttributeValue(
@@ -284,14 +285,7 @@ public final class TestSources {
         @NonnullAfterInit public IdPAttribute getValue() {
             return value;
         }
-
-        /** {@inheritDoc} */
-        @Override @Nonnull protected IdPAttribute doAttributeDefinitionResolve(
-                final AttributeResolutionContext resolutionContext,
-                @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
-            return value;
-        }
-
+        
         /** {@inheritDoc} */
         @Override protected void doInitialize() throws ComponentInitializationException {
             super.doInitialize();
@@ -300,20 +294,29 @@ public final class TestSources {
                 throw new ComponentInitializationException(getLogPrefix() + " no attribute value set");
             }
         }
+
+        /** {@inheritDoc} */
+        @Override
+        @Nonnull protected IdPAttribute doAttributeDefinitionResolve(
+                @Nonnull final AttributeResolutionContext resolutionContext,
+                @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
+            checkComponentActive();
+            return value;
+        }
     }
 
     /** Helper class.  We cannot use the definition in the resolver-impl package because of dependency circularity. */
     private static class StaticDataConnector extends AbstractDataConnector {
 
         /** Static collection of values returned by this connector. */
-        private Map<String, IdPAttribute> attributes;
+        @NonnullAfterInit private Map<String, IdPAttribute> attributes;
 
         /**
          * Get the static values returned by this connector.
          * 
          * @return static values returned by this connector
          */
-        @Nullable @NonnullAfterInit public Map<String, IdPAttribute> getAttributes() {
+        @NonnullAfterInit public Map<String, IdPAttribute> getAttributes() {
             return attributes;
         }
 
@@ -323,7 +326,7 @@ public final class TestSources {
          * @param newValues static values returned by this connector
          */
         public void setValues(@Nullable @NullableElements Collection<IdPAttribute> newValues) {
-
+            checkSetterPreconditions();
             if (null == newValues) {
                 attributes = null;
                 return;
@@ -340,13 +343,6 @@ public final class TestSources {
             attributes = Map.copyOf(map);
         }
 
-        /** {@inheritDoc} */
-        @Override @Nonnull protected Map<String, IdPAttribute> doDataConnectorResolve(
-                @Nonnull final AttributeResolutionContext resolutionContext,
-                @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
-            return attributes;
-        }
-
         /** {@inheritDoc} */
         @Override protected void doInitialize() throws ComponentInitializationException {
             super.doInitialize();
@@ -356,5 +352,13 @@ public final class TestSources {
             }
         }
 
+        /** {@inheritDoc} */
+        @Override @Nonnull protected Map<String, IdPAttribute> doDataConnectorResolve(
+                @Nonnull final AttributeResolutionContext resolutionContext,
+                @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
+            checkComponentActive();
+            return attributes;
+        }
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/package-info.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/package-info.java
index 21f526e74..315255172 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/package-info.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Testing utility classes.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.testing;
 
-package net.shibboleth.idp.attribute.resolver.testing;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java
index 2d23e7c7d..0d006553d 100644
--- a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java
+++ b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML1AttributeTranscoder.java
@@ -41,7 +41,6 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.xml.SAMLConstants;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -94,7 +93,7 @@ public abstract class AbstractSAML1AttributeTranscoder<EncodedType extends IdPAt
     @Override
     @Nonnull protected AttributeDesignator buildAttribute(@Nullable final ProfileRequestContext profileRequestContext,
             @Nullable final IdPAttribute attribute, @Nonnull final Class<? extends AttributeDesignator> to,
-            @Nonnull final TranscodingRule rule, @Nonnull @NonnullElements final List<XMLObject> attributeValues)
+            @Nonnull final TranscodingRule rule, @Nonnull final List<XMLObject> attributeValues)
                     throws AttributeEncodingException {
 
         if (attribute != null && !attribute.getValues().isEmpty() && attributeValues.isEmpty()) {
@@ -135,8 +134,7 @@ public abstract class AbstractSAML1AttributeTranscoder<EncodedType extends IdPAt
     @Override
     @Nonnull protected IdPAttribute buildIdPAttribute(
             @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final AttributeDesignator attribute,
-            @Nonnull final TranscodingRule rule,
-            @Nonnull @NonnullElements final List<IdPAttributeValue> attributeValues)
+            @Nonnull final TranscodingRule rule, @Nonnull final List<IdPAttributeValue> attributeValues)
                     throws AttributeDecodingException {
         
         final String id = rule.get(AttributeTranscoderRegistry.PROP_ID, String.class);
@@ -185,4 +183,4 @@ public abstract class AbstractSAML1AttributeTranscoder<EncodedType extends IdPAt
 
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
index 9a4033a88..476b348d2 100644
--- a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
+++ b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAML2AttributeTranscoder.java
@@ -39,7 +39,6 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
@@ -87,7 +86,7 @@ public abstract class AbstractSAML2AttributeTranscoder<EncodedType extends IdPAt
     @Override
     @Nonnull protected Attribute buildAttribute(@Nullable final ProfileRequestContext profileRequestContext,
             @Nullable final IdPAttribute attribute, @Nonnull final Class<? extends Attribute> to,
-            @Nonnull final TranscodingRule rule, @Nonnull @NonnullElements final List<XMLObject> attributeValues)
+            @Nonnull final TranscodingRule rule, @Nonnull final List<XMLObject> attributeValues)
                     throws AttributeEncodingException {
 
         if (attribute != null && !attribute.getValues().isEmpty() && attributeValues.isEmpty()) {
@@ -129,8 +128,7 @@ public abstract class AbstractSAML2AttributeTranscoder<EncodedType extends IdPAt
     @Override
     @Nonnull protected IdPAttribute buildIdPAttribute(
             @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final Attribute attribute,
-            @Nonnull final TranscodingRule rule,
-            @Nonnull @NonnullElements final List<IdPAttributeValue> attributeValues)
+            @Nonnull final TranscodingRule rule, @Nonnull final List<IdPAttributeValue> attributeValues)
                     throws AttributeDecodingException {
         
         if (!attribute.getAttributeValues().isEmpty() && attributeValues.isEmpty()) {
@@ -189,4 +187,4 @@ public abstract class AbstractSAML2AttributeTranscoder<EncodedType extends IdPAt
 
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAMLAttributeTranscoder.java b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAMLAttributeTranscoder.java
index 93933d7ff..785739c63 100644
--- a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAMLAttributeTranscoder.java
+++ b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/AbstractSAMLAttributeTranscoder.java
@@ -44,7 +44,6 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AbstractAttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.xmlobject.ScopedValue;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.DOMTypeSupport;
 
@@ -85,6 +84,7 @@ public abstract class AbstractSAMLAttributeTranscoder<AttributeType extends SAML
                 continue;
             }
 
+            @SuppressWarnings("unchecked")
             final EncodedType attributeValue = (EncodedType) o;
             final XMLObject samlAttributeValue =
                     encodeValue(profileRequestContext, attribute, rule, attributeValue);
@@ -144,52 +144,51 @@ public abstract class AbstractSAMLAttributeTranscoder<AttributeType extends SAML
     @Nullable protected String getStringValue(@Nullable final XMLObject object) {
         String retVal = null;
 
-        if (object instanceof XSString) {
+        if (object instanceof XSString val) {
 
-            retVal = ((XSString) object).getValue();
+            retVal = val.getValue();
 
-        } else if (object instanceof XSURI) {
+        } else if (object instanceof XSURI val) {
 
-            retVal = ((XSURI) object).getURI();
+            retVal = val.getURI();
 
-        } else if (object instanceof XSBoolean) {
+        } else if (object instanceof XSBoolean val) {
             
-            final XSBooleanValue bval = ((XSBoolean) object).getValue();
+            final XSBooleanValue bval = val.getValue();
             if (bval != null) {
                 final Boolean flag = bval.getValue();
                 if (flag != null) {
                     retVal = flag ? "1" : "0";                }
             }
 
-        } else if (object instanceof XSInteger) {
+        } else if (object instanceof XSInteger val) {
             
-            final Integer ival = ((XSInteger) object).getValue();
+            final Integer ival = val.getValue();
             if (ival != null) {
                 retVal = ival.toString();
             }
 
-        } else if (object instanceof XSDateTime) {
+        } else if (object instanceof XSDateTime val) {
 
-            final Instant dt = ((XSDateTime) object).getValue();
+            final Instant dt = val.getValue();
             if (dt != null) {
                 retVal = DOMTypeSupport.instantToString(dt);
             } else {
                 retVal = null;
             }
 
-        } else if (object instanceof XSBase64Binary) {
+        } else if (object instanceof XSBase64Binary val) {
 
-            retVal = ((XSBase64Binary) object).getValue();
+            retVal = val.getValue();
             
-        } else if (object instanceof ScopedValue) {
+        } else if (object instanceof ScopedValue val) {
             
-            retVal = ((ScopedValue) object).getValue();
+            retVal = val.getValue();
 
-        } else if (object instanceof XSAny) {
+        } else if (object instanceof XSAny val) {
 
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                retVal = wc.getTextContent();
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                retVal = val.getTextContent();
             } else {
                 retVal = null;
             }
@@ -232,7 +231,7 @@ public abstract class AbstractSAMLAttributeTranscoder<AttributeType extends SAML
     @Nonnull protected abstract AttributeType buildAttribute(
             @Nullable final ProfileRequestContext profileRequestContext, @Nullable final IdPAttribute attribute,
             @Nonnull final Class<? extends AttributeType> to, @Nonnull final TranscodingRule rule,
-            @Nonnull @NonnullElements final List<XMLObject> attributeValues) throws AttributeEncodingException;
+            @Nonnull final List<XMLObject> attributeValues) throws AttributeEncodingException;
 
     /**
      * Encodes an attribute value into a SAML AttributeValue element.
@@ -264,8 +263,7 @@ public abstract class AbstractSAMLAttributeTranscoder<AttributeType extends SAML
      */
     @Nonnull protected abstract IdPAttribute buildIdPAttribute(
             @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final AttributeType attribute,
-            @Nonnull final TranscodingRule rule,
-            @Nonnull @NonnullElements final List<IdPAttributeValue> attributeValues)
+            @Nonnull final TranscodingRule rule, @Nonnull final List<IdPAttributeValue> attributeValues)
                     throws AttributeDecodingException;
     
     /**
diff --git a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java
index 283db129c..6e40d87be 100644
--- a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java
+++ b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java
@@ -51,9 +51,7 @@ public final class SAMLEncoderSupport {
     @Nonnull private static final Logger LOG = LoggerFactory.getLogger(SAMLEncoderSupport.class);
 
     /** Constructor. */
-    private SAMLEncoderSupport() {
-
-    }
+    private SAMLEncoderSupport() {}
 
     /**
      * Encodes a String value into a SAML attribute value element.
diff --git a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/package-info.java b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/package-info.java
index 4c9f4e9b8..6289266be 100644
--- a/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/package-info.java
+++ b/shib-saml-attribute-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/package-info.java
@@ -18,5 +18,7 @@
 /** 
  * Base classes for SAML {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} classes.
  */
+ at NonnullElements
+package net.shibboleth.idp.saml.attribute.transcoding;
 
-package net.shibboleth.idp.saml.attribute.transcoding;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java
index 6e922fbe4..5bba8bc61 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/AttributeMappingNodeProcessor.java
@@ -51,8 +51,6 @@ import net.shibboleth.idp.attribute.transcoding.TranscoderSupport;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.SAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.impl.SAML2StringAttributeTranscoder;
-import net.shibboleth.shared.annotation.constraint.Live;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -95,7 +93,8 @@ public class AttributeMappingNodeProcessor implements MetadataNodeProcessor {
     }
     
     /** {@inheritDoc} */
-    @Override public void process(final XMLObject metadataNode) throws FilterException {
+    @Override
+    public void process(@Nonnull final XMLObject metadataNode) throws FilterException {
 
         if (metadataNode instanceof AttributeConsumingService || metadataNode instanceof EntityDescriptor) {
             try (final ServiceableComponent<AttributeTranscoderRegistry> component =
@@ -218,9 +217,8 @@ public class AttributeMappingNodeProcessor implements MetadataNodeProcessor {
      * 
      * @throws AttributeDecodingException if an error occurs or no results were obtained
      */
-    private <T> void decodeAttribute(@Nonnull @NonnullElements final Collection<TranscodingRule> rules,
-            @Nonnull final T input, @Nonnull @NonnullElements @Live final Multimap<String,IdPAttribute> results)
-                    throws AttributeDecodingException {
+    private <T> void decodeAttribute(@Nonnull final Collection<TranscodingRule> rules, @Nonnull final T input,
+            @Nonnull final Multimap<String,IdPAttribute> results) throws AttributeDecodingException {
         
         for (final TranscodingRule rule : rules) {
             assert rule != null;
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/package-info.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/package-info.java
index 04fb9f7b5..af1ab3b4f 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/package-info.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Miscellaneous implementation classes related to SAML Attributes.
  */
+ at NonnullElements
+package net.shibboleth.idp.saml.attribute.impl;
 
-package net.shibboleth.idp.saml.attribute.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
index daf2c53ce..08bd655c6 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
@@ -61,10 +61,10 @@ public class SAML1NameIdentifierAttributeDefinition extends AbstractAttributeDef
     @Nonnull private final SAMLObjectBuilder<NameIdentifier> nameIdentifierBuilder;
 
     /** Format of the NameID. */
-    private String nameIdFormat;
+    @Nullable private String nameIdFormat;
 
     /** Name qualifier for the NameID. */
-    private String nameIdQualifier;
+    @Nullable private String nameIdQualifier;
 
     /**
      * Constructor.
@@ -125,7 +125,7 @@ public class SAML1NameIdentifierAttributeDefinition extends AbstractAttributeDef
      * @return the constructed NameIdentifier
      * @throws ResolutionException if the IdP Name is empty.
      */
-    protected NameIdentifier buildNameId(@Nonnull @NotEmpty final String nameIdValue,
+    @Nonnull protected NameIdentifier buildNameId(@Nonnull @NotEmpty final String nameIdValue,
             @Nonnull final AttributeResolutionContext resolutionContext) throws ResolutionException {
 
         log.debug("{} building a SAML1 NameIdentifier with value of '{}'", getLogPrefix(), nameIdValue);
@@ -179,19 +179,20 @@ public class SAML1NameIdentifierAttributeDefinition extends AbstractAttributeDef
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttribute doAttributeDefinitionResolve(
+    @Override
+    @Nullable protected IdPAttribute doAttributeDefinitionResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
 
         checkComponentActive();
         final List<? extends IdPAttributeValue> inputValues;
         List<IdPAttributeValue> outputValues = null;
-        final IdPAttribute result = new IdPAttribute(getId());
+        final IdPAttribute result = new IdPAttribute(ensureId());
 
         inputValues = PluginDependencySupport.getMergedAttributeValues(workContext,
                 getAttributeDependencies(),
                 getDataConnectorDependencies(),
-                getId());
+                ensureId());
 
         if (null != inputValues && !inputValues.isEmpty()) {
             if (1 == inputValues.size()) {
@@ -204,6 +205,7 @@ public class SAML1NameIdentifierAttributeDefinition extends AbstractAttributeDef
                 // Intermediate to solve typing issues.
                 final List<IdPAttributeValue> xmlVals = new ArrayList<>(inputValues.size());
                 for (final IdPAttributeValue theValue : inputValues) {
+                    assert theValue != null;
                     final XMLObjectAttributeValue val = encodeOneValue(theValue, resolutionContext);
                     if (null != val) {
                         xmlVals.add(val);
@@ -221,4 +223,4 @@ public class SAML1NameIdentifierAttributeDefinition extends AbstractAttributeDef
         return result;
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
index f33d2d7e1..43199186b 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
@@ -63,13 +63,13 @@ public class SAML2NameIDAttributeDefinition extends AbstractAttributeDefinition
     @Nonnull private final SAMLObjectBuilder<NameID> nameIDBuilder;
 
     /** Format of the NameID. */
-    private String nameIdFormat;
+    @Nullable private String nameIdFormat;
 
     /** Name qualifier for the NameID. */
-    private String nameIdQualifier;
+    @Nullable private String nameIdQualifier;
 
     /** SP name qualifier for the NameID. */
-    private String nameIdSPQualifier;
+    @Nullable private String nameIdSPQualifier;
 
     /**
      * Constructor.
@@ -148,7 +148,7 @@ public class SAML2NameIDAttributeDefinition extends AbstractAttributeDefinition
      * @return the constructed NameID
      * @throws ResolutionException if the IdP Name is empty.
      */
-    protected NameID buildNameId(@Nonnull @NotEmpty final String nameIdValue,
+    @Nonnull protected NameID buildNameId(@Nonnull @NotEmpty final String nameIdValue,
             @Nonnull final AttributeResolutionContext resolutionContext) throws ResolutionException {
 
         log.debug("{} building a SAML2 NameID with value of '{}'", getLogPrefix(), nameIdValue);
@@ -215,19 +215,20 @@ public class SAML2NameIDAttributeDefinition extends AbstractAttributeDefinition
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttribute doAttributeDefinitionResolve(
+    @Override
+    @Nullable protected IdPAttribute doAttributeDefinitionResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
 
         checkComponentActive();
         final List<IdPAttributeValue> inputValues;
         List<IdPAttributeValue> outputValues = null;
-        final IdPAttribute result = new IdPAttribute(getId());
+        final IdPAttribute result = new IdPAttribute(ensureId());
 
         inputValues = PluginDependencySupport.getMergedAttributeValues(workContext,
                 getAttributeDependencies(),
                 getDataConnectorDependencies(),
-                getId());
+                ensureId());
 
         if (null != inputValues && !inputValues.isEmpty()) {
 
@@ -240,6 +241,7 @@ public class SAML2NameIDAttributeDefinition extends AbstractAttributeDefinition
                 // TODO Intermediate to solve typing issues.
                 final List<IdPAttributeValue> xmlVals = new ArrayList<>(inputValues.size());
                 for (final IdPAttributeValue theValue : inputValues) {
+                    assert theValue != null;
                     final XMLObjectAttributeValue val = encodeOneValue(theValue, resolutionContext);
                     if (null != val) {
                         xmlVals.add(val);
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/package-info.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/package-info.java
index 1ea048a02..7ff7f2c62 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/package-info.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/package-info.java
@@ -19,5 +19,7 @@
  * Implementations of SAML related {@link net.shibboleth.idp.attribute.resolver.AttributeDefinition}
  * and {@link net.shibboleth.idp.attribute.resolver.DataConnector}.
  */
+ at NonnullElements
+package net.shibboleth.idp.saml.attribute.resolver.impl;
 
-package net.shibboleth.idp.saml.attribute.resolver.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoder.java
index 57c93cc76..a53a21850 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoder.java
@@ -30,6 +30,7 @@ import net.shibboleth.idp.attribute.AttributeEncodingException;
 import net.shibboleth.idp.attribute.ByteAttributeValue;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
@@ -39,8 +40,7 @@ import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link AttributeDesignator} and
- * {@link ByteAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link AttributeDesignator} and {@link ByteAttributeValue} objects.
  */
 public class SAML1ByteAttributeTranscoder extends AbstractSAML1AttributeTranscoder<ByteAttributeValue> {
 
@@ -48,13 +48,14 @@ public class SAML1ByteAttributeTranscoder extends AbstractSAML1AttributeTranscod
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML1ByteAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof ByteAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final ByteAttributeValue value) throws AttributeEncodingException {
                 
@@ -70,9 +71,10 @@ public class SAML1ByteAttributeTranscoder extends AbstractSAML1AttributeTranscod
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final AttributeDesignator attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final AttributeDesignator attribute, @Nonnull final TranscodingRule rule,
+            @Nullable final XMLObject value) {
         
         final String s = getStringValue(value);
         if (null == s) {
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java
index 92e6b9f8a..8a73c07b3 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java
@@ -32,6 +32,7 @@ import net.shibboleth.idp.attribute.AttributeEncodingException;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
@@ -39,8 +40,7 @@ import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link AttributeDesignator} and
- * {@link ScopedStringAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link AttributeDesignator} and {@link ScopedStringAttributeValue} objects.
  */
 public class SAML1ScopedStringAttributeTranscoder extends AbstractSAML1AttributeTranscoder<ScopedStringAttributeValue> {
 
@@ -57,13 +57,14 @@ public class SAML1ScopedStringAttributeTranscoder extends AbstractSAML1Attribute
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML1ScopedStringAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof ScopedStringAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final ScopedStringAttributeValue value) throws AttributeEncodingException {
                 
@@ -89,9 +90,10 @@ public class SAML1ScopedStringAttributeTranscoder extends AbstractSAML1Attribute
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final AttributeDesignator attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final AttributeDesignator attribute, @Nonnull final TranscodingRule rule,
+            @Nullable final XMLObject value) {
         
         if (value == null) {
             return null;
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoder.java
index 23feb785e..50b7e2a8b 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoder.java
@@ -31,14 +31,14 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link AttributeDesignator} and
- * {@link StringAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link AttributeDesignator} and {@link StringAttributeValue} objects.
  */
 public class SAML1StringAttributeTranscoder extends AbstractSAML1AttributeTranscoder<StringAttributeValue> {
 
@@ -46,13 +46,14 @@ public class SAML1StringAttributeTranscoder extends AbstractSAML1AttributeTransc
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML1StringAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override 
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof StringAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final StringAttributeValue value) throws AttributeEncodingException {
         
@@ -69,9 +70,10 @@ public class SAML1StringAttributeTranscoder extends AbstractSAML1AttributeTransc
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final AttributeDesignator attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final AttributeDesignator attribute, @Nonnull final TranscodingRule rule,
+            @Nullable final XMLObject value) {
         
         final String stringValue = getStringValue(value);
         if (null == stringValue) {
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1XMLObjectAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1XMLObjectAttributeTranscoder.java
index 0bafcaacc..6bb124f7d 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1XMLObjectAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1XMLObjectAttributeTranscoder.java
@@ -32,6 +32,7 @@ import net.shibboleth.idp.attribute.AttributeEncodingException;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.XMLObjectAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
@@ -39,8 +40,7 @@ import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link AttributeDesignator} and
- * {@link XMLObjectAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link AttributeDesignator} and {@link XMLObjectAttributeValue} objects.
  */
 public class SAML1XMLObjectAttributeTranscoder extends AbstractSAML1AttributeTranscoder<XMLObjectAttributeValue> {
 
@@ -51,8 +51,8 @@ public class SAML1XMLObjectAttributeTranscoder extends AbstractSAML1AttributeTra
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML1XMLObjectAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof XMLObjectAttributeValue;
     }
 
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoder.java
index 8e41ac2f4..e5c58450b 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoder.java
@@ -30,6 +30,7 @@ import net.shibboleth.idp.attribute.AttributeEncodingException;
 import net.shibboleth.idp.attribute.ByteAttributeValue;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
@@ -39,8 +40,7 @@ import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link Attribute} and
- * {@link ByteAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link Attribute} and {@link ByteAttributeValue} objects.
  */
 public class SAML2ByteAttributeTranscoder extends AbstractSAML2AttributeTranscoder<ByteAttributeValue> {
 
@@ -48,13 +48,14 @@ public class SAML2ByteAttributeTranscoder extends AbstractSAML2AttributeTranscod
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML2ByteAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof ByteAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final ByteAttributeValue value) throws AttributeEncodingException {
                 
@@ -70,9 +71,9 @@ public class SAML2ByteAttributeTranscoder extends AbstractSAML2AttributeTranscod
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final Attribute attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final Attribute attribute, @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
         
         final String s = getStringValue(value);
         if (null == s) {
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoder.java
index 88f06581b..40cd61ada 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoder.java
@@ -59,13 +59,14 @@ public class SAML2DateTimeAttributeTranscoder extends AbstractSAML2AttributeTran
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML2DateTimeAttributeTranscoder.class);
     
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof DateTimeAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final DateTimeAttributeValue value) throws AttributeEncodingException {
         
@@ -77,9 +78,9 @@ public class SAML2DateTimeAttributeTranscoder extends AbstractSAML2AttributeTran
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final Attribute attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final Attribute attribute, @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
         
         if (value != null) {
             final Instant retVal = getDateTimeValue(rule, value);
@@ -102,26 +103,25 @@ public class SAML2DateTimeAttributeTranscoder extends AbstractSAML2AttributeTran
     @Nullable protected Instant getDateTimeValue(@Nonnull final TranscodingRule rule, @Nonnull final XMLObject object) {
         Instant retVal = null;
 
-        if (object instanceof XSString) {
+        if (object instanceof XSString val) {
             
-            return getDateTimeValue(rule, ((XSString) object).getValue());
+            return getDateTimeValue(rule, val.getValue());
             
-        } else if (object instanceof XSInteger) {
+        } else if (object instanceof XSInteger val) {
 
-            final Integer value = ((XSInteger) object).getValue();
+            final Integer value = val.getValue();
             if (value != null) {
                 return getDateTimeValue(rule, value.longValue());
             }
 
-        } else if (object instanceof XSDateTime) {
+        } else if (object instanceof XSDateTime val) {
 
-            retVal = ((XSDateTime) object).getValue();
+            retVal = val.getValue();
 
-        } else if (object instanceof XSAny) {
+        } else if (object instanceof XSAny val) {
 
-            final XSAny wc = (XSAny) object;
-            if (wc.getUnknownAttributes().isEmpty() && wc.getUnknownXMLObjects().isEmpty()) {
-                return getDateTimeValue(rule, wc.getTextContent());
+            if (val.getUnknownAttributes().isEmpty() && val.getUnknownXMLObjects().isEmpty()) {
+                return getDateTimeValue(rule, val.getTextContent());
             }
         }
 
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java
index 1498cdf41..e6dcbcef0 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java
@@ -32,6 +32,7 @@ import net.shibboleth.idp.attribute.AttributeEncodingException;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
@@ -39,8 +40,7 @@ import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link Attribute} and
- * {@link ScopedStringAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link Attribute} and {@link ScopedStringAttributeValue} objects.
  */
 public class SAML2ScopedStringAttributeTranscoder extends AbstractSAML2AttributeTranscoder<ScopedStringAttributeValue> {
 
@@ -57,13 +57,14 @@ public class SAML2ScopedStringAttributeTranscoder extends AbstractSAML2Attribute
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML2ScopedStringAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof ScopedStringAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final ScopedStringAttributeValue value) throws AttributeEncodingException {
                 
@@ -89,9 +90,9 @@ public class SAML2ScopedStringAttributeTranscoder extends AbstractSAML2Attribute
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final Attribute attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final Attribute attribute, @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
         
         if (value == null) {
             return null;
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoder.java
index f2df13a24..d403b2895 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoder.java
@@ -31,14 +31,14 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link Attribute} and
- * {@link StringAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link Attribute} and {@link StringAttributeValue} objects.
  */
 public class SAML2StringAttributeTranscoder extends AbstractSAML2AttributeTranscoder<StringAttributeValue> {
 
@@ -46,13 +46,14 @@ public class SAML2StringAttributeTranscoder extends AbstractSAML2AttributeTransc
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML2StringAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof StringAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final StringAttributeValue value) throws AttributeEncodingException {
         
@@ -69,9 +70,9 @@ public class SAML2StringAttributeTranscoder extends AbstractSAML2AttributeTransc
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final Attribute attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final Attribute attribute, @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
         
         final String stringValue = getStringValue(value);
         if (null == stringValue) {
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoder.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoder.java
index 50af2f487..fdd2fde2a 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoder.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoder.java
@@ -32,6 +32,7 @@ import net.shibboleth.idp.attribute.AttributeEncodingException;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.XMLObjectAttributeValue;
+import net.shibboleth.idp.attribute.transcoding.AttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
 import net.shibboleth.idp.saml.attribute.transcoding.SAMLEncoderSupport;
@@ -39,8 +40,7 @@ import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
- * {@link net.shibboleth.idp.attribute.transcoding.AttributeTranscoder} that supports {@link Attribute} and
- * {@link XMLObjectAttributeValue} objects.
+ * {@link AttributeTranscoder} that supports {@link Attribute} and {@link XMLObjectAttributeValue} objects.
  */
 public class SAML2XMLObjectAttributeTranscoder extends AbstractSAML2AttributeTranscoder<XMLObjectAttributeValue> {
 
@@ -51,13 +51,14 @@ public class SAML2XMLObjectAttributeTranscoder extends AbstractSAML2AttributeTra
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML2XMLObjectAttributeTranscoder.class);
 
     /** {@inheritDoc} */
-    @Override protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute,
-            @Nonnull final IdPAttributeValue value) {
+    @Override
+    protected boolean canEncodeValue(@Nonnull final IdPAttribute attribute, @Nonnull final IdPAttributeValue value) {
         return value instanceof XMLObjectAttributeValue;
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+    @Override
+    @Nullable protected XMLObject encodeValue(@Nullable final ProfileRequestContext profileRequestContext,
             @Nonnull final IdPAttribute attribute, @Nonnull final TranscodingRule rule,
             @Nonnull final XMLObjectAttributeValue value) throws AttributeEncodingException {
 
@@ -66,9 +67,9 @@ public class SAML2XMLObjectAttributeTranscoder extends AbstractSAML2AttributeTra
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected IdPAttributeValue decodeValue(
-            @Nullable final ProfileRequestContext profileRequestContext, @Nonnull final Attribute attribute,
-            @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
+    @Override
+    @Nullable protected IdPAttributeValue decodeValue(@Nullable final ProfileRequestContext profileRequestContext,
+            @Nonnull final Attribute attribute, @Nonnull final TranscodingRule rule, @Nullable final XMLObject value) {
 
         if (value == null) {
             return null;
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/package-info.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/package-info.java
index d7ff608da..b27185e28 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/package-info.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implementations of SAML transcoders.
  */
+ at NonnullElements
+package net.shibboleth.idp.saml.attribute.transcoding.impl;
 
-package net.shibboleth.idp.saml.attribute.transcoding.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;

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


More information about the commits mailing list