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

Scott Cantor cantor.2 at osu.edu
Wed May 3 16:56:50 UTC 2023


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

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

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

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

commit b8ddea86ed545a0d67bf39db28014c2eeb93723c
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed May 3 12:56:47 2023 -0400

    IDP-2083 - Treat NonnullElements as the default for collections
    
    https://shibboleth.atlassian.net/browse/IDP-2083
    
    Review rest of java-shib-attribute.
    Tighten method annotations where needed.
---
 .../attribute/filter/spring/BaseFilterParser.java  | 25 ++++---
 .../filter/spring/basic/impl/package-info.java     |  5 +-
 .../impl/AttributeFilterPolicyGroupParser.java     |  1 +
 .../impl/AttributeFilterServiceStrategy.java       |  2 +-
 .../attribute/filter/spring/impl/package-info.java |  4 +-
 .../matcher/BaseAttributeValueMatcherParser.java   |  2 +-
 .../filter/spring/matcher/impl/package-info.java   |  4 +-
 .../filter/spring/matcher/package-info.java        |  5 +-
 .../idp/attribute/filter/spring/package-info.java  |  3 +-
 .../impl/AbstractRegexPolicyRuleParser.java        |  2 +
 .../impl/AbstractStringPolicyRuleParser.java       |  7 +-
 .../spring/policyrule/impl/package-info.java       |  4 +-
 .../filter/spring/policyrule/package-info.java     |  4 +-
 .../AbstractRegistrationAuthorityRuleParser.java   |  4 +-
 .../RequesterEntityAttributeExactRuleParser.java   |  1 -
 .../RequesterEntityAttributeRegexRuleParser.java   |  1 -
 .../saml/impl/ScopeMatchesShibMDScopeParser.java   |  1 +
 .../saml/impl/ValueMatchesShibMDScopeParser.java   |  1 +
 .../filter/spring/saml/impl/package-info.java      |  5 +-
 .../attribute/resolver/AbstractDataConnector.java  | 27 ++++----
 .../attribute/resolver/AbstractResolverPlugin.java | 27 +++-----
 .../attribute/resolver/AttributeDefinition.java    |  1 +
 .../idp/attribute/resolver/DataConnector.java      |  9 ++-
 .../resolver/PluginDependencySupport.java          | 35 ++++------
 .../attribute/resolver/ResolvedDataConnector.java  |  4 +-
 .../resolver/ResolverDataConnectorDependency.java  |  8 +--
 .../idp/attribute/resolver/ResolverPlugin.java     |  6 +-
 .../context/AttributeResolutionContext.java        | 25 ++++---
 .../context/AttributeResolverWorkContext.java      | 11 ++--
 .../resolver/context/navigate/package-info.java    |  4 +-
 .../attribute/resolver/context/package-info.java   |  4 +-
 .../resolver/dc/AbstractMappingStrategy.java       | 20 ++----
 .../attribute/resolver/dc/ExecutableSearch.java    |  1 +
 .../resolver/dc/ExecutableSearchBuilder.java       |  3 +-
 .../idp/attribute/resolver/dc/MappingStrategy.java |  4 +-
 .../resolver/dc/NonFailFastValidator.java          | 76 ----------------------
 .../idp/attribute/resolver/dc/Validator.java       |  7 +-
 .../attribute/resolver/dc/http/package-info.java   |  7 +-
 .../AbstractExecutableSearchFilterBuilder.java     |  2 +-
 ...ParameterizedExecutableSearchFilterBuilder.java | 16 ++---
 .../dc/ldap/SearchResultMappingStrategy.java       |  1 +
 .../ldap/StringAttributeValueMappingStrategy.java  |  7 +-
 .../TemplatedExecutableSearchFilterBuilder.java    | 53 +++++++--------
 .../attribute/resolver/dc/ldap/package-info.java   |  5 +-
 .../idp/attribute/resolver/dc/package-info.java    |  4 +-
 .../rdbms/AbstractExecutableStatementBuilder.java  |  2 +-
 .../resolver/dc/rdbms/ExecutableStatement.java     |  1 +
 .../dc/rdbms/FormatExecutableStatementBuilder.java |  6 +-
 .../resolver/dc/rdbms/ResultMappingStrategy.java   |  1 +
 .../dc/rdbms/StringResultMappingStrategy.java      |  7 +-
 .../rdbms/TemplatedExecutableStatementBuilder.java | 52 +++++++--------
 .../attribute/resolver/dc/rdbms/package-info.java  |  7 +-
 .../resolver/dc/storage/package-info.java          |  4 +-
 .../resolver/logic/AttributeIssuerIdPredicate.java |  6 +-
 .../logic/AttributePrincipalPredicate.java         |  6 +-
 .../logic/AttributeRecipientIdPredicate.java       |  6 +-
 .../resolver/logic/ResolutionLabelPredicate.java   | 11 ++--
 .../idp/attribute/resolver/logic/package-info.java |  4 +-
 .../idp/attribute/resolver/package-info.java       |  4 +-
 .../resolver/scripted/ScriptedIdPAttribute.java    |  9 +--
 .../attribute/resolver/scripted/package-info.java  |  4 +-
 .../ad/impl/ScopedAttributeDefinition.java         |  4 +-
 .../ad/impl/ScriptedAttributeDefinition.java       |  6 +-
 .../resolver/ad/impl/ScriptedIdPAttributeImpl.java | 28 ++++----
 .../ad/impl/TemplateAttributeDefinition.java       | 10 ++-
 .../attribute/resolver/ad/impl/package-info.java   |  4 +-
 .../ad/mapped/impl/MappedAttributeDefinition.java  | 11 ++--
 .../resolver/ad/mapped/impl/SourceValue.java       |  4 +-
 .../resolver/ad/mapped/impl/ValueMap.java          |  9 +--
 .../resolver/ad/mapped/impl/package-info.java      |  4 +-
 .../dc/http/impl/AbstractHTTPSearchBuilder.java    | 13 ++--
 .../resolver/dc/http/impl/HTTPDataConnector.java   |  8 ++-
 .../http/impl/ScriptedResponseMappingStrategy.java | 11 ++--
 .../dc/http/impl/TemplatedBodyBuilder.java         |  4 +-
 .../resolver/dc/http/impl/TemplatedURLBuilder.java |  4 +-
 .../resolver/dc/http/impl/package-info.java        |  5 +-
 .../dc/impl/AbstractSearchDataConnector.java       |  9 ++-
 .../dc/impl/ContextDerivedDataConnector.java       |  5 +-
 .../resolver/dc/impl/PairwiseIdDataConnector.java  |  7 +-
 .../resolver/dc/impl/ScriptedDataConnector.java    | 12 ++--
 .../resolver/dc/impl/StaticDataConnector.java      | 12 ++--
 .../attribute/resolver/dc/impl/package-info.java   |  4 +-
 .../dc/ldap/impl/ConnectionFactoryValidator.java   |  2 +-
 .../resolver/dc/ldap/impl/LDAPDataConnector.java   |  6 +-
 .../resolver/dc/ldap/impl/package-info.java        |  4 +-
 .../dc/rdbms/impl/DataSourceValidator.java         | 10 ++-
 .../resolver/dc/rdbms/impl/RDBMSDataConnector.java |  7 +-
 .../resolver/dc/rdbms/impl/package-info.java       |  4 +-
 .../impl/ScriptedStorageMappingStrategy.java       |  4 +-
 .../storage/impl/SimpleStorageMappingStrategy.java |  5 +-
 .../storage/impl/StorageServiceDataConnector.java  |  2 +-
 .../dc/storage/impl/TemplatedSearchBuilder.java    |  2 +-
 .../resolver/dc/storage/impl/package-info.java     |  4 +-
 .../resolver/impl/AttributeResolverImpl.java       | 54 +++++++--------
 .../idp/attribute/resolver/impl/package-info.java  |  4 +-
 .../SubjectDerivedAttributeDefinitionParser.java   |  2 +-
 .../resolver/spring/ad/impl/package-info.java      |  4 +-
 .../spring/ad/mapped/impl/package-info.java        |  4 +-
 .../attribute/resolver/spring/ad/package-info.java |  6 +-
 .../resolver/spring/dc/http/impl/package-info.java |  4 +-
 .../resolver/spring/dc/impl/package-info.java      |  4 +-
 .../resolver/spring/dc/ldap/impl/package-info.java |  2 +
 .../attribute/resolver/spring/dc/package-info.java |  4 +-
 .../spring/dc/rdbms/impl/package-info.java         |  2 +
 .../spring/dc/storage/impl/package-info.java       |  4 +-
 .../resolver/spring/enc/impl/package-info.java     |  4 +-
 .../resolver/spring/enc/package-info.java          |  4 +-
 .../resolver/spring/impl/package-info.java         |  4 +-
 .../attribute/resolver/spring/package-info.java    |  4 +-
 .../spring/AttributeMappingNodeProcessorTest.java  |  1 +
 110 files changed, 470 insertions(+), 443 deletions(-)

diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java
index 062e16280..694bfb0c3 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java
@@ -34,7 +34,6 @@ import org.w3c.dom.Element;
 
 import com.google.common.base.Strings;
 
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -77,7 +76,8 @@ public abstract class BaseFilterParser extends AbstractCustomBeanDefinitionParse
     @Nonnull @NotEmpty public static final String QUALIFIED_ID = "qualifiedId";
 
     /** Generator of unique IDs. */
-    @Nonnull private static IdentifierGenerationStrategy idGen = IdentifierGenerationStrategy.getInstance(ProviderType.RANDOM);
+    @Nonnull private static IdentifierGenerationStrategy idGen =
+            IdentifierGenerationStrategy.getInstance(ProviderType.RANDOM);
 
     /** Class logger. */
     @Nonnull private static final Logger LOG = LoggerFactory.getLogger(BaseFilterParser.class);
