[java-shib-attribute] branch main updated: Fix null and annotation issues.

Scott Cantor cantor.2 at osu.edu
Thu Nov 17 19:38:51 UTC 2022


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=2970833925dc52ecd426b981cc4e6338ea0c52ad

The following commit(s) were added to refs/heads/main by this push:
     new 297083392 Fix null and annotation issues.
297083392 is described below

commit 2970833925dc52ecd426b981cc4e6338ea0c52ad
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Nov 17 14:38:48 2022 -0500

    Fix null and annotation issues.
---
 .../attribute/filter/AttributeFilterPolicy.java    |   8 +-
 .../idp/attribute/filter/AttributeRule.java        |  27 +-
 .../shibboleth/idp/attribute/filter/Matcher.java   |   6 +-
 .../idp/attribute/filter/MatcherFromPolicy.java    |   6 +-
 .../idp/attribute/filter/PolicyFromMatcher.java    |   6 +-
 .../idp/attribute/filter/PolicyFromMatcherId.java  |   8 +-
 .../attribute/filter/PolicyRequirementRule.java    |   6 +-
 .../filter/context/AttributeFilterWorkContext.java |  39 ++-
 .../attribute/filter/BaseBridgingClassTester.java  |  10 +-
 .../attribute/filter/MatcherFromPolicyTest.java    |  21 +-
 .../attribute/filter/PolicyFromMatcherIdTest.java  |   9 +-
 .../filter/context/AttributeFilterContextTest.java |   2 +
 .../context/AttributeFilterWorkContextTest.java    |  51 +--
 .../attribute/filter/impl/AttributeFilterImpl.java |  23 +-
 .../filter/matcher/impl/AbstractMatcher.java       |  10 +-
 .../matcher/impl/AttributeScopeStringMatcher.java  |   2 +-
 .../filter/matcher/impl/ScriptedMatcher.java       |  20 +-
 .../saml/impl/AttributeInMetadataMatcher.java      |  72 ++--
 .../filter/policyrule/impl/ScriptedPolicyRule.java |  16 +-
 .../impl/AbstractEntityAttributePolicyRule.java    |  48 ++-
 .../AbstractRegistrationAuthorityPolicyRule.java   |  10 +-
 .../impl/BaseComplexAttributeFilterTestCase.java   |  28 +-
 .../impl/TargettedAttributeValueFilterTest.java    | 169 +++++-----
 .../impl/UntargettedAttributeValueFilterTest.java  | 123 +++----
 .../filter/impl/AttributeFilterImplTest.java       | 375 ++++++++++++---------
 .../impl/AbstractRegexpStringMatcherTest.java      |   2 +-
 .../attribute/filter/matcher/impl/DataSources.java |  34 +-
 .../filter/matcher/impl/ScriptedMatcherTest.java   |  10 +-
 .../filter/matcher/logic/impl/AndMatcherTest.java  |   8 +-
 .../filter/matcher/logic/impl/NotMatcherTest.java  |  13 +-
 .../filter/matcher/logic/impl/OrMatcherTest.java   |  11 +-
 .../saml/impl/AttributeInMetadataMatcherTest.java  |  30 +-
 .../impl/MappedAttributeInMetadataMatcherTest.java |  33 +-
 .../saml/impl/ScopeMatchesShibMDScopeTests.java    |  18 +-
 .../impl/PredicatePolicyRuleTest.java              |   2 +
 .../filtercontext/impl/ProfilePolicyRuleTest.java  |  12 +-
 .../impl/ProxiedRequesterPolicyRuleTest.java       |  23 +-
 .../impl/ProxiedRequesterRegexpPolicyRuleTest.java |  10 +-
 .../policyrule/saml/impl/BaseMetadataTests.java    |  18 +-
 .../IssuerEntityAttributeExactPolicyRuleTest.java  |   8 +-
 .../filter/tests/AttributeFilterPolicyTest.java    |  25 +-
 .../tests/AttributeValueFilterPolicyTest.java      |  29 +-
 .../idp/attribute/filter/testing/MockMatcher.java  |   5 +-
 .../impl/testing/SAMLAttributeDataConnector.java   |  10 +-
 .../resolver/testing/MockAttributeDefinition.java  |  10 +-
 .../resolver/testing/MockDataConnector.java        |  20 +-
 .../testing/MockStaticAttributeDefinition.java     |  10 +-
 .../resolver/testing/MockStaticDataConnector.java  |  11 +-
 .../resolver/testing/ResolverTestSupport.java      |  39 ++-
 .../attribute/resolver/testing/TestSources.java    |   7 +-
 50 files changed, 898 insertions(+), 595 deletions(-)

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 bd78a0817..66294aca9 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
@@ -53,16 +53,16 @@ public final class AttributeFilterPolicy extends AbstractIdentifiedInitializable
         UnmodifiableComponent {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AttributeFilterPolicy.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeFilterPolicy.class);
 
     /** Criterion that must be met for this policy to be active for a given request. */
-    private final PolicyRequirementRule rule;
+    @Nonnull private final PolicyRequirementRule rule;
 
     /** Filters to be used on attribute values. */
-    private final List<AttributeRule> valuePolicies;
+    @Nonnull @NonnullElements private final List<AttributeRule> valuePolicies;
 
     /** Log prefix. */
-    private String logPrefix;
+    @Nullable private String logPrefix;
 
     /**
      * Constructor.
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 2f7edda0d..ce1f20607 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
@@ -59,10 +59,10 @@ public final class AttributeRule extends AbstractIdentifiableInitializableCompon
         UnmodifiableComponent {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AttributeRule.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeRule.class);
 
     /** Log prefix. */
-    private String logPrefix;
+    @Nullable private String logPrefix;
 
     // Checkstyle: Javadoc OFF
     // See https://github.com/checkstyle/checkstyle/issues/3351
@@ -81,12 +81,12 @@ public final class AttributeRule extends AbstractIdentifiableInitializableCompon
      */
     // Checkstyle: Javadoc ON
 
-    private String attributeId;
+    @NonnullAfterInit private String attributeId;
 
     /**
      * Filter that permits the release of attribute values.
      */
-    private Matcher matcher;
+    @NonnullAfterInit private Matcher matcher;
 
     /**
      * Filter that denies the release of attribute values.
@@ -164,16 +164,19 @@ public final class AttributeRule extends AbstractIdentifiableInitializableCompon
      * @param attribute attribute whose values will be filtered by this policy
      * @param filterContext current filter context
      * 
+     * @throws AttributeFilterException if an error occurs while applying the rule
+     * 
      */
