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

Scott Cantor cantor.2 at osu.edu
Wed Nov 16 16:09:06 UTC 2022


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

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

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

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

commit 53b3f6d4c5588c74bf0d7c515cb0319158ff6099
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Nov 16 11:09:03 2022 -0500

    Fix null and annotation bugs.
---
 .../resolver/spring/BaseResolverPluginParser.java  |  5 ++-
 .../ContextDerivedAttributeDefinitionParser.java   |  5 ++-
 .../ad/impl/DateTimeAttributeDefinitionParser.java |  3 +-
 .../impl/DecryptedAttributeDefinitionParser.java   |  7 ++--
 .../impl/PrescopedAttributeDefinitionParser.java   |  3 +-
 .../PrincipalNameAttributeDefinitionParser.java    |  3 +-
 .../impl/RegexSplitAttributeDefinitionParser.java  |  5 ++-
 ...ML1NameIdentifierAttributeDefinitionParser.java |  4 +-
 .../impl/SAML2NameIDAttributeDefinitionParser.java |  3 +-
 .../ad/impl/ScopedAttributeDefinitionParser.java   |  3 +-
 .../ad/impl/ScriptedAttributeDefinitionParser.java |  3 +-
 .../ad/impl/SimpleAttributeDefinitionParser.java   |  3 +-
 .../SubjectDerivedAttributeDefinitionParser.java   | 11 ++++--
 .../ad/impl/TemplateAttributeDefinitionParser.java |  4 +-
 .../impl/MappedAttributeDefinitionParser.java      |  5 ++-
 .../spring/ad/mapped/impl/SourceValueParser.java   |  3 +-
 .../spring/ad/mapped/impl/ValueMapParser.java      |  5 ++-
 .../dc/http/impl/HTTPDataConnectorParser.java      |  9 +++--
 .../resolver/spring/dc/impl/CacheConfigParser.java |  3 +-
 .../dc/impl/ComputedIdDataConnectorParser.java     |  4 +-
 .../dc/impl/ContextDerivedDataConnectorParser.java |  3 +-
 .../dc/impl/PairwiseIdDataConnectorParser.java     |  3 +-
 .../dc/impl/ScriptedDataConnectorParser.java       |  4 +-
 .../spring/dc/impl/StaticDataConnectorParser.java  |  4 +-
 .../spring/dc/impl/SubjectDataConnectorParser.java |  6 ++-
 .../dc/ldap/impl/CredentialConfigFactoryBean.java  | 11 ++++--
 .../dc/ldap/impl/LDAPDataConnectorParser.java      | 31 +++++++--------
 .../dc/rdbms/impl/RDBMSDataConnectorParser.java    | 11 +++---
 .../impl/StorageServiceDataConnectorParser.java    | 10 +++--
 .../spring/enc/BaseAttributeEncoderParser.java     |  8 ++--
 .../impl/SAML1Base64AttributeEncoderParser.java    |  2 +-
 .../SAML1ScopedStringAttributeEncoderParser.java   |  2 +-
 .../impl/SAML1StringAttributeEncoderParser.java    |  2 +-
 .../impl/SAML1XMLObjectAttributeEncoderParser.java |  2 +-
 .../impl/SAML2Base64AttributeEncoderParser.java    |  2 +-
 .../impl/SAML2DateTimeAttributeEncoderParser.java  |  2 +-
 .../SAML2ScopedStringAttributeEncoderParser.java   |  2 +-
 .../impl/SAML2StringAttributeEncoderParser.java    |  2 +-
 .../impl/SAML2XMLObjectAttributeEncoderParser.java |  2 +-
 .../impl/AbstractResolverPluginFactoryBean.java    | 33 ++++++++++------
 .../spring/impl/AttributeResolverParser.java       |  6 ++-
 .../impl/AttributeResolverServiceStrategy.java     |  4 ++
 .../spring/impl/InputDataConnectorParser.java      |  3 +-
 .../resolver/spring/AttributeMapperTest.java       | 14 ++++---
 .../spring/AttributeMappingNodeProcessorTest.java  | 37 ++++++++++--------
 .../resolver/spring/AttributeResolverTest.java     | 44 +++++++++++++---------
 .../idp/attribute/resolver/spring/IdP1676Test.java | 32 +++++++++-------
 .../DateTimeAttributeDefinitionParserTest.java     |  2 +-
 .../impl/ScopedAttributeDefinitionParserTest.java  |  8 ++--
 .../spring/ad/impl/SimpleAttributeParserTest.java  |  6 +++
 .../impl/MappedAttributeDefinitionParserTest.java  | 13 +++++--
 .../spring/ad/mapped/impl/ValueMapParserTest.java  |  7 +++-
 .../dc/http/impl/HTTPDataConnectorParserTest.java  | 19 +++++++---
 .../spring/dc/impl/CacheConfigParserTest.java      | 26 +++++++++----
 .../dc/impl/ScriptedDataConnectorParserTest.java   |  4 +-
 .../dc/impl/StoredIdDataConnectorParserTest.java   |  2 +
 .../dc/ldap/impl/LDAPDataConnectorParserTest.java  | 33 +++++++++-------
 .../StorageServiceDataConnectorParserTest.java     | 18 +++++++--
 .../failfast/AttributeResolverFailFastTest.java    | 16 ++++++--
 59 files changed, 341 insertions(+), 186 deletions(-)

diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java
index ed83d4b53..2d40236dc 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java
@@ -38,6 +38,7 @@ import net.shibboleth.shared.logic.PredicateSupport;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.spring.custom.AbstractCustomBeanDefinitionParser;
 import net.shibboleth.shared.spring.util.SpringSupport;
+import net.shibboleth.shared.xml.AttributeSupport;
 import net.shibboleth.shared.xml.ElementSupport;
 
 /** Bean definition parser for a {@link net.shibboleth.idp.attribute.resolver.ResolverPlugin}. */
@@ -100,7 +101,7 @@ public abstract class BaseResolverPluginParser extends AbstractCustomBeanDefinit
                 log.warn("relyingParties/resolutionPhases and variants ignored, using activationConditionRef");
             }
             builder.addPropertyReference("activationCondition",
-                    StringSupport.trimOrNull(config.getAttributeNS(null, "activationConditionRef")));
+                    AttributeSupport.getRequiredAttributeValue(config, null, "activationConditionRef"));
         } else {
             final BeanDefinitionBuilder condition = getActivationCondition(config);
             if (condition != null) {
@@ -153,6 +154,7 @@ public abstract class BaseResolverPluginParser extends AbstractCustomBeanDefinit
             if (config.hasAttributeNS(null, "excludeRelyingParties")) {
                 log.warn("excludeRelyingParties ignored, using relyingParties");
             }
+            assert relyingPartyPredicateClass != null;
             rpBuilder = BeanDefinitionBuilder.genericBeanDefinition(relyingPartyPredicateClass);
             rpBuilder.setFactoryMethod(RELYING_PARTIES_PREDICATE_METHOD);
             rpBuilder.addConstructorArgValue(
@@ -162,6 +164,7 @@ public abstract class BaseResolverPluginParser extends AbstractCustomBeanDefinit
                 log.warn("Ignoring excludeRelyingParties setting due to class instantiation failure at startup");
                 return null;
             }
+            assert relyingPartyPredicateClass != null;
             final BeanDefinitionBuilder unnegated =
                     BeanDefinitionBuilder.genericBeanDefinition(relyingPartyPredicateClass);
             unnegated.setFactoryMethod(RELYING_PARTIES_PREDICATE_METHOD);
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java
index 27315f4bb..4aec39c92 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.spring.ad.impl;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.springframework.beans.factory.BeanCreationException;
@@ -38,7 +39,8 @@ public class ContextDerivedAttributeDefinitionParser extends BaseAttributeDefini
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "ContextDerivedAttribute");
 
     /** {@inheritDoc} */
-    @Override protected Class<ContextDerivedAttributeDefinition> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<ContextDerivedAttributeDefinition> getBeanClass(@Nonnull final Element element) {
         return ContextDerivedAttributeDefinition.class;
     }
 
@@ -58,4 +60,5 @@ public class ContextDerivedAttributeDefinitionParser extends BaseAttributeDefini
     @Override protected boolean failOnDependencies() {
         return true;
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParser.java
index 9a52c420a..1b4f31b02 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParser.java
@@ -40,7 +40,8 @@ public class DateTimeAttributeDefinitionParser extends BaseAttributeDefinitionPa
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "DateTime");
 
     /** {@inheritDoc} */
-    @Override protected Class<DateTimeAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<DateTimeAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return DateTimeAttributeDefinition.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DecryptedAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DecryptedAttributeDefinitionParser.java
index d03a0f66e..cfdd49827 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DecryptedAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DecryptedAttributeDefinitionParser.java
@@ -28,7 +28,7 @@ import org.w3c.dom.Element;
 import net.shibboleth.idp.attribute.resolver.ad.impl.DecryptedAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.spring.ad.BaseAttributeDefinitionParser;
 import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
-import net.shibboleth.shared.primitive.StringSupport;
+import net.shibboleth.shared.xml.AttributeSupport;
 
 /** Bean definition parser for a {@link DecryptedAttributeDefinition}. */
 public class DecryptedAttributeDefinitionParser extends BaseAttributeDefinitionParser {
@@ -38,7 +38,8 @@ public class DecryptedAttributeDefinitionParser extends BaseAttributeDefinitionP
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "Decrypted");
 
     /** {@inheritDoc} */
-    @Override protected Class<DecryptedAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<DecryptedAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return DecryptedAttributeDefinition.class;
     }
 
@@ -48,7 +49,7 @@ public class DecryptedAttributeDefinitionParser extends BaseAttributeDefinitionP
         super.doParse(config, parserContext, builder);
     
         builder.addPropertyReference("dataSealer",
-                StringSupport.trimOrNull(config.getAttributeNS(null, "dataSealerRef")));
+                AttributeSupport.getRequiredAttributeValue(config, null, "dataSealerRef"));
     }
 
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrescopedAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrescopedAttributeDefinitionParser.java
index 81c0134dc..79dbd9a41 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrescopedAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrescopedAttributeDefinitionParser.java
@@ -43,7 +43,8 @@ public class PrescopedAttributeDefinitionParser extends BaseAttributeDefinitionP
     @Nonnull private final Logger log = LoggerFactory.getLogger(PrescopedAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<PrescopedAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<PrescopedAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return PrescopedAttributeDefinition.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrincipalNameAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrincipalNameAttributeDefinitionParser.java
index cf25066de..612525084 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrincipalNameAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/PrincipalNameAttributeDefinitionParser.java
@@ -35,7 +35,8 @@ public class PrincipalNameAttributeDefinitionParser extends BaseAttributeDefinit
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "PrincipalName");
 
     /** {@inheritDoc} */