@@ -226,8 +226,7 @@ public abstract class BaseFilterParser extends AbstractCustomBeanDefinitionParse
      * @return list of bean definitions
      */
     @Nullable public static ManagedList<BeanDefinition> parseCustomElements(
-            @Nullable @NonnullElements final Collection<Element> elements,
-            @Nonnull final ParserContext parserContext,
+            @Nullable final Collection<Element> elements, @Nonnull final ParserContext parserContext,
             @Nonnull final BeanDefinitionBuilder parentBuilder) {
 
         if (elements == null) {
@@ -238,18 +237,18 @@ public abstract class BaseFilterParser extends AbstractCustomBeanDefinitionParse
         final ManagedList<BeanDefinition> definitions = new ManagedList<>(elements.size());
         final HashSet<String> beanNames = new HashSet<>(elements.size());
         for (final Element e : elements) {
-            if (e != null) {
-                final BeanDefinition def = SpringSupport.parseCustomElement(e, parserContext, parentBuilder, false);
-                if (def != null) {
-                    definitions.add(def);
-                    final Object name = def.getAttribute(QUALIFIED_ID);
-                    if (name != null && !beanNames.add(name.toString())) {
-                        LOG.warn("Duplicate filter element name {} found", name);
-                    }
+            assert e != null;
+            final BeanDefinition def = SpringSupport.parseCustomElement(e, parserContext, parentBuilder, false);
+            if (def != null) {
+                definitions.add(def);
+                final Object name = def.getAttribute(QUALIFIED_ID);
+                if (name != null && !beanNames.add(name.toString())) {
+                    LOG.warn("Duplicate filter element name {} found", name);
                 }
             }
         }
 
         return definitions;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/package-info.java
index 8707d231e..7dc2a85e4 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/package-info.java
@@ -16,8 +16,9 @@
  */
 
 /**
- * Parsers for the top level of the "urn:mace:shibboleth:2.0:afp:mf:basic" namespace.  
+ * Parsers for simple matchers.  
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.filter.spring.basic.impl;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterPolicyGroupParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterPolicyGroupParser.java
index c751215d3..cdf165811 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterPolicyGroupParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterPolicyGroupParser.java
@@ -47,6 +47,7 @@ import net.shibboleth.shared.xml.ElementSupport;
  * </p>
  */
 public class AttributeFilterPolicyGroupParser implements BeanDefinitionParser {
+    
     /** Schema type name. */
     @Nonnull public static final QName TYPE_NAME = new QName(BaseFilterParser.NAMESPACE,
             "AttributeFilterPolicyGroupType");
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java
index 572da726c..ed6d5e340 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java
@@ -46,7 +46,7 @@ public class AttributeFilterServiceStrategy extends AbstractIdentifiableInitiali
     NonnullFunction<ApplicationContext, ServiceableComponent<AttributeFilter>> {
 
     /** log. */
-    private final Logger log = LoggerFactory.getLogger(AttributeFilterServiceStrategy.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeFilterServiceStrategy.class);
 
     /** {@inheritDoc} */
     @Nonnull
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/package-info.java
index 7460bb73e..1cc8ee207 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Parsers for the top level of the "urn:mace:shibboleth:2.0:afp" namespace. 
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.spring.impl;
 
-package net.shibboleth.idp.attribute.filter.spring.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java
index 522c2d527..ac2145dfe 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java
@@ -59,7 +59,7 @@ import net.shibboleth.idp.attribute.filter.spring.BaseFilterParser;
 public abstract class BaseAttributeValueMatcherParser extends BaseFilterParser {
     
     /** ATTRIBUTE ID string. */
-    public static final String ATTRIBUTE_ID = "attributeID";
+    @Nonnull public static final String ATTRIBUTE_ID = "attributeID";
 
     /**
      * Helper function to determine if the Attribute Matcher has the attribute Id Specified. This influences decisions
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/impl/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/impl/package-info.java
index a1994488b..a06435936 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/impl/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/impl/package-info.java
@@ -23,5 +23,7 @@
  * {@link net.shibboleth.idp.attribute.filter.spring.matcher.BaseAttributeValueMatcherParser}.
  * </p>
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.spring.matcher.impl;
 
-package net.shibboleth.idp.attribute.filter.spring.matcher.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/package-info.java
index 6d1bbd53c..b3913eb71 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/package-info.java
@@ -18,7 +18,8 @@
 /**
  *  Base class for parsers parse beans which are natural "Matchers" (that is to say that
  *  they look at attribute values). 
- * 
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.spring.matcher;
 
-package net.shibboleth.idp.attribute.filter.spring.matcher;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/package-info.java
index c9822854a..5ea582632 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/package-info.java
@@ -18,6 +18,7 @@
 /**
  * The base class for filter other parser is located here.
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.filter.spring;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractRegexPolicyRuleParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractRegexPolicyRuleParser.java
index e4e0ce487..63fb858ef 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractRegexPolicyRuleParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractRegexPolicyRuleParser.java
@@ -34,6 +34,7 @@ import org.w3c.dom.Element;
 public abstract class AbstractRegexPolicyRuleParser extends BasePolicyRuleParser {
 
     /** {@inheritDoc} */
+    @Override
     protected void doNativeParse(@Nonnull final Element config, @Nonnull final ParserContext parserContext,
             @Nonnull final BeanDefinitionBuilder builder) {
         super.doParse(config, builder);
@@ -55,4 +56,5 @@ public abstract class AbstractRegexPolicyRuleParser extends BasePolicyRuleParser
 
         builder.addPropertyValue("pattern", pattern.getBeanDefinition());
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractStringPolicyRuleParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractStringPolicyRuleParser.java
index e93b67e94..d0058c458 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractStringPolicyRuleParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/AbstractStringPolicyRuleParser.java
@@ -32,7 +32,8 @@ import net.shibboleth.shared.primitive.StringSupport;
 public abstract class AbstractStringPolicyRuleParser extends BasePolicyRuleParser {
 
     /** {@inheritDoc} */
-    @Override protected void doNativeParse(@Nonnull final Element element, @Nonnull final ParserContext parserContext,
+    @Override
+    protected void doNativeParse(@Nonnull final Element element, @Nonnull final ParserContext parserContext,
             @Nonnull final BeanDefinitionBuilder builder) {
         super.doParse(element, builder);
 
@@ -42,5 +43,7 @@ public abstract class AbstractStringPolicyRuleParser extends BasePolicyRuleParse
             builder.addPropertyValue("caseSensitive", 
                     StringSupport.trimOrNull(element.getAttributeNS(null, "caseSensitive")));
         
-        }    }
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/package-info.java
index 435947916..1671a688b 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/impl/package-info.java
@@ -21,5 +21,7 @@
  * Nearly all the work is done in 
  * {@link net.shibboleth.idp.attribute.filter.spring.policyrule.BasePolicyRuleParser}
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.spring.policyrule.impl;
 
-package net.shibboleth.idp.attribute.filter.spring.policyrule.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/package-info.java
index 2232de2bb..b9196fdfa 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/package-info.java
@@ -19,5 +19,7 @@
  * Base parser for filters that are natural policy rules (that is to make their 
  * decisions based on the context, not the attribute values are implemented.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.filter.spring.policyrule;
 
-package net.shibboleth.idp.attribute.filter.spring.policyrule;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/AbstractRegistrationAuthorityRuleParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/AbstractRegistrationAuthorityRuleParser.java
index 55f29d810..45f8b574d 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/AbstractRegistrationAuthorityRuleParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/AbstractRegistrationAuthorityRuleParser.java
@@ -34,10 +34,10 @@ import net.shibboleth.shared.spring.util.SpringSupport;
 public abstract class AbstractRegistrationAuthorityRuleParser extends BasePolicyRuleParser {
 
     /** Name of the attribute carrying the Issuers list. */
-    public static final String REGISTRARS_ATTR_NAME = "registrars";
+    @Nonnull public static final String REGISTRARS_ATTR_NAME = "registrars";
 
     /** Name of the attribute carrying the boolean to flag behaviour if the metadata MDRPI. */
-    public static final String MATCH_IF_METADATA_SILENT_ATTR_NAME = "matchIfMetadataSilent";
+    @Nonnull public static final String MATCH_IF_METADATA_SILENT_ATTR_NAME = "matchIfMetadataSilent";
 
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractRegistrationAuthorityRuleParser.class);
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeExactRuleParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeExactRuleParser.java
index 227a5101d..e0daff409 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeExactRuleParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeExactRuleParser.java
@@ -33,7 +33,6 @@ public class RequesterEntityAttributeExactRuleParser extends AbstractEntityAttri
             "EntityAttributeExactMatch");
 
     @Override @Nonnull protected Class<RequesterEntityAttributeExactPolicyRule> getNativeBeanClass() {
-
         return RequesterEntityAttributeExactPolicyRule.class;
     }
 
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeRegexRuleParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeRegexRuleParser.java
index 4c5741c54..382829de5 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeRegexRuleParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/RequesterEntityAttributeRegexRuleParser.java
@@ -34,7 +34,6 @@ public class RequesterEntityAttributeRegexRuleParser extends AbstractEntityAttri
 
     /** {@inheritDoc} */
     @Override @Nonnull protected Class<RequesterEntityAttributeRegexPolicyRule> getNativeBeanClass() {
-
         return RequesterEntityAttributeRegexPolicyRule.class;
     }
 
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ScopeMatchesShibMDScopeParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ScopeMatchesShibMDScopeParser.java
index 11a4d901a..926fa0abe 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ScopeMatchesShibMDScopeParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ScopeMatchesShibMDScopeParser.java
@@ -43,6 +43,7 @@ public class ScopeMatchesShibMDScopeParser extends BaseAttributeValueMatcherPars
     }
 
     /** {@inheritDoc} */
+    @Override
     protected void doNativeParse(@Nonnull final Element element, @Nonnull final ParserContext parserContext,
             @Nonnull final BeanDefinitionBuilder builder) {
         // Nothing to do
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ValueMatchesShibMDScopeParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ValueMatchesShibMDScopeParser.java
index e18d8d74d..d7208fe50 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ValueMatchesShibMDScopeParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/ValueMatchesShibMDScopeParser.java
@@ -43,6 +43,7 @@ public class ValueMatchesShibMDScopeParser extends BaseAttributeValueMatcherPars
     }
 
     /** {@inheritDoc} */
+    @Override
     protected void doNativeParse(@Nonnull final Element element, @Nonnull final ParserContext parserContext,
             @Nonnull final BeanDefinitionBuilder builder) {
         // Nothing to do
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/package-info.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/package-info.java
index bc42a3e63..da37785e7 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/package-info.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/saml/impl/package-info.java
@@ -16,13 +16,14 @@
  */
 
 /**
- * Parsers for the top level of the "urn:mace:shibboleth:2.0:saml" namespace.
+ * Parsers for the SAML rules.
  * 
  * <p>
  * These are all "policy" type <MatchFunctorType> rules and so all
  * the parsers are based on {@link net.shibboleth.idp.attribute.filter.spring.policyrule.BasePolicyRuleParser}.
  * </p>
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.filter.spring.saml.impl;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
index 0747f096f..db4947fdf 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
@@ -31,8 +31,8 @@ import org.slf4j.Logger;
 import net.shibboleth.idp.attribute.IdPAttribute;
 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.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -63,7 +63,7 @@ public abstract class AbstractDataConnector extends AbstractResolverPlugin<Map<S
     @Nonnull private Duration noRetryDelay;
 
     /** Which named attributes do we release?. */
-    @Nonnull @NonnullElements @Unmodifiable private Collection<String> exportAttributes;
+    @Nonnull @Unmodifiable private Collection<String> exportAttributes;
 
     /** Constructor. */
     public AbstractDataConnector() {
@@ -151,13 +151,13 @@ public abstract class AbstractDataConnector extends AbstractResolverPlugin<Map<S
      *
      * @param what the list
      */
-    public void setExportAttributes(@Nonnull @NonnullElements final Collection<String> what) {
+    public void setExportAttributes(@Nonnull final Collection<String> what) {
         checkSetterPreconditions();
         exportAttributes = CollectionSupport.copyToSet(what);
     }
 
     /** {@inheritDoc} */
-    @Nonnull @NonnullElements @Unmodifiable public Collection<String> getExportAttributes() {
+    @Nonnull @Unmodifiable @NotLive public Collection<String> getExportAttributes() {
         return exportAttributes;
     }
 
@@ -177,7 +177,7 @@ public abstract class AbstractDataConnector extends AbstractResolverPlugin<Map<S
      * extension point for introducing new common behavior.
      */
     @Override
-    @Nullable public final Map<String, IdPAttribute> doResolve(
+    @Nullable @Unmodifiable @NotLive public final Map<String,IdPAttribute> doResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
 
@@ -194,14 +194,17 @@ public abstract class AbstractDataConnector extends AbstractResolverPlugin<Map<S
         }
 
         if (null == result) {
-            log.debug("{} no attributes were produced during resolution", getId());
+            log.debug("{} No attributes were produced during resolution", getId());
             return result;
         }
-        log.debug("{} produced the following {} attributes during resolution {}", new Object[] {getLogPrefix(),
-                result.size(), result.keySet(),});
-        for (final String attrName : result.keySet()) {
-            final IdPAttribute attr = result.get(attrName);
-            log.debug("{} Attribute '{}': Values '{}'", new Object[] {getLogPrefix(), attrName, attr.getValues(),});
+        
+        if (log.isDebugEnabled()) {
+            log.debug("{} Produced the following {} attributes during resolution {}", new Object[] {getLogPrefix(),
+                    result.size(), result.keySet(),});
+            for (final String attrName : result.keySet()) {
+                final IdPAttribute attr = result.get(attrName);
+                log.debug("{} Attribute '{}': Values '{}'", new Object[] {getLogPrefix(), attrName, attr.getValues(),});
+            }
         }
 
         return result;
@@ -217,7 +220,7 @@ public abstract class AbstractDataConnector extends AbstractResolverPlugin<Map<S
      * 
      * @throws ResolutionException thrown if there is a problem resolving the attributes
      */
-    @Nullable protected abstract Map<String, IdPAttribute> doDataConnectorResolve(
+    @Nullable @Unmodifiable @NotLive protected abstract Map<String, IdPAttribute> doDataConnectorResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException;
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
index 7def85162..be48184da 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
@@ -32,15 +32,12 @@ import org.springframework.beans.factory.DisposableBean;
 
 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.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
-import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
-import net.shibboleth.shared.logic.PredicateSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
@@ -62,10 +59,10 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
     @Nullable private Predicate<ProfileRequestContext> activationCondition;
 
     /** The {@link ResolverAttributeDefinitionDependency}s this plug-in depends on. */
-    @Nonnull @NonnullElements private Set<ResolverAttributeDefinitionDependency> attributeDependencies;
+    @Nonnull private Set<ResolverAttributeDefinitionDependency> attributeDependencies;
     
     /** The {@link ResolverDataConnectorDependency}s this plug-in depends on. */
-    @Nonnull @NonnullElements private Set<ResolverDataConnectorDependency> dataConnectorDependencies;
+    @Nonnull private Set<ResolverDataConnectorDependency> dataConnectorDependencies;
 
     /** Constructor. */
     public AbstractResolverPlugin() {
@@ -109,8 +106,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
      * 
      * @return unmodifiable list of dependencies for this plugin, never null.
      */
-    @Override @Nonnull @Unmodifiable @NotLive public Set<ResolverAttributeDefinitionDependency>
-            getAttributeDependencies() {
+    @Nonnull @Unmodifiable @NotLive public Set<ResolverAttributeDefinitionDependency> getAttributeDependencies() {
         return attributeDependencies;
     }
     
@@ -119,8 +115,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
      * 
      * @return unmodifiable list of dependencies for this plugin, never null.
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<ResolverDataConnectorDependency>
-            getDataConnectorDependencies() {
+    @Nonnull @Unmodifiable @NotLive public Set<ResolverDataConnectorDependency> getDataConnectorDependencies() {
         return dataConnectorDependencies;
     }
 
@@ -130,8 +125,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
      * 
      * @param dependencies unmodifiable list of dependencies for this plugin
      */
-    public void setAttributeDependencies(@Nonnull @NonnullElements
-            final Set<ResolverAttributeDefinitionDependency> dependencies) {
+    public void setAttributeDependencies(@Nonnull final Set<ResolverAttributeDefinitionDependency> dependencies) {
         checkSetterPreconditions();
         Constraint.isNotNull(dependencies, "Attribute Dependencies cannot be null");
 
@@ -143,8 +137,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
      * 
      * @param dependencies unmodifiable list of dependencies for this plugin
      */
-    public void setDataConnectorDependencies(@Nonnull @NonnullElements
-            final Set<ResolverDataConnectorDependency> dependencies) {
+    public void setDataConnectorDependencies(@Nonnull final Set<ResolverDataConnectorDependency> dependencies) {
         checkSetterPreconditions();
         Constraint.isNotNull(dependencies, "DataConnector Dependencies cannot be null");
 
@@ -225,17 +218,12 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
 
     /** {@inheritDoc} */
     @Override protected void doDestroy() {
-        activationCondition = PredicateSupport.alwaysFalse();
+        // TODO: probably should strip this out
         attributeDependencies = CollectionSupport.emptySet();
         dataConnectorDependencies = CollectionSupport.emptySet();
         super.doDestroy();
     }
 
-    /** {@inheritDoc} */
-    @Override protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-    }
-
     /** {@inheritDoc} */
     @Override public int hashCode() {
         return Objects.hash(getId());
@@ -316,4 +304,5 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
      * @return a log prefix
      */
     @Nonnull @NotEmpty protected abstract String getLogPrefix();
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AttributeDefinition.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AttributeDefinition.java
index c2d1228b3..b2611c14e 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AttributeDefinition.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AttributeDefinition.java
@@ -39,4 +39,5 @@ public interface AttributeDefinition extends ResolverPlugin<IdPAttribute> {
      * @return true if this is a definition to be done "first"
      */
     boolean isPreRequested();
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/DataConnector.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/DataConnector.java
index 4179b71f2..e27f6f669 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/DataConnector.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/DataConnector.java
@@ -27,7 +27,7 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 
 /**
@@ -52,9 +52,7 @@ public interface DataConnector extends ResolverPlugin<Map<String, IdPAttribute>>
       * 
       * @since 4.1.0
       */
-     @Nullable default Instant getLastSuccess() {
-         return Instant.now();
-     }
+     @Nullable Instant getLastSuccess();
 
      /**
       * Get the time when this connector last failed. This will be set for any exception regardless of the setting of
@@ -78,5 +76,6 @@ public interface DataConnector extends ResolverPlugin<Map<String, IdPAttribute>>
      *
      * @return the list of attribute names to export during resolution
      */
-    @Nonnull @NonnullElements @Unmodifiable Collection<String> getExportAttributes();
+    @Nonnull @Unmodifiable @NotLive Collection<String> getExportAttributes();
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java
index ac51ca7d7..4dbc232bf 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java
@@ -32,7 +32,7 @@ import org.slf4j.Logger;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -64,11 +64,10 @@ public final class PluginDependencySupport {
      * @return the merged value set. Returns an empty set if we were given a DataConnector as a dependency, but not
      *         attribute name
      */
-    // Checkstyle: MethodLength|CyclomaticComplexity OFF
-    @Nonnull @NonnullElements public static List<IdPAttributeValue> getMergedAttributeValues(
+    @Nonnull @Live public static List<IdPAttributeValue> getMergedAttributeValues(
             @Nonnull final AttributeResolverWorkContext workContext,
-            @Nonnull @NonnullElements final Collection<ResolverAttributeDefinitionDependency> attributeDependencies,
-            @Nonnull @NonnullElements final Collection<ResolverDataConnectorDependency> dataConnectorDependencies,
+            @Nonnull final Collection<ResolverAttributeDefinitionDependency> attributeDependencies,
+            @Nonnull final Collection<ResolverDataConnectorDependency> dataConnectorDependencies,
             @Nonnull final String attributeDefinitionId) {
         Constraint.isNotNull(workContext, "Attribute resolution context cannot be null");
         Constraint.isNotNull(attributeDependencies, "Resolver dependency collection cannot be null");
@@ -79,8 +78,6 @@ public final class PluginDependencySupport {
         }
 
         for (final ResolverAttributeDefinitionDependency attributeDependency : attributeDependencies) {
-            Constraint.isNotNull(attributeDependency, "Resolver attribute dependency cannot be null");
-
             final String attributeId = attributeDependency.getDependencyPluginId();
             final ResolvedAttributeDefinition attributeDefinition =
                     workContext.getResolvedIdPAttributeDefinitions().get(attributeId);
@@ -92,8 +89,6 @@ public final class PluginDependencySupport {
         }
 
         for (final ResolverDataConnectorDependency dataConnectorDependency : dataConnectorDependencies) {
-            Constraint.isNotNull(dataConnectorDependency, "Resolver data connector dependency cannot be null");
-
             final String dataConnectorId = dataConnectorDependency.getDependencyPluginId();
             final ResolvedDataConnector dataConnector = workContext.getResolvedDataConnectors().get(dataConnectorId);
             if (dataConnector != null) {
@@ -112,9 +107,9 @@ public final class PluginDependencySupport {
                 }
             }
         }
+        
         return values;
     }
-    // Checkstyle: MethodLength|CyclomaticComplexity ON
 
     /**
      * Gets the values from all dependencies. Attributes, with the same identifier but from different resolver plugins,
@@ -134,11 +129,11 @@ public final class PluginDependencySupport {
      * 
      * @return the merged value set
      */
-    // Checkstyle: MethodLength|CyclomaticComplexity OFF
-    @Nonnull @NonnullElements public static Map<String, List<IdPAttributeValue>> getAllAttributeValues(
+    // Checkstyle: CyclomaticComplexity OFF
+    @Nonnull @Live public static Map<String, List<IdPAttributeValue>> getAllAttributeValues(
             @Nonnull final AttributeResolverWorkContext workContext,
             @Nonnull final Collection<ResolverAttributeDefinitionDependency> attributeDependencies,
-            @Nonnull @NonnullElements final Collection<ResolverDataConnectorDependency> dataConnectorDependencies) {
+            @Nonnull final Collection<ResolverDataConnectorDependency> dataConnectorDependencies) {
 
         final HashMap<String, List<IdPAttributeValue>> result = new HashMap<>();
         if (LOG.isTraceEnabled()) {
@@ -146,8 +141,6 @@ public final class PluginDependencySupport {
         }
 
         for (final ResolverAttributeDefinitionDependency dependency : attributeDependencies) {
-            Constraint.isNotNull(dependency, "Attribute Definition dependency cannot be null");
-
             final String attributeId = dependency.getDependencyPluginId();
             final ResolvedAttributeDefinition attributeDefinition =
                     workContext.getResolvedIdPAttributeDefinitions().get(attributeId);
@@ -160,8 +153,6 @@ public final class PluginDependencySupport {
         }
         
         for (final ResolverDataConnectorDependency dataConnectorDependency : dataConnectorDependencies) {
-            Constraint.isNotNull(dataConnectorDependency, "Data Connector dependency cannot be null");
-
             // Just add those attributes specified
             final String dataConnectorId = dataConnectorDependency.getDependencyPluginId();
             final ResolvedDataConnector dataConnector =
@@ -182,9 +173,10 @@ public final class PluginDependencySupport {
                 }
             }
         }
+        
         return result;
     }
-    // Checkstyle: MethodLength|CyclomaticComplexity ON
+    // Checkstyle: CyclomaticComplexity ON
 
     /**
      * Adds the values of the given attribute to the target collection of attribute values.
@@ -193,7 +185,7 @@ public final class PluginDependencySupport {
      * @param target current set attribute values
      */
     private static void addAttribute(@Nullable final IdPAttribute source,
-            @Nonnull @NonnullElements final Map<String, List<IdPAttributeValue>> target) {
+            @Nonnull final Map<String, List<IdPAttributeValue>> target) {
         if (source == null) {
             return;
         }
@@ -213,9 +205,10 @@ public final class PluginDependencySupport {
      * @param target current set attribute values
      */
     private static void mergeAttributeValues(@Nullable final IdPAttribute source,
-            @Nonnull final List<IdPAttributeValue> target) {
+            @Nonnull @Live final List<IdPAttributeValue> target) {
         if (source != null) {
             target.addAll(source.getValues());
         }
     }
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
index 848c545ad..0661ff329 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
@@ -31,7 +31,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import net.shibboleth.idp.attribute.IdPAttribute;
 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.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.logic.Constraint;
 
@@ -139,7 +139,7 @@ public final class ResolvedDataConnector extends AbstractDataConnector {
     }
 
     /** {@inheritDoc} */
-    @Override @Nonnull @NonnullElements @Unmodifiable public Collection<String> getExportAttributes() {
+    @Override @Nonnull @Unmodifiable @NotLive public Collection<String> getExportAttributes() {
         return resolvedConnector.getExportAttributes();
     }
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
index e3e031128..ab2d864a4 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
@@ -19,15 +19,15 @@ package net.shibboleth.idp.attribute.resolver;
 
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
 
 import net.shibboleth.shared.annotation.ParameterName;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -92,7 +92,7 @@ public final class ResolverDataConnectorDependency  {
      * 
      * @return attribute names
      */
-    @Nonnull @NonnullElements public Collection<String> getAttributeNames() {
+    @Nonnull @Unmodifiable @NotLive public Collection<String> getAttributeNames() {
         return attributeNames;
     }
 
@@ -102,7 +102,7 @@ public final class ResolverDataConnectorDependency  {
      * @param names attribute names
      */
     public void setAttributeNames(@Nonnull @NotEmpty final Collection<String> names) {
-        attributeNames = new HashSet<>(StringSupport.normalizeStringCollection(names));
+        attributeNames = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(names));
     }
     
     /** {@inheritDoc} */
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
index cd59addd4..82dad4737 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
@@ -63,16 +63,14 @@ public interface ResolverPlugin<ResolvedType> extends UnmodifiableComponent,
      * 
      * @return unmodifiable list of attribute dependencies for this plugin, never null
      */
-    @Nonnull @Unmodifiable @NotLive Set<ResolverAttributeDefinitionDependency>
-        getAttributeDependencies();
+    @Nonnull @Unmodifiable @NotLive Set<ResolverAttributeDefinitionDependency> getAttributeDependencies();
 
     /**
      * Get the unmodifiable list of data connector dependencies for this plugin.
      * 
      * @return unmodifiable list of data connector dependencies for this plugin, never null
      */
-    @Nonnull @Unmodifiable @NotLive Set<ResolverDataConnectorDependency>
-        getDataConnectorDependencies();
+    @Nonnull @Unmodifiable @NotLive Set<ResolverDataConnectorDependency> getDataConnectorDependencies();
 
     /**
      * Perform the attribute resolution for this plugin.
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java
index 8d3be5069..5221b5ef3 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolutionContext.java
@@ -37,7 +37,6 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.shared.annotation.constraint.Live;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -53,7 +52,7 @@ import net.shibboleth.shared.service.ServiceableComponent;
 public final class AttributeResolutionContext extends BaseContext {
     
     /** (internal) Names of the attributes that have been requested to be resolved. */
-    @Nonnull @NonnullElements private Set<String> requestedAttributeNames;
+    @Nonnull private Set<String> requestedAttributeNames;
 
     /** Strategy used to locate the {@link ProfileRequestContext} to use. */
     @Nonnull private Function<AttributeResolutionContext,ProfileRequestContext> prcLookupStrategy;
@@ -77,7 +76,7 @@ public final class AttributeResolutionContext extends BaseContext {
     @Nullable private String resolutionLabel;
 
     /** Attributes which were resolved and released by the attribute resolver. */
-    @Nonnull @NonnullElements private Map<String,IdPAttribute> resolvedAttributes;
+    @Nonnull private Map<String,IdPAttribute> resolvedAttributes;
     
     /** Constructor. */
     public AttributeResolutionContext() {
@@ -111,7 +110,7 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @since 5.0.0
      */
-    public AttributeResolutionContext setProfileRequestContextLookupStrategy(
+    @Nonnull public AttributeResolutionContext setProfileRequestContextLookupStrategy(
             @Nonnull final Function<AttributeResolutionContext,ProfileRequestContext> strategy) {
 
         prcLookupStrategy = Constraint.isNotNull(strategy, "ProfileRequestContext lookup strategy cannot be null");
@@ -190,7 +189,7 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @return this context
      */
-    @Nullable public AttributeResolutionContext setAttributeIssuerID(@Nullable final String value) {
+    @Nonnull public AttributeResolutionContext setAttributeIssuerID(@Nullable final String value) {
         attributeIssuerID = value;
         
         return this;
@@ -212,7 +211,7 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @return this context
      */
-    @Nullable public AttributeResolutionContext setAttributeRecipientID(@Nullable final String value) {
+    @Nonnull public AttributeResolutionContext setAttributeRecipientID(@Nullable final String value) {
         attributeRecipientID = value;
         
         return this;
@@ -241,7 +240,7 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @since 3.4.0
      */
-    @Nullable public AttributeResolutionContext setAttributeRecipientGroupID(@Nullable final String value) {
+    @Nonnull public AttributeResolutionContext setAttributeRecipientGroupID(@Nullable final String value) {
         attributeRecipientGroupID = value;
         
         return this;
@@ -274,7 +273,7 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @return live collection of attributes requested to be resolved
      */
-    @Nonnull @NonnullElements @Live public Collection<String> getRequestedIdPAttributeNames() {
+    @Nonnull @Live public Collection<String> getRequestedIdPAttributeNames() {
         return requestedAttributeNames;
     }
 
@@ -285,11 +284,9 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @return this context
      */
-    @Nullable public AttributeResolutionContext setRequestedIdPAttributeNames(
-            @Nonnull @NonnullElements final Collection<String> names) {
+    @Nonnull public AttributeResolutionContext setRequestedIdPAttributeNames(@Nonnull final Collection<String> names) {
         requestedAttributeNames = Constraint.isNotNull(names, "Requested IdPAttribute collection cannot be null")
                 .stream()
-                .filter(n -> n != null)
                 .collect(CollectionSupport.nonnullCollector(Collectors.toCollection(HashSet::new)))
                 .get();
         
@@ -301,7 +298,7 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @return set of resolved attributes
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, IdPAttribute> getResolvedIdPAttributes() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, IdPAttribute> getResolvedIdPAttributes() {
         return resolvedAttributes;
     }
 
@@ -312,8 +309,8 @@ public final class AttributeResolutionContext extends BaseContext {
      * 
      * @return this context
      */
-    @Nullable public AttributeResolutionContext setResolvedIdPAttributes(
-            @Nonnull @NonnullElements final Collection<IdPAttribute> attributes) {
+    @Nonnull public AttributeResolutionContext setResolvedIdPAttributes(
+            @Nonnull final Collection<IdPAttribute> attributes) {
         
         Constraint.isNotNull(attributes, "Null attribute set cannot be inserted into a context");
         resolvedAttributes = attributes.
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
index f14e0f14a..c7e92fecf 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
@@ -30,7 +30,6 @@ import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolvedAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.ResolvedDataConnector;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -50,10 +49,10 @@ import org.opensaml.messaging.context.BaseContext;
 public final class AttributeResolverWorkContext extends BaseContext {
 
     /** Attribute definitions that have been resolved and the resultant attribute. */
-    @Nonnull @NonnullElements private final Map<String, ResolvedAttributeDefinition> resolvedAttributeDefinitions;
+    @Nonnull private final Map<String,ResolvedAttributeDefinition> resolvedAttributeDefinitions;
 
     /** Data connectors that have been resolved and the resultant attributes. */
-    @Nonnull @NonnullElements private final Map<String, ResolvedDataConnector> resolvedDataConnectors;
+    @Nonnull private final Map<String,ResolvedDataConnector> resolvedDataConnectors;
 
     /** Constructor. */
     public AttributeResolverWorkContext() {
@@ -67,8 +66,7 @@ public final class AttributeResolverWorkContext extends BaseContext {
      * 
      * @return resolved attribute definitions that been recorded
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, ResolvedAttributeDefinition>
-            getResolvedIdPAttributeDefinitions() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, ResolvedAttributeDefinition> getResolvedIdPAttributeDefinitions() {
         return CollectionSupport.copyToMap(resolvedAttributeDefinitions);
     }
 
@@ -99,7 +97,7 @@ public final class AttributeResolverWorkContext extends BaseContext {
      * 
      * @return resolved data connectors that been recorded
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, ResolvedDataConnector> getResolvedDataConnectors() {
+    @Nonnull @Unmodifiable @NotLive public Map<String, ResolvedDataConnector> getResolvedDataConnectors() {
         return CollectionSupport.copyToMap(resolvedDataConnectors);
     }
 
@@ -151,4 +149,5 @@ public final class AttributeResolverWorkContext extends BaseContext {
                 new ResolvedDataConnector(failedConnector, resolvedFailoverConector.getResolvedAttributes());
         resolvedDataConnectors.put(failedConnector.getId(), wrapper);
     }
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/package-info.java
index f36a9e1e3..bc8ddae8f 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Functions for navigating attribute resolution contexts.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.context.navigate;
 
-package net.shibboleth.idp.attribute.resolver.context.navigate;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/package-info.java
index b0ee69e37..094b6fe0a 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/package-info.java
@@ -18,5 +18,7 @@
 /**
  * The context to do with Attribute Resolution.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.context;
 
-package net.shibboleth.idp.attribute.resolver.context;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java
index ac086d695..e449cc71f 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/AbstractMappingStrategy.java
@@ -17,12 +17,10 @@
 
 package net.shibboleth.idp.attribute.resolver.dc;
 
-import java.util.HashMap;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
 
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -37,7 +35,7 @@ import net.shibboleth.shared.logic.Constraint;
 public abstract class AbstractMappingStrategy<T> implements MappingStrategy<T> {
 
     /** A map to rename result fields. */
-    @Nonnull @NonnullElements private Map<String,String> resultRenamingMap;
+    @Nonnull private Map<String,String> resultRenamingMap;
     
     /** Whether an empty result set is an error. */
     private boolean noResultAnError;
@@ -55,8 +53,8 @@ public abstract class AbstractMappingStrategy<T> implements MappingStrategy<T> {
      * 
      * @return a map of result field names to alternate field names
      */
-    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String,String> getResultRenamingMap() {
-        return CollectionSupport.copyToMap(resultRenamingMap);
+    @Nonnull @Unmodifiable @NotLive public Map<String,String> getResultRenamingMap() {
+        return resultRenamingMap;
     }
     
     /**
@@ -64,15 +62,8 @@ public abstract class AbstractMappingStrategy<T> implements MappingStrategy<T> {
      * 
      * @param map map of result field names to alternate field names
      */
-    public void setResultRenamingMap(@Nonnull @NonnullElements final Map<String,String> map) {
-        Constraint.isNotNull(map, "Renaming map cannot be null");
-        
-        resultRenamingMap = new HashMap<>(map.size());
-        for (final Map.Entry<String,String> entry : map.entrySet()) {
-            if (entry.getKey() != null && entry.getValue() != null) {
-                resultRenamingMap.put(entry.getKey(), entry.getValue());
-            }
-        }
+    public void setResultRenamingMap(@Nonnull final Map<String,String> map) {
+        resultRenamingMap = CollectionSupport.copyToMap(Constraint.isNotNull(map, "Renaming map cannot be null"));
     }
     
     /**
@@ -110,4 +101,5 @@ public abstract class AbstractMappingStrategy<T> implements MappingStrategy<T> {
     public void setMultipleResultsAnError(final boolean isAnError) {
         multipleResultsAnError = isAnError;
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearch.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearch.java
index 15c60678e..1b4ee408f 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearch.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearch.java
@@ -30,4 +30,5 @@ public interface ExecutableSearch {
      * @return the result cache key
      */
     @Nullable String getResultCacheKey();
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearchBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearchBuilder.java
index 86a948531..38b24be74 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearchBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ExecutableSearchBuilder.java
@@ -45,4 +45,5 @@ public interface ExecutableSearchBuilder<T extends ExecutableSearch> {
      */
     @Nonnull T build(@Nonnull AttributeResolutionContext resolutionContext,
             @Nonnull Map<String, List<IdPAttributeValue>> dependencyAttributes) throws ResolutionException;
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/MappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/MappingStrategy.java
index 72b238ea7..4695098a1 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/MappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/MappingStrategy.java
@@ -24,6 +24,8 @@ import javax.annotation.Nullable;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 
 /**
  * Strategy for mapping from an arbitrary result type to a collection of {@link IdPAttribute}s.
@@ -41,6 +43,6 @@ public interface MappingStrategy<T> {
      * 
      * @throws ResolutionException thrown if there is a problem reading data or mapping it
      */
-    @Nullable Map<String,IdPAttribute> map(@Nonnull final T results) throws ResolutionException;
+    @Nullable @Unmodifiable @NotLive Map<String,IdPAttribute> map(@Nonnull final T results) throws ResolutionException;
     
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
deleted file mode 100644
index f752e8f9e..000000000
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the University Corporation for Advanced Internet Development,
- * Inc. (UCAID) under one or more contributor license agreements.  See the
- * NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The UCAID licenses this file to You under the Apache
- * License, Version 2.0 (the "License"); you may not use this file except in
- * compliance with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.shibboleth.idp.attribute.resolver.dc;
-
-import javax.annotation.Nullable;
-
-import net.shibboleth.idp.attribute.resolver.DataConnector;
-import net.shibboleth.shared.primitive.DeprecationSupport;
-import net.shibboleth.shared.primitive.DeprecationSupport.ObjectType;
-import net.shibboleth.shared.primitive.LoggerFactory;
-
-/** Used to determine whether a Data Connector initialized properly and continues to be fit for use. */
-public class NonFailFastValidator implements Validator {
-
-    /** Embedded validator to run. */
-    @Nullable private final Validator embeddedValidator;
-
-    /** Constructor. */
-    public NonFailFastValidator() {
-        this(null);
-    }
-
-    /**
-     * Constructor.
-     * 
-     * @param validator validator to run but trap exceptions from
-     */
-    public NonFailFastValidator(@Nullable final Validator validator) {
-        // V4 deprecation.  Remove the class in V5
-        DeprecationSupport.warnOnce(ObjectType.CLASS, "NonFailFastValidator", null, 
-                "failFastInitialize on DataConnector or p:throwValidateError on the contained Validator");
-        embeddedValidator = validator;
-        if (embeddedValidator != null) {
-            embeddedValidator.setThrowValidateError(false);
-        }
-    }
-    
-    /** {@inheritDoc} */
-    @Override
-    public void validate(final DataConnector dataConnector) throws ValidationException {
-        if (embeddedValidator != null) {
-            try {
-                embeddedValidator.validate(dataConnector);
-            } catch (final ValidationException e) {
-                LoggerFactory.getLogger(NonFailFastValidator.class).warn(
-                        "Non-fail-fast validator trapped an error from its embedded validator", e);
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    public void setThrowValidateError(final boolean what) {
-        LoggerFactory.getLogger(NonFailFastValidator.class).error("setThrowValidateError ignored");
-    }
-
-    /** {@inheritDoc} */
-    public boolean isThrowValidateError() {
-        return false;
-    }
-    
-}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
index 7dc22cba7..e94e61088 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.attribute.resolver.dc;
 
+import javax.annotation.Nonnull;
+
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 
 /** Used to determine whether a Data Connector initialized properly and continues to be fit for use. */
@@ -25,9 +27,11 @@ public interface Validator {
     /**
      * Probe the data connector and conditionally fails if it is not valid and ready for use.
      * 
+     * @param dataConnector data connector to validate 
+     * 
      * @throws ValidationException thrown if validation fails and {@link #isThrowValidateError()} is true
      */
-    void validate(DataConnector dataConnector) throws ValidationException;
+    void validate(@Nonnull final DataConnector dataConnector) throws ValidationException;
     
     /**
      * Sets whether {@link #validate(DataConnector)}  should throw or log errors.
@@ -42,4 +46,5 @@ public interface Validator {
      * @return whether {@link #validate(DataConnector)} should throw or log errors
      */
     boolean isThrowValidateError();
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/package-info.java
index 7247ac3bd..021f73cdd 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/package-info.java
@@ -14,8 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 /**
- * Package for http data connector configuration.
+ * Package for HTTP data connector configuration.
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.dc.http;
+
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java
index e6cac2c3b..f41bc7d2e 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/AbstractExecutableSearchFilterBuilder.java
@@ -39,7 +39,7 @@ public abstract class AbstractExecutableSearchFilterBuilder extends AbstractInit
     implements ExecutableSearchBuilder<ExecutableSearchFilter> {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractExecutableSearchFilterBuilder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractExecutableSearchFilterBuilder.class);
 
     /**
      * Creates an executable search filter that performs a search with the search filter.
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/ParameterizedExecutableSearchFilterBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/ParameterizedExecutableSearchFilterBuilder.java
index 41f251227..129f7d46a 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/ParameterizedExecutableSearchFilterBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/ParameterizedExecutableSearchFilterBuilder.java
@@ -27,12 +27,13 @@ import org.ldaptive.FilterTemplate;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
+import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 
 /**
- * An {@link net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder} that generates the search filter to
+ * An {@link ExecutableSearchBuilder} that generates the search filter to
  * be executed by evaluating a parameterized filter string against the currently resolved attributes within a
  * {@link AttributeResolutionContext}.
  */
@@ -40,14 +41,6 @@ public class ParameterizedExecutableSearchFilterBuilder extends AbstractExecutab
 
     /** LDAP search filter. */
     @NonnullAfterInit private String searchFilter;
-
-    /**
-     * Constructor.  
-     *
-     */
-    public ParameterizedExecutableSearchFilterBuilder() {
-        
-    }
     
     /** Set the filter used for the LDAP search.
      * @param filter used for the LDAP search
@@ -60,8 +53,11 @@ public class ParameterizedExecutableSearchFilterBuilder extends AbstractExecutab
     /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
-        Constraint.isNotNull(searchFilter, "Search filter can not be null");
         super.doInitialize();
+
+        if (searchFilter == null) {
+            throw new ComponentInitializationException("Search filter cannot be null");
+        }
     }
 
     /** {@inheritDoc} */
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/SearchResultMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/SearchResultMappingStrategy.java
index 465729bfc..34f95e251 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/SearchResultMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/SearchResultMappingStrategy.java
@@ -26,4 +26,5 @@ import net.shibboleth.idp.attribute.resolver.dc.MappingStrategy;
  * {@link net.shibboleth.idp.attribute.IdPAttribute}s.
  */
 public interface SearchResultMappingStrategy extends MappingStrategy<SearchResponse> {
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/StringAttributeValueMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/StringAttributeValueMappingStrategy.java
index a2669b549..7109087d9 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/StringAttributeValueMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/StringAttributeValueMappingStrategy.java
@@ -37,6 +37,8 @@ import net.shibboleth.idp.attribute.resolver.MultipleResultAnErrorResolutionExce
 import net.shibboleth.idp.attribute.resolver.NoResultAnErrorResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.dc.AbstractMappingStrategy;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -52,7 +54,8 @@ public class StringAttributeValueMappingStrategy extends AbstractMappingStrategy
 
  // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override @Nullable public Map<String,IdPAttribute> map(@Nonnull final SearchResponse results)
+    @Override
+    @Nullable @Unmodifiable @NotLive public Map<String,IdPAttribute> map(@Nonnull final SearchResponse results)
             throws ResolutionException {
         Constraint.isNotNull(results, "Results can not be null");
 
@@ -108,4 +111,4 @@ public class StringAttributeValueMappingStrategy extends AbstractMappingStrategy
     }
  // Checkstyle: CyclomaticComplexity ON
     
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/TemplatedExecutableSearchFilterBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/TemplatedExecutableSearchFilterBuilder.java
index 49226624d..f58e7e40b 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/TemplatedExecutableSearchFilterBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/TemplatedExecutableSearchFilterBuilder.java
@@ -37,22 +37,22 @@ import org.slf4j.Logger;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
+import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.velocity.Template;
 
 /**
- * An {@link net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder} that generates the search filter to
+ * An {@link ExecutableSearchBuilder} that generates the search filter to
  * be executed by evaluating a {@link Template} against the currently resolved attributes within a
  * {@link AttributeResolutionContext}.
  */
 public class TemplatedExecutableSearchFilterBuilder extends AbstractExecutableSearchFilterBuilder {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(TemplatedExecutableSearchFilterBuilder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(TemplatedExecutableSearchFilterBuilder.class);
 
     /** Template evaluated to generate a search filter. */
     @NonnullAfterInit private Template template;
@@ -163,12 +163,29 @@ public class TemplatedExecutableSearchFilterBuilder extends AbstractExecutableSe
     protected void addExtraVelocityContext(@Nonnull final VelocityContext velocityContext,
             @Nonnull final AttributeResolutionContext resolutionContext) {
     }
+    
+    /** {@inheritDoc} */
+    @Override protected void doInitialize() throws ComponentInitializationException {
+        super.doInitialize();
+
+        final VelocityEngine localEngine = engine;
+        final String localTemplateText = templateText;
+        if (null == localEngine) {
+            throw new ComponentInitializationException(
+                    "TemplatedExecutableStatementBuilder: no velocity engine was configured");
+        }
+        if (null == localTemplateText) {
+            throw new ComponentInitializationException(
+                    "TemplatedExecutableStatementBuilder: template text must be non null");
+        }
+
+        template = Template.fromTemplate(localEngine, localTemplateText);
+    }
 
     /** {@inheritDoc} */
     @Override
     @Nonnull public ExecutableSearchFilter build(@Nonnull final AttributeResolutionContext resolutionContext,
-            @Nonnull @NonnullElements final Map<String, List<IdPAttributeValue>> dependencyAttributes)
-                    throws ResolutionException {
+            @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) throws ResolutionException {
 
         final VelocityContext context = new VelocityContext();
         log.trace("Creating search filter using attribute resolution context {}", resolutionContext);
@@ -208,33 +225,13 @@ public class TemplatedExecutableSearchFilterBuilder extends AbstractExecutableSe
      * 
      * @return result of the merge operation
      */
-    protected String merge(@Nonnull final VelocityContext context) {
-        String result = template.merge(context);
-        if (result != null) {
-            result = result.trim();
-        }
+    @Nonnull protected String merge(@Nonnull final VelocityContext context) {
+        final String result = template.merge(context).trim();
         log.debug("Template text {} yields {}", templateText, result);
+        assert result != null;
         return result;
     }
 
-    /** {@inheritDoc} */
-    @Override protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-
-        final VelocityEngine localEngine = engine;
-        final String localTemplateText = templateText;
-        if (null == localEngine) {
-            throw new ComponentInitializationException(
-                    "TemplatedExecutableStatementBuilder: no velocity engine was configured");
-        }
-        if (null == localTemplateText) {
-            throw new ComponentInitializationException(
-                    "TemplatedExecutableStatementBuilder: template text must be non null");
-        }
-
-        template = Template.fromTemplate(localEngine, localTemplateText);
-    }
-
     /** Escapes LDAP attribute values added to the template context. */
     protected static class EscapingReferenceInsertionEventHandler implements ReferenceInsertionEventHandler {
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/package-info.java
index 541e44905..a2be50d6e 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/package-info.java
@@ -14,8 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 /**
  * Package for LDAP data connector configuration.
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.dc.ldap;
+
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/package-info.java
index bc1d1b989..d36fe735b 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Interfaces supporting data connectors.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.dc;
 
-package net.shibboleth.idp.attribute.resolver.dc;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/AbstractExecutableStatementBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/AbstractExecutableStatementBuilder.java
index bcfd71f1c..1655e3658 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/AbstractExecutableStatementBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/AbstractExecutableStatementBuilder.java
@@ -82,7 +82,7 @@ public abstract class AbstractExecutableStatementBuilder extends AbstractInitial
      * 
      * @return the SQL string
      */
-    protected abstract String getSQLQuery(@Nonnull final AttributeResolutionContext resolutionContext,
+    @Nonnull protected abstract String getSQLQuery(@Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) throws ResolutionException;
 
     /** {@inheritDoc} */
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ExecutableStatement.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ExecutableStatement.java
index 4b38f3a33..1dd6ed97d 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ExecutableStatement.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ExecutableStatement.java
@@ -39,4 +39,5 @@ public interface ExecutableStatement extends ExecutableSearch {
      * @throws SQLException thrown if there is a problem executing the statement
      */
     @Nonnull ResultSet execute(@Nonnull Connection connection) throws SQLException;
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java
index d6ac1b2c2..c3808fe60 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/FormatExecutableStatementBuilder.java
@@ -25,12 +25,13 @@ import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
+import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 
 /**
- * An {@link net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder}. It generates the SQL statement to
+ * An {@link ExecutableSearchBuilder}. It generates the SQL statement to
  * be executed by invoking {@link String#format(String, Object...)} with
  * {@link AttributeResolutionContext#getPrincipal() }.
  */
@@ -58,7 +59,8 @@ public class FormatExecutableStatementBuilder extends AbstractExecutableStatemen
     }
 
     /** {@inheritDoc} */
-    @Override protected String getSQLQuery(@Nonnull final AttributeResolutionContext resolutionContext,
+    @Override
+    @Nonnull protected String getSQLQuery(@Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) {
         final List<Object> args = new ArrayList<>();
         if (dependencyAttributes != null && !dependencyAttributes.isEmpty()) {
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ResultMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ResultMappingStrategy.java
index 3a5b674ba..13eed3d65 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ResultMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/ResultMappingStrategy.java
@@ -26,4 +26,5 @@ import net.shibboleth.idp.attribute.resolver.dc.MappingStrategy;
  * net.shibboleth.idp.attribute.IdPAttribute}s.
  */
 public interface ResultMappingStrategy extends MappingStrategy<ResultSet> {
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java
index 188bb50f4..1f609b394 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/StringResultMappingStrategy.java
@@ -37,6 +37,8 @@ import net.shibboleth.idp.attribute.resolver.MultipleResultAnErrorResolutionExce
 import net.shibboleth.idp.attribute.resolver.NoResultAnErrorResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.dc.AbstractMappingStrategy;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -52,7 +54,8 @@ public class StringResultMappingStrategy extends AbstractMappingStrategy<ResultS
 
 // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override @Nullable public Map<String, IdPAttribute> map(@Nonnull final ResultSet results)
+    @Override
+    @Nullable @Unmodifiable @NotLive public Map<String, IdPAttribute> map(@Nonnull final ResultSet results)
             throws ResolutionException {
         Constraint.isNotNull(results, "Result set can not be null");
 
@@ -115,4 +118,4 @@ public class StringResultMappingStrategy extends AbstractMappingStrategy<ResultS
     }
 // Checkstyle: CyclomaticComplexity ON
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/TemplatedExecutableStatementBuilder.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/TemplatedExecutableStatementBuilder.java
index f2005655f..eadd714fe 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/TemplatedExecutableStatementBuilder.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/TemplatedExecutableStatementBuilder.java
@@ -36,15 +36,15 @@ import org.slf4j.Logger;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
+import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.velocity.Template;
 
 /**
- * An {@link net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder} that generates the SQL statement to
+ * An {@link ExecutableSearchBuilder} that generates the SQL statement to
  * be executed by evaluating a {@link Template} against the currently resolved attributes within a
  * {@link AttributeResolutionContext}.
  */
@@ -63,7 +63,7 @@ public class TemplatedExecutableStatementBuilder extends AbstractExecutableState
     @NonnullAfterInit private VelocityEngine engine;
 
     /** Event handler used for escaping. */
-    private ReferenceInsertionEventHandler eventHandler = new EscapingReferenceInsertionEventHandler();
+    @Nullable private ReferenceInsertionEventHandler eventHandler = new EscapingReferenceInsertionEventHandler();
 
     /** Do we need to make ourself V2 Compatible? */
     private boolean v2Compatibility;
@@ -155,6 +155,24 @@ public class TemplatedExecutableStatementBuilder extends AbstractExecutableState
         v2Compatibility = compat;
     }
 
+    /** {@inheritDoc} */
+    @Override protected void doInitialize() throws ComponentInitializationException {
+        super.doInitialize();
+
+        final VelocityEngine localEngine = engine;
+        final String localTemplateText = templateText;
+        if (null == localEngine) {
+            throw new ComponentInitializationException(
+                    "TemplatedExecutableStatementBuilder: no velocity engine was configured");
+        }
+        if (null == localTemplateText) {
+            throw new ComponentInitializationException(
+                    "TemplatedExecutableStatementBuilder: Template text must be non null");
+        }
+
+        template = Template.fromTemplate(localEngine, localTemplateText);
+    }
+
     /**
      * Invokes {@link Template#merge(org.apache.velocity.context.Context)} on the supplied context.
      * 
@@ -162,7 +180,7 @@ public class TemplatedExecutableStatementBuilder extends AbstractExecutableState
      * 
      * @return result of the merge operation
      */
-    protected String merge(@Nonnull final VelocityContext context) {
+    @Nonnull protected String merge(@Nonnull final VelocityContext context) {
         final String result = template.merge(context);
         log.debug("Template text {} yields {}", templateText, result);
         return result;
@@ -172,9 +190,8 @@ public class TemplatedExecutableStatementBuilder extends AbstractExecutableState
      * Apply the context to the template. {@inheritDoc}
      */
     @Override
-    public final String getSQLQuery(@Nonnull final AttributeResolutionContext resolutionContext,
-            @Nonnull @NonnullElements final Map<String, List<IdPAttributeValue>> dependencyAttributes)
-                    throws ResolutionException {
+    @Nonnull public final String getSQLQuery(@Nonnull final AttributeResolutionContext resolutionContext,
+            @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) throws ResolutionException {
         final VelocityContext context = new VelocityContext();
         log.trace("Creating search filter using attribute resolution context {}", resolutionContext);
         context.put("resolutionContext", resolutionContext);
@@ -215,24 +232,6 @@ public class TemplatedExecutableStatementBuilder extends AbstractExecutableState
             @Nonnull final AttributeResolutionContext resolutionContext) {
     }
 
-    /** {@inheritDoc} */
-    @Override protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-
-        final VelocityEngine localEngine = engine;
-        final String localTemplateText = templateText;
-        if (null == localEngine) {
-            throw new ComponentInitializationException(
-                    "TemplatedExecutableStatementBuilder: no velocity engine was configured");
-        }
-        if (null == localTemplateText) {
-            throw new ComponentInitializationException(
-                    "TemplatedExecutableStatementBuilder: Template text must be non null");
-        }
-
-        template = Template.fromTemplate(localEngine, localTemplateText);
-    }
-
     /** Escapes SQL values added to the template context. */
     protected static class EscapingReferenceInsertionEventHandler implements ReferenceInsertionEventHandler {
 
@@ -271,4 +270,5 @@ public class TemplatedExecutableStatementBuilder extends AbstractExecutableState
             return value;
         }
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/package-info.java
index 96a5afd29..0cb5ee066 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/package-info.java
@@ -14,8 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 /**
- * Package for rdbms data connector configuration.
+ * Package for RDBMS data connector configuration.
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.dc.rdbms;
+
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/package-info.java
index d36e26cb3..95cbdbe11 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/package-info.java
@@ -18,5 +18,7 @@
 /**
  * StorageService-backed data connector APIs.
  */
-
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.dc.storage;
+
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java
index 5c107f146..06eff8c5a 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java
@@ -23,7 +23,7 @@ import java.util.function.Predicate;
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.resolver.context.navigate.AttributeIssuerIdLookupFunction;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.logic.StrategyIndirectedPredicate;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -42,7 +42,7 @@ public class AttributeIssuerIdPredicate extends StrategyIndirectedPredicate<Prof
      * 
      * @param candidates hardwired set of values to check against
      */
-    public AttributeIssuerIdPredicate(@Nonnull @NonnullElements final Collection<String> candidates) {
+    public AttributeIssuerIdPredicate(@ParameterName(name="candidates") @Nonnull final Collection<String> candidates) {
         super(new AttributeIssuerIdLookupFunction(), StringSupport.normalizeStringCollection(candidates));
     }
 
@@ -51,7 +51,7 @@ public class AttributeIssuerIdPredicate extends StrategyIndirectedPredicate<Prof
      * 
      * @param pred generalized predicate
      */
-    public AttributeIssuerIdPredicate(@Nonnull final Predicate<String> pred) {
+    public AttributeIssuerIdPredicate(@ParameterName(name="pred") @Nonnull final Predicate<String> pred) {
         super(new AttributeIssuerIdLookupFunction(), pred);
     }
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java
index 74217354e..822eb4a1d 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java
@@ -23,7 +23,7 @@ import java.util.function.Predicate;
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.resolver.context.navigate.AttributePrincipalLookupFunction;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.logic.StrategyIndirectedPredicate;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -42,7 +42,7 @@ public class AttributePrincipalPredicate extends StrategyIndirectedPredicate<Pro
      * 
      * @param candidates hardwired set of values to check against
      */
-    public AttributePrincipalPredicate(@Nonnull @NonnullElements final Collection<String> candidates) {
+    public AttributePrincipalPredicate(@ParameterName(name="candidates") @Nonnull final Collection<String> candidates) {
         super(new AttributePrincipalLookupFunction(), StringSupport.normalizeStringCollection(candidates));
     }
 
@@ -51,7 +51,7 @@ public class AttributePrincipalPredicate extends StrategyIndirectedPredicate<Pro
      * 
      * @param pred generalized predicate
      */
-    public AttributePrincipalPredicate(@Nonnull final Predicate<String> pred) {
+    public AttributePrincipalPredicate(@ParameterName(name="pred") @Nonnull final Predicate<String> pred) {
         super(new AttributePrincipalLookupFunction(), pred);
     }
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java
index d2553f1e7..e532184c3 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java
@@ -23,7 +23,7 @@ import java.util.function.Predicate;
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.resolver.context.navigate.AttributeRecipientIdLookupFunction;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.logic.StrategyIndirectedPredicate;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -42,7 +42,7 @@ public class AttributeRecipientIdPredicate extends StrategyIndirectedPredicate<P
      * 
      * @param candidates hardwired set of values to check against
      */
-    public AttributeRecipientIdPredicate(@Nonnull @NonnullElements final Collection<String> candidates) {
+    public AttributeRecipientIdPredicate(@ParameterName(name="candidates") @Nonnull final Collection<String> candidates) {
         super(new AttributeRecipientIdLookupFunction(), StringSupport.normalizeStringCollection(candidates));
     }
 
@@ -51,7 +51,7 @@ public class AttributeRecipientIdPredicate extends StrategyIndirectedPredicate<P
      * 
      * @param pred generalized predicate
      */
-    public AttributeRecipientIdPredicate(@Nonnull final Predicate<String> pred) {
+    public AttributeRecipientIdPredicate(@ParameterName(name="pred") @Nonnull final Predicate<String> pred) {
         super(new AttributeRecipientIdLookupFunction(), pred);
     }
 
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/ResolutionLabelPredicate.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/ResolutionLabelPredicate.java
index 275f030dd..e5f6e3a71 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/ResolutionLabelPredicate.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/ResolutionLabelPredicate.java
@@ -23,7 +23,7 @@ import java.util.function.Predicate;
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.resolver.context.navigate.ResolutionLabelLookupFunction;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.logic.StrategyIndirectedPredicate;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -44,7 +44,7 @@ public class ResolutionLabelPredicate extends StrategyIndirectedPredicate<Profil
      * 
      * @param candidates hardwired set of values to check against
      */
-    public ResolutionLabelPredicate(@Nonnull @NonnullElements final Collection<String> candidates) {
+    public ResolutionLabelPredicate(@ParameterName(name="candidates") @Nonnull final Collection<String> candidates) {
         super(new ResolutionLabelLookupFunction(), StringSupport.normalizeStringCollection(candidates));
     }
 
@@ -53,7 +53,7 @@ public class ResolutionLabelPredicate extends StrategyIndirectedPredicate<Profil
      * 
      * @param pred generalized predicate
      */
-    public ResolutionLabelPredicate(@Nonnull final Predicate<String> pred) {
+    public ResolutionLabelPredicate(@ParameterName(name="pred") @Nonnull final Predicate<String> pred) {
         super(new ResolutionLabelLookupFunction(), pred);
     }
 
@@ -63,7 +63,7 @@ public class ResolutionLabelPredicate extends StrategyIndirectedPredicate<Profil
      * @param candidates hardwired set of values to check against
      * @return the result of calling {@link #ResolutionLabelPredicate(Collection)}
      */
-    static ResolutionLabelPredicate byList(@Nonnull @NonnullElements final Collection<String> candidates) {
+    static ResolutionLabelPredicate byList(@Nonnull final Collection<String> candidates) {
         return new ResolutionLabelPredicate(candidates);
     }
 
@@ -76,4 +76,5 @@ public class ResolutionLabelPredicate extends StrategyIndirectedPredicate<Profil
     static ResolutionLabelPredicate byPredicate(@Nonnull final Predicate<String> pred) {
         return new ResolutionLabelPredicate(pred);
     }
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/package-info.java
index 61734e5d7..e19465820 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Predicates related to attribute resolution.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.logic;
 
-package net.shibboleth.idp.attribute.resolver.logic;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/package-info.java
index a46978a43..4e2c7c057 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/package-info.java
@@ -20,5 +20,7 @@
  * {@link net.shibboleth.idp.attribute.IdPAttribute}s from a variety of locations, transform them, 
  * and associate a set of protocol-specific encoders to them.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver;
 
-package net.shibboleth.idp.attribute.resolver;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/ScriptedIdPAttribute.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/ScriptedIdPAttribute.java
index fa0bb2bc3..afc74ab61 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/ScriptedIdPAttribute.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/ScriptedIdPAttribute.java
@@ -23,7 +23,9 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 
 /**
@@ -32,13 +34,12 @@ import net.shibboleth.shared.annotation.constraint.NotEmpty;
 public interface ScriptedIdPAttribute {
 
     /**
-     * Return all the values, but with {@link net.shibboleth.idp.attribute.StringAttributeValue} values returned as
-     * strings.
+     * Return all the values, but with {@link StringAttributeValue} values returned as strings.
      * 
      * @return a modifiable collection of the string attributes
      * @throws ResolutionException if the script has called {@link #getNativeAttribute()}
      */
-    @Nullable Collection<Object> getValues() throws ResolutionException;
+    @Nullable @Live Collection<Object> getValues() throws ResolutionException;
 
     /**
      * return the underlying attribute.
@@ -63,4 +64,4 @@ public interface ScriptedIdPAttribute {
      */
     void addValue(@Nullable final Object what) throws ResolutionException;
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/package-info.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/package-info.java
index c3739e859..93ab70562 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/package-info.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/package-info.java
@@ -23,5 +23,7 @@
  * used by Java.
  * </p>
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.scripted;
 
-package net.shibboleth.idp.attribute.resolver.scripted;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java
index 6ce315778..fc3d87f56 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java
@@ -99,7 +99,7 @@ public class ScopedAttributeDefinition extends AbstractAttributeDefinition {
     /** Null safe getter for {@link #nonScopeAttributeDependencies}.
      * @return Returns the nonScopeAttributeDependencies.
      */
-    @Nonnull private Collection<ResolverAttributeDefinitionDependency> getNonScopeAttributeDependencies() {
+    @Nonnull private Collection<ResolverAttributeDefinitionDependency> ensureNonScopeAttributeDependencies() {
         checkComponentActive();
         assert nonScopeAttributeDependencies!=null;
         return nonScopeAttributeDependencies;
@@ -178,7 +178,7 @@ public class ScopedAttributeDefinition extends AbstractAttributeDefinition {
         }
         final List<IdPAttributeValue> dependencyValues =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        getNonScopeAttributeDependencies(),
+                        ensureNonScopeAttributeDependencies(),
                         getDataConnectorDependencies(), 
                         ensureId());
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
index ec4a6e25c..bc762c8f1 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
@@ -40,7 +40,6 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.idp.attribute.resolver.scripted.ResolverScriptContextExtender;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -84,7 +83,7 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
     @NonnullAfterInit private AttributeDefinitionScriptEvaluator scriptEvaluator;
 
     /** Extenders for script context. */
-    @Nonnull @NonnullElements private Collection<ResolverScriptContextExtender> contextExtenders;
+    @Nonnull private Collection<ResolverScriptContextExtender> contextExtenders;
     
     /** The custom object we inject into all scripts. */
     @Nullable private Object customObject;
@@ -139,8 +138,7 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
      * 
      * @since 5.0.0
      */
-    public void setScriptContextExtenders(
-            @Nullable @NonnullElements final Collection<ResolverScriptContextExtender> extenders) {
+    public void setScriptContextExtenders(@Nullable final Collection<ResolverScriptContextExtender> extenders) {
         checkSetterPreconditions();
         if (extenders != null) {
             contextExtenders = CollectionSupport.copyToList(extenders);
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedIdPAttributeImpl.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedIdPAttributeImpl.java
index 0cdedf747..23a56f576 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedIdPAttributeImpl.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedIdPAttributeImpl.java
@@ -34,7 +34,7 @@ import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.scripted.ScriptedIdPAttribute;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -49,12 +49,12 @@ import net.shibboleth.shared.primitive.LoggerFactory;
  */
 public class ScriptedIdPAttributeImpl implements ScriptedIdPAttribute {
 
+    /** Logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ScriptedIdPAttributeImpl.class);
+
     /** The {@link IdPAttribute} we are encapsulating. */
     @Nonnull private final IdPAttribute encapsulatedAttribute;
 
-    /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(ScriptedIdPAttributeImpl.class);
-
     /** has method {@link #getNativeAttribute()} be called. */
     private boolean calledGetNativeAttribute;
 
@@ -69,7 +69,7 @@ public class ScriptedIdPAttributeImpl implements ScriptedIdPAttribute {
     private List<Object> attributeValues;
 
     /** The prefix for logging. Derived from the definition's logPrefix and the attribute ID. */
-    @Nonnull final String logPrefix;
+    @Nonnull private final String logPrefix;
 
     /**
      * Constructor.
@@ -77,10 +77,12 @@ public class ScriptedIdPAttributeImpl implements ScriptedIdPAttribute {
      * @param attribute the attribute we are encapsulating.
      * @param prefix the log path from the definition.
      */
-    public ScriptedIdPAttributeImpl(@Nonnull final IdPAttribute attribute, final String prefix) {
+    public ScriptedIdPAttributeImpl(@Nonnull final IdPAttribute attribute, @Nullable final String prefix) {
         encapsulatedAttribute = attribute;
-        final String lpf = new StringBuilder(prefix).append(" scripted attribute '").append(attribute.getId()).append("':")
-                        .toString();
+        final String lpf = new StringBuilder(prefix)
+                .append(" scripted attribute '")
+                .append(attribute.getId())
+                .append("':").toString();
         assert lpf != null;
         logPrefix=lpf;
     }
@@ -97,7 +99,7 @@ public class ScriptedIdPAttributeImpl implements ScriptedIdPAttribute {
         // NOTE. This has to be a List - the examples use get(0)
         final ArrayList<Object> newValues = new ArrayList<>(encapsulatedAttribute.getValues().size());
         for (final IdPAttributeValue value : encapsulatedAttribute.getValues()) {
-            if ((value instanceof StringAttributeValue) && !(value instanceof ScopedStringAttributeValue)) {
+            if (value instanceof StringAttributeValue && !(value instanceof ScopedStringAttributeValue)) {
                 newValues.add(((StringAttributeValue) value).getValue());
             } else if (value instanceof EmptyAttributeValue) {
                 // Shib2 made both empty strings and nulls null
@@ -120,7 +122,8 @@ public class ScriptedIdPAttributeImpl implements ScriptedIdPAttribute {
      * @return a modifiable collection of the string attributes (not the String
      * @throws ResolutionException if the script has called {@link #getNativeAttribute()}
      */
-    @Override @Nullable @NonnullElements public Collection<Object> getValues() throws ResolutionException {
+    @Override
+    @Nullable @Live public Collection<Object> getValues() throws ResolutionException {
         if (calledGetNativeAttribute) {
             throw new ResolutionException(getLogPrefix()
                     + " cannot call getNativeAttribute() and getValues() or addValues() on the same attribute()");
@@ -162,7 +165,7 @@ public class ScriptedIdPAttributeImpl implements ScriptedIdPAttribute {
      * @param values the list to add to.
      * @param value the value to add. Known to be a {@link String} or an {@link IdPAttributeValue}
      */
-    private void addAsIdPAttributeValue(final List<IdPAttributeValue> values, final Object value) {
+    private void addAsIdPAttributeValue(@Nonnull final List<IdPAttributeValue> values, @Nullable final Object value) {
         if (null == value) {
             values.add(new EmptyAttributeValue(EmptyType.NULL_VALUE));
         } else if (value instanceof String) {
@@ -238,4 +241,5 @@ public class ScriptedIdPAttributeImpl implements ScriptedIdPAttribute {
     @Nonnull protected String getLogPrefix() {
         return logPrefix;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java
index 1bdf0175a..0ca9c1f40 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java
@@ -42,7 +42,6 @@ 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.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.ThreadSafeAfterInit;
 import net.shibboleth.shared.collection.LazyMap;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -214,8 +213,8 @@ public class TemplateAttributeDefinition extends AbstractAttributeDefinition {
      */
     private int addAttributeValues(@Nonnull final String attributeName,
             @Nullable final List<IdPAttributeValue> attributeValues,  
-            @Nonnull @NonnullElements final Map<String,Iterator<IdPAttributeValue>> sourceValues,
-            final int curValueCount) throws ResolutionException {
+            @Nonnull final Map<String,Iterator<IdPAttributeValue>> sourceValues, final int curValueCount)
+                    throws ResolutionException {
         
         int valueCount = curValueCount;
         if (null == attributeValues || 0 == attributeValues.size()) {
@@ -247,8 +246,7 @@ public class TemplateAttributeDefinition extends AbstractAttributeDefinition {
      * @throws ResolutionException if there is a mismatched count of attributes
      */
     private int setupSourceValues(@Nonnull final AttributeResolverWorkContext workContext,
-            @Nonnull @NonnullElements final Map<String,Iterator<IdPAttributeValue>> sourceValues)
-                    throws ResolutionException {
+            @Nonnull final Map<String,Iterator<IdPAttributeValue>> sourceValues) throws ResolutionException {
 
         final Map<String, List<IdPAttributeValue>> dependencyAttributes = 
                 PluginDependencySupport.getAllAttributeValues(workContext,
@@ -266,4 +264,4 @@ public class TemplateAttributeDefinition extends AbstractAttributeDefinition {
         return valueCount;
     }
     
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/package-info.java
index bc7c4c095..0e25937e5 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/package-info.java
@@ -16,5 +16,7 @@
  */
 
 /** Implementations of various {@link net.shibboleth.idp.attribute.resolver.AttributeDefinition}s. */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.ad.impl;
 
-package net.shibboleth.idp.attribute.resolver.ad.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
index 55f9ce641..58a67751d 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
@@ -40,7 +40,8 @@ import net.shibboleth.idp.attribute.resolver.PluginDependencySupport;
 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.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -65,7 +66,7 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
     @Nonnull private final Logger log = LoggerFactory.getLogger(MappedAttributeDefinition.class);
 
     /** Value maps. */
-    @Nonnull @NonnullElements private Set<ValueMap> valueMaps = CollectionSupport.emptySet();
+    @Nonnull private Set<ValueMap> valueMaps = CollectionSupport.emptySet();
 
     /** Whether the definition passes thru unmatched values. */
     private boolean passThru;
@@ -78,7 +79,7 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
      * 
      * @return functions used to map an input value to an output value
      */
-    @Nonnull @NonnullElements @Unmodifiable public Collection<ValueMap> getValueMaps() {
+    @Nonnull @Unmodifiable @NotLive public Collection<ValueMap> getValueMaps() {
         return valueMaps;
     }
 
@@ -87,7 +88,7 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
      * 
      * @param mappings functions used to map an input value to an output value
      */
-    public void setValueMaps(@Nullable @NonnullElements final Collection<ValueMap> mappings) {
+    public void setValueMaps(@Nullable final Collection<ValueMap> mappings) {
         checkSetterPreconditions();
 
         valueMaps = mappings != null ? CollectionSupport.copyToSet(mappings) : CollectionSupport.emptySet();
@@ -155,7 +156,7 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
      * 
      * @return the set of attribute values that the given dependency value maps in to
      */
-    protected List<StringAttributeValue> mapValue(@Nullable final String value) {
+    @Nonnull @Live protected List<StringAttributeValue> mapValue(@Nullable final String value) {
         log.debug("Attribute Definition {}: mapping dependency attribute value {}", getId(), value);
 
         final List<StringAttributeValue> mappedValues = new ArrayList<>();
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/SourceValue.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/SourceValue.java
index 1e34dec70..fa9a368f2 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/SourceValue.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/SourceValue.java
@@ -36,7 +36,7 @@ public class SourceValue extends AbstractInitializableComponent {
     /**
      * Value string. This may contain regular expressions.
      */
-    private @Nullable String value;
+    @Nullable private String value;
 
     /**
      * Whether case should be taken into account when matching.
@@ -44,7 +44,7 @@ public class SourceValue extends AbstractInitializableComponent {
     private boolean caseSensitive = true;
 
     /** In the regexp case this contains the compiled pattern. */
-    private @Nullable Pattern pattern;
+    @Nullable private Pattern pattern;
 
     /**
      * Whether partial matches should be allowed.
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
index 0abe776bc..aee40b89a 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
@@ -31,8 +31,8 @@ import javax.annotation.Nullable;
 import org.slf4j.Logger;
 
 import net.shibboleth.idp.attribute.StringAttributeValue;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
@@ -52,7 +52,7 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
     private String returnValue;
 
     /** Source values. */
-    @Nonnull @NonnullElements private Collection<SourceValue> sourceValues;
+    @Nonnull private Collection<SourceValue> sourceValues;
 
     /** Constructor. */
     public ValueMap() {
@@ -83,7 +83,7 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
      *
      * @param newValues functions used to map an input value to an output value
      */
-    public void setSourceValues(@Nullable @NonnullElements final Collection<SourceValue> newValues) {
+    public void setSourceValues(@Nullable final Collection<SourceValue> newValues) {
 
         sourceValues = newValues != null ? CollectionSupport.copyToSet(newValues) : CollectionSupport.emptySet();
     }
@@ -93,7 +93,7 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
      *
      * @return the collection of source values
      */
-    @Nonnull @NonnullElements @Unmodifiable public Collection<SourceValue> getSourceValues() {
+    @Nonnull @Unmodifiable @NotLive public Collection<SourceValue> getSourceValues() {
         return sourceValues;
     }
 
@@ -157,4 +157,5 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
         return mappedValues;
     }
 // CheckStyle: CyclomaticComplexity ON
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/package-info.java
index e3e79d578..c3ec19735 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/package-info.java
@@ -19,5 +19,7 @@
  * A {@link net.shibboleth.idp.attribute.resolver.DataConnector} implementation that maps from a given set of
  * source value to an output value. 
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.ad.mapped.impl;
 
-package net.shibboleth.idp.attribute.resolver.ad.mapped.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
index 2fa9b2cc1..8a786cc81 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
@@ -39,7 +39,6 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.idp.attribute.resolver.dc.http.HTTPResponseMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.http.HTTPSearch;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
@@ -64,7 +63,7 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
         ExecutableSearchBuilder<HTTPSearch> {
     
     /** Map of headers to set. */
-    @Nonnull @NonnullElements @Unmodifiable private List<Pair<String,String>> headerList;
+    @Nonnull @Unmodifiable private List<Pair<String,String>> headerList;
     
     /** HTTP client security parameters. */
     @Nullable private HttpClientSecurityParameters httpClientSecurityParameters;
@@ -79,7 +78,7 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
      * 
      * @return map of headers
      */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public List<Pair<String,String>> getHeaders() {
+    @Nonnull @NotLive @Unmodifiable public List<Pair<String,String>> getHeaders() {
         return headerList;
     }
     
@@ -90,7 +89,7 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
      * 
      * @param headers map of headers
      */
-    public void setHeaders(@Nonnull @NonnullElements final Map<String,String> headers) {
+    public void setHeaders(@Nonnull final Map<String,String> headers) {
         checkSetterPreconditions();
                 
         Constraint.isNotNull(headers, "Map of headers cannot be null");
@@ -164,11 +163,13 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
                     @Nullable final HttpClientSecurityParameters securityParameters,
                     @Nonnull final HTTPResponseMappingStrategy mappingStrategy) throws IOException {
                 
-                @Nonnull HttpClientContext clientContext = HttpClientContext.create();
+                final HttpClientContext clientContext = HttpClientContext.create();
+                assert clientContext != null;
                 HttpClientSecuritySupport.marshalSecurityParameters(clientContext, securityParameters, true);
                 HttpClientSecuritySupport.addDefaultTLSTrustEngineCriteria(clientContext, request);
-                @Nonnull final Map<String,IdPAttribute> results = client.execute(request, clientContext, mappingStrategy);
+                final Map<String,IdPAttribute> results = client.execute(request, clientContext, mappingStrategy);
                 HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, request.getScheme());
+                assert results != null;
                 return results;
             }
             
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
index 05ea4ea79..1696117f5 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
@@ -39,6 +39,8 @@ import net.shibboleth.idp.attribute.resolver.dc.http.HTTPResponseMappingStrategy
 import net.shibboleth.idp.attribute.resolver.dc.http.HTTPSearch;
 import net.shibboleth.idp.attribute.resolver.dc.impl.AbstractSearchDataConnector;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 
@@ -57,7 +59,7 @@ public class HTTPDataConnector extends AbstractSearchDataConnector<HTTPSearch,HT
     /** Constructor. */
     public HTTPDataConnector() {
         setValidator(new Validator() {
-            public void validate(final DataConnector dataConnector) throws ValidationException {
+            public void validate(@Nonnull final DataConnector dataConnector) throws ValidationException {
             }
 
             public void setThrowValidateError(final boolean what) {
@@ -102,8 +104,8 @@ public class HTTPDataConnector extends AbstractSearchDataConnector<HTTPSearch,HT
 
     /** {@inheritDoc} */
     @Override
-    @Nullable protected Map<String,IdPAttribute> retrieveAttributes(@Nonnull final HTTPSearch executable)
-            throws ResolutionException {
+    @Nullable @Unmodifiable @NotLive protected Map<String,IdPAttribute> retrieveAttributes(
+            @Nonnull final HTTPSearch executable) throws ResolutionException {
 
         try {
             return getMappingStrategy().map(
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
index f7e2af0a0..8715c615b 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
@@ -42,8 +42,9 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.dc.http.HTTPResponseMappingStrategy;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -94,7 +95,7 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
      * 
      * @param statuses successful codes
      */
-    public void setAcceptStatuses(@Nonnull @NonnullElements final Collection<Integer> statuses) {
+    public void setAcceptStatuses(@Nonnull final Collection<Integer> statuses) {
         acceptStatuses = CollectionSupport.copyToSet(Constraint.isNotNull(statuses, "Statuses cannot be null"));
     }
 
@@ -103,7 +104,7 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
      * 
      * @param types types to allow
      */
-    public void setAcceptTypes(@Nonnull @NonnullElements final Collection<String> types) {
+    public void setAcceptTypes(@Nonnull final Collection<String> types) {
         acceptTypes = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(
                 Constraint.isNotNull(types, "Types cannot be null")));
     }
@@ -120,8 +121,8 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
     }
     
     /** {@inheritDoc} */
-    @Nonnull public Map<String,IdPAttribute> map(@Nonnull final Map<String,IdPAttribute> results)
-            throws ResolutionException {
+    @Nullable @Unmodifiable @NotLive public Map<String,IdPAttribute> map(
+            @Nonnull final Map<String,IdPAttribute> results) throws ResolutionException {
         return results;
     }
     
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
index 73eaf60aa..8c8b44a73 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedBodyBuilder.java
@@ -41,6 +41,7 @@ import com.google.common.xml.XmlEscapers;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
+import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -50,7 +51,7 @@ import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.velocity.Template;
 
 /**
- * An {@link net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder} that generates a
+ * An {@link ExecutableSearchBuilder} that generates a
  * request by evaluating {@link Template}s against the currently resolved attributes within an
  * {@link AttributeResolutionContext} to produce a URL and body, via GET or POST, and a configurable
  * cache key.
@@ -112,6 +113,7 @@ public class TemplatedBodyBuilder extends AbstractHTTPSearchBuilder {
     @Nullable private Object customObject;
 
     /** Constructor. */
+    @SuppressWarnings("null")
     public TemplatedBodyBuilder() {
         method = "POST";
         mimeType ="text/plain";
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedURLBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedURLBuilder.java
index 86b03718b..b86c25fbb 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedURLBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/TemplatedURLBuilder.java
@@ -35,6 +35,7 @@ import com.google.common.net.UrlEscapers;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
+import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -44,7 +45,7 @@ import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.velocity.Template;
 
 /**
- * An {@link net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder} that generates the URL to
+ * An {@link ExecutableSearchBuilder} that generates the URL to
  * request by evaluating a {@link Template} against the currently resolved attributes within an
  * {@link AttributeResolutionContext}.
  */
@@ -75,6 +76,7 @@ public class TemplatedURLBuilder extends AbstractHTTPSearchBuilder {
     @Nullable private Object customObject;
     
     /** Constructor. */
+    @SuppressWarnings("null")
     public TemplatedURLBuilder() {
         paramEscaper = UrlEscapers.urlFormParameterEscaper();
         fragmentEscaper = UrlEscapers.urlFragmentEscaper();
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/package-info.java
index 195491a80..fff4a7324 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/package-info.java
@@ -19,4 +19,7 @@
  * A {@link net.shibboleth.idp.attribute.resolver.DataConnector} implementation that
  * reads data from an HTTP web service.
  */
-package net.shibboleth.idp.attribute.resolver.dc.http.impl;
\ No newline at end of file
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.dc.http.impl;
+
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
index e8c708237..d8a90e3a7 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
@@ -39,6 +39,8 @@ import net.shibboleth.idp.attribute.resolver.dc.ExecutableSearchBuilder;
 import net.shibboleth.idp.attribute.resolver.dc.MappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.Validator;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -161,11 +163,12 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
      * 
      * @throws ResolutionException thrown if there is a problem retrieving data from the data source
      */
-    @Nullable protected abstract Map<String,IdPAttribute> retrieveAttributes(@Nonnull final T1 executable)
-            throws ResolutionException;
+    @Nullable @Unmodifiable @NotLive protected abstract Map<String,IdPAttribute> retrieveAttributes(
+            @Nonnull final T1 executable) throws ResolutionException;
 
     /** {@inheritDoc} */
-    @Override @Nullable protected Map<String, IdPAttribute> doDataConnectorResolve(
+    @Override
+    @Nullable @Unmodifiable @NotLive protected Map<String, IdPAttribute> doDataConnectorResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
         checkComponentActive();
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ContextDerivedDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ContextDerivedDataConnector.java
index 10bab9220..41e992b17 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ContextDerivedDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ContextDerivedDataConnector.java
@@ -35,7 +35,8 @@ 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.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -106,7 +107,7 @@ public class ContextDerivedDataConnector extends AbstractDataConnector {
 
     /** {@inheritDoc} */
     @Override
-    @Nullable @NonnullElements protected Map<String,IdPAttribute> doDataConnectorResolve(
+    @Nullable @Unmodifiable @NotLive protected Map<String,IdPAttribute> doDataConnectorResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
index a1fd30cc1..b0375f043 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
@@ -42,6 +42,8 @@ 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.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -73,7 +75,7 @@ public class PairwiseIdDataConnector extends AbstractDataConnector {
      *
      * @return source attribute ID
      */
-    @Nullable @NonnullAfterInit public String getSourceAttributeInformation() {
+    @NonnullAfterInit public String getSourceAttributeInformation() {
         checkComponentActive();
         return sourceInformation;
     }
@@ -234,7 +236,8 @@ public class PairwiseIdDataConnector extends AbstractDataConnector {
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable protected Map<String, IdPAttribute> doDataConnectorResolve(
+    @Override
+    @Nullable @Unmodifiable @NotLive protected Map<String, IdPAttribute> doDataConnectorResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
index 638283c41..49fef1d4c 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
@@ -43,7 +43,8 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.idp.attribute.resolver.scripted.ResolverScriptContextExtender;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -69,7 +70,7 @@ public class ScriptedDataConnector extends AbstractDataConnector {
     @NonnullAfterInit private DataConnectorScriptEvaluator scriptEvaluator;
     
     /** Extenders for script context. */
-    @Nonnull @NonnullElements private Collection<ResolverScriptContextExtender> contextExtenders;
+    @Nonnull private Collection<ResolverScriptContextExtender> contextExtenders;
     
     /** The custom object we inject into all scripts. */
     @Nullable private Object customObject;
@@ -124,8 +125,7 @@ public class ScriptedDataConnector extends AbstractDataConnector {
      * 
      * @since 5.0.0
      */
-    public void setScriptContextExtenders(
-            @Nullable @NonnullElements final Collection<ResolverScriptContextExtender> extenders) {
+    public void setScriptContextExtenders(@Nullable final Collection<ResolverScriptContextExtender> extenders) {
         checkSetterPreconditions();
         if (extenders != null) {
             contextExtenders = CollectionSupport.copyToList(extenders);
@@ -184,7 +184,7 @@ public class ScriptedDataConnector extends AbstractDataConnector {
          * @throws ResolutionException if the script fails
          */
         @SuppressWarnings("unchecked")
-        @Nullable protected Map<String,IdPAttribute> execute(
+        @Nullable @Unmodifiable @NotLive protected Map<String,IdPAttribute> execute(
                 @Nonnull final AttributeResolutionContext resolutionContext,
                 @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
             try {
@@ -198,7 +198,7 @@ public class ScriptedDataConnector extends AbstractDataConnector {
         @Override
         protected void prepareContext(@Nonnull final ScriptContext scriptContext, @Nullable final Object... input) {
 
-            assert(input != null);
+            assert input != null;
             
             log.debug("{} Adding to-be-populated attribute set '{}' to script context", getLogPrefix(), RESULTS_STRING);
             scriptContext.setAttribute(RESULTS_STRING, new HashSet<>(), ScriptContext.ENGINE_SCOPE);
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/StaticDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/StaticDataConnector.java
index face1384b..7dacb609e 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/StaticDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/StaticDataConnector.java
@@ -32,7 +32,8 @@ 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.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -49,14 +50,14 @@ public class StaticDataConnector extends AbstractDataConnector {
     @Nonnull private final Logger log = LoggerFactory.getLogger(StaticDataConnector.class);
 
     /** Static collection of values returned by this connector. */
-    private @NonnullAfterInit @NonnullElements Map<String, IdPAttribute> attributes;
+    @NonnullAfterInit private Map<String, IdPAttribute> attributes;
 
     /**
      * Get the static values returned by this connector.
      * 
      * @return static values returned by this connector
      */
-    @NonnullAfterInit public Map<String, IdPAttribute> getAttributes() {
+    @NonnullAfterInit @Unmodifiable @NotLive public Map<String, IdPAttribute> getAttributes() {
         return attributes;
     }
 
@@ -65,14 +66,13 @@ public class StaticDataConnector extends AbstractDataConnector {
      * 
      * @param newValues static values returned by this connector
      */
-    public void setValues(@Nonnull @NonnullElements final Collection<IdPAttribute> newValues) {
+    public void setValues(@Nonnull final Collection<IdPAttribute> newValues) {
         checkSetterPreconditions();
 
         Constraint.isNotNull(newValues, "Values must not be null");
 
         attributes = newValues.
                 stream().
-                map(e -> Constraint.isNotNull(e, "non null Attribute in connector")).
                 collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableMap(IdPAttribute::getId,
                         i -> i,
                         CollectionSupport.warningMergeFunction("StaticDataConnector " + getId(), true)))).
@@ -81,7 +81,7 @@ public class StaticDataConnector extends AbstractDataConnector {
 
     /** {@inheritDoc} */
     @Override
-    @Nonnull protected Map<String, IdPAttribute> doDataConnectorResolve(
+    @Nonnull @Unmodifiable @NotLive protected Map<String, IdPAttribute> doDataConnectorResolve(
             @Nonnull final AttributeResolutionContext resolutionContext,
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
         
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/package-info.java
index 6ce29c9df..af658ad8d 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/package-info.java
@@ -18,5 +18,7 @@
 /** 
  * Common functionality used by data connectors.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.dc.impl;
 
-package net.shibboleth.idp.attribute.resolver.dc.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
index 3b530272d..7955d4a88 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
@@ -54,7 +54,7 @@ public class ConnectionFactoryValidator implements Validator {
     }
 
     /** {@inheritDoc} */
-    @Override public void validate(final DataConnector dataConnector) throws ValidationException {
+    @Override public void validate(@Nonnull final DataConnector dataConnector) throws ValidationException {
         if (!(dataConnector instanceof LDAPDataConnector)) {
             throw new ValidationException("DataConnector must be of type LDAPDataConnector");
         }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
index 8b6be5aa1..6cd73ede0 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
@@ -43,6 +43,8 @@ import net.shibboleth.idp.attribute.resolver.dc.ldap.ExecutableSearchFilter;
 import net.shibboleth.idp.attribute.resolver.dc.ldap.SearchResultMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.ldap.StringAttributeValueMappingStrategy;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -189,7 +191,8 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
      * 
      * @throws ResolutionException thrown if there is a problem retrieving data from the LDAP
      */
-    @Override @Nullable protected Map<String, IdPAttribute> retrieveAttributes(
+    @Override
+    @Nullable @Unmodifiable @NotLive protected Map<String, IdPAttribute> retrieveAttributes(
             @Nullable final ExecutableSearchFilter filter) throws ResolutionException {
         
         // The base class method defines the parameter is non-null, so this is arguably unneeded.
@@ -206,4 +209,5 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
             throw new ResolutionException(getLogPrefix() + " Unable to execute LDAP search", e);
         }
     }
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/package-info.java
index 421fb0cbb..6cb8e4eb2 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/package-info.java
@@ -18,5 +18,7 @@
 /** 
  * A {@link net.shibboleth.idp.attribute.resolver.DataConnector} implementation that reads data from an LDAP.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.dc.ldap.impl;
 
-package net.shibboleth.idp.attribute.resolver.dc.ldap.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
index 3cbe398a5..dffd14cbb 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.dc.rdbms.impl;
 import java.sql.Connection;
 import java.sql.SQLException;
 
+import javax.annotation.Nonnull;
 import javax.sql.DataSource;
 
 import org.slf4j.Logger;
@@ -36,7 +37,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 public class DataSourceValidator implements Validator {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(DataSourceValidator.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(DataSourceValidator.class);
 
     /** Whether validate should throw, default value is <code>true</code>. */
     private boolean throwOnValidateError;
@@ -53,8 +54,9 @@ public class DataSourceValidator implements Validator {
         return throwOnValidateError;
     }
 
+// Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override public void validate(final DataConnector dataConnector) throws ValidationException {
+    @Override public void validate(@Nonnull final DataConnector dataConnector) throws ValidationException {
         if (!(dataConnector instanceof RDBMSDataConnector)) {
             throw new ValidationException("DataConnector must be of type RDBMSDataConnector");
         }
@@ -97,4 +99,6 @@ public class DataSourceValidator implements Validator {
             }
         }
     }
-}
+// Checkstyle: CyclomaticComplexity ON
+
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
index f0461b539..f6b9980b2 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
@@ -37,6 +37,8 @@ import net.shibboleth.idp.attribute.resolver.dc.rdbms.ExecutableStatement;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.ResultMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.StringResultMappingStrategy;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -132,8 +134,8 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
      *             data into {@link IdPAttribute}s
      */
     @Override
-    @Nullable protected Map<String, IdPAttribute> retrieveAttributes(@Nullable final ExecutableStatement statement)
-            throws ResolutionException {
+    @Nullable @Unmodifiable @NotLive protected Map<String, IdPAttribute> retrieveAttributes(
+            @Nullable final ExecutableStatement statement) throws ResolutionException {
 
         // The base class method defines the parameter is non-null, so this is arguably unneeded.
         if (statement == null) {
@@ -151,4 +153,5 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
             throw new ResolutionException(getLogPrefix() + " Unable to execute SQL query", e);
         }
     }
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/package-info.java
index 7f6572ffc..926d705db 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/package-info.java
@@ -19,5 +19,7 @@
  * A {@link net.shibboleth.idp.attribute.resolver.DataConnector} implementation that reads data from a relational
  * database. 
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.dc.rdbms.impl;
 
-package net.shibboleth.idp.attribute.resolver.dc.rdbms.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java
index ec2b09613..1ffacea7a 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/ScriptedStorageMappingStrategy.java
@@ -39,6 +39,8 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.dc.storage.StorageMappingStrategy;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resource.Resource;
 import net.shibboleth.shared.scripting.AbstractScriptEvaluator;
@@ -71,7 +73,7 @@ public final class ScriptedStorageMappingStrategy extends AbstractScriptEvaluato
     }
     
     /** {@inheritDoc} */
-    @Nonnull public Map<String,IdPAttribute> map(@Nonnull final StorageRecord<?> results)
+    @Nonnull @Unmodifiable @NotLive public Map<String,IdPAttribute> map(@Nonnull final StorageRecord<?> results)
             throws ResolutionException {
         log.debug("{} Handling StorageRecord", getLogPrefix());
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java
index d19acf021..5ec11ddf0 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java
@@ -28,8 +28,9 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.dc.MappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.storage.StorageMappingStrategy;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -54,7 +55,7 @@ public class SimpleStorageMappingStrategy implements StorageMappingStrategy {
     }
     
     /** {@inheritDoc} */
-    @Nonnull @NonnullElements public Map<String,IdPAttribute> map(
+    @Nonnull @Unmodifiable @NotLive public Map<String,IdPAttribute> map(
             @Nonnull final StorageRecord<?> results) throws ResolutionException {
         
         final IdPAttribute attribute = new IdPAttribute(attributeId);
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
index 403fd3506..a93313709 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
@@ -66,7 +66,7 @@ public class StorageServiceDataConnector
     /** Constructor. */
     public StorageServiceDataConnector() {
         setValidator(new Validator() {
-            public void validate(final DataConnector dataConnector) throws ValidationException {
+            public void validate(@Nonnull final DataConnector dataConnector) throws ValidationException {
             }
 
             public void setThrowValidateError(final boolean what) {
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/TemplatedSearchBuilder.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/TemplatedSearchBuilder.java
index 663864799..a8cdb47c4 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/TemplatedSearchBuilder.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/TemplatedSearchBuilder.java
@@ -224,7 +224,7 @@ public class TemplatedSearchBuilder extends AbstractInitializableComponent
     }
     
     /**
-     * Helper method to extract the parameters needed for the {@link StorageServiceSearch}
+     * Helper method to extract the parameters needed for the {@link StorageServiceSearch}.
      * 
      * @param resolutionContext the context of the resolution
      * @param dependencyAttributes the attributes we depend upon
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/package-info.java
index 52b89e3f8..6086a2f6f 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implementation of StorageService-backed data connector.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.dc.storage.impl;
 
-package net.shibboleth.idp.attribute.resolver.dc.storage.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
index 41ed70f9f..3873382bb 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
@@ -52,8 +52,9 @@ import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 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.Live;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazyList;
@@ -98,9 +99,9 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
     /** Sets the attribute definitions for this resolver.
      * @param definitions attribute definitions loaded in to this resolver
      */
-    public void setAttributeDefinitions(@Nonnull @NonnullElements final Collection<AttributeDefinition> definitions) {
+    public void setAttributeDefinitions(@Nonnull final Collection<AttributeDefinition> definitions) {
         checkSetterPreconditions();
-        Constraint.isNotNull(definitions, "Attribute Defintions should be non-null");
+        Constraint.isNotNull(definitions, "Attribute Defintions cannot be null");
         
         final Map<String, AttributeDefinition> checkedDefinitions = new HashMap<>(definitions.size());
         for (final AttributeDefinition definition : definitions) {
@@ -112,7 +113,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
                 checkedDefinitions.put(definition.getId(), definition);
             }
         }
-        attributeDefinitions = Map.copyOf(checkedDefinitions);
+        attributeDefinitions = CollectionSupport.copyToMap(checkedDefinitions);
     }
 
     /**
@@ -120,17 +121,16 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * 
      * @return attribute definitions loaded in to this resolver
      */
-    @NonnullAfterInit @NonnullElements @Unmodifiable public Map<String, AttributeDefinition>
-        getAttributeDefinitions() {
+    @NonnullAfterInit @Unmodifiable @NotLive public Map<String,AttributeDefinition> getAttributeDefinitions() {
         return attributeDefinitions;
     }
     
     /** Sets the data connectors for this resolver.
      * @param connectors data connectors loaded in to this resolver
      */
-    public void setDataConnectors(@Nonnull @NonnullElements  final Collection<DataConnector> connectors){
+    public void setDataConnectors(@Nonnull final Collection<DataConnector> connectors) {
         checkSetterPreconditions();
-        Constraint.isNotNull(connectors, "Data Connectors should be non-null");
+        Constraint.isNotNull(connectors, "Data Connectors cannot be null");
         
         final Map<String, DataConnector> checkedConnectors = new HashMap<>(connectors.size());
         for (final DataConnector connector : connectors) {
@@ -142,7 +142,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
                 checkedConnectors.put(connector.getId(), connector);
             }
         }
-        dataConnectors = Map.copyOf(checkedConnectors);
+        dataConnectors = CollectionSupport.copyToMap(checkedConnectors);
     }
 
     /**
@@ -150,7 +150,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * 
      * @return data connectors loaded in to this resolver
      */
-    @NonnullAfterInit @NonnullElements @Unmodifiable public Map<String, DataConnector> getDataConnectors() {
+    @NonnullAfterInit @Unmodifiable @NotLive public Map<String, DataConnector> getDataConnectors() {
         return dataConnectors;
     }
     
@@ -183,7 +183,8 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * @throws ResolutionException thrown if there is a problem resolving the attributes for the subject
      */
     // CheckStyle: CyclomaticComplexity OFF
-    @Override public void resolveAttributes(@Nonnull final AttributeResolutionContext resolutionContext)
+    @Override
+    public void resolveAttributes(@Nonnull final AttributeResolutionContext resolutionContext)
             throws ResolutionException {
         checkComponentActive();
 
@@ -259,7 +260,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * 
      * @return list of attributes, identified by IDs, that should be resolved
      */
-    @Nonnull @NonnullElements protected Collection<String> getToBeResolvedAttributeIds(
+    @Nonnull @Live protected Collection<String> getToBeResolvedAttributeIds(
             @Nonnull final AttributeResolutionContext resolutionContext) {
         Constraint.isNotNull(resolutionContext, "Attribute resolution context cannot be null");
 
@@ -439,8 +440,8 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * @param input the inout list
      * @return a null stripped, or null list of values
      */
-    private @Nullable @NonnullElements List<IdPAttributeValue> filterAttributeValues(final String attributeId,
-            final List<IdPAttributeValue> input) {
+    @Nullable @Live private List<IdPAttributeValue> filterAttributeValues(@Nonnull final String attributeId,
+            @Nonnull final List<IdPAttributeValue> input) {
 
         log.debug("{} De-duping (and null filtering) attribute definition {} result",
                 logPrefix, attributeId);
@@ -480,8 +481,8 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * @param workContext context to extract attributes from
      * @param includeDependencyOnly whether we include dependencyOnly attributes
      */
-    private void collectResolvedAttributes(final Map<String, IdPAttribute> resolvedAttributes,
-            final AttributeResolverWorkContext workContext, final boolean includeDependencyOnly) {
+    private void collectResolvedAttributes(@Nonnull final Map<String, IdPAttribute> resolvedAttributes,
+            @Nonnull final AttributeResolverWorkContext workContext, final boolean includeDependencyOnly) {
 
         for (final ResolvedAttributeDefinition definition : workContext.getResolvedIdPAttributeDefinitions().values()) {
             final IdPAttribute resolvedAttribute = definition.getResolvedAttribute();
@@ -524,9 +525,9 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * @param workContext context to extract attributes from
      */
     // CheckStyle: CyclomaticComplexity OFF
-    private void collectExportingDataConnectors(final Map<String, IdPAttribute> resolvedAttributes,
-           final AttributeResolutionContext resolutionContext,
-           final AttributeResolverWorkContext workContext) {
+    private void collectExportingDataConnectors(@Nonnull final Map<String, IdPAttribute> resolvedAttributes,
+           @Nonnull final AttributeResolutionContext resolutionContext,
+           @Nonnull final AttributeResolverWorkContext workContext) {
 
         for (final ResolvedDataConnector dataConnector: workContext.getResolvedDataConnectors().values()) {
 
@@ -579,7 +580,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
     protected void finalizeResolvedAttributes(@Nonnull final AttributeResolutionContext resolutionContext) {
         Constraint.isNotNull(resolutionContext, "Attribute resolution context cannot be null");
         final AttributeResolverWorkContext workContext =
-                resolutionContext.getSubcontext(AttributeResolverWorkContext.class);
+                resolutionContext.ensureSubcontext(AttributeResolverWorkContext.class);
 
         final Map<String, IdPAttribute> resolvedAttributes = new LazyMap<>();
 
@@ -603,7 +604,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      protected void finalizePreResolvedAttributes(@Nonnull final AttributeResolutionContext resolutionContext) {
         Constraint.isNotNull(resolutionContext, "Attribute resolution context cannot be null");
         final AttributeResolverWorkContext workContext =
-                resolutionContext.getSubcontext(AttributeResolverWorkContext.class);
+                resolutionContext.ensureSubcontext(AttributeResolverWorkContext.class);
 
         final Map<String, IdPAttribute> resolvedAttributes = new LazyMap<>();
 
@@ -660,8 +661,9 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
      * 
      * @throws ComponentInitializationException thrown if there is a dependency loop
      */
-    protected void checkPlugInDependencies(final String circularCheckPluginId, final ResolverPlugin<?> plugin,
-            final Set<String> checkedPlugins) throws ComponentInitializationException {
+    protected void checkPlugInDependencies(@Nullable final String circularCheckPluginId,
+            @Nonnull final ResolverPlugin<?> plugin, @Nonnull final Set<String> checkedPlugins)
+                    throws ComponentInitializationException {
         final String pluginId = plugin.getId();
 
         for (final ResolverAttributeDefinitionDependency attrDependency : plugin.getAttributeDependencies()) {
@@ -670,7 +672,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
                 continue;
             }
 
-            if (circularCheckPluginId.equals(attrDependency.getDependencyPluginId())) {
+            if (attrDependency.getDependencyPluginId().equals(circularCheckPluginId)) {
                 throw new ComponentInitializationException(logPrefix + " Plugin '" + circularCheckPluginId
                         + "' and attribute definition '" + attrDependency.getDependencyPluginId()
                         + "' have a circular dependency on each other.");
@@ -694,7 +696,7 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
                 continue;
             }
 
-            if (circularCheckPluginId.equals(dependency.getDependencyPluginId())) {
+            if (dependency.getDependencyPluginId().equals(circularCheckPluginId)) {
                 throw new ComponentInitializationException(logPrefix + " Plugin '" + circularCheckPluginId
                         + "' and data connector '" + dependency.getDependencyPluginId()
                         + "' have a circular dependency on each other.");
@@ -747,4 +749,4 @@ public class AttributeResolverImpl extends AbstractIdentifiableInitializableComp
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/package-info.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/package-info.java
index 280700ea7..7434f7c5b 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/package-info.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/package-info.java
@@ -16,5 +16,7 @@
  */
 
 /** Implementations of core resolver functionality. */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.impl;
 
-package net.shibboleth.idp.attribute.resolver.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SubjectDerivedAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SubjectDerivedAttributeDefinitionParser.java
index 22f63a102..c4c5fb0f1 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SubjectDerivedAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SubjectDerivedAttributeDefinitionParser.java
@@ -59,7 +59,7 @@ public class SubjectDerivedAttributeDefinitionParser extends BaseAttributeDefini
     @Nullable private Class<? extends Function<?,?>> principalDerivedClass;
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(SubjectDerivedAttributeDefinitionParser.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(SubjectDerivedAttributeDefinitionParser.class);
 
     /** Constructor. */
     @SuppressWarnings("unchecked")
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/package-info.java
index b60a44c08..f2e5b76be 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implementation of the Attribute Definition parsers.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.ad.impl;
 
-package net.shibboleth.idp.attribute.resolver.spring.ad.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/package-info.java
index cee66155e..423846a7a 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/package-info.java
@@ -19,5 +19,7 @@
  * Contains the parsers for the {@link net.shibboleth.idp.attribute.resolver.ad.mapped.impl.MappedAttributeDefinition} 
  * and its child elements.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.ad.mapped.impl;
 
-package net.shibboleth.idp.attribute.resolver.spring.ad.mapped.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/package-info.java
index f43255878..f1235a4ef 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/package-info.java
@@ -16,8 +16,10 @@
  */
 
 /**
- * Classes in this package are to do with parsing the attribute resolver definitions
- * associated with schema urn\mace:shibboleth:2.0:resolver:ad. 
+ * Classes in this package are to do with parsing the attribute definitions
+ * associated with schema urn:mace:shibboleth:2.0:resolver. 
  */
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.spring.ad;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/package-info.java
index fca4d36c2..4904edd97 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * The parser for the HTTP Data connector.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.dc.http.impl;
 
-package net.shibboleth.idp.attribute.resolver.spring.dc.http.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/package-info.java
index 2945f37ee..149380a50 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implementation of specific DataConnector parsers.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.dc.impl;
 
-package net.shibboleth.idp.attribute.resolver.spring.dc.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/package-info.java
index b3043c69c..a1b14c821 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * The parser for the LDAP Data connector.
  */
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.spring.dc.ldap.impl;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/package-info.java
index 78b16cdf8..fc51765ca 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Supported base class for the implementation of specific DataConnector parsers.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.dc;
 
-package net.shibboleth.idp.attribute.resolver.spring.dc;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/package-info.java
index a6e274d3f..d67d9a81e 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * The parser for the RDBMS Data connector.
  */
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.spring.dc.rdbms.impl;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/package-info.java
index 505e066d7..59f9c26f7 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Parser for StorageService data connector.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.dc.storage.impl;
 
-package net.shibboleth.idp.attribute.resolver.spring.dc.storage.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/package-info.java
index 7512358e8..23355fefd 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implememtation of atttribute encoders.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.enc.impl;
 
-package net.shibboleth.idp.attribute.resolver.spring.enc.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/package-info.java
index 1bcaebd67..ac30138e3 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Parsers for the urn:mace:shibboleth:2.0:attribute:encoder namespace.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.enc;
 
-package net.shibboleth.idp.attribute.resolver.spring.enc;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/package-info.java
index 2283b65db..df14541ec 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/package-info.java
@@ -18,5 +18,7 @@
 /**
  * Implementation of top level attribute resolvers.
  */
+ at NonnullElements
+package net.shibboleth.idp.attribute.resolver.spring.impl;
 
-package net.shibboleth.idp.attribute.resolver.spring.impl;
\ No newline at end of file
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/package-info.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/package-info.java
index 225cabf1c..9bad01c08 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/package-info.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/package-info.java
@@ -17,7 +17,9 @@
 
 /**
  * Classes in this package are to do with parsing the attribute resolver definitions
- * associated with schema urn\mace:shibboleth:2.0:resolver. 
+ * associated with schema urn:mace:shibboleth:2.0:resolver. 
  */
+ at NonnullElements
 package net.shibboleth.idp.attribute.resolver.spring;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
index 1d47f003b..cf3ce9fa7 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
@@ -110,6 +110,7 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
         assertTrue(entityDescriptor.getObjectMetadata().get(AttributesMapContainer.class).isEmpty());
 
         assert processor != null;
+        assert entityDescriptor != null;
         processor.process(entityDescriptor);
 
         assert entityDescriptor != null;

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


More information about the commits mailing list