-    public void apply(@Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
+    public void apply(@Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext)
+            throws AttributeFilterException {
         checkComponentActive();
 
         Constraint.isNotNull(attribute, "To-be-filtered attribute can not be null");
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
 
-        final AttributeFilterWorkContext filterWorkContext =
-                filterContext.getSubcontext(AttributeFilterWorkContext.class, false);
-        Constraint.isNotNull(filterWorkContext, "Attribute filter work context can not be null");
+        final AttributeFilterWorkContext filterWorkContext = Constraint.isNotNull(
+                filterContext.getSubcontext(AttributeFilterWorkContext.class, false),
+                "Attribute filter work context can not be null");
 
         log.debug("{} Filtering values for attribute '{}' which currently contains {} values", getLogPrefix(),
                 getAttributeId(), attribute.getValues().size());
@@ -220,10 +223,8 @@ public final class AttributeRule extends AbstractIdentifiableInitializableCompon
      * 
      * @return Returns the logPrefix.
      */
-    protected String getLogPrefix() {
-        String result;
-
-        result = logPrefix;
+    @Nonnull @NotEmpty protected String getLogPrefix() {
+        String result = logPrefix;
         if (null == result) {
             result = new StringBuffer("Attribute filtering engine '").append(getId()).append("' ").toString();
             logPrefix = result;
@@ -231,4 +232,4 @@ public final class AttributeRule extends AbstractIdentifiableInitializableCompon
         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 937644720..e23027955 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
@@ -36,7 +36,7 @@ import net.shibboleth.shared.component.IdentifiedComponent;
 public interface Matcher extends IdentifiedComponent {
 
     /** A {@link Matcher} that returns true/all attribute values as matched. */
-    public static final Matcher MATCHES_ALL = new Matcher() {
+    @Nonnull public static final Matcher MATCHES_ALL = new Matcher() {
 
         /** {@inheritDoc} */
         @Override public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
@@ -51,7 +51,7 @@ public interface Matcher extends IdentifiedComponent {
     };
 
     /** A {@link Matcher} that returns false/no attribute values as matched. */
-    public static final Matcher MATCHES_NONE = new Matcher() {
+    @Nonnull public static final Matcher MATCHES_NONE = new Matcher() {
 
         /** {@inheritDoc} */
         @Override public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
@@ -66,7 +66,7 @@ public interface Matcher extends IdentifiedComponent {
     };
 
     /** A {@link Matcher} that fails. targetted primarily at testing, but also at odd corners of parsing. */
-    public static final Matcher MATCHER_FAILS = new Matcher() {
+    @Nonnull public static final Matcher MATCHER_FAILS = new Matcher() {
 
         /** {@inheritDoc} */
         @Override public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java
index 943a6a72d..73241fa66 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicy.java
@@ -44,10 +44,10 @@ public final class MatcherFromPolicy extends BaseBridgingClass implements Matche
         DestructableComponent {
 
     /** The rule we are shadowing. */
-    private final PolicyRequirementRule rule;
+    @Nonnull private final PolicyRequirementRule rule;
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(MatcherFromPolicy.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(MatcherFromPolicy.class);
 
     /**
      * Constructor.
@@ -86,4 +86,4 @@ public final class MatcherFromPolicy extends BaseBridgingClass implements Matche
         }
     }
     
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcher.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcher.java
index c28e28129..afcb28347 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcher.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcher.java
@@ -41,10 +41,10 @@ public final class PolicyFromMatcher extends BaseBridgingClass implements Policy
         IdentifiedComponent, DestructableComponent {
 
     /** The rule we are shadowing. */
-    private final Matcher matcher;
+    @Nonnull private final Matcher matcher;
     
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(PolicyFromMatcher.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(PolicyFromMatcher.class);
     
     /**
      * Constructor.
@@ -81,5 +81,5 @@ public final class PolicyFromMatcher extends BaseBridgingClass implements Policy
         log.debug("{} Matcher returned no values for any attribute.  Return FALSE", getLogPrefix());
         return Tristate.FALSE;
     }
-}
 
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherId.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherId.java
index 2ca9bde3f..db4ae5581 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherId.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherId.java
@@ -44,13 +44,13 @@ public final class PolicyFromMatcherId extends BaseBridgingClass implements Poli
         IdentifiedComponent, DestructableComponent {
 
     /** The rule we are shadowing. */
-    private final Matcher theMatcher;
+    @Nonnull private final Matcher theMatcher;
     
     /** The attribute Id we care about. */
-    private final String attributeId;
+    @Nonnull @NotEmpty private final String attributeId;
     
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(PolicyFromMatcherId.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(PolicyFromMatcherId.class);
     
     /**
      * Constructor.
@@ -103,5 +103,5 @@ public final class PolicyFromMatcherId extends BaseBridgingClass implements Poli
             return Tristate.FALSE;
         }
     }
-}
 
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyRequirementRule.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyRequirementRule.java
index afdb1255a..317076f5d 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyRequirementRule.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/PolicyRequirementRule.java
@@ -48,7 +48,7 @@ public interface PolicyRequirementRule extends IdentifiedComponent {
     };
 
     /** A {@link PolicyRequirementRule} that returns true matched. */
-    public static final PolicyRequirementRule MATCHES_ALL = new PolicyRequirementRule() {
+    @Nonnull public static final PolicyRequirementRule MATCHES_ALL = new PolicyRequirementRule() {
 
         @Override public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
             return Tristate.TRUE;
@@ -61,7 +61,7 @@ public interface PolicyRequirementRule extends IdentifiedComponent {
     };
 
     /** A {@link PolicyRequirementRule} that returns false as matched. */
-    public static final PolicyRequirementRule MATCHES_NONE = new PolicyRequirementRule() {
+    @Nonnull public static final PolicyRequirementRule MATCHES_NONE = new PolicyRequirementRule() {
 
         @Override public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
             return Tristate.FALSE;
@@ -74,7 +74,7 @@ public interface PolicyRequirementRule extends IdentifiedComponent {
     };
 
     /** A {@link PolicyRequirementRule} that returns failed. */
-    public static final PolicyRequirementRule REQUIREMENT_RULE_FAILS = new PolicyRequirementRule() {
+    @Nonnull public static final PolicyRequirementRule REQUIREMENT_RULE_FAILS = new PolicyRequirementRule() {
 
         @Override public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
             return Tristate.FAIL;
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 8c9d7a571..2b6864e95 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,6 +32,7 @@ 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.Unmodifiable;
@@ -79,11 +80,21 @@ public final class AttributeFilterWorkContext extends BaseContext {
      * 
      * @param attributeId ID of the attribute whose values are permitted to be released
      * @param attributeValues values for the attribute that are permitted to be released
+     * 
+     * @throws AttributeFilterException if the context tree is invalid or the value(s) to add are
+     * not actually values of the attribute.
      */
     public void addPermittedIdPAttributeValues(@Nonnull @NotEmpty final String attributeId,
-            @Nullable @NonnullElements final Collection<IdPAttributeValue> attributeValues) {
-        final AttributeFilterContext parent = (AttributeFilterContext) getParent();
-        final Map<String, IdPAttribute> prefilteredAttributes = parent.getPrefilteredIdPAttributes();
+            @Nullable @NonnullElements final Collection<IdPAttributeValue> attributeValues)
+                    throws AttributeFilterException {
+        
+        final BaseContext parent = getParent();
+        if (!(parent instanceof AttributeFilterContext)) {
+            throw new AttributeFilterException("AttributeFilterWorkContext was not a child of AttributeFilterContext");
+        }
+        
+        final Map<String, IdPAttribute> prefilteredAttributes =
+                ((AttributeFilterContext) parent).getPrefilteredIdPAttributes();
         final String trimmedAttributeId =
                 Constraint.isNotNull(StringSupport.trimOrNull(attributeId), "Attribute ID can not be null or empty");
         Constraint.isTrue(prefilteredAttributes.containsKey(trimmedAttributeId), "no attribute with ID "
@@ -102,7 +113,7 @@ public final class AttributeFilterWorkContext extends BaseContext {
         for (final IdPAttributeValue value : attributeValues) {
             Constraint.isNotNull(value, "non null value cannot be added to permitted list");
             if (!prefilteredAttributes.get(trimmedAttributeId).getValues().contains(value)) {
-                throw new IllegalArgumentException("permitted value is not a current value of attribute "
+                throw new AttributeFilterException("permitted value is not a current value of attribute "
                         + trimmedAttributeId);
             }
 
@@ -129,11 +140,21 @@ public final class AttributeFilterWorkContext extends BaseContext {
      * 
      * @param attributeId ID of the attribute whose values are not permitted to be released
      * @param attributeValues values for the attribute that are not permitted to be released
+     * 
+     * @throws AttributeFilterException if the context tree is invalid or if the values being denied are not in fact
+     *  values of the attribute
      */
     public void addDeniedIdPAttributeValues(@Nonnull @NotEmpty final String attributeId,
-            @Nullable @NonnullElements final Collection<IdPAttributeValue> attributeValues) {
-        final AttributeFilterContext parent = (AttributeFilterContext) getParent();
-        final Map<String, IdPAttribute> prefilteredAttributes = parent.getPrefilteredIdPAttributes();
+            @Nullable @NonnullElements final Collection<IdPAttributeValue> attributeValues)
+                    throws AttributeFilterException {
+        
+        final BaseContext parent = getParent();
+        if (!(parent instanceof AttributeFilterContext)) {
+            throw new AttributeFilterException("AttributeFilterWorkContext was not a child of AttributeFilterContext");
+        }
+        
+        final Map<String, IdPAttribute> prefilteredAttributes =
+                ((AttributeFilterContext) parent).getPrefilteredIdPAttributes();
         final String trimmedAttributeId =
                 Constraint.isNotNull(StringSupport.trimOrNull(attributeId), "Attribute ID can not be null or empty");
         Constraint.isTrue(prefilteredAttributes.containsKey(trimmedAttributeId), "No attribute with ID "
@@ -152,7 +173,7 @@ public final class AttributeFilterWorkContext extends BaseContext {
         for (final IdPAttributeValue value : attributeValues) {
             Constraint.isNotNull(value, "non null value cannot be added to denied list");
             if (!prefilteredAttributes.get(trimmedAttributeId).getValues().contains(value)) {
-                throw new IllegalArgumentException("denied value is not a current value of attribute "
+                throw new AttributeFilterException("denied value is not a current value of attribute "
                         + trimmedAttributeId);
             }
 
@@ -162,4 +183,4 @@ public final class AttributeFilterWorkContext extends BaseContext {
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/BaseBridgingClassTester.java b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/BaseBridgingClassTester.java
index 59f06a96d..a0d856005 100644
--- a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/BaseBridgingClassTester.java
+++ b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/BaseBridgingClassTester.java
@@ -20,6 +20,8 @@ package net.shibboleth.idp.attribute.filter;
 import java.util.Arrays;
 import java.util.LinkedHashSet;
 
+import javax.annotation.Nonnull;
+
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
@@ -42,8 +44,8 @@ public class BaseBridgingClassTester {
     protected final String NAME1 = "foo";
     protected final String NAME2 = "bar";
     
-    protected AttributeFilterContext setUpCtx() {
-        LinkedHashSet<IdPAttribute> attributes = new LinkedHashSet<>(2);
+    @Nonnull protected AttributeFilterContext setUpCtx() {
+        final LinkedHashSet<IdPAttribute> attributes = new LinkedHashSet<>(2);
 
         IdPAttribute attribute = new IdPAttribute(NAME1);
         attribute.setValues(Arrays.asList(VALUE1, VALUE2));
@@ -53,8 +55,8 @@ public class BaseBridgingClassTester {
         attribute = new IdPAttribute(NAME2);
         attribute.setValues(Arrays.asList(VALUE1, VALUE3));
         attributes.add(attribute);
-        AttributeFilterContext filterContext = new AttributeFilterContext();
-
+        
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
         filterContext.setPrefilteredIdPAttributes(attributes);
         
         return filterContext;
diff --git a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicyTest.java b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicyTest.java
index 6d47fb645..d1606306f 100644
--- a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicyTest.java
+++ b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MatcherFromPolicyTest.java
@@ -33,11 +33,13 @@ public class MatcherFromPolicyTest extends BaseBridgingClassTester {
     
 
     @Test public void all() {
-        Matcher matcher = new MatcherFromPolicy(PolicyRequirementRule.MATCHES_ALL);
+        final Matcher matcher = new MatcherFromPolicy(PolicyRequirementRule.MATCHES_ALL);
         
-        AttributeFilterContext context = setUpCtx();
+        final AttributeFilterContext context = setUpCtx();
         
-        Set<IdPAttributeValue> values = matcher.getMatchingValues(context.getPrefilteredIdPAttributes().get(NAME1), context);
+        final Set<IdPAttributeValue> values =
+                matcher.getMatchingValues(context.getPrefilteredIdPAttributes().get(NAME1), context);
+        assert values != null;
         
         Assert.assertEquals(values.size(), 2);
         Assert.assertTrue(values.contains(VALUE1));
@@ -45,11 +47,13 @@ public class MatcherFromPolicyTest extends BaseBridgingClassTester {
     }
     
     @Test public void none() {
-        Matcher matcher = new MatcherFromPolicy(PolicyRequirementRule.MATCHES_NONE);
+        final Matcher matcher = new MatcherFromPolicy(PolicyRequirementRule.MATCHES_NONE);
         
-        AttributeFilterContext context = setUpCtx();
+        final AttributeFilterContext context = setUpCtx();
         
-        Set<IdPAttributeValue> values = matcher.getMatchingValues(context.getPrefilteredIdPAttributes().get(NAME1), context);
+        final Set<IdPAttributeValue> values =
+                matcher.getMatchingValues(context.getPrefilteredIdPAttributes().get(NAME1), context);
+        assert values != null;
         
         Assert.assertTrue(values.isEmpty());
     }
@@ -57,9 +61,10 @@ public class MatcherFromPolicyTest extends BaseBridgingClassTester {
     @Test public void fails() {
         Matcher matcher = new MatcherFromPolicy(PolicyRequirementRule.REQUIREMENT_RULE_FAILS);
         
-        AttributeFilterContext context = setUpCtx();
+        final AttributeFilterContext context = setUpCtx();
         
-        Set<IdPAttributeValue> values = matcher.getMatchingValues(context.getPrefilteredIdPAttributes().get(NAME1), context);
+        final Set<IdPAttributeValue> values =
+                matcher.getMatchingValues(context.getPrefilteredIdPAttributes().get(NAME1), context);
         
         Assert.assertNull(values);
     }
diff --git a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherIdTest.java b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherIdTest.java
index b14415ba6..241b6e752 100644
--- a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherIdTest.java
+++ b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/PolicyFromMatcherIdTest.java
@@ -32,7 +32,7 @@ public class PolicyFromMatcherIdTest extends BaseBridgingClassTester {
     @Test public void all() {
         PolicyFromMatcherId rule = new PolicyFromMatcherId(Matcher.MATCHES_ALL, NAME1);
 
-        AttributeFilterContext context = setUpCtx();
+        final AttributeFilterContext context = setUpCtx();
 
         Assert.assertTrue(rule.matches(context) == Tristate.TRUE);
         Assert.assertEquals(rule.getAttributeId(), NAME1);
@@ -45,7 +45,7 @@ public class PolicyFromMatcherIdTest extends BaseBridgingClassTester {
     @Test public void none() {
         PolicyRequirementRule rule = new PolicyFromMatcherId(Matcher.MATCHES_NONE, NAME1);
 
-        AttributeFilterContext context = setUpCtx();
+        final AttributeFilterContext context = setUpCtx();
 
         Assert.assertTrue(rule.matches(context) == Tristate.FALSE);
         Assert.assertTrue(new PolicyFromMatcherId(Matcher.MATCHES_NONE, "fred").matches(setUpCtx()) == Tristate.FALSE);
@@ -54,9 +54,10 @@ public class PolicyFromMatcherIdTest extends BaseBridgingClassTester {
     @Test public void fails() {
         PolicyRequirementRule rule = new PolicyFromMatcherId(Matcher.MATCHER_FAILS, NAME1);
 
-        AttributeFilterContext context = setUpCtx();
+        final AttributeFilterContext context = setUpCtx();
 
         Assert.assertTrue(rule.matches(context) == Tristate.FAIL);
         Assert.assertTrue(new PolicyFromMatcherId(Matcher.MATCHER_FAILS, "fred").matches(context) == Tristate.FALSE);
     }
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContextTest.java b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContextTest.java
index 13b1c53c2..e45f1942f 100644
--- a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContextTest.java
+++ b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContextTest.java
@@ -35,6 +35,8 @@ public class AttributeFilterContextTest {
     @Test public void testPostConstructionState() {
         final AttributeFilterContext context = new AttributeFilterContext();
         final AttributeFilterWorkContext child = context.getSubcontext(AttributeFilterWorkContext.class, true);
+        assert child != null;
+        
         Assert.assertNotNull(context.getFilteredIdPAttributes());
         Assert.assertTrue(context.getFilteredIdPAttributes().isEmpty());
         Assert.assertNull(context.getParent());
diff --git a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java
index e6620c7c7..7f98d14d2 100644
--- a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java
+++ b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
+import net.shibboleth.idp.attribute.filter.AttributeFilterException;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
 import org.testng.Assert;
@@ -40,12 +41,17 @@ public class AttributeFilterWorkContextTest {
 
 
 
-    /** Testing getting and adding permitted attribute values. */
-    @Test public void testPermittedAttributeValues() {
-        AttributeFilterContext parent = new AttributeFilterContext();
-        AttributeFilterWorkContext context = parent.getSubcontext(AttributeFilterWorkContext.class, true);
-
-        IdPAttribute attribute1 = new IdPAttribute("one");
+    /**
+     * Testing getting and adding permitted attribute values.
+     * 
+     * @throws AttributeFilterException
+     */
+    @Test public void testPermittedAttributeValues() throws AttributeFilterException {
+        final AttributeFilterContext parent = new AttributeFilterContext();
+        final AttributeFilterWorkContext context = parent.getSubcontext(AttributeFilterWorkContext.class, true);
+        assert context != null;
+        
+        final IdPAttribute attribute1 = new IdPAttribute("one");
         attribute1.setValues(Arrays.asList(aStringAttributeValue, bStringAttributeValue));
         parent.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
@@ -64,38 +70,43 @@ public class AttributeFilterWorkContextTest {
         try {
             context.addPermittedIdPAttributeValues(null, Collections.singletonList(aStringAttributeValue));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
             context.addPermittedIdPAttributeValues("", Collections.singletonList(aStringAttributeValue));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
             context.addPermittedIdPAttributeValues("two", Collections.singletonList(aStringAttributeValue));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
             context.addPermittedIdPAttributeValues("one", Collections.singletonList(cStringAttributeValue));
             Assert.fail();
-        } catch (IllegalArgumentException e) {
+        } catch (final AttributeFilterException e) {
             // expected this
         }
     }
 
-    /** Testing getting and adding denied attribute values. */
-    @Test public void testDeniedAttributeValues() {
-        AttributeFilterContext parent = new AttributeFilterContext();
-        AttributeFilterWorkContext context = parent.getSubcontext(AttributeFilterWorkContext.class, true);
-
-        IdPAttribute attribute1 = new IdPAttribute("one");
+    /**
+     * Testing getting and adding denied attribute values.
+     *  
+     * @throws AttributeFilterException
+     */
+    @Test public void testDeniedAttributeValues() throws AttributeFilterException {
+        final AttributeFilterContext parent = new AttributeFilterContext();
+        final AttributeFilterWorkContext context = parent.getSubcontext(AttributeFilterWorkContext.class, true);
+        assert context != null;
+
+        final IdPAttribute attribute1 = new IdPAttribute("one");
         attribute1.setValues(Arrays.asList(aStringAttributeValue, bStringAttributeValue));
         parent.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
@@ -114,28 +125,28 @@ public class AttributeFilterWorkContextTest {
         try {
             context.addDeniedIdPAttributeValues(null, Collections.singletonList(bStringAttributeValue));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
             context.addDeniedIdPAttributeValues("", Collections.singletonList(bStringAttributeValue));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
             context.addDeniedIdPAttributeValues("two", Collections.singletonList(bStringAttributeValue));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
             context.addDeniedIdPAttributeValues("one", Collections.singletonList(cStringAttributeValue));
             Assert.fail();
-        } catch (IllegalArgumentException e) {
+        } catch (final AttributeFilterException e) {
             // expected this
         }
     }
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 deb6d1afa..75fc9abcd 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
@@ -100,7 +100,7 @@ public class AttributeFilterImpl extends AbstractServiceableComponent<AttributeF
             throws AttributeFilterException {
         checkComponentActive();
 
-        Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
+        Constraint.isNotNull(filterContext, "Attribute filter context cannot be null");
         
         final boolean timerStarted = startTimer(filterContext);
         try {        
@@ -117,8 +117,9 @@ public class AttributeFilterImpl extends AbstractServiceableComponent<AttributeF
                 policy.apply(filterContext);
             }
 
-            for (Entry<String, IdPAttribute> entry : filterContext.getPrefilteredIdPAttributes().entrySet()) {
-                final Collection<IdPAttributeValue> filteredAttributeValues = getFilteredValues(entry.getKey(), filterContext);
+            for (final Entry<String, IdPAttribute> entry : filterContext.getPrefilteredIdPAttributes().entrySet()) {
+                final Collection<IdPAttributeValue> filteredAttributeValues =
+                        getFilteredValues(entry.getKey(), filterContext);
                 if (null != filteredAttributeValues && !filteredAttributeValues.isEmpty()) {
                     final IdPAttribute filteredAttribute;
                     try {
@@ -152,15 +153,15 @@ public class AttributeFilterImpl extends AbstractServiceableComponent<AttributeF
      */
     @Nullable protected Collection<IdPAttributeValue> getFilteredValues(@Nonnull @NotEmpty final String attributeId,
             @Nonnull final AttributeFilterContext filterContext) {
-        Constraint.isNotNull(attributeId, "attributeId can not be null");
-        Constraint.isNotNull(filterContext, "filterContext can not be null");
+        Constraint.isNotNull(attributeId, "attributeId cannot be null");
+        Constraint.isNotNull(filterContext, "filterContext cannot be null");
 
         final AttributeFilterWorkContext filterWorkContext =
-                filterContext.getSubcontext(AttributeFilterWorkContext.class, false);
-        Constraint.isNotNull(filterWorkContext, "Attribute filter work context can not be null");
-
-        final Collection<IdPAttributeValue> filteredAttributeValues = filterWorkContext.
-                getPermittedIdPAttributeValues().get(attributeId);
+                filterContext.getSubcontext(AttributeFilterWorkContext.class);
+        
+        final Collection<IdPAttributeValue> filteredAttributeValues =
+                Constraint.isNotNull(filterWorkContext, "AttributeFilterWorkContext cannot be null"
+                        ).getPermittedIdPAttributeValues().get(attributeId);
 
         if (filteredAttributeValues == null || filteredAttributeValues.isEmpty()) {
             log.debug("Attribute filtering engine '{}': no policy permitted release of attribute {} values", getId(),
@@ -168,6 +169,8 @@ public class AttributeFilterImpl extends AbstractServiceableComponent<AttributeF
             return null;
         }
 
+        assert filterWorkContext != null;
+        
         if (filterWorkContext.getDeniedAttributeValues().containsKey(attributeId)) {
             filteredAttributeValues.removeAll(filterWorkContext.getDeniedAttributeValues().get(attributeId));
         }
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 3647efaa1..6d71deb48 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
@@ -22,12 +22,14 @@ import java.util.LinkedHashSet;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 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.Unmodifiable;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -41,10 +43,10 @@ import org.slf4j.LoggerFactory;
 public abstract class AbstractMatcher extends AbstractIdentifiableInitializableComponent implements Matcher {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractMatcher.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractMatcher.class);
 
     /** The String used to prefix log message. */
-    private String logPrefix;
+    @Nullable private String logPrefix;
 
     /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException {
@@ -85,7 +87,7 @@ public abstract class AbstractMatcher extends AbstractIdentifiableInitializableC
      * 
      * @return "Attribute Filter '<filterID>' :"
      */
-    protected String getLogPrefix() {
+    @Nonnull @NotEmpty protected String getLogPrefix() {
         // local cache of cached entry to allow unsynchronised clearing.
         String prefix = logPrefix;
         if (null == prefix) {
@@ -98,4 +100,4 @@ public abstract class AbstractMatcher extends AbstractIdentifiableInitializableC
         return prefix;
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java
index 625edca51..cffaa6970 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java
@@ -56,4 +56,4 @@ public class AttributeScopeStringMatcher extends AbstractStringMatcher {
         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/ScriptedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
index 93c102e50..eb218b605 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
@@ -253,14 +253,18 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
         @Override
         protected void prepareContext(@Nonnull final ScriptContext scriptContext, @Nullable final Object... input) {
 
-            scriptContext.setAttribute("attribute", input[0], ScriptContext.ENGINE_SCOPE);
-            scriptContext.setAttribute("filterContext", input[1], ScriptContext.ENGINE_SCOPE);
-
-            final ProfileRequestContext prc =
-                    ((AttributeFilterContext) input[1]).getProfileRequestContextLookupStrategy().apply(
-                            (AttributeFilterContext) input[1]);
-            
-            scriptContext.setAttribute("profileContext", prc, ScriptContext.ENGINE_SCOPE);
+            if (input != null) {
+                scriptContext.setAttribute("attribute", input[0], ScriptContext.ENGINE_SCOPE);
+                scriptContext.setAttribute("filterContext", input[1], ScriptContext.ENGINE_SCOPE);
+    
+                final ProfileRequestContext prc =
+                        ((AttributeFilterContext) input[1]).getProfileRequestContextLookupStrategy().apply(
+                                (AttributeFilterContext) input[1]);
+                
+                scriptContext.setAttribute("profileContext", prc, ScriptContext.ENGINE_SCOPE);
+            } else {
+                log.error("{} Script invoked with null inputs", getLogPrefix());
+            }
         }
     }
     
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 5eb42f256..1df2da1e1 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
@@ -32,6 +32,7 @@ import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSAny;
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.core.xml.schema.XSBoolean;
+import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.core.xml.schema.XSDateTime;
 import org.opensaml.core.xml.schema.XSInteger;
 import org.opensaml.core.xml.schema.XSString;
@@ -197,6 +198,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
             // Look for a RequestedAttribute explicitly identified by config.
             log.debug("Looking for RequestedAttribute {} (NameFormat {}) in metadata", attributeName,
                     attributeNameFormat);
+            assert attributeName != null;
             final RequestedAttribute requestedAttribute = findInMetadata(service, attributeName, attributeNameFormat);
             final String attributeToLog = attributeName != null ? attributeName : attribute.getId();
 
@@ -217,10 +219,10 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
         }
         
         // Utilize pre-mapped approach.
-        final List<AttributesMapContainer> containerList =
-                service.getObjectMetadata().get(AttributesMapContainer.class);
-        if (null == containerList || containerList.isEmpty() || containerList.get(0).get() == null ||
-                containerList.get(0).get().isEmpty()) {
+
+        final Multimap<String,IdPAttribute> requestedAttributes = getMappedRequestedAttributes(service);
+
+        if (requestedAttributes == null || requestedAttributes.isEmpty()) {
             log.debug("{} No decoded attributes found when filtering", getLogPrefix());
             if (matchIfMetadataSilent) {
                 // TODO: not sure what the right answer is here
@@ -232,15 +234,8 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
                     + ", returning no values", getLogPrefix());
             return Collections.emptySet();
         }
-        if (containerList.size() > 1) {
-            log.error("{} More than one set of mapped attributes found when filtering, this shouldn't ever happen",
-                    getLogPrefix());
-        }
-        
-        final Multimap<String,IdPAttribute> requestedAttributes = containerList.get(0).get();
-
-        final Collection<? extends IdPAttribute> requestedAttributeList =
-                requestedAttributes.get(attribute.getId());
+                
+        final Collection<IdPAttribute> requestedAttributeList = requestedAttributes.get(attribute.getId());
         if (null == requestedAttributeList) {
             log.debug("{} Decoded attribute {} not found in metadata", getLogPrefix(), attribute.getId());
             return Collections.emptySet();
@@ -261,7 +256,6 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
         }
         
         return values;
-    
     }
 // Checkstyle: CyclomaticComplexity|ReturnCount|MethodLength ON
     
@@ -285,7 +279,32 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
                 metadataContext.getSubcontext(AttributeConsumingServiceContext.class);
         return acsContext != null ? acsContext.getAttributeConsumingService() : null;
     }
-    
+
+    /**
+     * Dig into the metadata to determine whether any mapped requested attribute information exists.
+     * 
+     * @param service metadata service object
+     * 
+     * @return the extracted map of requested attributes or null
+     */
+    @Nullable @NonnullElements private Multimap<String,IdPAttribute> getMappedRequestedAttributes(
+            @Nonnull final AttributeConsumingService service) {
+        
+        final List<AttributesMapContainer> containerList =
+                service.getObjectMetadata().get(AttributesMapContainer.class);
+        if (null == containerList || containerList.isEmpty()) {
+            return null;
+        }
+
+        if (containerList.size() > 1) {
+            log.error("{} More than one set of mapped attributes found when filtering, this shouldn't ever happen",
+                    getLogPrefix());
+        }
+
+        final AttributesMapContainer container = containerList.get(0);
+        return container != null ? container.get() : null;
+    }
+
     /**
      * Locates a RequestedAttribute object in metadata that matches a specific Attribute Name
      * and NameFormat.
@@ -318,7 +337,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
      * @param requestedValues the values
      * @return the result of the filter
      */
-    @Nonnull private Set<IdPAttributeValue> filterValues(@Nullable final IdPAttribute attribute,
+    @Nonnull private Set<IdPAttributeValue> filterValues(@Nonnull final IdPAttribute attribute,
             @Nonnull @NonnullElements final List<IdPAttributeValue> requestedValues) {
 
         if (null == requestedValues || requestedValues.isEmpty()) {
@@ -344,7 +363,7 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
      */
     @Nonnull @Unmodifiable @NonnullElements private Set<IdPAttributeValue> filterValues(
             @Nonnull final String attributeToLog,
-            @Nullable final IdPAttribute attribute, 
+            @Nonnull final IdPAttribute attribute, 
             @Nonnull @NonnullElements final List<XMLObject> requestedValues) {
 
         if (requestedValues.isEmpty()) {
@@ -391,9 +410,18 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
         } else if (xmlObj instanceof XSURI) {
             toMatch = ((XSURI) xmlObj).getURI();
         } else if (xmlObj instanceof XSBoolean) {
-            toMatch = ((XSBoolean) xmlObj).getValue().getValue() ? "1" : "0";
+            final XSBooleanValue bval = ((XSBoolean) xmlObj).getValue();
+            if (bval != null) {
+                final Boolean flag = bval.getValue();
+                if (flag != null) {
+                    toMatch = flag ? "1" : "0";
+                }
+            }
         } else if (xmlObj instanceof XSInteger) {
-            toMatch = ((XSInteger) xmlObj).getValue().toString();
+            final Integer ival =  ((XSInteger) xmlObj).getValue();
+            if (ival != null) {
+                toMatch = ival.toString();
+            }
         } else if (xmlObj instanceof XSDateTime) {
             final Instant dt = ((XSDateTime) xmlObj).getValue();
             if (dt != null) {
@@ -420,8 +448,8 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
      * 
      * @return "Attribute Filter '<filterID>' :"
      */
-    @Nonnull protected String getLogPrefix() {
-        // local cache of cached entry to allow unsynchronised clearing.
+    @Nonnull @NotEmpty protected String getLogPrefix() {
+        // local cache of cached entry to allow unsynchronized clearing.
         String prefix = logPrefix;
         if (null == prefix) {
             final StringBuilder builder = new StringBuilder("Attribute Filter '").append(getId()).append("':");
@@ -433,4 +461,4 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
         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/ScriptedPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
index 6502eefbb..f483edb24 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
@@ -245,12 +245,16 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
         @Override
         protected void prepareContext(@Nonnull final ScriptContext scriptContext, @Nullable final Object... input) {
 
-            scriptContext.setAttribute("filterContext", input[0], ScriptContext.ENGINE_SCOPE);
-            
-            final ProfileRequestContext prc =
-                    ((AttributeFilterContext) input[0]).getProfileRequestContextLookupStrategy().apply(
-                            (AttributeFilterContext) input[0]);
-            scriptContext.setAttribute("profileContext", prc, ScriptContext.ENGINE_SCOPE);
+            if (input != null) {
+                scriptContext.setAttribute("filterContext", input[0], ScriptContext.ENGINE_SCOPE);
+                
+                final ProfileRequestContext prc =
+                        ((AttributeFilterContext) input[0]).getProfileRequestContextLookupStrategy().apply(
+                                (AttributeFilterContext) input[0]);
+                scriptContext.setAttribute("profileContext", prc, ScriptContext.ENGINE_SCOPE);
+            } else {
+                log.error("{} Script invoked with null inputs", getLogPrefix());
+            }
         }
     }
 
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 35ad3784a..a67840a12 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
@@ -31,6 +31,7 @@ import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSAny;
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.core.xml.schema.XSBoolean;
+import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.core.xml.schema.XSDateTime;
 import org.opensaml.core.xml.schema.XSInteger;
 import org.opensaml.core.xml.schema.XSString;
@@ -210,7 +211,7 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
      * 
      * @return entity descriptor for the entity to check or null if not found
      */
-    @Nullable protected abstract EntityDescriptor getEntityMetadata(AttributeFilterContext filterContext);
+    @Nullable protected abstract EntityDescriptor getEntityMetadata(@Nonnull AttributeFilterContext filterContext);
 
     /**
      * Checks whether the given entity attribute's values match for particular implementations of this functor.
@@ -299,10 +300,8 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
     private void getMappedEntityAttributeValues(@Nonnull final XMLObject metadataObject,
             @Nonnull @NonnullElements final Set<String> valueAccumulator) {
         
-        final List<AttributesMapContainer> containerList =
-                metadataObject.getObjectMetadata().get(AttributesMapContainer.class);
-        if (null == containerList || containerList.isEmpty() || containerList.get(0).get() == null ||
-                containerList.get(0).get().isEmpty()) {
+        final Multimap<String, IdPAttribute> mappedAttributes = getMappedRequestedAttributes(metadataObject);
+        if (mappedAttributes == null || mappedAttributes.isEmpty()) {
             log.debug("{} No mapped entity attributes found for {}", getLogPrefix(), attrName);
             return;
         }
@@ -311,7 +310,6 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
         
         int count = 0;
         
-        final Multimap<String, IdPAttribute> mappedAttributes = containerList.get(0).get();
         for (final IdPAttribute attribute : mappedAttributes.get(attrName)) {
             for (final IdPAttributeValue attributeValue : attribute.getValues()) {
                 if (attributeValue instanceof StringAttributeValue) {
@@ -326,6 +324,31 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
         log.debug("{} Added {} values of mapped entity attribute {} for evaluation", getLogPrefix(), count, attrName);
     }
 
+    /**
+     * Dig into the metadata to determine whether any mapped requested attribute information exists.
+     * 
+     * @param metadataObject metadata object
+     * 
+     * @return the extracted map of requested attributes or null
+     */
+    @Nullable @NonnullElements private Multimap<String,IdPAttribute> getMappedRequestedAttributes(
+            @Nonnull final XMLObject metadataObject) {
+        
+        final List<AttributesMapContainer> containerList =
+                metadataObject.getObjectMetadata().get(AttributesMapContainer.class);
+        if (null == containerList || containerList.isEmpty()) {
+            return null;
+        }
+
+        if (containerList.size() > 1) {
+            log.error("{} More than one set of mapped attributes found when filtering, this shouldn't ever happen",
+                    getLogPrefix());
+        }
+
+        final AttributesMapContainer container = containerList.get(0);
+        return container != null ? container.get() : null;
+    }
+
     /**
      * Function to return an XMLObject in string form.
      * 
@@ -347,11 +370,20 @@ public abstract class AbstractEntityAttributePolicyRule extends AbstractPolicyRu
 
         } else if (object instanceof XSBoolean) {
 
-            retVal = ((XSBoolean) object).getValue().getValue() ? "1" : "0";
+            final XSBooleanValue bval = ((XSBoolean) object).getValue();
+            if (bval != null) {
+                final Boolean flag = bval.getValue();
+                if (flag != null) {
+                    retVal = flag ? "1" : "0";
+                }
+            }
 
         } else if (object instanceof XSInteger) {
 
-            retVal = ((XSInteger) object).getValue().toString();
+            final Integer ival =  ((XSInteger) object).getValue();
+            if (ival != null) {
+                retVal = ival.toString();
+            }
 
         } else if (object instanceof XSDateTime) {
 
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 96edeca70..5c3e12adf 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -53,7 +54,14 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
 
     /** What to say if no MDRPI is present. */
     private boolean matchIfMetadataSilent;
-
+    
+    /**
+     * Constructor.
+     */
+    public AbstractRegistrationAuthorityPolicyRule() {
+        registrars = Collections.emptySet();
+    }
+    
     /**
      * Get the candidate registrars.
      * 
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java
index ddb238d9d..84cc9d0b9 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java
@@ -19,13 +19,19 @@ package net.shibboleth.idp.attribute.filter.complex.impl;
 
 import java.util.Map;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.filter.AttributeFilter;
 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.idp.attribute.resolver.dc.impl.testing.SAMLAttributeDataConnector;
+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;
 import net.shibboleth.shared.logic.FunctionSupport;
 
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
@@ -36,7 +42,7 @@ import org.opensaml.saml.ext.saml2mdattr.EntityAttributes;
  */
 public class BaseComplexAttributeFilterTestCase extends XMLObjectBaseTestCase {
 
-    private static final String PATH = "/net/shibboleth/idp/filter/impl/complex/";
+    @Nonnull @NotEmpty private static final String PATH = "/net/shibboleth/idp/filter/impl/complex/";
 
     /**
      * Helper function to return attributes pulled from a file (on the classpath). The file is expected to contain a
@@ -44,17 +50,18 @@ public class BaseComplexAttributeFilterTestCase extends XMLObjectBaseTestCase {
      * 
      * @param xmlFileName the file within the test directory.
      * 
-     * @return the att
+     * @return the attributes
      * 
      * @throws ComponentInitializationException ...
      * @throws ResolutionException ...
      */
-    protected Map<String, IdPAttribute> getIdPAttributes(String xmlFileName) throws ComponentInitializationException,
-            ResolutionException {
+    @Nonnull @NonnullElements protected Map<String,IdPAttribute> getIdPAttributes(@Nonnull @NotEmpty String xmlFileName)
+            throws ComponentInitializationException, ResolutionException {
 
         final EntityAttributes obj = (EntityAttributes) unmarshallElement(PATH + xmlFileName);
+        assert obj != null;
 
-        SAMLAttributeDataConnector connector = new SAMLAttributeDataConnector();
+        final SAMLAttributeDataConnector connector = new SAMLAttributeDataConnector();
         connector.setId(xmlFileName);
         connector.setAttributesStrategy(FunctionSupport.constant(obj.getAttributes()));
 
@@ -62,10 +69,17 @@ public class BaseComplexAttributeFilterTestCase extends XMLObjectBaseTestCase {
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
         context.getSubcontext(AttributeResolverWorkContext.class, true);
-        return connector.resolve(context);
+        return Constraint.isNotNull(connector.resolve(context), "Resolved Attributes were null");
     }
 
-    protected AttributeFilter getPolicy(String xmlFileName) {
+    /**
+     * Get filter policy.
+     * 
+     * @param xmlFileName the file withiin the test directory
+     * 
+     * @return policy
+     */
+    @Nullable protected AttributeFilter getPolicy(@Nonnull @NotEmpty String xmlFileName) {
         return null;
     }
 
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java
index d0a3a35c7..95898ca53 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java
@@ -23,6 +23,8 @@ import static org.testng.Assert.assertNull;
 import java.util.Collections;
 import java.util.Map;
 
+import javax.annotation.Nonnull;
+
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
@@ -48,20 +50,15 @@ import net.shibboleth.shared.testing.MockApplicationContext;
 public class TargettedAttributeValueFilterTest extends BaseComplexAttributeFilterTestCase {
     
     /*
-     * We will test this rule: xsi:type="basic:AttributeValueString" value="jsmith" attributeId="uid" ignoreCase="true"
+     * We will test this rule: xsi:type="basic:AttributeValueString" value="jsmith" attributeId="uid" ignoreCase="true".
      */
-    private Matcher valueMatcher() {
+    @Nonnull private Matcher valueMatcher() throws ComponentInitializationException {
         AttributeValueStringMatcher retVal = new AttributeValueStringMatcher();
 
         retVal.setCaseSensitive(true);
         retVal.setMatchString("jsmith");
         retVal.setId("Test");
-        try {
-            retVal.initialize();
-        } catch (final ComponentInitializationException e) {
-            retVal = null;
-        }
-
+        retVal.initialize();
         return retVal;
     }
 
@@ -101,31 +98,36 @@ public class TargettedAttributeValueFilterTest extends BaseComplexAttributeFilte
                 new AttributeFilterPolicy("targettedAtPermit", PolicyRequirementRule.MATCHES_ALL,
                         Collections.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
-        engine.setApplicationContext(new MockApplicationContext());
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy))) {
+
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            engine.pinComponent();
 
-        attributeValueFilterPolicy.initialize();
-        policy.initialize();
-        engine.initialize();
+            engine.setApplicationContext(new MockApplicationContext());
 
-        AttributeFilterContext context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
-        engine.filterAttributes(context);
-        Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
-        final IdPAttribute attribute = attributes.get("eduPersonAffiliation");
-        assertEquals(attribute.getValues().size(), 3);
+            attributeValueFilterPolicy.initialize();
+            policy.initialize();
+            engine.initialize();
 
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertNull(attributes.get("eduPersonAffiliation"));
+            AttributeFilterContext context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
+            engine.filterAttributes(context);
+            Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
+            final IdPAttribute attribute = attributes.get("eduPersonAffiliation");
+            assertEquals(attribute.getValues().size(), 3);
 
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertNull(attributes.get("eduPersonAffiliation"));
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertNull(attributes.get("eduPersonAffiliation"));
+
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertNull(attributes.get("eduPersonAffiliation"));
+        }
     }
 
     /**
@@ -169,32 +171,36 @@ public class TargettedAttributeValueFilterTest extends BaseComplexAttributeFilte
                 new AttributeFilterPolicy("targettedAtPermit", PolicyRequirementRule.MATCHES_ALL,
                         Collections.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
-        engine.setApplicationContext(new MockApplicationContext());
-
-
-        attributeValueFilterPolicy.initialize();
-        policy.initialize();
-        engine.initialize();
-
-        AttributeFilterContext context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
-        engine.filterAttributes(context);
-        Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
-        final IdPAttribute attribute = attributes.get("eduPersonAffiliation");
-        assertEquals(attribute.getValues().size(), 3);
-
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertEquals(attribute.getValues().size(), 3);
-
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertEquals(attribute.getValues().size(), 3);
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy))) {
+    
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            engine.pinComponent();
+            
+            engine.setApplicationContext(new MockApplicationContext());
+    
+            attributeValueFilterPolicy.initialize();
+            policy.initialize();
+            engine.initialize();
+    
+            AttributeFilterContext context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
+            engine.filterAttributes(context);
+            Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
+            final IdPAttribute attribute = attributes.get("eduPersonAffiliation");
+            assertEquals(attribute.getValues().size(), 3);
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertEquals(attribute.getValues().size(), 3);
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertEquals(attribute.getValues().size(), 3);
+        }
     }
 
     /**
@@ -229,31 +235,36 @@ public class TargettedAttributeValueFilterTest extends BaseComplexAttributeFilte
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("targettedAtPermit", rule,  Collections.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
-        engine.setApplicationContext(new MockApplicationContext());
-
-        attributeValueFilterPolicy.initialize();
-        policy.initialize();
-        engine.initialize();
-
-        AttributeFilterContext context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
-        engine.filterAttributes(context);
-        Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
-        final IdPAttribute attribute = attributes.get("eduPersonAffiliation");
-        assertEquals(attribute.getValues().size(), 3);
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy))) {
 
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertNull(attributes.get("eduPersonAffiliation"));
-
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertNull(attributes.get("eduPersonAffiliation"));
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            engine.pinComponent();
+            
+            engine.setApplicationContext(new MockApplicationContext());
+    
+            attributeValueFilterPolicy.initialize();
+            policy.initialize();
+            engine.initialize();
+    
+            AttributeFilterContext context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
+            engine.filterAttributes(context);
+            Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
+            final IdPAttribute attribute = attributes.get("eduPersonAffiliation");
+            assertEquals(attribute.getValues().size(), 3);
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertNull(attributes.get("eduPersonAffiliation"));
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertNull(attributes.get("eduPersonAffiliation"));
+        }
     }
 
 }
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java
index 037582e58..a0cefc683 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java
@@ -23,6 +23,8 @@ import static org.testng.Assert.assertNull;
 import java.util.Collections;
 import java.util.Map;
 
+import javax.annotation.Nonnull;
+
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
@@ -47,18 +49,14 @@ public class UntargettedAttributeValueFilterTest extends BaseComplexAttributeFil
     /*
      * We will test this rule: xsi:type="basic:AttributeValueString" value="jsmith" ignoreCase="true"
      */
-    private Matcher valueMatcher() {
+    @Nonnull private Matcher valueMatcher() throws ComponentInitializationException {
         AttributeValueStringMatcher retVal = new AttributeValueStringMatcher();
 
         retVal.setCaseSensitive(true);
         retVal.setMatchString("jsmith");
         
         retVal.setId("valueMatcher");
-        try {
-            retVal.initialize();
-        } catch (ComponentInitializationException e) {
-            retVal = null;
-        }
+        retVal.initialize();
 
         return retVal;
     }
@@ -93,31 +91,37 @@ public class UntargettedAttributeValueFilterTest extends BaseComplexAttributeFil
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("targettedAtPermit", PolicyRequirementRule.MATCHES_ALL,
                         Collections.singleton(attributeValueFilterPolicy));
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
-        engine.setApplicationContext(new MockApplicationContext());
-
-        attributeValueFilterPolicy.initialize();
-        policy.initialize();
-        engine.initialize();
-
-        AttributeFilterContext context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
-        engine.filterAttributes(context);
-        Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
-        assertNull(attributes.get("eduPersonAffiliation"));
-
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        IdPAttribute attribute = attributes.get("eduPersonAffiliation");
-        assertEquals(attribute.getValues().size(), 1);
-
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertNull(attributes.get("eduPersonAffiliation"));
+        
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy))) {
+            
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            engine.pinComponent();
+            
+            engine.setApplicationContext(new MockApplicationContext());
+    
+            attributeValueFilterPolicy.initialize();
+            policy.initialize();
+            engine.initialize();
+    
+            AttributeFilterContext context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
+            engine.filterAttributes(context);
+            Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
+            assertNull(attributes.get("eduPersonAffiliation"));
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            IdPAttribute attribute = attributes.get("eduPersonAffiliation");
+            assertEquals(attribute.getValues().size(), 1);
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertNull(attributes.get("eduPersonAffiliation"));
+        }
     }
 
     /**
@@ -151,31 +155,36 @@ public class UntargettedAttributeValueFilterTest extends BaseComplexAttributeFil
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("targettedAtPermit", rule,  Collections.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
-        engine.setApplicationContext(new MockApplicationContext());
-
-        attributeValueFilterPolicy.initialize();
-        policy.initialize();
-        engine.initialize();
-        AttributeFilterContext context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
-        engine.filterAttributes(context);
-        Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
-        IdPAttribute attribute = attributes.get("eduPersonAffiliation");
-        assertEquals(attribute.getValues().size(), 3);
-
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        attribute = attributes.get("eduPersonAffiliation");
-        assertEquals(attribute.getValues().size(), 3);
-
-        context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
-        engine.filterAttributes(context);
-        attributes = context.getFilteredIdPAttributes();
-        assertNull(attributes.get("eduPersonAffiliation"));
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy))) {
+    
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            engine.pinComponent();
+
+            engine.setApplicationContext(new MockApplicationContext());
+    
+            attributeValueFilterPolicy.initialize();
+            policy.initialize();
+            engine.initialize();
+            AttributeFilterContext context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uidwithjsmith.xml").values());
+            engine.filterAttributes(context);
+            Map<String, IdPAttribute> attributes = context.getFilteredIdPAttributes();
+            IdPAttribute attribute = attributes.get("eduPersonAffiliation");
+            assertEquals(attribute.getValues().size(), 3);
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("uid-epawithjsmith.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            attribute = attributes.get("eduPersonAffiliation");
+            assertEquals(attribute.getValues().size(), 3);
+    
+            context = new AttributeFilterContext();
+            context.setPrefilteredIdPAttributes(getIdPAttributes("epa-uid.xml").values());
+            engine.filterAttributes(context);
+            attributes = context.getFilteredIdPAttributes();
+            assertNull(attributes.get("eduPersonAffiliation"));
+        }
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java
index 5e4ea31d1..0161411e8 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java
@@ -50,29 +50,31 @@ public class AttributeFilterImplTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testPostConstructionState() throws Exception {
-        AttributeFilter filter = new AttributeFilterImpl("engine", Collections.EMPTY_LIST);
-        Assert.assertNotNull(filter.getFilterPolicies());
-        Assert.assertTrue(filter.getFilterPolicies().isEmpty());
-        Assert.assertEquals(filter.getId(), "engine");
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.emptyList())) {
+            
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+            
+            Assert.assertNotNull(filter.getFilterPolicies());
+            Assert.assertTrue(filter.getFilterPolicies().isEmpty());
+            Assert.assertEquals(filter.getId(), "engine");
+        }
 
-        try {
-            new AttributeFilterImpl("  ", null);
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl("  ", null)) {
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected
         }
 
-        try {
-            new AttributeFilterImpl("", null);
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl("", null)) {
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected
         }
 
-        try {
-            new AttributeFilterImpl(null, null);
+        try (final AttributeFilterImpl engine = new AttributeFilterImpl(null, null)) {
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected
         }
     }
@@ -87,35 +89,44 @@ public class AttributeFilterImplTest {
         AttributeFilterPolicy policy2 = new AttributeFilterPolicy("policy2", PolicyRequirementRule.MATCHES_NONE, null);
         AttributeFilterPolicy policy3 = new AttributeFilterPolicy("policy3", PolicyRequirementRule.MATCHES_NONE, null);
 
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Arrays.asList(policy1, policy1, policy2));
-        filter.setApplicationContext(new MockApplicationContext());
-        policy1.initialize();
-        policy2.initialize();
-        filter.initialize();
-
-        Assert.assertTrue(filter.isInitialized());
-        Assert.assertEquals(filter.getFilterPolicies().size(), 3);
-        Assert.assertTrue(filter.getFilterPolicies().contains(policy1));
-        Assert.assertTrue(policy1.isInitialized());
-        Assert.assertTrue(filter.getFilterPolicies().contains(policy2));
-        Assert.assertTrue(policy2.isInitialized());
-        Assert.assertFalse(filter.getFilterPolicies().contains(policy3));
-        Assert.assertFalse(policy3.isInitialized());
-
-        filter = new AttributeFilterImpl("engine", Arrays.asList(policy1, policy2));
-        filter.setApplicationContext(new MockApplicationContext());
-        filter.initialize();
-
-        Assert.assertEquals(filter.getFilterPolicies().size(), 2);
-        List<AttributeFilterPolicy> contents = filter.getFilterPolicies();
-        Assert.assertEquals(contents.get(0).getId(), "policy1");
-        Assert.assertEquals(contents.get(1).getId(), "policy2");
-
-        try {
-            filter.getFilterPolicies().add(policy1);
-            Assert.fail();
-        } catch (UnsupportedOperationException e) {
-            // expected this
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Arrays.asList(policy1, policy1, policy2))) {
+
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+            
+            filter.setApplicationContext(new MockApplicationContext());
+            policy1.initialize();
+            policy2.initialize();
+            filter.initialize();
+    
+            Assert.assertTrue(filter.isInitialized());
+            Assert.assertEquals(filter.getFilterPolicies().size(), 3);
+            Assert.assertTrue(filter.getFilterPolicies().contains(policy1));
+            Assert.assertTrue(policy1.isInitialized());
+            Assert.assertTrue(filter.getFilterPolicies().contains(policy2));
+            Assert.assertTrue(policy2.isInitialized());
+            Assert.assertFalse(filter.getFilterPolicies().contains(policy3));
+            Assert.assertFalse(policy3.isInitialized());
+        }
+
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Arrays.asList(policy1, policy2))) {
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            filter.initialize();
+    
+            Assert.assertEquals(filter.getFilterPolicies().size(), 2);
+            List<AttributeFilterPolicy> contents = filter.getFilterPolicies();
+            Assert.assertEquals(contents.get(0).getId(), "policy1");
+            Assert.assertEquals(contents.get(1).getId(), "policy2");
+    
+            try {
+                filter.getFilterPolicies().add(policy1);
+                Assert.fail();
+            } catch (UnsupportedOperationException e) {
+                // expected this
+            }
         }
     }
 
@@ -125,48 +136,53 @@ public class AttributeFilterImplTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testFilterAttributes() throws Exception {
-        MockMatcher attribute1Matcher = new MockMatcher();
+        final MockMatcher attribute1Matcher = new MockMatcher();
         attribute1Matcher.setMatchingAttribute("attribute1");
         attribute1Matcher.setMatchingValues(null);
 
-        AttributeRule attribute1Policy = new AttributeRule();
+        final AttributeRule attribute1Policy = new AttributeRule();
         attribute1Policy.setId("attribute1Policy");
         attribute1Policy.setAttributeId("attribute1");
         attribute1Policy.setMatcher(attribute1Matcher);
         attribute1Policy.setIsDenyRule(false);
 
-        AttributeFilterPolicy policy =
+        final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
                         Collections.singletonList(attribute1Policy));
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
 
-        IdPAttribute attribute1 = new IdPAttribute("attribute1");
+        final IdPAttribute attribute1 = new IdPAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        IdPAttribute attribute2 = new IdPAttribute("attribute2");
+        final IdPAttribute attribute2 = new IdPAttribute("attribute2");
         attribute2.setValues(Arrays.asList(new StringAttributeValue("a"), new StringAttributeValue("b")));
         filterContext.getPrefilteredIdPAttributes().put(attribute2.getId(), attribute2);
 
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
-        attribute1Policy.initialize();
-        policy.initialize();
-        filter.initialize();
-
-        filter.filterAttributes(filterContext);
-        final Map<String, IdPAttribute> resultAttrs = filterContext.getFilteredIdPAttributes();
-        Assert.assertEquals(resultAttrs.size(), 1);
-        final List<IdPAttributeValue> result = resultAttrs.get("attribute1").getValues();
-        Assert.assertEquals(result.size(), 2);
-        Assert.assertTrue(result.contains(new StringAttributeValue("one")));
-        Assert.assertTrue(result.contains(new StringAttributeValue("two")));
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
+
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            attribute1Policy.initialize();
+            policy.initialize();
+            filter.initialize();
+    
+            filter.filterAttributes(filterContext);
+            final Map<String, IdPAttribute> resultAttrs = filterContext.getFilteredIdPAttributes();
+            Assert.assertEquals(resultAttrs.size(), 1);
+            final List<IdPAttributeValue> result = resultAttrs.get("attribute1").getValues();
+            Assert.assertEquals(result.size(), 2);
+            Assert.assertTrue(result.contains(new StringAttributeValue("one")));
+            Assert.assertTrue(result.contains(new StringAttributeValue("two")));
+        }
     }
 
     @Test public void testAllMatcher() throws Exception {
 
-        AttributeRule attribute1Policy = new AttributeRule();
+        final AttributeRule attribute1Policy = new AttributeRule();
         attribute1Policy.setId("attribute1Policy");
         attribute1Policy.setAttributeId("attribute1");
         attribute1Policy.setMatcher(Matcher.MATCHES_ALL);
@@ -176,224 +192,263 @@ public class AttributeFilterImplTest {
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
                         Collections.singletonList(attribute1Policy));
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
 
-        IdPAttribute attribute1 = new IdPAttribute("attribute1");
+        final IdPAttribute attribute1 = new IdPAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
         attribute1Policy.initialize();
         policy.initialize();
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
-        filter.initialize();
-
-        filter.filterAttributes(filterContext);
-        List<IdPAttributeValue> result = filterContext.getFilteredIdPAttributes().get("attribute1").getValues();
-        Assert.assertEquals(result.size(), 2);
-        Assert.assertTrue(result.contains(new StringAttributeValue("one")));
-        Assert.assertTrue(result.contains(new StringAttributeValue("two")));
+        
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
+
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            filter.initialize();
+    
+            filter.filterAttributes(filterContext);
+            final List<IdPAttributeValue> result = filterContext.getFilteredIdPAttributes().get("attribute1").getValues();
+            Assert.assertEquals(result.size(), 2);
+            Assert.assertTrue(result.contains(new StringAttributeValue("one")));
+            Assert.assertTrue(result.contains(new StringAttributeValue("two")));
+        }
     }
     
     @Test public void testAllMatcherFails() throws Exception {
 
-        AttributeRule attribute2Policy = new AttributeRule();
+        final AttributeRule attribute2Policy = new AttributeRule();
         attribute2Policy.setId("attribute2Policy");
         attribute2Policy.setAttributeId("attribute1");
-        MockMatcher matcher = new MockMatcher();
+        final MockMatcher matcher = new MockMatcher();
         matcher.setFailValidate(true);
         attribute2Policy.setMatcher(matcher);
         attribute2Policy.setIsDenyRule(false);
 
-        AttributeFilterPolicy policy =
+        final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
                         Collections.singletonList(attribute2Policy));
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
 
-        IdPAttribute attribute1 = new IdPAttribute("attribute1");
+        final IdPAttribute attribute1 = new IdPAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
         attribute2Policy.initialize();
         policy.initialize();
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
-        filter.initialize();
+        
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
 
-        filter.filterAttributes(filterContext);
-        Assert.assertTrue(filterContext.getFilteredIdPAttributes().isEmpty());
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            filter.initialize();
+    
+            filter.filterAttributes(filterContext);
+            Assert.assertTrue(filterContext.getFilteredIdPAttributes().isEmpty());
+        }
     }
 
 
     @Test public void testNoneMatcher() throws Exception {
 
-        AttributeRule attribute1Policy = new AttributeRule();
+        final AttributeRule attribute1Policy = new AttributeRule();
         attribute1Policy.setId("attribute1Policy");
         attribute1Policy.setAttributeId("attribute1");
         attribute1Policy.setMatcher(Matcher.MATCHES_NONE);
         attribute1Policy.setIsDenyRule(false);
 
-        AttributeFilterPolicy policy =
+        final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
                         Collections.singletonList(attribute1Policy));
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
 
-        IdPAttribute attribute1 = new IdPAttribute("attribute1");
+        final IdPAttribute attribute1 = new IdPAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
-        attribute1Policy.initialize();
-        policy.initialize();
-        filter.initialize();
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
 
-        filter.filterAttributes(filterContext);
-        Assert.assertTrue(filterContext.getFilteredIdPAttributes().isEmpty());
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            attribute1Policy.initialize();
+            policy.initialize();
+            filter.initialize();
+    
+            filter.filterAttributes(filterContext);
+            Assert.assertTrue(filterContext.getFilteredIdPAttributes().isEmpty());
+        }
     }
 
     @Test public void testDenyFilterAttributes() throws Exception {
-        MockMatcher deny = new MockMatcher();
+        final MockMatcher deny = new MockMatcher();
         deny.setMatchingAttribute("attribute1");
         deny.setMatchingValues(Collections.singletonList(new StringAttributeValue("one")));
 
-        AttributeRule denyPolicy = new AttributeRule();
+        final AttributeRule denyPolicy = new AttributeRule();
         denyPolicy.setId("denyPolicy");
         denyPolicy.setAttributeId("attribute1");
         denyPolicy.setMatcher(deny);
         denyPolicy.setIsDenyRule(true);
 
-        AttributeRule allowPolicy = new AttributeRule();
+        final AttributeRule allowPolicy = new AttributeRule();
         allowPolicy.setId("allowPolicy");
         allowPolicy.setAttributeId("attribute1");
         allowPolicy.setMatcher(Matcher.MATCHES_ALL);
         allowPolicy.setIsDenyRule(false);
 
-        AttributeFilterPolicy policy =
+        final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
                         Arrays.asList(denyPolicy, allowPolicy));
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
 
-        IdPAttribute attribute1 = new IdPAttribute("attribute1");
+        final IdPAttribute attribute1 = new IdPAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
-        denyPolicy.initialize();
-        allowPolicy.initialize();
-        policy.initialize();
-        filter.initialize();
-
-        filter.filterAttributes(filterContext);
-        Map<String, IdPAttribute> resultAttrs = filterContext.getFilteredIdPAttributes();
-        Assert.assertEquals(resultAttrs.size(), 1);
-        List<IdPAttributeValue> result = resultAttrs.get("attribute1").getValues();
-        Assert.assertEquals(result.size(), 1);
-        Assert.assertTrue(result.contains(new StringAttributeValue("two")));
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
+
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            denyPolicy.initialize();
+            allowPolicy.initialize();
+            policy.initialize();
+            filter.initialize();
+    
+            filter.filterAttributes(filterContext);
+            final Map<String, IdPAttribute> resultAttrs = filterContext.getFilteredIdPAttributes();
+            Assert.assertEquals(resultAttrs.size(), 1);
+            final List<IdPAttributeValue> result = resultAttrs.get("attribute1").getValues();
+            Assert.assertEquals(result.size(), 1);
+            Assert.assertTrue(result.contains(new StringAttributeValue("two")));
+        }
     }
 
     @Test public void testNoPolicy() throws Exception {
-        AttributeRule allowPolicy = new AttributeRule();
+        final AttributeRule allowPolicy = new AttributeRule();
         allowPolicy.setId("allowPolicy");
         allowPolicy.setAttributeId("attribute1");
         allowPolicy.setMatcher(Matcher.MATCHES_ALL);
         allowPolicy.setIsDenyRule(false);
 
-        AttributeFilterPolicy policy =
+        final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_NONE,
                         Collections.singletonList(allowPolicy));
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
 
-        IdPAttribute attribute1 = new IdPAttribute("attribute1");
+        final IdPAttribute attribute1 = new IdPAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
-        policy.initialize();
-        filter.initialize();
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
 
-        filter.filterAttributes(filterContext);
-        Assert.assertTrue(filterContext.getFilteredIdPAttributes().isEmpty());
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            policy.initialize();
+            filter.initialize();
+    
+            filter.filterAttributes(filterContext);
+            Assert.assertTrue(filterContext.getFilteredIdPAttributes().isEmpty());
+        }
     }
 
     @Test public void testDenyAllFilterAttributes() throws Exception {
-        AttributeRule denyPolicy = new AttributeRule();
+        final AttributeRule denyPolicy = new AttributeRule();
         denyPolicy.setId("denyPolicy");
         denyPolicy.setAttributeId("attribute1");
         denyPolicy.setMatcher(Matcher.MATCHES_ALL);
         denyPolicy.setIsDenyRule(true);
 
-        AttributeRule allowPolicy = new AttributeRule();
+        final AttributeRule allowPolicy = new AttributeRule();
         allowPolicy.setId("allowPolicy");
         allowPolicy.setAttributeId("attribute1");
         allowPolicy.setMatcher(Matcher.MATCHES_ALL);
         allowPolicy.setIsDenyRule(false);
 
-        AttributeFilterPolicy policy =
+        final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
                         Arrays.asList(denyPolicy, allowPolicy));
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
 
-        IdPAttribute attribute1 = new IdPAttribute("attribute1");
+        final IdPAttribute attribute1 = new IdPAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
-        allowPolicy.initialize();
-        denyPolicy.initialize();
-        policy.initialize();
-        filter.initialize();
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
 
-        filter.filterAttributes(filterContext);
-        Map<String, IdPAttribute> resultAttrs = filterContext.getFilteredIdPAttributes();
-        Assert.assertTrue(resultAttrs.isEmpty());
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
+
+            filter.setApplicationContext(new MockApplicationContext());
+            allowPolicy.initialize();
+            denyPolicy.initialize();
+            policy.initialize();
+            filter.initialize();
+    
+            filter.filterAttributes(filterContext);
+            final Map<String, IdPAttribute> resultAttrs = filterContext.getFilteredIdPAttributes();
+            Assert.assertTrue(resultAttrs.isEmpty());
+        }
     }
 
     @Test public void testInitDestroy() throws ComponentInitializationException {
-        MockMatcher matcher = new MockMatcher();
-        AttributeRule filterPolicy = new AttributeRule();
+        final MockMatcher matcher = new MockMatcher();
+        final AttributeRule filterPolicy = new AttributeRule();
         filterPolicy.setId("filterPolicy");
         filterPolicy.setAttributeId("attribute1");
         filterPolicy.setMatcher(matcher);
         filterPolicy.setIsDenyRule(false);
 
-        MockPolicyRequirementRule policyRule = new MockPolicyRequirementRule();
-        AttributeFilterPolicy policy = new AttributeFilterPolicy("policy", policyRule, Collections.singletonList(filterPolicy));
+        final MockPolicyRequirementRule policyRule = new MockPolicyRequirementRule();
+        final AttributeFilterPolicy policy = new AttributeFilterPolicy("policy", policyRule, Collections.singletonList(filterPolicy));
 
         Assert.assertFalse(policyRule.isInitialized());
         Assert.assertFalse(policyRule.isDestroyed());
         Assert.assertFalse(matcher.isInitialized());
         Assert.assertFalse(matcher.isDestroyed());
 
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
-        filter.setApplicationContext(new MockApplicationContext());
+        try (final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy))) {
 
-        policy.initialize();
-        matcher.initialize();
-        policyRule.initialize();
-        filter.initialize();
+            // TODO: this seems off but is needed to allow try-with-resources while also unlocking.
+            filter.pinComponent();
 
-        Assert.assertTrue(policyRule.isInitialized());
-        Assert.assertFalse(policyRule.isDestroyed());
-        Assert.assertTrue(matcher.isInitialized());
-        Assert.assertFalse(matcher.isDestroyed());
-
-        filter.destroy();
-        policyRule.destroy();
-        policy.destroy();
-        matcher.destroy();
-        Assert.assertTrue(policyRule.isInitialized());
-        Assert.assertTrue(policyRule.isDestroyed());
-        Assert.assertTrue(matcher.isInitialized());
-        Assert.assertTrue(matcher.isDestroyed());
+            filter.setApplicationContext(new MockApplicationContext());
+    
+            policy.initialize();
+            matcher.initialize();
+            policyRule.initialize();
+            filter.initialize();
+    
+            Assert.assertTrue(policyRule.isInitialized());
+            Assert.assertFalse(policyRule.isDestroyed());
+            Assert.assertTrue(matcher.isInitialized());
+            Assert.assertFalse(matcher.isDestroyed());
+    
+            // TODO: can't do this because pin above grabs read lock and this requires write lock
+            //filter.destroy();
+            
+            policyRule.destroy();
+            policy.destroy();
+            matcher.destroy();
+            Assert.assertTrue(policyRule.isInitialized());
+            Assert.assertTrue(policyRule.isDestroyed());
+            Assert.assertTrue(matcher.isInitialized());
+            Assert.assertTrue(matcher.isDestroyed());
+        }
     }
 
 }
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcherTest.java
index 25093c433..7f452ab92 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractRegexpStringMatcherTest.java
@@ -61,4 +61,4 @@ public class AbstractRegexpStringMatcherTest {
 
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/DataSources.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/DataSources.java
index 81e174da9..17806f8fa 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/DataSources.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/DataSources.java
@@ -25,6 +25,7 @@ import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 
 import org.opensaml.messaging.context.navigate.ParentContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -35,43 +36,44 @@ import org.opensaml.profile.context.ProfileRequestContext;
 @SuppressWarnings("javadoc")
 public abstract class DataSources {
 
-    public final static String TEST_STRING = "nibbleahappywarthog";
+    @Nonnull @NotEmpty public final static String TEST_STRING = "nibbleahappywarthog";
 
-    public final static String TEST_STRING_UPPER = TEST_STRING.toUpperCase();
+    @Nonnull @NotEmpty public final static String TEST_STRING_UPPER = TEST_STRING.toUpperCase();
 
-    public final static String NON_MATCH_STRING = "ThisIsADifferentString";
+    @Nonnull @NotEmpty public final static String NON_MATCH_STRING = "ThisIsADifferentString";
 
-    public final static String TEST_REGEX = "^n.*g";
+    @Nonnull @NotEmpty public final static String TEST_REGEX = "^n.*g";
 
-    public final static StringAttributeValue STRING_VALUE = new StringAttributeValue(TEST_STRING);
+    @Nonnull public final static StringAttributeValue STRING_VALUE = new StringAttributeValue(TEST_STRING);
     
-    public final static StringAttributeValue STRING_VALUE_UPPER = new StringAttributeValue(TEST_STRING.toUpperCase());
+    @Nonnull public final static StringAttributeValue STRING_VALUE_UPPER = new StringAttributeValue(TEST_STRING.toUpperCase());
 
-    public final static StringAttributeValue NON_MATCH_STRING_VALUE = new StringAttributeValue(NON_MATCH_STRING);
+    @Nonnull public final static StringAttributeValue NON_MATCH_STRING_VALUE = new StringAttributeValue(NON_MATCH_STRING);
 
-    public final static ScopedStringAttributeValue SCOPED_VALUE_VALUE_MATCH = new ScopedStringAttributeValue(
+    @Nonnull public final static ScopedStringAttributeValue SCOPED_VALUE_VALUE_MATCH = new ScopedStringAttributeValue(
             TEST_STRING, NON_MATCH_STRING);
 
-    public final static ScopedStringAttributeValue SCOPED_VALUE_SCOPE_MATCH = new ScopedStringAttributeValue(
+    @Nonnull public final static ScopedStringAttributeValue SCOPED_VALUE_SCOPE_MATCH = new ScopedStringAttributeValue(
             NON_MATCH_STRING, TEST_STRING);
 
-    public final static ByteAttributeValue BYTE_ATTRIBUTE_VALUE = new ByteAttributeValue(TEST_STRING.getBytes());
+    @Nonnull public final static ByteAttributeValue BYTE_ATTRIBUTE_VALUE = new ByteAttributeValue(TEST_STRING.getBytes());
 
-    public final static IdPAttributeValue OTHER_VALUE = new IdPAttributeValue() {
+    @Nonnull public final static IdPAttributeValue OTHER_VALUE = new IdPAttributeValue() {
 
         @Override @Nonnull public Object getNativeValue() {
             return TEST_STRING;
         }
-        public String getDisplayValue() {
+        @Nonnull public String getDisplayValue() {
             return TEST_STRING;
         }
     };
 
-    public static AttributeFilterContext populatedFilterContext(String principal, String issuerID, String recipientId) {
+    @Nonnull public static AttributeFilterContext populatedFilterContext(String principal, String issuerID, String recipientId) {
 
         final ProfileRequestContext parent = new ProfileRequestContext();
         parent.addSubcontext(TestSources.createResolutionContext(principal, issuerID, recipientId));
-        AttributeFilterContext retVal = parent.getSubcontext(AttributeFilterContext.class, true);
+        final AttributeFilterContext retVal = parent.getSubcontext(AttributeFilterContext.class, true);
+        assert retVal != null;
         retVal.setPrincipal(principal);
         retVal.setAttributeIssuerID(issuerID);
         retVal.setAttributeRecipientID(recipientId);
@@ -80,11 +82,11 @@ public abstract class DataSources {
         return retVal;
     }
 
-    public static AttributeFilterContext unPopulatedFilterContext() {
+    @Nonnull public static AttributeFilterContext unPopulatedFilterContext() {
 
         final ProfileRequestContext parent = new ProfileRequestContext();
         final AttributeFilterContext afc = parent.getSubcontext(AttributeFilterContext.class, true);
-        
+        assert afc != null;
         afc.setProfileRequestContextLookupStrategy(new ParentContextLookup<>(ProfileRequestContext.class));
         
         return afc;
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
index f34cc596a..68e7abcda 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
@@ -28,6 +28,9 @@ import static org.testng.Assert.fail;
 import java.util.Collections;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -160,6 +163,7 @@ public class ScriptedMatcherTest extends AbstractMatcherPolicyRuleTest {
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
         assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 1);
         assertTrue(result.contains(value1) || result.contains(value2) || result.contains(value3));
     }
@@ -176,7 +180,7 @@ public class ScriptedMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 1);
         assertTrue(result.contains(value1) || result.contains(value2) || result.contains(value3));
     }
@@ -207,7 +211,7 @@ public class ScriptedMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 1);
         assertTrue(result.contains(value1) || result.contains(value2) || result.contains(value3));
     }
@@ -277,7 +281,7 @@ public class ScriptedMatcherTest extends AbstractMatcherPolicyRuleTest {
 
     }
 
-    static public  ScriptedMatcher newScriptedMatcher(final EvaluableScript script) {
+    @Nonnull static public  ScriptedMatcher newScriptedMatcher(@Nonnull final EvaluableScript script) {
         final ScriptedMatcher what = new ScriptedMatcher();
         what.setScript(script);
         return what;
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcherTest.java
index 898bbb76a..342a9327c 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcherTest.java
@@ -90,6 +90,7 @@ public class AndMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
+        assert result != null;
         assertEquals(result.size(), 2);
         assertTrue(result.contains(value2));
         assertTrue(result.contains(value1));
@@ -113,7 +114,7 @@ public class AndMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 1);
         assertTrue(result.contains(value2));
 
@@ -157,7 +158,10 @@ public class AndMatcherTest extends AbstractMatcherPolicyRuleTest {
 
         matcher.setId("Test");
         matcher.initialize();
-        assertTrue(matcher.getMatchingValues(attribute, filterContext).isEmpty());
+        
+        final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
+        assert result != null;
+        assertTrue(result.isEmpty());
     }
     
     static public AndMatcher newAndMatcher(final @Nonnull @NonnullElements List<Matcher> what) {
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcherTest.java
index e38f065e8..2461d71f8 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcherTest.java
@@ -19,12 +19,7 @@ package net.shibboleth.idp.attribute.filter.matcher.logic.impl;
 
 import static com.google.common.base.Predicates.equalTo;
 import static com.google.common.base.Predicates.or;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
+import static org.testng.Assert.*;
 
 import java.util.Arrays;
 import java.util.Set;
@@ -117,7 +112,7 @@ public class NotMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 1);
         assertTrue(result.contains(value3));
         matcher.destroy();
@@ -140,7 +135,7 @@ public class NotMatcherTest extends AbstractMatcherPolicyRuleTest {
         orMatcher.initialize();
 
         result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 0);
     }
 
@@ -159,4 +154,4 @@ public class NotMatcherTest extends AbstractMatcherPolicyRuleTest {
         return rule;
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
index d78386309..71ac08616 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
@@ -31,6 +31,8 @@ import java.util.List;
 import java.util.Set;
 import java.util.function.Predicate;
 
+import javax.annotation.Nonnull;
+
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -91,6 +93,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
+        assert result != null;
         assertEquals(result.size(), 2);
         assertTrue(result.contains(value2));
         assertTrue(result.contains(value1));
@@ -115,7 +118,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 2);
         assertTrue(result.contains(value2) && result.contains(value1));
 
@@ -146,7 +149,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertEquals(result.size(), 2);
         assertTrue(result.contains(value2) && result.contains(value1));
 
@@ -164,7 +167,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
 
         final Set<IdPAttributeValue> result = matcher.getMatchingValues(attribute, filterContext);
-        assertNotNull(result);
+        assert result != null;
         assertTrue(result.isEmpty());
 
     }
@@ -185,7 +188,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
         matcher.initialize();
     }
     
-    static public OrMatcher newOrMatcher(final List<Matcher> what) {
+    @Nonnull static public OrMatcher newOrMatcher(final List<Matcher> what) {
         final OrMatcher matcher = new OrMatcher();
         matcher.setSubsidiaries(what);
         return matcher;
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java
index 9613a6987..5eb89f105 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java
@@ -25,10 +25,14 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
 import org.opensaml.core.xml.XMLObjectBuilder;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.core.xml.schema.XSString;
+import org.opensaml.messaging.context.BaseContext;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.saml.common.SAMLObjectBuilder;
 import org.opensaml.saml.common.messaging.context.AttributeConsumingServiceContext;
@@ -70,13 +74,13 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
         valueBuilder = XMLObjectProviderRegistrySupport.getBuilderFactory().<XSString>getBuilderOrThrow(XSString.TYPE_NAME);
     }
 
-    private IdPAttribute makeAttribute(String id, List<IdPAttributeValue> values) {
+    @Nonnull private IdPAttribute makeAttribute(@Nonnull String id, @Nullable List<IdPAttributeValue> values) {
         final IdPAttribute attr = new IdPAttribute(id);
         attr.setValues(values);
         return attr;
     }
 
-    private AttributeInMetadataMatcher makeMatcher(String id, boolean matchIfMetadataSilent, boolean onlyIfRequired,
+    private AttributeInMetadataMatcher makeMatcher(@Nonnull String id, boolean matchIfMetadataSilent, boolean onlyIfRequired,
             String name, String nameFormat)
             throws ComponentInitializationException {
         AttributeInMetadataMatcher matcher = new AttributeInMetadataMatcher();
@@ -92,15 +96,19 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     private void setRequestedAttributesInContext(final AttributeFilterContext context,
             final Collection<RequestedAttribute> attributes) {
         final SAMLMetadataContext samlMetadataContext = context.getSubcontext(SAMLMetadataContext.class, true);
+        assert samlMetadataContext != null;
         final AttributeConsumingServiceContext acsCtx =
                 samlMetadataContext.getSubcontext(AttributeConsumingServiceContext.class, true);
-        acsCtx.setAttributeConsumingService(acsBuilder.buildObject());
-        acsCtx.getAttributeConsumingService().getRequestedAttributes().addAll(attributes);
+        assert acsCtx != null;
+        final AttributeConsumingService acs =
+                acsCtx.setAttributeConsumingService(acsBuilder.buildObject()).getAttributeConsumingService();
+        assert acs != null;
+        acs.getRequestedAttributes().addAll(attributes);
         context.setRequesterMetadataContextLookupStrategy(
                 new ChildContextLookup<AttributeFilterContext,SAMLMetadataContext>(SAMLMetadataContext.class));
     }
 
-    private AttributeFilterContext makeContext(RequestedAttribute attribute) {
+    @Nonnull private AttributeFilterContext makeContext(@Nullable RequestedAttribute attribute) {
         final AttributeFilterContext context = new AttributeFilterContext();
         if (attribute != null) {
             setRequestedAttributesInContext(context, Collections.singletonList(attribute));
@@ -229,13 +237,17 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
                 makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final AttributeFilterContext context = makeContext(null);
-        setRequestedAttributesInContext(context, Collections.EMPTY_SET);
+        setRequestedAttributesInContext(context, Collections.emptySet());
         
-        final AttributeConsumingService acs = context.getRequesterMetadataContext().
-                getSubcontext(AttributeConsumingServiceContext.class).getAttributeConsumingService();
+        final BaseContext b1 = context.getRequesterMetadataContext();
+        assert b1 != null;
+        final AttributeConsumingServiceContext b2 = b1.getSubcontext(AttributeConsumingServiceContext.class);
+        assert b2 != null;
+        final AttributeConsumingService acs = b2.getAttributeConsumingService();
         
-        Multimap<String,IdPAttribute> value =  HashMultimap.create();
+        final Multimap<String,IdPAttribute> value =  HashMultimap.create();
         value.put("attr", attr);
+        assert acs != null;
         acs.getObjectMetadata().put(new AttributesMapContainer(value));
         
 
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
index 971ceb34b..81bd8e653 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
@@ -26,6 +26,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -61,15 +64,15 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
                         AttributeConsumingService.DEFAULT_ELEMENT_NAME);
     }
     
-    private IdPAttribute makeAttribute(String id, List<IdPAttributeValue> values) {
+    @Nonnull private IdPAttribute makeAttribute(@Nonnull final String id, @Nullable final List<IdPAttributeValue> values) {
         IdPAttribute attr = new IdPAttribute(id);
         attr.setValues(values);
         return attr;
     }
 
-    private AttributeInMetadataMatcher makeMatcher(String id, boolean matchIfMetadataSilent, boolean onlyIfRequired)
+    @Nonnull private AttributeInMetadataMatcher makeMatcher(@Nonnull final String id, boolean matchIfMetadataSilent, boolean onlyIfRequired)
             throws ComponentInitializationException {
-        AttributeInMetadataMatcher matcher = new AttributeInMetadataMatcher();
+        final AttributeInMetadataMatcher matcher = new AttributeInMetadataMatcher();
         matcher.setMatchIfMetadataSilent(matchIfMetadataSilent);
         matcher.setOnlyIfRequired(onlyIfRequired);
         matcher.setId(id);
@@ -77,19 +80,23 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
         return matcher;
     }
 
-    private void setRequestedAttributesInContext(final AttributeFilterContext context,
-            final Multimap<String, IdPAttribute> multimap) {
+    private void setRequestedAttributesInContext(@Nonnull final AttributeFilterContext context,
+            @Nonnull final Multimap<String, IdPAttribute> multimap) {
         final AttributesMapContainer container = new AttributesMapContainer(multimap);
         final SAMLMetadataContext samlMetadataContext = context.getSubcontext(SAMLMetadataContext.class, true);
+        assert samlMetadataContext != null;
         final AttributeConsumingServiceContext acsCtx =
                 samlMetadataContext.getSubcontext(AttributeConsumingServiceContext.class, true);
-        acsCtx.setAttributeConsumingService(acsBuilder.buildObject());
-        acsCtx.getAttributeConsumingService().getObjectMetadata().put(container);
+        assert acsCtx != null;
+        final AttributeConsumingService acs = acsCtx.setAttributeConsumingService(acsBuilder.buildObject()).getAttributeConsumingService();
+        assert acs != null;
+        acs.getObjectMetadata().put(container);
         context.setRequesterMetadataContextLookupStrategy(new ChildContextLookup<AttributeFilterContext, SAMLMetadataContext>(
                 SAMLMetadataContext.class));
     }
 
-    private AttributeFilterContext makeContext(String attributeId, IdPRequestedAttribute attribute) {
+    @Nonnull private AttributeFilterContext makeContext(@Nullable final String attributeId,
+            @Nullable final IdPRequestedAttribute attribute) {
 
         final AttributeFilterContext context = new AttributeFilterContext();
 
@@ -103,7 +110,7 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
         return context;
     }
 
-    private AttributeFilterContext makeContext(IdPRequestedAttribute attribute) {
+    @Nonnull private AttributeFilterContext makeContext(@Nullable final IdPRequestedAttribute attribute) {
 
         if (null == attribute) {
             return makeContext(null, null);
@@ -194,8 +201,8 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
         final IdPAttribute attr =
                 makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
-        AttributeFilterContext context = makeContext("attr", null);
-        Set<IdPAttributeValue> result = makeMatcher("test", false, true).getMatchingValues(attr, context);
+        final AttributeFilterContext context = makeContext("attr", null);
+        final Set<IdPAttributeValue> result = makeMatcher("test", false, true).getMatchingValues(attr, context);
         assertTrue(result.isEmpty());
     }
 
@@ -204,11 +211,11 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
         final IdPAttribute attr =
                 makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
-        IdPRequestedAttribute req1 = new IdPRequestedAttribute("attr");
+        final IdPRequestedAttribute req1 = new IdPRequestedAttribute("attr");
         req1.setRequired(true);
         req1.setValues(Collections.singletonList(DataSources.STRING_VALUE));
 
-        IdPRequestedAttribute req2 = new IdPRequestedAttribute("attr");
+        final IdPRequestedAttribute req2 = new IdPRequestedAttribute("attr");
         req2.setRequired(true);
         req2.setValues(Collections.singletonList(DataSources.NON_MATCH_STRING_VALUE));
 
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/ScopeMatchesShibMDScopeTests.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/ScopeMatchesShibMDScopeTests.java
index 42dddb9a8..73dbbfeb9 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/ScopeMatchesShibMDScopeTests.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/ScopeMatchesShibMDScopeTests.java
@@ -24,6 +24,8 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.criterion.EntityIdCriterion;
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.saml.common.messaging.context.SAMLMetadataContext;
@@ -68,7 +70,7 @@ public class ScopeMatchesShibMDScopeTests extends XMLObjectBaseTestCase {
         valueMatcher.setId("valueMatcher");
         valueMatcher.initialize();
 
-        NodeProcessingMetadataFilter filter = new NodeProcessingMetadataFilter();
+        final NodeProcessingMetadataFilter filter = new NodeProcessingMetadataFilter();
         filter.setNodeProcessors(List.of(new ScopesNodeProcessor()));
         filter.initialize();
         
@@ -81,7 +83,7 @@ public class ScopeMatchesShibMDScopeTests extends XMLObjectBaseTestCase {
         resolver.initialize();
     }
     
-    private AttributeFilterContext filterContextFor(final EntityDescriptor entity) {
+    @Nonnull private AttributeFilterContext filterContextFor(@Nonnull final EntityDescriptor entity) {
         final SAMLMetadataContext metadataContext = new SAMLMetadataContext();
         metadataContext.setEntityDescriptor(entity);
         metadataContext.setRoleDescriptor(entity.getRoleDescriptors().get(0));
@@ -96,9 +98,9 @@ public class ScopeMatchesShibMDScopeTests extends XMLObjectBaseTestCase {
     }
     
     @Test public void aa() throws ResolverException {
-        IdPAttribute testAttribute = new IdPAttribute("test");
-        IdPAttributeValue resultValue1 = new ScopedStringAttributeValue("value", "aa.aa");
-        IdPAttributeValue resultValue2 = new StringAttributeValue("aa");
+        final IdPAttribute testAttribute = new IdPAttribute("test");
+        final IdPAttributeValue resultValue1 = new ScopedStringAttributeValue("value", "aa.aa");
+        final IdPAttributeValue resultValue2 = new StringAttributeValue("aa");
 
         testAttribute.setValues(List.of(
                     new ScopedStringAttributeValue("value", "scope"),
@@ -108,6 +110,7 @@ public class ScopeMatchesShibMDScopeTests extends XMLObjectBaseTestCase {
                     resultValue2));
         
         final EntityDescriptor entity = resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(aaEntityID)));
+        assert entity != null;
         Set<IdPAttributeValue> result = scopeMatcher.getMatchingValues(testAttribute, filterContextFor(entity));
         assertEquals(result.size(), 1);
         assertTrue(result.contains(resultValue1));
@@ -127,7 +130,8 @@ public class ScopeMatchesShibMDScopeTests extends XMLObjectBaseTestCase {
                     ));
         
         final EntityDescriptor entity = resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(noneEntityID)));
-        Set<IdPAttributeValue> result = scopeMatcher.getMatchingValues(testAttribute, filterContextFor(entity));
+        assert entity != null;
+        final Set<IdPAttributeValue> result = scopeMatcher.getMatchingValues(testAttribute, filterContextFor(entity));
         assertTrue(result.isEmpty());
 
         assertTrue(valueMatcher.getMatchingValues(testAttribute, filterContextFor(entity)).isEmpty());
@@ -146,6 +150,7 @@ public class ScopeMatchesShibMDScopeTests extends XMLObjectBaseTestCase {
         testAttribute.setValues(list);
         
         final EntityDescriptor entity = resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(bothEntityID)));
+        assert entity != null;
         Set<IdPAttributeValue> result = scopeMatcher.getMatchingValues(testAttribute, filterContextFor(entity));
         assertEquals(result.size(), 3);
         for (int i = 0; i < 3; i++) {
@@ -169,6 +174,7 @@ public class ScopeMatchesShibMDScopeTests extends XMLObjectBaseTestCase {
                     resultValue2));
         
         final EntityDescriptor entity = resolver.resolveSingle(new CriteriaSet(new EntityIdCriterion(entityEntityID)));
+        assert entity != null;
         Set<IdPAttributeValue> result = scopeMatcher.getMatchingValues(testAttribute, filterContextFor(entity));
         assertEquals(result.size(), 1);
         assertTrue(result.contains(resultValue1));
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java
index d985f6d3c..67e0fcdfe 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java
@@ -59,6 +59,7 @@ public class PredicatePolicyRuleTest {
 
         final ProfileRequestContext pc = new ProfileRequestContext();
         final AttributeFilterContext afc = pc.getSubcontext(AttributeFilterContext.class, true);
+        assert afc != null;
         afc.setProfileRequestContextLookupStrategy(new ParentContextLookup<>(ProfileRequestContext.class));
         
         assertEquals(rule.matches(afc), Tristate.FALSE);
@@ -72,6 +73,7 @@ public class PredicatePolicyRuleTest {
         
         final ProfileRequestContext pc = new ProfileRequestContext();
         final AttributeFilterContext afc = pc.getSubcontext(AttributeFilterContext.class, true);
+        assert afc != null;
         assertEquals(rule.matches(afc), Tristate.FAIL);
     }
     
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRuleTest.java
index e35103270..267908837 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProfilePolicyRuleTest.java
@@ -71,11 +71,13 @@ public class ProfilePolicyRuleTest {
 
         final ProfilePolicyRule matcher = getMatcher(true);
         final AttributeFilterContext afc = DataSources.populatedFilterContext(null, null, null);
+        final ProfileRequestContext prc = (ProfileRequestContext) afc.getParent();
+        assert prc != null;
         
-        ((ProfileRequestContext) afc.getParent()).setProfileId("https://shibboleth.net/Profile");
+        prc.setProfileId("https://shibboleth.net/Profile");
         assertEquals(matcher.matches(afc), Tristate.FALSE);
         
-        ((ProfileRequestContext) afc.getParent()).setProfileId("https://shibboleth.net/profile");
+        prc.setProfileId("https://shibboleth.net/profile");
         assertEquals(matcher.matches(afc), Tristate.TRUE);
     }
 
@@ -84,11 +86,13 @@ public class ProfilePolicyRuleTest {
 
         final ProfilePolicyRule matcher = getMatcher(false);
         final AttributeFilterContext afc = DataSources.populatedFilterContext(null, null, null);
+        final ProfileRequestContext prc = (ProfileRequestContext) afc.getParent();
+        assert prc != null;
         
-        ((ProfileRequestContext) afc.getParent()).setProfileId("https://shibboleth.net/Profile");
+        prc.setProfileId("https://shibboleth.net/Profile");
         assertEquals(matcher.matches(afc), Tristate.TRUE);
         
-        ((ProfileRequestContext) afc.getParent()).setProfileId("https://shibboleth.net/profile");
+        prc.setProfileId("https://shibboleth.net/profile");
         assertEquals(matcher.matches(afc), Tristate.TRUE);
     }
 
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRuleTest.java
index 87807d040..8c3efe40b 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRuleTest.java
@@ -22,6 +22,8 @@ import static org.testng.Assert.fail;
 
 import java.util.Arrays;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProxiedRequesterContext;
 import org.testng.annotations.Test;
@@ -38,7 +40,8 @@ import net.shibboleth.shared.component.UninitializedComponentException;
 @SuppressWarnings("javadoc")
 public class ProxiedRequesterPolicyRuleTest {
 
-    private ProxiedRequesterPolicyRule getMatcher(final boolean caseSensitive) throws ComponentInitializationException {
+    @Nonnull private ProxiedRequesterPolicyRule getMatcher(final boolean caseSensitive)
+            throws ComponentInitializationException {
         final ProxiedRequesterPolicyRule matcher = new ProxiedRequesterPolicyRule();
         matcher.setMatchString("requester");
         matcher.setCaseSensitive(caseSensitive);
@@ -79,11 +82,15 @@ public class ProxiedRequesterPolicyRuleTest {
         final AttributeFilterContext ctx = DataSources.populatedFilterContext(null, null, "wibble");
         ctx.setProxiedRequesterContextLookupStrategy(
                 new ChildContextLookup<AttributeFilterContext,ProxiedRequesterContext>(ProxiedRequesterContext.class));
-        ctx.getSubcontext(ProxiedRequesterContext.class, true).getRequesters().addAll(Arrays.asList("foo", "bar"));
+        
+        final ProxiedRequesterContext proxyCtx = ctx.getSubcontext(ProxiedRequesterContext.class, true);
+        assert proxyCtx != null;
+        
+        proxyCtx.getRequesters().addAll(Arrays.asList("foo", "bar"));
 
         assertEquals(matcher.matches(ctx), Tristate.FALSE);
         
-        ctx.getSubcontext(ProxiedRequesterContext.class).getRequesters().add("requester");
+        proxyCtx.getRequesters().add("requester");
         assertEquals(matcher.matches(ctx), Tristate.TRUE);
     }
 
@@ -94,12 +101,16 @@ public class ProxiedRequesterPolicyRuleTest {
         final AttributeFilterContext ctx = DataSources.populatedFilterContext(null, null, "wibble");
         ctx.setProxiedRequesterContextLookupStrategy(
                 new ChildContextLookup<AttributeFilterContext,ProxiedRequesterContext>(ProxiedRequesterContext.class));
-        ctx.getSubcontext(ProxiedRequesterContext.class, true).getRequesters().addAll(Arrays.asList("foo", "bar"));
+
+        final ProxiedRequesterContext proxyCtx = ctx.getSubcontext(ProxiedRequesterContext.class, true);
+        assert proxyCtx != null;
+
+        proxyCtx.getRequesters().addAll(Arrays.asList("foo", "bar"));
 
         assertEquals(matcher.matches(ctx), Tristate.FALSE);
         
-        ctx.getSubcontext(ProxiedRequesterContext.class).getRequesters().add("REQUESTER");
+        proxyCtx.getRequesters().add("REQUESTER");
         assertEquals(matcher.matches(ctx), Tristate.TRUE);
     }
     
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRuleTest.java
index 7fcdd5b06..f25daa016 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterRegexpPolicyRuleTest.java
@@ -72,12 +72,16 @@ public class ProxiedRequesterRegexpPolicyRuleTest {
         final AttributeFilterContext ctx = DataSources.populatedFilterContext(null, null, "wibble");
         ctx.setProxiedRequesterContextLookupStrategy(
                 new ChildContextLookup<AttributeFilterContext,ProxiedRequesterContext>(ProxiedRequesterContext.class));
-        ctx.getSubcontext(ProxiedRequesterContext.class, true).getRequesters().addAll(Arrays.asList("foo", "bar"));
+        
+        final ProxiedRequesterContext proxyCtx = ctx.getSubcontext(ProxiedRequesterContext.class, true);
+        assert proxyCtx != null;
+        
+        proxyCtx.getRequesters().addAll(Arrays.asList("foo", "bar"));
 
         assertEquals(matcher.matches(ctx), Tristate.FALSE);
         
-        ctx.getSubcontext(ProxiedRequesterContext.class).getRequesters().add("requester");
+        proxyCtx.getRequesters().add("requester");
         assertEquals(matcher.matches(ctx), Tristate.TRUE);
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
index 85726d989..bcf44df09 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
@@ -20,6 +20,8 @@ package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 import java.util.Arrays;
 import java.util.Collections;
 
+import javax.annotation.Nonnull;
+
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
@@ -94,9 +96,10 @@ public class BaseMetadataTests extends XMLObjectBaseTestCase {
 
     static protected AttributeFilterContext reqMetadataContext(EntityDescriptor sp, String principal) {
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
-        SAMLMetadataContext metadataContext = filterContext.getSubcontext(SAMLMetadataContext.class, true);
-
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
+        final SAMLMetadataContext metadataContext = filterContext.getSubcontext(SAMLMetadataContext.class, true);
+        assert metadataContext != null;
+        
         metadataContext.setEntityDescriptor(sp);
         if (sp != null) {
             metadataContext.setRoleDescriptor(sp.getSPSSODescriptor("urn:oasis:names:tc:SAML:2.0:protocol"));
@@ -108,11 +111,12 @@ public class BaseMetadataTests extends XMLObjectBaseTestCase {
         return filterContext;
     }
 
-    static protected AttributeFilterContext issMetadataContext(EntityDescriptor idp, String principal) {
-
-        AttributeFilterContext filterContext = new AttributeFilterContext();
-        SAMLMetadataContext metadataContext = filterContext.getSubcontext(SAMLMetadataContext.class, true);
+    @Nonnull static protected AttributeFilterContext issMetadataContext(EntityDescriptor idp, String principal) {
 
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
+        final SAMLMetadataContext metadataContext = filterContext.getSubcontext(SAMLMetadataContext.class, true);
+        assert metadataContext != null;
+        
         metadataContext.setEntityDescriptor(idp);
         if (idp != null) {
             metadataContext.setRoleDescriptor(idp.getIDPSSODescriptor("urn:oasis:names:tc:SAML:2.0:protocol"));
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/IssuerEntityAttributeExactPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/IssuerEntityAttributeExactPolicyRuleTest.java
index b927d816c..2a17d75a6 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/IssuerEntityAttributeExactPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/IssuerEntityAttributeExactPolicyRuleTest.java
@@ -19,6 +19,9 @@ package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 
 import static org.testng.Assert.assertEquals;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule.Tristate;
@@ -35,8 +38,9 @@ public class IssuerEntityAttributeExactPolicyRuleTest extends BaseMetadataTests
         return getMatcher("urn:example.org:policies", "urn:example.org:policy:1234", null, false);
     }
 
-    private IssuerEntityAttributeExactPolicyRule getMatcher(String attributeName, String attributeValue,
-            String attributeNameFormat, boolean ignoreUnmapped) throws ComponentInitializationException {
+    @Nonnull private IssuerEntityAttributeExactPolicyRule getMatcher(@Nonnull final String attributeName,
+            @Nonnull final String attributeValue, @Nullable final String attributeNameFormat, boolean ignoreUnmapped)
+                    throws ComponentInitializationException {
         IssuerEntityAttributeExactPolicyRule matcher = new IssuerEntityAttributeExactPolicyRule();
         matcher.setId("matcher");
         matcher.setAttributeName(attributeName);
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java
index 07a2131a8..b7d2db615 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java
@@ -83,28 +83,28 @@ public class AttributeFilterPolicyTest {
         try {
             new AttributeFilterPolicy(null, policyMatcher, Arrays.asList(valuePolicy));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected
         }
 
         try {
             new AttributeFilterPolicy("", policyMatcher, Arrays.asList(valuePolicy));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected
         }
 
         try {
             new AttributeFilterPolicy("  ", policyMatcher, Arrays.asList(valuePolicy));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected
         }
 
         try {
             new AttributeFilterPolicy("engine", null, Arrays.asList(valuePolicy));
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected
         }
     }
@@ -137,7 +137,7 @@ public class AttributeFilterPolicyTest {
         boolean thrown = false;
         try {
             policy.initialize();
-        } catch (DestroyedComponentException e) {
+        } catch (final DestroyedComponentException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "Destroyed");
@@ -209,8 +209,9 @@ public class AttributeFilterPolicyTest {
         
         AttributeFilterContext ctx = apply(Tristate.TRUE);
         AttributeFilterWorkContext workCtx = ctx.getSubcontext(AttributeFilterWorkContext.class, false);
+        assert workCtx != null;
         
-        Collection<?> values = workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME);
+        final Collection<?> values = workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME);
 
         Assert.assertEquals(values.size(), 2);
         Assert.assertTrue(values.containsAll(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue(
@@ -220,21 +221,25 @@ public class AttributeFilterPolicyTest {
 
         ctx = apply(Tristate.FALSE);
         workCtx = ctx.getSubcontext(AttributeFilterWorkContext.class, false);
+        assert workCtx != null;
         Assert.assertNull(workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME));
 
         ctx = apply(Tristate.FAIL);
         workCtx = ctx.getSubcontext(AttributeFilterWorkContext.class, false);
+        assert workCtx != null;
         Assert.assertNull(workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME));
 }
 
     @Test public void testApplyToEmpty() throws ComponentInitializationException, AttributeFilterException {
-        AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
+        final AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
         //
         // Empty attribute
         //
-        AttributeFilterContext ctx = new AttributeFilterContext();
-        AttributeFilterWorkContext workCtx = ctx.getSubcontext(AttributeFilterWorkContext.class, true);
-        IdPAttribute attribute = new IdPAttribute(ATTR_NAME);
+        final AttributeFilterContext ctx = new AttributeFilterContext();
+        final AttributeFilterWorkContext workCtx = ctx.getSubcontext(AttributeFilterWorkContext.class, true);
+        assert workCtx != null;
+        
+        final IdPAttribute attribute = new IdPAttribute(ATTR_NAME);
         attribute.setValues(Collections.emptyList());
         ctx.setPrefilteredIdPAttributes(Arrays.asList(attribute));
         policy.initialize();
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeValueFilterPolicyTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeValueFilterPolicyTest.java
index cbebbdb7c..f90099feb 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeValueFilterPolicyTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeValueFilterPolicyTest.java
@@ -23,6 +23,7 @@ import java.util.Collection;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
+import net.shibboleth.idp.attribute.filter.AttributeFilterException;
 import net.shibboleth.idp.attribute.filter.AttributeRule;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
@@ -72,7 +73,7 @@ public class AttributeValueFilterPolicyTest {
         boolean thrown = false;
         try {
             policy.initialize();
-        } catch (DestroyedComponentException e) {
+        } catch (final DestroyedComponentException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "initialize after destroy");
@@ -85,7 +86,7 @@ public class AttributeValueFilterPolicyTest {
         boolean thrown = false;
         try {
             policy.initialize();
-        } catch (ComponentInitializationException e) {
+        } catch (final ComponentInitializationException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "AttributeId can never initialized be null");
@@ -94,7 +95,7 @@ public class AttributeValueFilterPolicyTest {
         try {
             policy.setAttributeId(null);
             policy.initialize();
-        } catch (ComponentInitializationException e) {
+        } catch (final ComponentInitializationException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "null Attribute Id");
@@ -103,7 +104,7 @@ public class AttributeValueFilterPolicyTest {
         try {
             policy.setAttributeId("");
             policy.initialize();
-        } catch (ComponentInitializationException e) {
+        } catch (final ComponentInitializationException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "empty Attribute Id");
@@ -120,7 +121,7 @@ public class AttributeValueFilterPolicyTest {
         thrown = false;
         try {
             policy.setAttributeId("foo");
-        } catch (UnmodifiableComponentException e) {
+        } catch (final UnmodifiableComponentException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "SetAttributeId after init");
@@ -130,7 +131,7 @@ public class AttributeValueFilterPolicyTest {
         thrown = false;
         try {
             policy.getAttributeId();
-        } catch (DestroyedComponentException e) {
+        } catch (final DestroyedComponentException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "GetAttributeId after destroy");
@@ -140,7 +141,7 @@ public class AttributeValueFilterPolicyTest {
         thrown = false;
         try {
             policy.setAttributeId("foo");
-        } catch (DestroyedComponentException e) {
+        } catch (final DestroyedComponentException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "SetAttributeId after destroy");
@@ -164,7 +165,7 @@ public class AttributeValueFilterPolicyTest {
         boolean thrown = false;
         try {
             policy.setMatcher(Matcher.MATCHES_NONE);
-        } catch (UnmodifiableComponentException e) {
+        } catch (final UnmodifiableComponentException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "AttributeValueMatcher - set after initialized");
@@ -196,7 +197,7 @@ public class AttributeValueFilterPolicyTest {
 
     }
 
-    @Test public void testApply() throws ComponentInitializationException { 
+    @Test public void testApply() throws ComponentInitializationException, AttributeFilterException { 
         MockMatcher matcher = new MockMatcher();
 
         final StringAttributeValue aStringAttributeValue = new StringAttributeValue("a");
@@ -220,7 +221,7 @@ public class AttributeValueFilterPolicyTest {
         boolean thrown = false;
         try {
             policy.apply(null, new AttributeFilterContext());
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "Null attribute");
@@ -228,7 +229,7 @@ public class AttributeValueFilterPolicyTest {
         thrown = false;
         try {
             policy.apply(new IdPAttribute(ATTR_NAME), null);
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             thrown = true;
         }
         Assert.assertTrue(thrown, "Null context");
@@ -236,9 +237,9 @@ public class AttributeValueFilterPolicyTest {
         AttributeFilterContext context = new AttributeFilterContext();
         context.setPrefilteredIdPAttributes(Arrays.asList(attribute1));
         AttributeFilterWorkContext workCtx = context.getSubcontext(AttributeFilterWorkContext.class, true);
-
+        assert workCtx != null;
+        
         policy.apply(attribute1, context);
-
         Collection<IdPAttributeValue> result = workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME);
         Assert.assertEquals(result.size(), 2);
         Assert.assertTrue(result.contains(aStringAttributeValue));
@@ -254,11 +255,13 @@ public class AttributeValueFilterPolicyTest {
 
         context = new AttributeFilterContext();
         workCtx = context.getSubcontext(AttributeFilterWorkContext.class, true);
+        assert workCtx != null;
         context.setPrefilteredIdPAttributes(Arrays.asList(attribute1));
 
         policy.apply(attribute1, context);
 
         result = workCtx.getDeniedAttributeValues().get(ATTR_NAME);
+        assert workCtx != null;
         Assert.assertEquals(result.size(), 2);
         Assert.assertTrue(result.contains(aStringAttributeValue));
         Assert.assertTrue(result.contains(cStringAttributeValue));
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java
index 790c31e27..970acbaf8 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java
@@ -23,6 +23,8 @@ import java.util.LinkedHashSet;
 import java.util.Objects;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
@@ -76,7 +78,8 @@ public class MockMatcher extends AbstractIdentifiedInitializableComponent implem
 
     /** {@inheritDoc} */
     @Override
-    public Set<IdPAttributeValue> getMatchingValues(IdPAttribute attribute, AttributeFilterContext filterContext) {
+    public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
+            @Nonnull final AttributeFilterContext filterContext) {
         if (fails) {
             return null;
         }
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 782e74bfc..a8778ff57 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
@@ -114,8 +114,9 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
      * @param inputString string to encode
      * @return encoded attribute value
      */
-    private IdPAttributeValue encodeString(XSString inputString) {
-        String value = inputString.getValue();
+    private IdPAttributeValue encodeString(@Nonnull final XSString inputString) {
+        final String value = inputString.getValue();
+        assert(value != null);
         int separator = value.indexOf('@');
 
         if (separator < 0) {
@@ -130,7 +131,7 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
      * @param attributeValues the input values
      * @return a list of values, Possibly empty.
      */
-    @Nullable protected @Nonnull List<IdPAttributeValue> encodeValues(final List<XMLObject> attributeValues) {
+    @Nullable protected List<IdPAttributeValue> encodeValues(final List<XMLObject> attributeValues) {
         final ArrayList<IdPAttributeValue> result = new ArrayList<>(attributeValues.size());
 
         for (XMLObject object : attributeValues) {
@@ -155,8 +156,9 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
 
         final Map<String, IdPAttribute> retVal = new HashMap<>(samlAttributes.size());
 
-        for (Attribute samlAttribute : samlAttributes) {
+        for (final Attribute samlAttribute : samlAttributes) {
             final String attributeName = samlAttribute.getName();
+            assert attributeName != null;
             log.debug("Connector '{}': found attribute named '{}'", getId(), attributeName);
 
             final List<IdPAttributeValue> values = encodeValues(samlAttribute.getAttributeValues());
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockAttributeDefinition.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockAttributeDefinition.java
index 2cbeb79f3..deed246e7 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockAttributeDefinition.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/MockAttributeDefinition.java
@@ -26,6 +26,7 @@ import net.shibboleth.idp.attribute.resolver.AbstractAttributeDefinition;
 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.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** An attribute definition that simply returns a static value. */
@@ -39,10 +40,10 @@ public class MockAttributeDefinition extends AbstractAttributeDefinition {
     private int initializeCount;
 
     /** Static value returned by this definition. */
-    private IdPAttribute staticValue;
+    @Nullable private IdPAttribute staticValue;
 
     /** Exception thrown by resolution. */
-    private ResolutionException resolutionException;
+    @Nullable private ResolutionException resolutionException;
 
     /**
      * Constructor.
@@ -52,7 +53,8 @@ public class MockAttributeDefinition extends AbstractAttributeDefinition {
      * 
      * @throws ComponentInitializationException ...
      */
-    public MockAttributeDefinition(final String id, final IdPAttribute value) throws ComponentInitializationException {
+    public MockAttributeDefinition(@Nonnull @NotEmpty final String id, @Nullable final IdPAttribute value)
+            throws ComponentInitializationException {
         setId(id);
         staticValue = value;
     }
@@ -63,7 +65,7 @@ public class MockAttributeDefinition extends AbstractAttributeDefinition {
      * @param id id of the data connector
      * @param exception exception thrown by resolution
      */
-    public MockAttributeDefinition(final String id, final ResolutionException exception) {
+    public MockAttributeDefinition(@Nonnull @NotEmpty final String id, @Nullable final ResolutionException exception) {
         setId(id);
         resolutionException = exception;
     }
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 6756f5ea4..93e16c8d2 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
@@ -32,6 +32,8 @@ 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.component.ComponentInitializationException;
 
 /** A data connector that just returns a static collection of attributes. */
@@ -45,10 +47,10 @@ public class MockDataConnector extends AbstractDataConnector {
     private int initializeCount;
 
     /** Static collection of values returned by this connector. */
-    private final Map<String, IdPAttribute> values;
+    @Nullable @NonnullElements private final Map<String, IdPAttribute> values;
 
     /** Exception thrown by resolution. */
-    private ResolutionException resolutionException;
+    @Nullable private ResolutionException resolutionException;
 
     /**
      * Constructor.
@@ -58,7 +60,9 @@ public class MockDataConnector extends AbstractDataConnector {
      * 
      * @throws ComponentInitializationException ...
      */
-    public MockDataConnector(String id, Map<String, IdPAttribute> connectorValues) throws ComponentInitializationException {
+    public MockDataConnector(@Nonnull @NotEmpty String id,
+            @Nullable @NonnullElements Map<String, IdPAttribute> connectorValues)
+                    throws ComponentInitializationException {
         setId(id);
         values = connectorValues;
     }
@@ -72,10 +76,10 @@ public class MockDataConnector extends AbstractDataConnector {
      * @param dcDepends The DC dependencies
      * @throws ComponentInitializationException if initialization failed
      */
-    public MockDataConnector(String id, 
-            Map<String, IdPAttribute> connectorValues, 
-            Set<ResolverAttributeDefinitionDependency> attrDepends, 
-            Set<ResolverDataConnectorDependency> dcDepends
+    public MockDataConnector(@Nonnull @NotEmpty String id, 
+            @Nullable @NonnullElements Map<String, IdPAttribute> connectorValues, 
+            @Nullable @NonnullElements Set<ResolverAttributeDefinitionDependency> attrDepends, 
+            @Nullable @NonnullElements Set<ResolverDataConnectorDependency> dcDepends
             ) throws ComponentInitializationException {
         setAttributeDependencies(attrDepends == null? Collections.emptySet() : attrDepends);
         setDataConnectorDependencies(dcDepends == null? Collections.emptySet() : dcDepends);
@@ -89,7 +93,7 @@ public class MockDataConnector extends AbstractDataConnector {
      * 
      * @param fail <code>true</code> to return a {@link ResolutionException}, otherwise <code>null</code>
      */
-    public void setFailure(boolean fail) {
+    public void setFailure(final boolean fail) {
         if (fail) {
             resolutionException = new ResolutionException();
         } else {
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 fd2245cf4..ef3c004af 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
@@ -40,19 +40,17 @@ public class MockStaticAttributeDefinition extends AbstractAttributeDefinition {
     @Nonnull private final Logger log = LoggerFactory.getLogger(MockStaticAttributeDefinition.class);
 
     /** Static value returned by this definition. */
-    private IdPAttribute value;
+    @Nullable private IdPAttribute value;
 
     /**
      * Set the attribute value we are returning.
      * 
      * @param newAttribute what to set.
      */
-    public void setValue(@Nullable IdPAttribute newAttribute) {
+    public void setValue(@Nullable final IdPAttribute newAttribute) {
         checkSetterPreconditions();
         
-        if (null != newAttribute) {
-            value = newAttribute;
-        }
+        value = newAttribute;
     }
 
     /**
@@ -60,7 +58,7 @@ public class MockStaticAttributeDefinition extends AbstractAttributeDefinition {
      * 
      * @return the attribute.
      */
-    @Nonnull public IdPAttribute getValue() {
+    @Nullable public IdPAttribute getValue() {
         return value;
     }
 
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 a9524651a..d675597c6 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
@@ -33,6 +33,7 @@ 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;
 
 /** An attribute definition that simply returns a static value.   Used for testing only.  This is 
@@ -44,14 +45,14 @@ public class MockStaticDataConnector extends AbstractDataConnector {
     @Nonnull private final Logger log = LoggerFactory.getLogger(MockStaticDataConnector.class);
 
     /** Static collection of values returned by this connector. */
-    private Map<String, IdPAttribute> attributes;
+    @Nullable @NonnullElements private Map<String, IdPAttribute> attributes;
 
     /**
      * Get the static values returned by this connector.
      * 
      * @return static values returned by this connector
      */
-    @Nonnull public Map<String, IdPAttribute> getAttributes() {
+    @Nullable @NonnullElements public Map<String, IdPAttribute> getAttributes() {
         return attributes;
     }
 
@@ -60,7 +61,7 @@ public class MockStaticDataConnector extends AbstractDataConnector {
      * 
      * @param newValues static values returned by this connector
      */
-    public void setValues(@Nullable Collection<IdPAttribute> newValues) {
+    public void setValues(@Nullable @NonnullElements Collection<IdPAttribute> newValues) {
         checkSetterPreconditions();
 
         if (null == newValues) {
@@ -68,8 +69,8 @@ public class MockStaticDataConnector extends AbstractDataConnector {
             return;
         } 
         
-        Map<String, IdPAttribute> map = new HashMap<>(newValues.size());
-        for (IdPAttribute attr:newValues) {
+        final Map<String, IdPAttribute> map = new HashMap<>(newValues.size());
+        for (final IdPAttribute attr : newValues) {
             if (null == attr) {
                 continue;
             }
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/ResolverTestSupport.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/ResolverTestSupport.java
index 6dbdd789e..50d6e815d 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/ResolverTestSupport.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/resolver/testing/ResolverTestSupport.java
@@ -21,6 +21,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
@@ -30,35 +33,36 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolverPlugin;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Support class for attribute resolvers testing. */
 public class ResolverTestSupport {
 
     /** eduPersonAfiliation. */
-    public static final String EPA_ATTRIB_ID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.1";
+    @Nonnull @NotEmpty public static final String EPA_ATTRIB_ID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.1";
 
     /** Two affiliations. */
-    public static final String[] EPA1_VALUES = new String[] {"student", "member"};
+    @Nonnull @NotEmpty public static final String[] EPA1_VALUES = new String[] {"student", "member"};
 
     /** Another two affiliations. */
-    public static final String[] EPA2_VALUES = new String[] {"staff", "member"};
+    @Nonnull @NotEmpty public static final String[] EPA2_VALUES = new String[] {"staff", "member"};
 
     /** Three affiliations. */
-    public static final String[] EPA3_VALUES = new String[] {"student", "part-time-student", "library-walk-in"};
+    @Nonnull @NotEmpty public static final String[] EPA3_VALUES = new String[] {"student", "part-time-student", "library-walk-in"};
 
     /** eduPersonEntitlement. */
-    public static final String EPE_ATTRIB_ID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.7";
+    @Nonnull @NotEmpty public static final String EPE_ATTRIB_ID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.7";
 
     /** Two entitlement URIs. */
-    public static final String[] EPE1_VALUES = new String[] {"http://example.org/entitlement1",
+    @Nonnull @NotEmpty public static final String[] EPE1_VALUES = new String[] {"http://example.org/entitlement1",
             "http://example.org/entitlement2"};
 
     /** An entitlement URN. */
-    public static final String[] EPE2_VALUES = new String[] {"urn:example.org:entitlement1"};
+    @Nonnull @NotEmpty public static final String[] EPE2_VALUES = new String[] {"urn:example.org:entitlement1"};
 
     /** A different entitlement URN. */
-    public static final String[] EPE3_VALUES = new String[] {"urn:example.org:entitlement2"};
+    @Nonnull @NotEmpty public static final String[] EPE3_VALUES = new String[] {"urn:example.org:entitlement2"};
 
     /** work method to build a {@link AttributeResolutionContext}
      * @param plugins what to pupulate 
@@ -69,6 +73,8 @@ public class ResolverTestSupport {
         final AttributeResolverWorkContext workContext =
                 resolutionContext.getSubcontext(AttributeResolverWorkContext.class, true);
 
+        assert workContext != null;
+        
         MockStaticAttributeDefinition definition;
         MockStaticDataConnector connector;
         try {
@@ -84,7 +90,7 @@ public class ResolverTestSupport {
                     workContext.recordDataConnectorResolution(connector, connector.resolve(resolutionContext));
                 }
             }
-        } catch (ResolutionException e) {
+        } catch (final ResolutionException e) {
             // this can't happen here
             e.printStackTrace();
         }
@@ -97,7 +103,7 @@ public class ResolverTestSupport {
      * @param values its values (as strings)
      * @return the Attribute
      */
-    public static IdPAttribute buildAttribute(final String attributeId, final String... values) {
+    @Nonnull public static IdPAttribute buildAttribute(@Nonnull @NotEmpty final String attributeId, @Nonnull final String... values) {
         final IdPAttribute attribute = new IdPAttribute(attributeId);
         
         List<IdPAttributeValue> valueList = new ArrayList<>();
@@ -114,7 +120,8 @@ public class ResolverTestSupport {
      * @param values the values
      * @return the definition
      */
-    public static MockStaticAttributeDefinition buildAttributeDefinition(final String attributeId, final String... values) {
+    @Nullable public static MockStaticAttributeDefinition buildAttributeDefinition(@Nonnull @NotEmpty final String attributeId,
+            @Nonnull final String... values) {
         final IdPAttribute attribute = buildAttribute(attributeId, values);
 
         try {
@@ -123,7 +130,7 @@ public class ResolverTestSupport {
             definition.setValue(attribute);
             definition.initialize();
             return definition;
-        } catch (ComponentInitializationException e) {
+        } catch (final ComponentInitializationException e) {
             // this can't happen here
             e.printStackTrace();
             return null;
@@ -135,7 +142,8 @@ public class ResolverTestSupport {
      * @param attributes what to return
      * @return the definition
      */
-    public static MockStaticDataConnector buildDataConnector(final String connectorId, final IdPAttribute... attributes) {
+    @Nullable public static MockStaticDataConnector buildDataConnector(@Nonnull @NotEmpty final String connectorId,
+            @Nonnull final IdPAttribute... attributes) {
 
         try {
             final MockStaticDataConnector connector = new MockStaticDataConnector();
@@ -144,10 +152,11 @@ public class ResolverTestSupport {
             connector.initialize();
 
             return connector;
-        } catch (ComponentInitializationException e) {
+        } catch (final ComponentInitializationException e) {
             // this can't happen here
             e.printStackTrace();
             return null;
         }
     }
-}
+    
+}
\ 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 8d1e479e6..f859eb5b6 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
@@ -225,9 +225,10 @@ public final class TestSources {
      */
     @Nonnull public static AttributeResolutionContext createResolutionContext(String principal, String issuerID,
             String recipientId) {
-        ProfileRequestContext parent = new ProfileRequestContext();
-        AttributeResolutionContext retVal = parent.getSubcontext(AttributeResolutionContext.class, true);
-
+        final ProfileRequestContext parent = new ProfileRequestContext();
+        final AttributeResolutionContext retVal = parent.getSubcontext(AttributeResolutionContext.class, true);
+        assert retVal != null;
+        
         retVal.setAttributeIssuerID(issuerID);
         retVal.setAttributeRecipientID(recipientId);
         retVal.setPrincipal(principal);

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


More information about the commits mailing list