-    @Override protected Class<PrincipalNameAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<PrincipalNameAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return PrincipalNameAttributeDefinition.class;
     }
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/RegexSplitAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/RegexSplitAttributeDefinitionParser.java
index b27247999..dd22d34cc 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/RegexSplitAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/RegexSplitAttributeDefinitionParser.java
@@ -45,7 +45,8 @@ public class RegexSplitAttributeDefinitionParser extends BaseAttributeDefinition
     @Nonnull private final Logger log = LoggerFactory.getLogger(RegexSplitAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<RegexSplitAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<RegexSplitAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return RegexSplitAttributeDefinition.class;
     }
 
@@ -66,10 +67,12 @@ public class RegexSplitAttributeDefinitionParser extends BaseAttributeDefinition
         pattern.addPropertyValue("regexp", regexp);
 
         if (config.hasAttributeNS(null, "caseSensitive")) {
+            // TODO: Shouldn't this be retrieving the attribute as a Boolean?
             pattern.addPropertyValue("caseSensitive",
                     StringSupport.trimOrNull(config.getAttributeNS(null, "caseSensitive")));
         }
 
         builder.addPropertyValue("regularExpression", pattern.getBeanDefinition());
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML1NameIdentifierAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML1NameIdentifierAttributeDefinitionParser.java
index 4b7514591..f4c51bdb1 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML1NameIdentifierAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML1NameIdentifierAttributeDefinitionParser.java
@@ -46,7 +46,8 @@ public class SAML1NameIdentifierAttributeDefinitionParser extends BaseAttributeD
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML1NameIdentifierAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<SAML1NameIdentifierAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<SAML1NameIdentifierAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return SAML1NameIdentifierAttributeDefinition.class;
     }
 
@@ -69,4 +70,5 @@ public class SAML1NameIdentifierAttributeDefinitionParser extends BaseAttributeD
             log.debug("{} nameIdQualifier '{}'", getLogPrefix(), nameIdQualifier);
         }
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML2NameIDAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML2NameIDAttributeDefinitionParser.java
index bfc82098d..4cb52d9ab 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML2NameIDAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SAML2NameIDAttributeDefinitionParser.java
@@ -46,7 +46,8 @@ public class SAML2NameIDAttributeDefinitionParser extends BaseAttributeDefinitio
     @Nonnull private final Logger log = LoggerFactory.getLogger(SAML1NameIdentifierAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<SAML2NameIDAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<SAML2NameIDAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return SAML2NameIDAttributeDefinition.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParser.java
index 5b31f9ace..e5db72f0b 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParser.java
@@ -45,7 +45,8 @@ public class ScopedAttributeDefinitionParser extends BaseAttributeDefinitionPars
     @Nonnull private final Logger log = LoggerFactory.getLogger(ScopedAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<ScopedAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<ScopedAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return ScopedAttributeDefinition.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScriptedAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScriptedAttributeDefinitionParser.java
index 5f94f93a9..71906134b 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScriptedAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScriptedAttributeDefinitionParser.java
@@ -58,7 +58,8 @@ public class ScriptedAttributeDefinitionParser extends BaseAttributeDefinitionPa
     @Nonnull private final Logger log = LoggerFactory.getLogger(ScriptedAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<ScriptedAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<ScriptedAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return ScriptedAttributeDefinition.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeDefinitionParser.java
index b3f0b9b07..7ac57bdd6 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeDefinitionParser.java
@@ -38,7 +38,8 @@ public class SimpleAttributeDefinitionParser extends BaseAttributeDefinitionPars
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "Simple");
 
     /** {@inheritDoc} */
-    @Override protected Class<SimpleAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<SimpleAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return SimpleAttributeDefinition.class;
     }
 
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 263b83166..d8b2de445 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.spring.ad.impl;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.slf4j.Logger;
@@ -52,10 +53,10 @@ public class SubjectDerivedAttributeDefinitionParser extends BaseAttributeDefini
             "net.shibboleth.idp.authn.context.impl.IdPAttributePrincipalValuesFunction"; 
 
     /** Class for sourcing values from Subject(s). */
-    @Nonnull private Class<? extends Function<?,?>> subjectDerivedClass;
+    @Nullable private Class<? extends Function<?,?>> subjectDerivedClass;
 
     /** Class for sourcing values from Principal(s). */
-    @Nonnull private Class<? extends Function<?,?>> principalDerivedClass;
+    @Nullable private Class<? extends Function<?,?>> principalDerivedClass;
 
     /** Class logger. */
     private final Logger log = LoggerFactory.getLogger(SubjectDerivedAttributeDefinitionParser.class);
@@ -72,7 +73,8 @@ public class SubjectDerivedAttributeDefinitionParser extends BaseAttributeDefini
     }
     
     /** {@inheritDoc} */
-    @Override protected Class<ContextDerivedAttributeDefinition> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<ContextDerivedAttributeDefinition> getBeanClass(@Nonnull final Element element) {
         return ContextDerivedAttributeDefinition.class;
     }
 
@@ -98,6 +100,7 @@ public class SubjectDerivedAttributeDefinitionParser extends BaseAttributeDefini
         final String attributeName = StringSupport.trimOrNull(config.getAttributeNS(null, "principalAttributeName"));
         final String functionRef = StringSupport.trimOrNull(config.getAttributeNS(null, "attributeValuesFunctionRef"));
         
+        assert subjectDerivedClass != null;
         final BeanDefinitionBuilder contextFunctionBuilder =
                 BeanDefinitionBuilder.genericBeanDefinition(subjectDerivedClass);
         contextFunctionBuilder.setInitMethodName("initialize");
@@ -119,6 +122,7 @@ public class SubjectDerivedAttributeDefinitionParser extends BaseAttributeDefini
                 throw new BeanCreationException("Unable to load class for principal-derived attribute function.");
             }
             
+            assert principalDerivedClass != null;
             final BeanDefinitionBuilder principalValuesFunctionBuilder =
                     BeanDefinitionBuilder.genericBeanDefinition(principalDerivedClass);
             principalValuesFunctionBuilder.addPropertyValue("attributeName", attributeName);
@@ -138,4 +142,5 @@ public class SubjectDerivedAttributeDefinitionParser extends BaseAttributeDefini
     @Override protected boolean failOnDependencies() {
         return true;
     }
+    
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/TemplateAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/TemplateAttributeDefinitionParser.java
index badada57f..44dc7d82b 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/TemplateAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/TemplateAttributeDefinitionParser.java
@@ -52,7 +52,8 @@ public class TemplateAttributeDefinitionParser extends BaseAttributeDefinitionPa
     @Nonnull private final Logger log = LoggerFactory.getLogger(TemplateAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<TemplateAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<TemplateAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return TemplateAttributeDefinition.class;
     }
 
@@ -82,4 +83,5 @@ public class TemplateAttributeDefinitionParser extends BaseAttributeDefinitionPa
         log.debug("{} Velocity engine reference '{}'.", getLogPrefix(), velocityEngineRef);
         builder.addPropertyReference("velocityEngine", velocityEngineRef);
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParser.java
index 6ece4fb27..3711a6fb6 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParser.java
@@ -54,7 +54,8 @@ public class MappedAttributeDefinitionParser extends BaseAttributeDefinitionPars
     @Nonnull private Logger log = LoggerFactory.getLogger(MappedAttributeDefinitionParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<MappedAttributeDefinition> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<MappedAttributeDefinition> getBeanClass(@Nullable final Element element) {
         return MappedAttributeDefinition.class;
     }
 
@@ -95,7 +96,7 @@ public class MappedAttributeDefinitionParser extends BaseAttributeDefinitionPars
                 SpringSupport.parseCustomElements(valueMapElements, parserContext, builder);
 
         log.debug("{} passThru = {}, defaultValue = {}, {} value maps",
-                new Object[] {getLogPrefix(), passThru, defaultValue, valueMaps.size(),});
+                new Object[] {getLogPrefix(), passThru, defaultValue, valueMaps != null ? valueMaps.size() : 0,});
         log.trace("{} Value maps {}", getLogPrefix(), valueMaps);
 
         builder.addPropertyValue("defaultValue", defaultValue);
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/SourceValueParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/SourceValueParser.java
index cac7ca373..2b56a512f 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/SourceValueParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/SourceValueParser.java
@@ -46,7 +46,8 @@ public class SourceValueParser extends AbstractCustomBeanDefinitionParser {
     @Nonnull private Logger log = LoggerFactory.getLogger(SourceValueParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<SourceValue> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<SourceValue> getBeanClass(@Nullable final Element element) {
         return SourceValue.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParser.java
index d9e1e453d..311a973f0 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParser.java
@@ -54,7 +54,8 @@ public class ValueMapParser extends AbstractCustomBeanDefinitionParser {
     @Nonnull private Logger log = LoggerFactory.getLogger(ValueMapParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<ValueMap> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<ValueMap> getBeanClass(@Nullable final Element element) {
         return ValueMap.class;
     }
 
@@ -84,7 +85,7 @@ public class ValueMapParser extends AbstractCustomBeanDefinitionParser {
                 SpringSupport.parseCustomElements(sourceValueElements, parserContext, builder);
 
         log.debug("AttributeDefinition(ValueMap): return value: {}, {} source values ", returnValue,
-                sourceValues.size());
+                sourceValues != null ? sourceValues.size() : 0);
         log.trace("AttributeDefinition(ValueMap): source values: {}", sourceValues);
 
         builder.addPropertyValue("sourceValues", sourceValues);
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParser.java
index 7be66dd75..c0c9193f3 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParser.java
@@ -60,7 +60,8 @@ public class HTTPDataConnectorParser extends AbstractDataConnectorParser {
     @Nonnull private final Logger log = LoggerFactory.getLogger(HTTPDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<HTTPDataConnector> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<HTTPDataConnector> getBeanClass(@Nonnull final Element element) {
         return HTTPDataConnector.class;
     }
     
@@ -308,14 +309,14 @@ public class HTTPDataConnectorParser extends AbstractDataConnectorParser {
             final Element bodyTemplate = bodyTemplates.get(0);
             if (urlTemplate.hasAttributeNS(null, "customObjectRef")) {
                 templateBuilder.addPropertyReference("customObject",
-                        urlTemplate.getAttributeNS(null, "customObjectRef"));
+                        AttributeSupport.getRequiredAttributeValue(urlTemplate, null, "customObjectRef"));
                 if (bodyTemplate.hasAttributeNS(null, "customObjectRef")) {
                     log.warn("{} Ignored <BodyTemplate> customObjectRef in favor of <URLTemplate> customObjectRef",
                             getLogPrefix());
                 }
             } else if (bodyTemplate.hasAttributeNS(null, "customObjectRef")) {
                 templateBuilder.addPropertyReference("customObject",
-                        bodyTemplate.getAttributeNS(null, "customObjectRef"));
+                        AttributeSupport.getRequiredAttributeValue(bodyTemplate, null, "customObjectRef"));
             }
             
             templateBuilder.addPropertyValue("uRLTemplateText", urlTemplate.getTextContent());
@@ -410,7 +411,7 @@ public class HTTPDataConnectorParser extends AbstractDataConnectorParser {
          */
         @Nullable public BeanDefinition createCache(@Nonnull final ParserContext parserContext) {
             final CacheConfigParser parser = new CacheConfigParser(configElement);
-            return parser.createCache(parserContext);
+            return parser.createCache();
         }
         
         /**
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java
index 69a6e92d1..16359d7df 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java
@@ -38,7 +38,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
-import org.springframework.beans.factory.xml.ParserContext;
 import org.w3c.dom.Element;
 
 import com.google.common.cache.Cache;
@@ -88,7 +87,7 @@ public class CacheConfigParser {
      * 
      * @return cache bean definition
      */
-    @Nonnull public BeanDefinition createCache(@Nonnull final ParserContext parserContext) {
+    @Nullable public BeanDefinition createCache() {
 
         final List<Element> cacheElements = ElementSupport.getChildElements(configElement, RESULT_CACHE_RESOLVER);
         if (cacheElements.isEmpty()) {
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ComputedIdDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ComputedIdDataConnectorParser.java
index bfbdeacf5..52b617b50 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ComputedIdDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ComputedIdDataConnectorParser.java
@@ -22,6 +22,7 @@ import javax.xml.namespace.QName;
 
 import net.shibboleth.idp.attribute.impl.ComputedPairwiseIdStore;
 import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
+import net.shibboleth.shared.xml.AttributeSupport;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -74,7 +75,8 @@ public class ComputedIdDataConnectorParser extends PairwiseIdDataConnectorParser
         }
         
         if (config.hasAttributeNS(null, "exceptionMapRef")) {
-            builder.addPropertyReference("exceptionMap", config.getAttributeNS(null, "exceptionMapRef"));
+            builder.addPropertyReference("exceptionMap",
+                    AttributeSupport.getRequiredAttributeValue(config, null, "exceptionMapRef"));
         }
 
         final String salt;
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ContextDerivedDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ContextDerivedDataConnectorParser.java
index 5be41f732..c6875dbe7 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ContextDerivedDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ContextDerivedDataConnectorParser.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.spring.dc.impl;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.springframework.beans.factory.BeanCreationException;
@@ -42,7 +43,7 @@ public class ContextDerivedDataConnectorParser extends AbstractDataConnectorPars
 
     /** {@inheritDoc} */
     @Override
-    @Nonnull protected Class<? extends AbstractDataConnector> getBeanClass(final Element element) {
+    @Nullable protected Class<? extends AbstractDataConnector> getBeanClass(@Nonnull final Element element) {
         return ContextDerivedDataConnector.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/PairwiseIdDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/PairwiseIdDataConnectorParser.java
index 9262ddbd9..48b6e996d 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/PairwiseIdDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/PairwiseIdDataConnectorParser.java
@@ -50,7 +50,8 @@ public class PairwiseIdDataConnectorParser extends AbstractDataConnectorParser {
     @Nonnull private final Logger log = LoggerFactory.getLogger(PairwiseIdDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<PairwiseIdDataConnector> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<PairwiseIdDataConnector> getBeanClass(@Nonnull final Element element) {
         return PairwiseIdDataConnector.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParser.java
index c17a2a73d..e4030b7f2 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParser.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.spring.dc.impl;
 import java.util.List;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.slf4j.Logger;
@@ -55,7 +56,8 @@ public class ScriptedDataConnectorParser extends AbstractDataConnectorParser {
     @Nonnull private final Logger log = LoggerFactory.getLogger(ScriptedDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<ScriptedDataConnector> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<ScriptedDataConnector> getBeanClass(@Nonnull final Element element) {
         return ScriptedDataConnector.class;
     }
     
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StaticDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StaticDataConnectorParser.java
index 88290be34..7cc5496f9 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StaticDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StaticDataConnectorParser.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.spring.dc.impl;
 import java.util.List;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.slf4j.Logger;
@@ -53,7 +54,8 @@ public class StaticDataConnectorParser extends AbstractDataConnectorParser {
     @Nonnull private final Logger log = LoggerFactory.getLogger(StaticDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected final Class<StaticDataConnector> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected final Class<StaticDataConnector> getBeanClass(@Nonnull final Element element) {
         return StaticDataConnector.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/SubjectDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/SubjectDataConnectorParser.java
index 834382d4e..7f5b9d1eb 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/SubjectDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/SubjectDataConnectorParser.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.spring.dc.impl;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.slf4j.Logger;
@@ -53,11 +54,11 @@ public class SubjectDataConnectorParser extends AbstractDataConnectorParser {
     @Nonnull private final Logger log = LoggerFactory.getLogger(SubjectDataConnectorParser.class);
 
     /** Class for sourcing values from Subject(s). */
-    @Nonnull private Class<? extends Function<?,?>> subjectDerivedClass;
+    @Nullable private Class<? extends Function<?,?>> subjectDerivedClass;
 
     /** {@inheritDoc} */
     @Override
-    @Nonnull protected Class<? extends AbstractDataConnector> getBeanClass(final Element element) {
+    @Nullable  protected Class<? extends AbstractDataConnector> getBeanClass(@Nonnull final Element element) {
         return ContextDerivedDataConnector.class;
     }
     
@@ -82,6 +83,7 @@ public class SubjectDataConnectorParser extends AbstractDataConnectorParser {
 
         // Auto-inject an instance of the deferred class type as the lookup function.
         
+        assert subjectDerivedClass != null;
         final BeanDefinitionBuilder contextFunctionBuilder =
                 BeanDefinitionBuilder.genericBeanDefinition(subjectDerivedClass);
         contextFunctionBuilder.setInitMethodName("initialize");
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/CredentialConfigFactoryBean.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/CredentialConfigFactoryBean.java
index 884e33dd9..e35354ed5 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/CredentialConfigFactoryBean.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/CredentialConfigFactoryBean.java
@@ -48,12 +48,14 @@ public class CredentialConfigFactoryBean extends AbstractComponentAwareFactoryBe
     @Nullable private Credential authCredential;
 
     /** {@inheritDoc} */
-    @Override public Class<?> getObjectType() {
+    @Override
+    @Nonnull public Class<?> getObjectType() {
         return CredentialConfig.class;
     }
 
     /** {@inheritDoc} */
-    @Override protected CredentialConfig doCreateInstance() throws Exception {
+    @Override
+    @Nonnull protected CredentialConfig doCreateInstance() throws Exception {
         X509Certificate[] trustCerts = null;
 
         if (trustCredential != null) {
@@ -63,6 +65,7 @@ public class CredentialConfigFactoryBean extends AbstractComponentAwareFactoryBe
                         cred.getEntityCertificateChain().toArray(
                                 new X509Certificate[cred.getEntityCertificateChain().size()]);
             } else {
+                assert trustCredential != null;
                 log.error("Supplied StartTLSTrustCredential was of type {}, not {}", trustCredential.getClass()
                         .getName(), X509Credential.class.getName());
                 throw new BeanCreationException("Supplied StartTLSTrustCredential was of wrong type");
@@ -77,6 +80,7 @@ public class CredentialConfigFactoryBean extends AbstractComponentAwareFactoryBe
                 authCert = cred.getEntityCertificate();
                 authKey = cred.getPrivateKey();
             } else {
+                assert authCredential != null;
                 log.error("Supplied StartTLSAuthenticationCredential was of type {}, not {}", 
                         authCredential.getClass().getName(), X509Credential.class.getName());
                 throw new BeanCreationException("Supplied StartTLSAuthenticationCredential was of wrong type");
@@ -120,4 +124,5 @@ public class CredentialConfigFactoryBean extends AbstractComponentAwareFactoryBe
     public void setTrustCredential(@Nullable final Credential credential) {
         trustCredential = credential;
     }
-}
+
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
index 9fc0c8956..facd9b633 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
@@ -67,6 +67,7 @@ import net.shibboleth.idp.attribute.resolver.dc.ldap.impl.LDAPDataConnector;
 import net.shibboleth.idp.attribute.resolver.spring.dc.AbstractDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.CacheConfigParser;
 import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.DeprecationSupport;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -90,7 +91,8 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
     @Nonnull private final Logger log = LoggerFactory.getLogger(LDAPDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<LDAPDataConnector> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<LDAPDataConnector> getBeanClass(@Nonnull final Element element) {
         return LDAPDataConnector.class;
     }
     
@@ -205,7 +207,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
             }
             else if (pooledConnectionFactory != null) {
                 builder.addPropertyValue("validator", v2Parser.createValidator(pooledConnectionFactory));
-            } else {
+            } else if (connectionFactory != null) {
                 builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactory.getBeanDefinition()));
             }
         }
@@ -230,13 +232,13 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
     protected static class V2Parser {
 
         /** Class logger. */
-        private static final Logger LOG = LoggerFactory.getLogger(V2Parser.class);
+        @Nonnull private static final Logger LOG = LoggerFactory.getLogger(V2Parser.class);
 
         /** LDAPDirectory XML element. */
-        private final Element configElement;
+        @Nonnull private final Element configElement;
         
         /** LogPrefix of parent. */
-        private final String logPrefix;
+        @Nonnull @NotEmpty private final String logPrefix;
 
         /**
          * Creates a new V2Parser with the supplied LDAPDirectory element.
@@ -245,9 +247,8 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
          * @param prefix the parent's log prefix
          */
         public V2Parser(@Nonnull final Element config, @Nonnull final String prefix) {
-            Constraint.isNotNull(config, "LDAPDirectory element cannot be null");
-            configElement = config;
-            logPrefix = prefix; 
+            configElement = Constraint.isNotNull(config, "LDAPDirectory element cannot be null");
+            logPrefix = Constraint.isNotEmpty(prefix, "Log prefix cannot be null or empty"); 
         }
 
         /**
@@ -737,7 +738,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
                 for (final Element property : saslProperties) {
                     final String name = AttributeSupport.getAttributeValue(property, null, "name");
                     final String value = AttributeSupport.getAttributeValue(property, null, "value");
-                    if ("javax.security.sasl.qop".equals(name)) {
+                    if ("javax.security.sasl.qop".equals(name) && value != null) {
                         final String[] splitValues = value.split(",");
                         final String[] values = new String[splitValues.length];
                         for (int i = 0; i < splitValues.length; i++) {
@@ -752,7 +753,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
                             }
                         }
                         saslConfig.addPropertyValue("qualityOfProtection", values);
-                    } else if ("javax.security.sasl.strength".equals(name)) {
+                    } else if ("javax.security.sasl.strength".equals(name) && value != null) {
                         final String[] splitValues = value.split(",");
                         final String[] values = new String[splitValues.length];
                         for (int i = 0; i < splitValues.length; i++) {
@@ -814,7 +815,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
          *
          * @return validator
          */
-        @Nullable public BeanDefinition createValidator(final String connectionFactoryId) {
+        @Nullable public BeanDefinition createValidator(@Nonnull @NotEmpty final String connectionFactoryId) {
 
             final BeanDefinitionBuilder validator =
                     BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
@@ -848,7 +849,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
          */
         @Nullable public BeanDefinition createCache(@Nonnull final ParserContext parserContext) {
             final CacheConfigParser parser = new CacheConfigParser(configElement);
-            return parser.createCache(parserContext);
+            return parser.createCache();
         }
         
         /** The parent's log prefix.
@@ -865,7 +866,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
          * 
          * @return list of strings
          */
-        @Nonnull public static List<String> buildStringList(final String value) {
+        @Nonnull public static List<String> buildStringList(@Nonnull final String value) {
             return StringSupport.stringToList(value, XMLConstants.LIST_DELIMITERS + ",");
         }
 
@@ -950,7 +951,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
          *
          * @return  search result handlers or null
          */
-        @Nonnull public static List<SearchResultHandler> buildReferralHandlers(
+        @Nullable public static List<SearchResultHandler> buildReferralHandlers(
                 @Nullable final String followReferrals) {
             if (followReferrals != null && Boolean.valueOf(followReferrals)) {
                 return List.of(new FollowSearchReferralHandler());
@@ -975,7 +976,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
          * @param connectionStrategy the provided string (with properties stripped)
          * @return the appropriate {@link ConnectionStrategy}.
         */
-        @Nonnull public static ConnectionStrategy buildConnectionStrategy(@Nonnull final String connectionStrategy) {
+        @Nonnull public static ConnectionStrategy buildConnectionStrategy(@Nullable final String connectionStrategy) {
 
             if (connectionStrategy == null) {
                 return new ActivePassiveConnectionStrategy();
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
index 7e9e7bd3f..f545a5714 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
@@ -59,7 +59,8 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
     @Nonnull private final Logger log = LoggerFactory.getLogger(RDBMSDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<RDBMSDataConnector> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<RDBMSDataConnector> getBeanClass(@Nonnull final Element element) {
         return RDBMSDataConnector.class;
     }
 
@@ -144,10 +145,10 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
     protected static class V2Parser {
 
         /** Base XML element. */
-        private final Element configElement;
+        @Nonnull private final Element configElement;
 
         /** Class logger. */
-        private final Logger log = LoggerFactory.getLogger(V2Parser.class);
+        @Nonnull private final Logger log = LoggerFactory.getLogger(V2Parser.class);
 
         /** Parent parser's log prefix.*/
         @Nonnull @NotEmpty private final String logPrefix;
@@ -169,7 +170,7 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
          * 
          * @return data source bean definition
          */
-        @Nonnull public BeanDefinition createManagedDataSource() {
+        @Nullable  public BeanDefinition createManagedDataSource() {
             final ManagedConnectionParser parser = new ManagedConnectionParser(configElement);
             return parser.createDataSource();
         }
@@ -321,7 +322,7 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
          */
         @Nullable public BeanDefinition createCache(@Nonnull final ParserContext parserContext) {
             final CacheConfigParser parser = new CacheConfigParser(configElement);
-            return parser.createCache(parserContext);
+            return parser.createCache();
         }
         
         /** The parent parser's log prefix.
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParser.java
index 592cf64eb..40f5b8285 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParser.java
@@ -55,7 +55,8 @@ public class StorageServiceDataConnectorParser extends AbstractDataConnectorPars
     @Nonnull private final Logger log = LoggerFactory.getLogger(StorageServiceDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<StorageServiceDataConnector> getBeanClass(final Element element) {
+    @Override
+    @Nullable protected Class<StorageServiceDataConnector> getBeanClass(@Nonnull final Element element) {
         return StorageServiceDataConnector.class;
     }
     
@@ -100,7 +101,8 @@ public class StorageServiceDataConnectorParser extends AbstractDataConnectorPars
             builder.addPropertyValue("resultsCache", v2Parser.createCache(parserContext));
         }
         
-        builder.addPropertyReference("storageService", config.getAttributeNS(null, "storageServiceRef"));
+        builder.addPropertyReference("storageService",
+                AttributeSupport.getRequiredAttributeValue(config, null, "storageServiceRef"));
 
         final String noResultIsError =
                 AttributeSupport.getAttributeValue(config, new QName("noResultIsError"));
@@ -187,7 +189,7 @@ public class StorageServiceDataConnectorParser extends AbstractDataConnectorPars
             
             if (configElement.hasAttributeNS(null, "customObjectRef")) {
                 templateBuilder.addPropertyReference("customObject",
-                        configElement.getAttributeNS(null, "customObjectRef"));
+                        AttributeSupport.getRequiredAttributeValue(configElement, null, "customObjectRef"));
             }
             
             templateBuilder.addPropertyValue("contextTemplateText", contextTemplate.getTextContent());
@@ -243,7 +245,7 @@ public class StorageServiceDataConnectorParser extends AbstractDataConnectorPars
          */
         @Nullable public BeanDefinition createCache(@Nonnull final ParserContext parserContext) {
             final CacheConfigParser parser = new CacheConfigParser(configElement);
-            return parser.createCache(parserContext);
+            return parser.createCache();
         }
 
         /** The parent parser's log prefix.
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java
index 0ac39a616..67358dcbb 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/BaseAttributeEncoderParser.java
@@ -21,6 +21,7 @@ import java.util.List;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.slf4j.Logger;
@@ -57,7 +58,7 @@ public abstract class BaseAttributeEncoderParser extends AbstractCustomBeanDefin
 
     /** {@inheritDoc} */
     @Override
-    protected Class<TranscodingRule> getBeanClass(final Element element) {
+    @Nullable protected Class<TranscodingRule> getBeanClass(@Nonnull final Element element) {
         return TranscodingRule.class;
     }
     
@@ -76,7 +77,8 @@ public abstract class BaseAttributeEncoderParser extends AbstractCustomBeanDefin
     /** {@inheritDoc} */
 // Checkstyle: CyclomaticComplexity OFF
     @Override
-    protected void doParse(final Element config, final ParserContext context, final BeanDefinitionBuilder builder) {
+    protected void doParse(@Nonnull final Element config, @Nonnull final ParserContext context,
+            @Nonnull final BeanDefinitionBuilder builder) {
 
         final ManagedMap<String, Object> rule = new ManagedMap<>();
 
@@ -114,7 +116,7 @@ public abstract class BaseAttributeEncoderParser extends AbstractCustomBeanDefin
                 log.warn("relyingParties ignored, using activationConditionRef");
             }
             rule.put(AttributeTranscoderRegistry.PROP_CONDITION, new RuntimeBeanReference(
-                    StringSupport.trimOrNull(config.getAttributeNS(null, "activationConditionRef"))));
+                    AttributeSupport.getRequiredAttributeValue(config, null, "activationConditionRef")));
         } else if (config.hasAttributeNS(null, "relyingParties")) {
             rule.put(AttributeTranscoderRegistry.PROP_RELYINGPARTIES, config.getAttributeNS(null, "relyingParties"));
         } else {
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1Base64AttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1Base64AttributeEncoderParser.java
index 6cfe0b11f..7aba0dbe8 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1Base64AttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1Base64AttributeEncoderParser.java
@@ -38,7 +38,7 @@ public class SAML1Base64AttributeEncoderParser extends BaseSAML1AttributeEncoder
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML1ByteTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1ScopedStringAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1ScopedStringAttributeEncoderParser.java
index 8c87e38fc..74ae6a766 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1ScopedStringAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1ScopedStringAttributeEncoderParser.java
@@ -64,7 +64,7 @@ public class SAML1ScopedStringAttributeEncoderParser extends BaseSAML1AttributeE
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML1ScopedStringTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1StringAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1StringAttributeEncoderParser.java
index e71f747ea..b46a4b789 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1StringAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1StringAttributeEncoderParser.java
@@ -38,7 +38,7 @@ public class SAML1StringAttributeEncoderParser extends BaseSAML1AttributeEncoder
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML1StringTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1XMLObjectAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1XMLObjectAttributeEncoderParser.java
index 97a030919..acd472bae 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1XMLObjectAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML1XMLObjectAttributeEncoderParser.java
@@ -36,7 +36,7 @@ public class SAML1XMLObjectAttributeEncoderParser extends BaseSAML1AttributeEnco
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML1XMLObjectTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2Base64AttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2Base64AttributeEncoderParser.java
index 8b78057aa..a14cdfa94 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2Base64AttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2Base64AttributeEncoderParser.java
@@ -38,7 +38,7 @@ public class SAML2Base64AttributeEncoderParser extends BaseSAML2AttributeEncoder
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML2ByteTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2DateTimeAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2DateTimeAttributeEncoderParser.java
index 60b9b4180..be00f0ca2 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2DateTimeAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2DateTimeAttributeEncoderParser.java
@@ -38,7 +38,7 @@ public class SAML2DateTimeAttributeEncoderParser extends BaseSAML2AttributeEncod
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML2DateTimeTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2ScopedStringAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2ScopedStringAttributeEncoderParser.java
index cfac5bcd1..188ce6d27 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2ScopedStringAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2ScopedStringAttributeEncoderParser.java
@@ -64,7 +64,7 @@ public class SAML2ScopedStringAttributeEncoderParser extends BaseSAML2AttributeE
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML2ScopedStringTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2StringAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2StringAttributeEncoderParser.java
index 0ae5203a6..8f1a77335 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2StringAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2StringAttributeEncoderParser.java
@@ -38,7 +38,7 @@ public class SAML2StringAttributeEncoderParser extends BaseSAML2AttributeEncoder
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML2StringTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2XMLObjectAttributeEncoderParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2XMLObjectAttributeEncoderParser.java
index 2cf1a92ce..fda45e400 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2XMLObjectAttributeEncoderParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/enc/impl/SAML2XMLObjectAttributeEncoderParser.java
@@ -36,7 +36,7 @@ public class SAML2XMLObjectAttributeEncoderParser extends BaseSAML2AttributeEnco
 
     /** {@inheritDoc} */
     @Override
-    protected BeanReference buildTranscoder() {
+    @Nonnull protected BeanReference buildTranscoder() {
         return new RuntimeBeanReference("SAML2XMLObjectTranscoder");
     }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
index 18b633343..8b72c9bc2 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
@@ -142,24 +142,33 @@ public abstract class AbstractResolverPluginFactoryBean<T extends AbstractResolv
     }
 
     /** 
-     * Set the locally define values into the object under construction.
+     * Set the locally defined values into the object under construction.
      * @param what the object being built.
      */
-    protected void setValues(@Nonnull final T what) {   
-        if (null != getId()) {
-            what.setId(getId());
+    protected void setValues(@Nonnull final T what) {
+        final String id = getId();
+        if (null != id) {
+            what.setId(id);
         }
-        if (null != getActivationCondition()) {
-            what.setActivationCondition(getActivationCondition());
+        
+        final Predicate<ProfileRequestContext> condition = getActivationCondition();
+        if (null != condition) {
+            what.setActivationCondition(condition);
         }
-        if (null != getAttributeDependencies()) {
-            what.setAttributeDependencies(getAttributeDependencies());
+        
+        final Set<ResolverAttributeDefinitionDependency> depad = getAttributeDependencies(); 
+        if (null != depad) {
+            what.setAttributeDependencies(depad);
         }
-        if (null != getDataConnectorDependencies()) {
-            what.setDataConnectorDependencies(getDataConnectorDependencies());
+        
+        final Set<ResolverDataConnectorDependency> depdc = getDataConnectorDependencies(); 
+        if (null != depdc) {
+            what.setDataConnectorDependencies(depdc);
         }
-        if (null != getPropagateResolutionExceptions()) {
-            what.setPropagateResolutionExceptions(getPropagateResolutionExceptions());
+        
+        final Boolean flag = getPropagateResolutionExceptions();
+        if (null != flag) {
+            what.setPropagateResolutionExceptions(flag);
         }
     }
     
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverParser.java
index 5dbd38030..24a877ba7 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverParser.java
@@ -21,6 +21,7 @@ import java.util.List;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.springframework.beans.factory.config.BeanDefinition;
@@ -58,11 +59,12 @@ public class AttributeResolverParser implements BeanDefinitionParser {
     /**
      * {@inheritDoc}
      */
-    @Override public BeanDefinition parse(final Element config, final ParserContext context) {
+    @Override
+    @Nullable public BeanDefinition parse(@Nonnull final Element config, @Nonnull final ParserContext context) {
 
         final Map<QName, List<Element>> configChildren = ElementSupport.getIndexedChildElements(config);
+        
         List<Element> children;
-
         children = configChildren.get(BaseAttributeDefinitionParser.ELEMENT_NAME);
         SpringSupport.parseLazyInitCustomElements(children, context);
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java
index c17673e27..a267fb170 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java
@@ -68,6 +68,10 @@ public class AttributeResolverServiceStrategy extends AbstractIdentifiableInitia
     /** {@inheritDoc} */
     @Nullable public AbstractServiceableComponent<AttributeResolver> apply(@Nullable final ApplicationContext appContext) {
 
+        if (appContext == null) {
+            throw new ServiceException("ApplicationContext was null");
+        }
+        
         final Collection<AttributeDefinition> definitions =
                 appContext.getBeansOfType(AttributeDefinition.class).values();
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java
index e985f625e..98d9d73d3 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java
@@ -45,7 +45,8 @@ public class InputDataConnectorParser extends BaseResolverPluginDependencyParser
     @Nonnull private final Logger log = LoggerFactory.getLogger(InputDataConnectorParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class<ResolverDataConnectorDependency> getBeanClass(@Nullable final Element element) {
+    @Override
+    @Nullable protected Class<ResolverDataConnectorDependency> getBeanClass(@Nonnull final Element element) {
         return ResolverDataConnectorDependency.class;
     }
 
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMapperTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMapperTest.java
index 2a4009ffc..c061d2e47 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMapperTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMapperTest.java
@@ -25,6 +25,8 @@ import java.util.HashSet;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.annotation.Nullable;
+
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
 import org.opensaml.saml.saml2.core.Attribute;
 import org.springframework.context.support.ConversionServiceFactoryBean;
@@ -50,14 +52,13 @@ import net.shibboleth.shared.spring.custom.SchemaTypeAwareXMLBeanDefinitionReade
 @SuppressWarnings("javadoc")
 public class AttributeMapperTest extends OpenSAMLInitBaseTestCase {
 
-    private GenericApplicationContext pendingTeardownContext = null;
+    @Nullable private GenericApplicationContext pendingTeardownContext = null;
     
     @AfterMethod public void tearDownTestContext() {
-        if (null == pendingTeardownContext ) {
-            return;
+        if (null != pendingTeardownContext ) {
+            pendingTeardownContext.close();
+            pendingTeardownContext = null;
         }
-        pendingTeardownContext.close();
-        pendingTeardownContext = null;
     }
     
     protected void setTestContext(GenericApplicationContext context) {
@@ -88,7 +89,8 @@ public class AttributeMapperTest extends OpenSAMLInitBaseTestCase {
         final ReloadableService<AttributeTranscoderRegistry> transcoderRegistry = context.getBean(ReloadableService.class);
 
         try (final ServiceableComponent<AttributeTranscoderRegistry> serviceableComponent = transcoderRegistry.getServiceableComponent()){
-           
+            assert serviceableComponent != null;
+            
             final IdPAttribute idpattr = new IdPAttribute("eduPersonScopedAffiliation");
             
             Collection<TranscodingRule> rulesets = serviceableComponent.getComponent().getTranscodingRules(
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 e949ba53b..1f7a2fd1e 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
@@ -24,6 +24,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.saml.metadata.resolver.filter.FilterException;
 import org.opensaml.saml.saml2.metadata.AttributeConsumingService;
@@ -52,23 +55,22 @@ import net.shibboleth.shared.spring.custom.SchemaTypeAwareXMLBeanDefinitionReade
 @SuppressWarnings("javadoc")
 public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
 
-    private EntityDescriptor entityDescriptor;
+    @Nullable private EntityDescriptor entityDescriptor;
 
-    private ReloadableService<AttributeTranscoderRegistry> service;
+    @Nullable private ReloadableService<AttributeTranscoderRegistry> service;
 
-    private AttributeMappingNodeProcessor processor;
+    @Nullable private AttributeMappingNodeProcessor processor;
 
-    private GenericApplicationContext pendingTeardownContext = null;
+    @Nullable private GenericApplicationContext pendingTeardownContext;
     
     @AfterClass public void tearDownTestContext() {
-        if (null == pendingTeardownContext ) {
-            return;
+        if (null != pendingTeardownContext ) {
+            pendingTeardownContext.close();
+            pendingTeardownContext = null;
         }
-        pendingTeardownContext.close();
-        pendingTeardownContext = null;
     }
     
-    protected void setTestContext(GenericApplicationContext context) {
+    protected void setTestContext(@Nullable GenericApplicationContext context) {
         tearDownTestContext();
         pendingTeardownContext = context;
     }
@@ -77,12 +79,12 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
         entityDescriptor = unmarshallElement("/net/shibboleth/idp/saml/attribute/impl/metadata.xml");
         assertNotNull(entityDescriptor);
         service = getService();
-        assertNotNull(service);
+        assert service != null;
         processor = new AttributeMappingNodeProcessor(service);
     }
 
-    private ReloadableService<AttributeTranscoderRegistry> getService() {
-        GenericApplicationContext context = new GenericApplicationContext();
+    @Nonnull private ReloadableService<AttributeTranscoderRegistry> getService() {
+        final GenericApplicationContext context = new GenericApplicationContext();
         setTestContext(context);
         context.setDisplayName("ApplicationContext: ");
 
@@ -92,7 +94,7 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
 
         context.getBeanFactory().setConversionService(service1.getObject());
         
-        SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+        final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
                 new SchemaTypeAwareXMLBeanDefinitionReader(context);
 
         beanDefinitionReader.loadBeanDefinitions(
@@ -105,15 +107,18 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
 
     // Tests use of default mapping behavior for URI-named, string-valued tags.
     @Test public void entityAttributes() throws FilterException {
-
+        assert entityDescriptor != null;
         assertTrue(entityDescriptor.getObjectMetadata().get(AttributesMapContainer.class).isEmpty());
 
+        assert processor != null;
         processor.process(entityDescriptor);
 
+        assert entityDescriptor != null;
         final AttributesMapContainer container =
                 entityDescriptor.getObjectMetadata().get(AttributesMapContainer.class).get(0);
 
         final Multimap<String, IdPAttribute> map = container.get();
+        assert map != null;
 
         assertEquals(map.size(), 1);
         Collection<IdPAttribute> attribute = map.get("http://macedir.org/entity-category");
@@ -131,18 +136,20 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
 
     @Test public void requiredAttributes() throws FilterException {
 
+        assert entityDescriptor != null;
         final AttributeConsumingService acs =
                 entityDescriptor.getSPSSODescriptor("urn:oasis:names:tc:SAML:1.1:protocol")
                         .getDefaultAttributeConsumingService();
 
         assertTrue(acs.getObjectMetadata().get(AttributesMapContainer.class).isEmpty());
 
+        assert processor != null;
         processor.process(acs);
 
         final AttributesMapContainer container = acs.getObjectMetadata().get(AttributesMapContainer.class).get(0);
 
         final Multimap<String,IdPAttribute> map = container.get();
-
+        assert map != null;
         assertEquals(map.size(), 3);
 
         Collection<IdPAttribute> attribute = map.get("dn1");
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java
index 9f7bcd89f..fb728abb0 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.sql.DataSource;
 
@@ -53,6 +54,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.spring.testing.BaseAttributeDefinitionParserTest;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.security.DataSealer;
@@ -75,30 +77,29 @@ public class AttributeResolverTest extends OpenSAMLInitBaseTestCase {
     private final Logger log = LoggerFactory.getLogger(AttributeResolverTest.class);
 
     /* LDAP */
-    private InMemoryDirectory directoryServer;
+    @Nullable private InMemoryDirectory directoryServer;
 
-    private static final String LDAP_INIT_FILE =
+    @Nonnull @NotEmpty private static final String LDAP_INIT_FILE =
             "/net/shibboleth/idp/attribute/resolver/spring/ldapDataConnectorTest.ldif";
 
     /** DataBase initialise */
-    private static final String DB_INIT_FILE = "/net/shibboleth/idp/attribute/resolver/spring/RdbmsStore.sql";
+    @Nonnull @NotEmpty private static final String DB_INIT_FILE = "/net/shibboleth/idp/attribute/resolver/spring/RdbmsStore.sql";
 
     /** DataBase Populate */
-    private static final String DB_DATA_FILE = "/net/shibboleth/idp/attribute/resolver/spring/RdbmsData.sql";
+    @Nonnull @NotEmpty private static final String DB_DATA_FILE = "/net/shibboleth/idp/attribute/resolver/spring/RdbmsData.sql";
 
-    private DataSource datasource;
+    @Nullable private DataSource datasource;
     
-    private GenericApplicationContext pendingTeardownContext = null;
+    @Nullable private GenericApplicationContext pendingTeardownContext;
     
     @AfterMethod public void tearDownTestContext() {
-        if (null == pendingTeardownContext ) {
-            return;
+        if (null != pendingTeardownContext ) {
+            pendingTeardownContext.close();
+            pendingTeardownContext = null;
         }
-        pendingTeardownContext.close();
-        pendingTeardownContext = null;
     }
     
-    protected void setTestContext(final GenericApplicationContext context) {
+    protected void setTestContext(@Nullable final GenericApplicationContext context) {
         tearDownTestContext();
         pendingTeardownContext = context;
     }
@@ -120,13 +121,21 @@ public class AttributeResolverTest extends OpenSAMLInitBaseTestCase {
 
     /**
      * Shutdown the in-memory directory server.
+     * @throws InterruptedException 
      */
-    @AfterClass public void teardownDataConnectors() {
-        assertEquals(directoryServer.openConnectionCount(), 0);
-        directoryServer.stop(true);
+    @AfterClass public void teardownDataConnectors() throws InterruptedException {
+        if (directoryServer != null) {
+            if (directoryServer.openConnectionCount() > 0) {
+                Thread.sleep(100);
+            }
+            assert directoryServer != null;
+            assertEquals(directoryServer.openConnectionCount(), 0);
+            assert directoryServer != null;
+            directoryServer.stop(true);
+        }
     }
     
-    private ReloadableService<AttributeResolver> getResolver(final String file) {
+    @Nonnull private ReloadableService<AttributeResolver> getResolver(@Nonnull @NotEmpty final String file) {
         final GenericApplicationContext context = new GenericApplicationContext();
         context.getBeanFactory().addBeanPostProcessor(new IdentifiableBeanPostProcessor());
         setTestContext(context);
@@ -208,7 +217,7 @@ public class AttributeResolverTest extends OpenSAMLInitBaseTestCase {
                 TestSources.createResolutionContext("PETER_THE_PRINCIPAL", "issuer", "recipient");
 
         try (final ServiceableComponent<AttributeResolver> serviceableComponent = attributeResolverService.getServiceableComponent()) {
-
+            assert serviceableComponent != null;
             final AttributeResolver resolver = serviceableComponent.getComponent();
             assertEquals(resolver.getId(), "Shibboleth.Resolver");
             resolver.resolveAttributes(resolutionContext);
@@ -320,6 +329,7 @@ public class AttributeResolverTest extends OpenSAMLInitBaseTestCase {
                 TestSources.createResolutionContext("PETER_THE_PRINCIPAL", "issuer", "recipient");
 
         try (final ServiceableComponent<AttributeResolver> serviceableComponent = attributeResolverService.getServiceableComponent()) {
+            assert serviceableComponent != null;
             final AttributeResolver resolver = serviceableComponent.getComponent();
             assertEquals(resolver.getId(), "Shibboleth.Resolver");
             resolver.resolveAttributes(resolutionContext);
@@ -451,7 +461,7 @@ public class AttributeResolverTest extends OpenSAMLInitBaseTestCase {
                 TestSources.createResolutionContext("PETER_THE_PRINCIPAL", "issuer", "recipient");
 
         try (final ServiceableComponent<AttributeResolver> serviceableComponent = attributeResolverService.getServiceableComponent()) {
-
+            assert serviceableComponent != null;
             final AttributeResolver resolver = serviceableComponent.getComponent();
             assertEquals(resolver.getId(), "MultiFileResolver");
             resolver.resolveAttributes(resolutionContext);
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/IdP1676Test.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/IdP1676Test.java
index 65b90db45..8e10c948a 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/IdP1676Test.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/IdP1676Test.java
@@ -25,6 +25,9 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
 import org.springframework.context.support.ConversionServiceFactoryBean;
 import org.springframework.context.support.GenericApplicationContext;
@@ -40,7 +43,7 @@ import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
-import net.shibboleth.shared.collection.Pair;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.service.ReloadableService;
 import net.shibboleth.shared.service.ServiceableComponent;
@@ -48,24 +51,24 @@ import net.shibboleth.shared.spring.config.IdentifiableBeanPostProcessor;
 import net.shibboleth.shared.spring.config.StringToDurationConverter;
 import net.shibboleth.shared.spring.custom.SchemaTypeAwareXMLBeanDefinitionReader;
 import net.shibboleth.shared.testing.InMemoryDirectory;
+import net.shibboleth.spring.testing.AbstractFailFastTest.MockProperty;
 
 @SuppressWarnings("javadoc")
 public class IdP1676Test extends OpenSAMLInitBaseTestCase {
 
     /* LDAP */
-    private InMemoryDirectory directoryServer;
+    @Nullable private InMemoryDirectory directoryServer;
 
-    private static final String LDAP_INIT_FILE =
+    @Nonnull @NotEmpty private static final String LDAP_INIT_FILE =
             "/net/shibboleth/idp/attribute/resolver/spring/ldapDataConnectorTest.ldif";
     
-    private GenericApplicationContext pendingTeardownContext = null;
+    @Nullable private GenericApplicationContext pendingTeardownContext;
     
     @AfterMethod public void tearDownTestContext() {
-        if (null == pendingTeardownContext ) {
-            return;
+        if (null != pendingTeardownContext ) {
+            pendingTeardownContext.close();
+            pendingTeardownContext = null;
         }
-        pendingTeardownContext.close();
-        pendingTeardownContext = null;
     }
     
     @AfterClass public void teardown() {
@@ -103,14 +106,14 @@ public class IdP1676Test extends OpenSAMLInitBaseTestCase {
         final GenericApplicationContext context = new GenericApplicationContext();
         context.getBeanFactory().addBeanPostProcessor(new IdentifiableBeanPostProcessor());
         
-        final Pair<String, String> pRE = new Pair<>("propagateResolutionExceptions", propagateResolutionExceptions ? "true": "false");
-        final Pair<String, String> fF = new Pair<>("failfast", failFast ? "true": "false");
-        final List<Pair<String, String>> properties = List.of(pRE,fF);
+        final MockProperty pRE = new MockProperty("propagateResolutionExceptions", propagateResolutionExceptions ? "true": "false");
+        final MockProperty fF = new MockProperty("failfast", failFast ? "true": "false");
+        final List<MockProperty> properties = List.of(pRE,fF);
         
         final MutablePropertySources propertySources = context.getEnvironment().getPropertySources();
         final MockPropertySource mockEnvVars = new MockPropertySource();
-        for (final Pair<String, String> p :properties) {
-            mockEnvVars.setProperty(p.getFirst(), p.getSecond());
+        for (final MockProperty p :properties) {
+            mockEnvVars.setProperty(p.name(), p.value());
         }
         propertySources.replace(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, mockEnvVars);
         
@@ -138,7 +141,8 @@ public class IdP1676Test extends OpenSAMLInitBaseTestCase {
     private void testResolve(ReloadableService<AttributeResolver> resolverService, int attributeCount) throws ResolutionException {
         final AttributeResolutionContext resolutionContext =
                 TestSources.createResolutionContext("PETER_THE_PRINCIPAL", "issuer", "recipient");
-        try (final ServiceableComponent<AttributeResolver> serviceableComponent = resolverService.getServiceableComponent()){
+        try (final ServiceableComponent<AttributeResolver> serviceableComponent = resolverService.getServiceableComponent()) {
+            assert serviceableComponent != null;
             serviceableComponent.getComponent().resolveAttributes(resolutionContext);
         }
         assertEquals(resolutionContext.getResolvedIdPAttributes().size(), attributeCount);
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParserTest.java
index 7a0a7b7c5..3077faedb 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/DateTimeAttributeDefinitionParserTest.java
@@ -54,7 +54,7 @@ public class DateTimeAttributeDefinitionParserTest extends BaseAttributeDefiniti
         assertTrue(attrDef.isIgnoreConversionErrors());
         
         final DateTimeFormatter formatter = attrDef.getDateTimeFormatter();
-        assertNotNull(formatter);
+        assert formatter != null;
         assertEquals(formatter.format(ZonedDateTime.ofInstant(Instant.ofEpochSecond(100), ZoneId.of("UTC"))), "1970");
     }
 
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParserTest.java
index 5f5ab5495..5fbfc6eae 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ScopedAttributeDefinitionParserTest.java
@@ -17,8 +17,7 @@
 
 package net.shibboleth.idp.attribute.resolver.spring.ad.impl;
 
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.fail;
+import static org.testng.Assert.*;
 
 import org.springframework.beans.factory.BeanCreationException;
 
@@ -56,10 +55,11 @@ public class ScopedAttributeDefinitionParserTest extends BaseAttributeDefinition
         try {
             getAttributeDefn("resolver/scopedBoth.xml", ScopedAttributeDefinition.class);
         } catch (final BeanCreationException e) {
-            assertEquals(e.getRootCause().getClass(), ComponentInitializationException.class);
+            final Throwable cause = e.getRootCause();
+            assertTrue(cause instanceof ComponentInitializationException);
             return;
         }
         fail("Did not catch impossible setup");
     }
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeParserTest.java
index d84de6fa1..6e7634613 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/SimpleAttributeParserTest.java
@@ -126,8 +126,10 @@ public class SimpleAttributeParserTest extends BaseAttributeDefinitionParserTest
 
         final AttributeDefinition attr = getAttributeDefn("resolver/resolutionPhases.xml", SimpleAttributeDefinition.class, context);
         final ResolutionLabelPredicate pre = (ResolutionLabelPredicate) attr.getActivationCondition();
+        assert pre != null;
         final ProfileRequestContext prc = new ProfileRequestContext();
         final AttributeResolutionContext resContext = prc.getSubcontext(AttributeResolutionContext.class, true);
+        assert resContext != null;
         resContext.setResolutionLabel("p1");
         assertTrue(pre.test(prc));
         resContext.setResolutionLabel("p2 p3");
@@ -153,8 +155,10 @@ public class SimpleAttributeParserTest extends BaseAttributeDefinitionParserTest
 
         final AttributeDefinition attr = getAttributeDefn("resolver/excludeResolutionPhases.xml", SimpleAttributeDefinition.class, context);
         final Predicate<ProfileRequestContext> pre = attr.getActivationCondition();
+        assert pre != null;
         final ProfileRequestContext prc = new ProfileRequestContext();
         final AttributeResolutionContext resContext = prc.getSubcontext(AttributeResolutionContext.class, true);
+        assert resContext != null;
         resContext.setResolutionLabel("p1");
         assertFalse(pre.test(prc));
         resContext.setResolutionLabel("p2 p3");
@@ -180,8 +184,10 @@ public class SimpleAttributeParserTest extends BaseAttributeDefinitionParserTest
 
         final AttributeDefinition attr = getAttributeDefn("resolver/phases.xml", SimpleAttributeDefinition.class, context);
         final Predicate<ProfileRequestContext> pre = attr.getActivationCondition();
+        assert pre != null;
         final ProfileRequestContext prc = new ProfileRequestContext();
         final AttributeResolutionContext resContext = prc.getSubcontext(AttributeResolutionContext.class, true);
+        assert resContext != null;
         
         resContext.setResolutionLabel("p1");
         assertTrue(pre.test(prc));
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParserTest.java
index 8b8efe069..548e6ae4e 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/MappedAttributeDefinitionParserTest.java
@@ -27,6 +27,7 @@ import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.testng.annotations.Test;
 
+import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ad.mapped.impl.MappedAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.spring.testing.BaseAttributeDefinitionParserTest;
 
@@ -45,7 +46,9 @@ public class MappedAttributeDefinitionParserTest extends BaseAttributeDefinition
 
         assertTrue(defn.isPassThru());
         assertEquals(defn.getValueMaps().size(), 2);
-        assertEquals(defn.getDefaultAttributeValue().getValue(), "foobar");
+        final StringAttributeValue defValue = defn.getDefaultAttributeValue();
+        assert defValue != null;
+        assertEquals(defValue.getValue(), "foobar");
     }
 
     @Test public void defaultCase() {
@@ -53,7 +56,9 @@ public class MappedAttributeDefinitionParserTest extends BaseAttributeDefinition
 
         assertTrue(defn.isPassThru());
         assertEquals(defn.getValueMaps().size(), 2);
-        assertEquals(defn.getDefaultAttributeValue().getValue(), "foobar");
+        final StringAttributeValue defValue = defn.getDefaultAttributeValue();
+        assert defValue != null;
+        assertEquals(defValue.getValue(), "foobar");
     }
     
     @Test(expectedExceptions = {BeanCreationException.class}) public void emptyPassThru() {
@@ -61,7 +66,9 @@ public class MappedAttributeDefinitionParserTest extends BaseAttributeDefinition
 
         assertFalse(defn.isPassThru());
         assertEquals(defn.getValueMaps().size(), 2);
-        assertEquals(defn.getDefaultAttributeValue().getValue(), "foobar");
+        final StringAttributeValue defValue = defn.getDefaultAttributeValue();
+        assert defValue != null;
+        assertEquals(defValue.getValue(), "foobar");
     }
 
 
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParserTest.java
index 3eec5af0e..f9555e33d 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/mapped/impl/ValueMapParserTest.java
@@ -20,6 +20,8 @@ package net.shibboleth.idp.attribute.resolver.spring.ad.mapped.impl;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.fail;
 
+import java.util.regex.Pattern;
+
 import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.springframework.context.support.GenericApplicationContext;
 import org.testng.annotations.Test;
@@ -49,7 +51,10 @@ public class ValueMapParserTest extends BaseAttributeDefinitionParserTest {
         final ValueMap value = getValueMap("valueMap.xml");
         assertEquals(value.getReturnValue(), "return");
         assertEquals(value.getSourceValues().size(), 1);
-        assertEquals(value.getSourceValues().iterator().next().getPattern().pattern(), "source");
+        
+        final Pattern pattern = value.getSourceValues().iterator().next().getPattern();
+        assert pattern != null;
+        assertEquals(pattern.pattern(), "source");
     }
 
 
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParserTest.java
index a44be04ba..c07d0db51 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/impl/HTTPDataConnectorParserTest.java
@@ -37,6 +37,8 @@ import org.springframework.mock.env.MockPropertySource;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.Test;
 
+import com.google.common.cache.Cache;
+
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
@@ -91,7 +93,7 @@ public class HTTPDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
-
+        assert attrs != null;
         assertEquals(attrs.size(), 2);
         
         assertEquals(attrs.get("foo").getValues().size(), 1);
@@ -100,8 +102,9 @@ public class HTTPDataConnectorParserTest {
         assertEquals(attrs.get("bar").getValues().size(), 2);
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(0)).getValue(), "bar1");
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(1)).getValue(), "bar2");
-        
-        assertTrue(connector.getResultsCache().size() == 1);
+        final Cache<String, Map<String, IdPAttribute>> cache = connector.getResultsCache();
+        assert cache != null;
+        assertTrue(cache.size() == 1);
     }
 
     @Test(expectedExceptions=ResolutionException.class) public void v2BadProtocol() throws Exception {
@@ -201,6 +204,7 @@ public class HTTPDataConnectorParserTest {
         connector.resolve(context);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
+        assert attrs != null;
         
         assertEquals(attrs.size(), 2);
         
@@ -272,6 +276,7 @@ public class HTTPDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
+        assert attrs != null;
         
         assertEquals(attrs.size(), 2);
         
@@ -304,6 +309,7 @@ public class HTTPDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
+        assert attrs != null;
 
         assertEquals(attrs.size(), 2);
         
@@ -314,7 +320,9 @@ public class HTTPDataConnectorParserTest {
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(0)).getValue(), "bar1");
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(1)).getValue(), "bar2");
         
-        assertTrue(connector.getResultsCache().size() == 1);    
+        final Cache<String, Map<String, IdPAttribute>> cache = connector.getResultsCache();
+        assert cache != null;
+        assertTrue(cache.size() == 1);
     }
 
     @Test(enabled=false) public void v2ConfigPOST() throws Exception {
@@ -335,7 +343,8 @@ public class HTTPDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
-
+        assert attrs != null;
+        
         assertEquals(attrs.size(), 2);
         
         assertEquals(attrs.get("foo").getValues().size(), 1);
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParserTest.java
index c965d00f2..3642f812c 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParserTest.java
@@ -19,12 +19,12 @@ package net.shibboleth.idp.attribute.resolver.spring.dc.impl;
 
 import java.io.IOException;
 
-import net.shibboleth.idp.attribute.resolver.spring.dc.impl.CacheConfigParser;
 import net.shibboleth.shared.xml.ParserPool;
 import net.shibboleth.shared.xml.XMLParserException;
 
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.context.support.GenericApplicationContext;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
@@ -34,7 +34,7 @@ import org.w3c.dom.Document;
 import com.google.common.cache.Cache;
 
 /**
- * Code to exercise the ResultCache Parser outwith the DataConnector parsers.
+ * Code to exercise the ResultCache Parser with the DataConnector parsers.
  * There is no actual testing since we cannot look at what is created.
  */
 @SuppressWarnings("javadoc")
@@ -43,12 +43,15 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void ttl() throws XMLParserException, IOException {
         final ParserPool parserPool = XMLObjectProviderRegistrySupport.getParserPool();
+        assert parserPool != null;
         final Resource resource= new ClassPathResource("net/shibboleth/idp/attribute/resolver/spring/dc/ResultCacheElementTimeToLive.xml");
         final Document doc = parserPool.parse(resource.getInputStream());
-            final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
+        final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
         try (final GenericApplicationContext context = new GenericApplicationContext()) {
-            context.registerBeanDefinition("ElementTTL", ccp.createCache(null));
+            final BeanDefinition cacheBean = ccp.createCache();
+            assert cacheBean != null;
+            context.registerBeanDefinition("ElementTTL", cacheBean);
             context.refresh();
             context.getBean("ElementTTL", Cache.class);
         }
@@ -56,12 +59,15 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
 
     @Test public void access() throws XMLParserException, IOException {
         final ParserPool parserPool = XMLObjectProviderRegistrySupport.getParserPool();
+        assert parserPool != null;
         final Resource resource= new ClassPathResource("net/shibboleth/idp/attribute/resolver/spring/dc/ResultCacheExpireAfterAccess.xml");
         final Document doc = parserPool.parse(resource.getInputStream());
             final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
         try (final GenericApplicationContext context = new GenericApplicationContext()) {
-            context.registerBeanDefinition("Access", ccp.createCache(null));
+            final BeanDefinition cacheBean = ccp.createCache();
+            assert cacheBean != null;
+            context.registerBeanDefinition("Access", cacheBean);
             context.refresh();
             context.getBean("Access", Cache.class);
         }
@@ -69,12 +75,15 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
 
     @Test public void write() throws XMLParserException, IOException {
         final ParserPool parserPool = XMLObjectProviderRegistrySupport.getParserPool();
+        assert parserPool != null;
         final Resource resource= new ClassPathResource("net/shibboleth/idp/attribute/resolver/spring/dc/ResultCacheExpireAfterWrite.xml");
         final Document doc = parserPool.parse(resource.getInputStream());
             final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
         try (final GenericApplicationContext context = new GenericApplicationContext()) {
-            context.registerBeanDefinition("Write", ccp.createCache(null));
+            final BeanDefinition cacheBean = ccp.createCache();
+            assert cacheBean != null;
+            context.registerBeanDefinition("Write", cacheBean);
             context.refresh();
             context.getBean("Write", Cache.class);
         }
@@ -82,12 +91,15 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
 
     @Test public void both() throws XMLParserException, IOException {
         final ParserPool parserPool = XMLObjectProviderRegistrySupport.getParserPool();
+        assert parserPool != null;
         final Resource resource= new ClassPathResource("net/shibboleth/idp/attribute/resolver/spring/dc/ResultCacheExpireBoth.xml");
         final Document doc = parserPool.parse(resource.getInputStream());
             final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
         try (final GenericApplicationContext context = new GenericApplicationContext()) {
-            context.registerBeanDefinition("Write", ccp.createCache(null));
+            final BeanDefinition cacheBean = ccp.createCache();
+            assert cacheBean != null;
+            context.registerBeanDefinition("Write", cacheBean);
             context.refresh();
             context.getBean("Write", Cache.class);
         }
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParserTest.java
index 7d8d8993f..a66585c65 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParserTest.java
@@ -53,7 +53,7 @@ public class ScriptedDataConnectorParserTest extends BaseAttributeDefinitionPars
         dataConnector.initialize();
         
         final Map<?,?> custom = (Map<?,?>) dataConnector.getCustomObject();
-        
+        assert custom != null;
         assertEquals(custom.size(), 1);
         assertEquals(custom.get("bar"), "foo");
         
@@ -61,7 +61,7 @@ public class ScriptedDataConnectorParserTest extends BaseAttributeDefinitionPars
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> result = dataConnector.resolve(context);
-        
+        assert result != null;
         assertEquals(result.size(), 3);
         
         List<IdPAttributeValue> values = result.get("ScriptedOne").getValues();
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java
index a74e8d9ea..ca0764cfa 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/StoredIdDataConnectorParserTest.java
@@ -63,6 +63,7 @@ public class StoredIdDataConnectorParserTest extends BaseAttributeDefinitionPars
         final PairwiseIdDataConnector connector = getDataConnector("resolver/stored.xml", PairwiseIdDataConnector.class);
         final JDBCPairwiseIdStore store = (JDBCPairwiseIdStore) connector.getPairwiseIdStore();
         final ComputedPairwiseIdStore store2 = (ComputedPairwiseIdStore) store.getInitialValueStore();
+        assert store2 != null;
 
         final ResolverAttributeDefinitionDependency attrib = connector.getAttributeDependencies().iterator().next();
         assertEquals(attrib.getDependencyPluginId(), "theSourceRemainsTheSame");
@@ -95,6 +96,7 @@ public class StoredIdDataConnectorParserTest extends BaseAttributeDefinitionPars
                 DATACONNECTOR_FILE_PATH + "rdbms/rdbms-attribute-resolver-spring-context.xml");
         final JDBCPairwiseIdStore store = (JDBCPairwiseIdStore) connector.getPairwiseIdStore();
         final ComputedPairwiseIdStore store2 = (ComputedPairwiseIdStore) store.getInitialValueStore();
+        assert store2 != null;
         
         final ResolverAttributeDefinitionDependency attrib = connector.getAttributeDependencies().iterator().next();
         assertEquals(attrib.getDependencyPluginId(), "theSourceRemainsTheSame");
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
index ea4714df1..7e8ac5ab0 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
@@ -33,6 +33,8 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+import javax.annotation.Nullable;
+
 import org.ldaptive.BindConnectionInitializer;
 import org.ldaptive.BindResponse;
 import org.ldaptive.ConnectionConfig;
@@ -86,9 +88,9 @@ import net.shibboleth.shared.testing.InMemoryDirectory;
 public class LDAPDataConnectorParserTest {
 
     /** In-memory directory server. */
-    private InMemoryDirectory directoryServer;
+    @Nullable private InMemoryDirectory directoryServer;
     
-    private GenericApplicationContext pendingTeardownContext = null;
+    @Nullable private GenericApplicationContext pendingTeardownContext = null;
 
     /** Override the default SASL client for testing. */
     public static class TestSaslClient implements SaslClient<DefaultSaslClientRequest>
@@ -101,11 +103,10 @@ public class LDAPDataConnectorParserTest {
     }
 
     @AfterMethod public void tearDownTestContext() {
-        if (null == pendingTeardownContext ) {
-            return;
+        if (null != pendingTeardownContext ) {
+            pendingTeardownContext.close();
+            pendingTeardownContext = null;
         }
-        pendingTeardownContext.close();
-        pendingTeardownContext = null;
     }
     
     protected void setTestContext(final GenericApplicationContext context) {
@@ -132,9 +133,13 @@ public class LDAPDataConnectorParserTest {
 
     /**
      * Shutdown the in-memory directory server.
+     * @throws InterruptedException 
      */
-    @AfterClass public void teardownDirectoryServer() {
-        directoryServer.stop(true);
+    @AfterClass public void teardownDirectoryServer() throws InterruptedException {
+        if (directoryServer != null) {
+            directoryServer.stop(true);
+        }
+
         System.clearProperty("org.ldaptive.sasl.defaultSaslClient");
     }
 
@@ -154,7 +159,7 @@ public class LDAPDataConnectorParserTest {
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
-        assertNotNull(attrs);
+        assert attrs != null;
         assertEquals(2, attrs.size());
         assertEquals(attrs.get("employeeNumber").getValues().get(0).getNativeValue(), "C2J20hMNp7NlUwQ+");
         assertNotNull(attrs.get("entryDN"));
@@ -175,7 +180,7 @@ public class LDAPDataConnectorParserTest {
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
-        assertNotNull(attrs);
+        assert attrs != null;
         assertNotNull(attrs.get("entryDN"));
     }
 
@@ -238,7 +243,7 @@ public class LDAPDataConnectorParserTest {
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
-        assertNotNull(attrs);
+        assert attrs != null;
         assertNotNull(attrs.get("entryDN"));
     }
 
@@ -307,7 +312,7 @@ public class LDAPDataConnectorParserTest {
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
-        assertNotNull(attrs);
+        assert attrs != null;
         assertNotNull(attrs.get("entryDN"));
     }
 
@@ -324,7 +329,7 @@ public class LDAPDataConnectorParserTest {
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
-        assertNotNull(attrs);
+        assert attrs != null;
         assertEquals(attrs.size(), 4);
         assertNotNull(attrs.get("uid"));
         assertNotNull(attrs.get("homephone"));
@@ -493,7 +498,7 @@ public class LDAPDataConnectorParserTest {
                 TestSources.createResolutionContext(TestSources.PRINCIPAL_ID, TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> attrs = dataConnector.resolve(context);
-        assertNotNull(attrs);
+        assert attrs != null;
         assertNull(attrs.get("homephone"));
         assertNotNull(attrs.get("phonenumber"));
         assertNotNull(attrs.get("entryDN"));
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParserTest.java
index 015198204..af2b9daf2 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/storage/impl/StorageServiceDataConnectorParserTest.java
@@ -36,6 +36,8 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.Test;
 import org.testng.reporters.Files;
 
+import com.google.common.cache.Cache;
+
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.NoResultAnErrorResolutionException;
@@ -80,13 +82,16 @@ public class StorageServiceDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
+        assert attrs != null;
 
         assertEquals(attrs.size(), 1);
         
         assertEquals(attrs.get("test").getValues().size(), 1);
         assertEquals(((StringAttributeValue)attrs.get("test").getValues().get(0)).getValue(), "testdata");
         
-        assertTrue(connector.getResultsCache().size() == 1);
+        final Cache<String, Map<String, IdPAttribute>> cache = connector.getResultsCache();
+        assert cache != null;
+        assertTrue(cache.size() == 1);
     }    
     
     @Test public void v2Config() throws Exception {
@@ -108,6 +113,7 @@ public class StorageServiceDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
+        assert attrs != null;
 
         assertEquals(attrs.size(), 2);
         
@@ -118,7 +124,9 @@ public class StorageServiceDataConnectorParserTest {
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(0)).getValue(), "bar1");
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(1)).getValue(), "bar2");
         
-        assertTrue(connector.getResultsCache().size() == 1);
+        final Cache<String, Map<String, IdPAttribute>> cache = connector.getResultsCache();
+        assert cache != null;
+        assertTrue(cache.size() == 1);
     }
 
      @Test(expectedExceptions=NoResultAnErrorResolutionException.class) public void v2Missing() throws Exception {
@@ -156,6 +164,7 @@ public class StorageServiceDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
+        assert attrs != null;
 
         assertTrue(attrs.isEmpty());
     }
@@ -179,6 +188,7 @@ public class StorageServiceDataConnectorParserTest {
                         TestSources.SP_ENTITY_ID);
         
         final Map<String,IdPAttribute> attrs = connector.resolve(context);
+        assert attrs != null;
 
         assertEquals(attrs.size(), 2);
         
@@ -189,7 +199,9 @@ public class StorageServiceDataConnectorParserTest {
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(0)).getValue(), "bar1");
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(1)).getValue(), "bar2");
         
-        assertTrue(connector.getResultsCache().size() == 1);
+        final Cache<String, Map<String, IdPAttribute>> cache = connector.getResultsCache();
+        assert cache != null;
+        assertTrue(cache.size() == 1);
     }
     
     private StorageServiceDataConnector getDataConnector(final PropertySource<?> propSource, final String... beanDefinitions)
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/failfast/AttributeResolverFailFastTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/failfast/AttributeResolverFailFastTest.java
index 1d71f2130..c104da3b5 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/failfast/AttributeResolverFailFastTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/failfast/AttributeResolverFailFastTest.java
@@ -24,6 +24,8 @@ import static org.testng.Assert.assertNull;
 import java.io.IOException;
 import java.util.Optional;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.sql.DataSource;
 
 import org.springframework.core.io.ClassPathResource;
@@ -35,6 +37,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.spring.dc.rdbms.impl.RDBMSDataConnectorParserTest;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.service.ReloadableService;
 import net.shibboleth.shared.service.ServiceableComponent;
 import net.shibboleth.shared.testing.DatabaseTestingSupport;
@@ -45,12 +48,12 @@ import net.shibboleth.shared.testing.InMemoryDirectory;
 @SuppressWarnings({"unchecked", "javadoc"})
 public class AttributeResolverFailFastTest extends AbstractFailFastTest {
     
-    protected String getPath() {
+    @Nonnull @NotEmpty protected String getPath() {
         return "/net/shibboleth/idp/attribute/resolver/failfast/";
     }
     
-    private InMemoryDirectory directoryServer;
-    private DataSource datasource;
+    @Nullable private InMemoryDirectory directoryServer;
+    @Nullable private DataSource datasource;
 
     @BeforeClass(enabled = false) public void setupDirectoryServer() {
         //
@@ -78,7 +81,9 @@ public class AttributeResolverFailFastTest extends AbstractFailFastTest {
             if (directoryServer.openConnectionCount() > 0) {
                 Thread.sleep(100);
             }
+            assert directoryServer != null;
             assertEquals(directoryServer.openConnectionCount(), 0);
+            assert directoryServer != null;
             directoryServer.stop(true);
         }
     }
@@ -87,7 +92,10 @@ public class AttributeResolverFailFastTest extends AbstractFailFastTest {
        final Object bean = getBean(props, "attributeResolverBeansDefaultFF.xml");
        final ReloadableService<AttributeResolver > service = (ReloadableService<AttributeResolver>) bean;
        assertNotNull(service);
-       final AttributeResolver resolver = service.getServiceableComponent().getComponent();
+       final ServiceableComponent<AttributeResolver> component = service.getServiceableComponent();
+       assertNotNull(component);
+       assert component != null;
+       final AttributeResolver resolver = component.getComponent();
        assertNotNull(resolver);
     }
 

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


More information about the commits mailing list