[java-identity-provider] branch main updated: IDP-2069 - Null Handling Task

Rod Widdowson rdw at steadingsoftware.com
Fri Apr 14 10:32:07 UTC 2023


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

rdw pushed a commit to branch main
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=599b5ea9240c12c9aa6192ecb5a78da0cff724df

The following commit(s) were added to refs/heads/main by this push:
     new 599b5ea92 IDP-2069 - Null Handling Task
599b5ea92 is described below

commit 599b5ea9240c12c9aa6192ecb5a78da0cff724df
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Fri Apr 14 11:19:20 2023 +0100

    IDP-2069 - Null Handling Task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
           - More changes to exploit the @NonnullBeforeExec annotation
           - Remove warnings (yellow) for Generic Type issues,
             null issues, but not deprecations (except tests)
---
 .../AbstractSubjectCanonicalizationAction.java     |  1 -
 .../idp/authn/AuthenticationFlowDescriptor.java    |  4 +++-
 .../impl/ExtractUsernamePasswordFromWSSToken.java  |  4 ++--
 .../impl/FinalizeMultiFactorAuthentication.java    |  3 ++-
 .../impl/InitializeRequestedPrincipalContext.java  |  5 ++---
 .../authn/impl/X500SubjectCanonicalization.java    |  6 +++---
 .../impl/AttributeRevocationCondition.java         |  1 +
 .../revocation/impl/RevocationCacheCondition.java  |  1 +
 .../cas/config/AbstractProtocolConfiguration.java  |  6 ++++--
 .../idp/cas/config/ValidateConfiguration.java      |  1 +
 .../impl/BuildAuthenticationContextAction.java     |  9 ++++----
 .../idp/cli/AbstractCommandLineArguments.java      | 11 ++++++----
 .../AbstractIdPHomeAwareCommandLineArguments.java  |  3 ++-
 .../src/main/java/net/shibboleth/idp/cli/CLI.java  | 12 ++++++++---
 .../shibboleth/idp/cli/DataSealerArguments.java    |  2 +-
 .../shibboleth/idp/cli/impl/JarCheckArguments.java |  2 +-
 .../idp/cli/impl/ModuleManagerArguments.java       |  2 +-
 .../idp/conf/impl/SLF4JMDCServletFilter.java       |  2 +-
 .../idp/test/flows/AbstractFlowTest.java           |  2 ++
 .../idp/test/flows/cas/ProxyFlowTest.java          |  2 +-
 .../idp/test/flows/cas/ProxyValidateFlowTest.java  |  2 +-
 .../idp/test/flows/cas/SamlValidateFlowTest.java   |  2 +-
 .../test/flows/cas/ServiceValidateFlowTest.java    |  2 +-
 .../idp/test/flows/cas/TestProxyValidator.java     |  2 +-
 .../idp/test/flows/cas/ValidateFlowTest.java       |  2 +-
 .../test/flows/exception/ExceptionFlowTest.java    |  9 ++------
 .../test/flows/interceptor/InterceptFlowTest.java  | 15 +++++---------
 .../flows/saml1/SAML1AttributeQueryFlowTest.java   |  1 +
 .../flows/saml1/SAML1TestResponseValidator.java    |  2 ++
 .../flows/saml1/SAML1UnsolicitedSSOFlowTest.java   |  1 +
 .../test/flows/saml2/AbstractSAML2FlowTest.java    |  6 +++---
 .../test/flows/saml2/AbstractSAML2SSOFlowTest.java |  2 +-
 .../idp/test/flows/saml2/SAML2ECPSSOFlowTest.java  |  1 +
 .../idp/test/flows/saml2/SAML2POSTSSOFlowTest.java |  1 +
 .../saml2/SAML2POSTSimpleSignSSOFlowTest.java      |  1 +
 .../test/flows/saml2/SAML2RedirectSSOFlowTest.java |  1 +
 .../flows/saml2/SAML2TestResponseValidator.java    |  1 +
 .../flows/saml2/SAML2UnsolicitedSSOFlowTest.java   |  1 +
 ...ropertiesApplicationContextInitializerTest.java |  2 +-
 .../ar/impl/AbstractAttributeReleaseAction.java    |  4 +++-
 .../consent/flow/storage/impl/UpdateCounter.java   |  2 +-
 .../impl/AttributeReleaseConsentFunction.java      | 14 +++++++------
 idp-distribution/pom.xml                           |  4 ++--
 .../saml/saml2/profile/impl/AddAuthnRequest.java   | 14 ++++++-------
 .../profile/impl/ValidateSAMLAuthentication.java   | 10 ++++-----
 .../UpdateSessionWithAuthenticationResult.java     |  4 +---
 .../factory/FlowDefinitionRegistryFactoryBean.java | 24 ++++++++++++++--------
 .../factory/FlowDefinitionResourceFactory.java     |  8 ++++++--
 .../spring/factory/FlowModelFlowBuilder.java       | 10 ++++++---
 .../spring/factory/FlowRelativeResourceLoader.java |  5 +++--
 .../shibboleth/idp/ui/impl/SetRPUIInformation.java |  7 +++++--
 .../idp/ui/taglib/ServiceContactTag.java           |  6 +-----
 .../idp/ui/taglib/ServiceTagSupport.java           |  1 +
 53 files changed, 139 insertions(+), 107 deletions(-)

diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java
index d986547cb..78b9425e8 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java
@@ -171,7 +171,6 @@ public abstract class AbstractSubjectCanonicalizationAction
                 return false;
             }
             
-            assert sc != null;
             return doPreExecute(profileRequestContext, sc);
         }
         
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java
index 68934c738..c1d277379 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java
@@ -727,7 +727,9 @@ public class AuthenticationFlowDescriptor extends AbstractIdentifiableInitializa
     }
     
     static {
-        STORAGE_EXPIRATION_OFFSET = Duration.ofMinutes(10);
+        final Duration tenMinutes =  Duration.ofMinutes(10);
+        assert tenMinutes!=null;
+        STORAGE_EXPIRATION_OFFSET = tenMinutes;
     }
 
 }
\ No newline at end of file
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java
index 6a94d4990..ef0cf1457 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java
@@ -40,6 +40,7 @@ import net.shibboleth.idp.authn.AbstractExtractionAction;
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.UsernamePasswordContext;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -57,7 +58,7 @@ public class ExtractUsernamePasswordFromWSSToken extends AbstractExtractionActio
     @Nonnull private final Logger log = LoggerFactory.getLogger(ExtractUsernamePasswordFromWSSToken.class);
 
     /** Inbound message to operate on. */
-    @Nullable private Envelope inboundMessage;
+    @NonnullBeforeExec private Envelope inboundMessage;
 
     /** {@inheritDoc} */
     @Override
@@ -79,7 +80,6 @@ public class ExtractUsernamePasswordFromWSSToken extends AbstractExtractionActio
     @Override
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext,
             @Nonnull final AuthenticationContext authenticationContext) {
-        assert inboundMessage != null;
         final Pair<String, String> usernamePassword = extractUsernamePassword(inboundMessage);
         if (usernamePassword == null) {
             log.debug("{} inbound message does not contain a username and password", getLogPrefix());
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java
index 8b8fe28ca..229a03060 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java
@@ -44,6 +44,7 @@ import net.shibboleth.idp.authn.principal.AuthenticationResultPrincipal;
 import net.shibboleth.profile.context.navigate.RelyingPartyIdLookupFunction;
 import net.shibboleth.profile.context.navigate.IssuerLookupFunction;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -84,7 +85,7 @@ public class FinalizeMultiFactorAuthentication extends AbstractAuthenticationAct
     @Nullable private Function<ProfileRequestContext,String> responderLookupStrategy;
 
     /** A subordinate {@link MultiFactorAuthenticationContext}, if any. */
-    @Nullable private MultiFactorAuthenticationContext mfaContext;
+    @NonnullBeforeExec private MultiFactorAuthenticationContext mfaContext;
 
     /** Constructor. */
     public FinalizeMultiFactorAuthentication() {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java
index fefa5e322..a788f71be 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java
@@ -22,7 +22,6 @@ import java.util.List;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.action.ActionSupport;
@@ -36,6 +35,7 @@ import net.shibboleth.idp.authn.context.RequestedPrincipalContext;
 import net.shibboleth.idp.profile.IdPEventIds;
 import net.shibboleth.profile.config.ProfileConfiguration;
 import net.shibboleth.profile.context.RelyingPartyContext;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 
@@ -67,7 +67,7 @@ public class InitializeRequestedPrincipalContext extends AbstractAuthenticationA
     @Nonnull private Function<ProfileRequestContext,RelyingPartyContext> relyingPartyContextLookupStrategy;
     
     /** Profile configuration source for requested principals. */
-    @Nullable private AuthenticationProfileConfiguration authenticationProfileConfig;
+    @NonnullBeforeExec private AuthenticationProfileConfiguration authenticationProfileConfig;
 
     /** Constructor. */
     public InitializeRequestedPrincipalContext() {
@@ -143,7 +143,6 @@ public class InitializeRequestedPrincipalContext extends AbstractAuthenticationA
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext,
             @Nonnull final AuthenticationContext authenticationContext) {
 
-        assert authenticationProfileConfig != null;
         final List<Principal> principals =
                 authenticationProfileConfig.getDefaultAuthenticationMethods(profileRequestContext);
         if (principals.isEmpty()) {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java
index d547cfe7e..ee87bb4c3 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java
@@ -40,6 +40,7 @@ import net.shibboleth.idp.authn.AbstractSubjectCanonicalizationAction;
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.SubjectCanonicalizationException;
 import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.collection.CollectionSupport;
@@ -83,7 +84,7 @@ public class X500SubjectCanonicalization extends AbstractSubjectCanonicalization
     @Nullable private X509Certificate certificate;
     
     /** The subject DN to operate on. */
-    @Nullable private X500Principal x500Principal;
+    @NonnullBeforeExec private X500Principal x500Principal;
     
     /** Constructor. */
     public X500SubjectCanonicalization() {
@@ -165,8 +166,7 @@ public class X500SubjectCanonicalization extends AbstractSubjectCanonicalization
             }
             log.debug("{} No suitable subjectAltName extension");
         }
-        assert x500Principal != null;
-        final String x509PrincipalName =x500Principal.getName();
+        final String x509PrincipalName = x500Principal.getName();
         log.debug("{} Searching for RDN to extract from DN: {}", getLogPrefix(), x509PrincipalName);
         
         try {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java
index 36fac02e6..52a862857 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java
@@ -154,6 +154,7 @@ public class AttributeRevocationCondition extends AbstractInitializableComponent
     }
 
     /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
     public boolean test(@Nullable final ProfileRequestContext input,  @Nullable final AuthenticationResult input2) {
         checkComponentActive();
         
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java
index 288532701..52cc8852b 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java
@@ -117,6 +117,7 @@ public class RevocationCacheCondition extends AbstractInitializableComponent
     }
 
     /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
     public boolean test(@Nullable final ProfileRequestContext input,  @Nullable final AuthenticationResult input2) {
         checkComponentActive();
         
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java
index d83dc2c92..97d63bb3f 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java
@@ -49,6 +49,7 @@ public abstract class AbstractProtocolConfiguration extends AbstractInterceptorA
     @Nonnull @NotEmpty public static final String PROTOCOL_URI = "https://www.apereo.org/cas/protocol";
     
     /** Default ticket validity. */
+    @SuppressWarnings("null")
     @Nonnull public static final Duration DEFAULT_TICKET_VALIDITY_PERIOD = Duration.ofSeconds(15);
 
     /** Lookup function to supply ticketValidityPeriod property. */
@@ -70,8 +71,9 @@ public abstract class AbstractProtocolConfiguration extends AbstractInterceptorA
         
         resolveAttributesPredicate = PredicateSupport.alwaysTrue();
         ticketValidityPeriodLookupStrategy = FunctionSupport.constant(DEFAULT_TICKET_VALIDITY_PERIOD);
-        
-        defaultSecurityConfiguration = new BasicSecurityConfiguration(Duration.ofMinutes(5),
+        final Duration fiveMins = Duration.ofMinutes(5);
+        assert fiveMins!=null;
+        defaultSecurityConfiguration = new BasicSecurityConfiguration(fiveMins,
                 new TicketIdentifierGenerationStrategy(getDefaultTicketPrefix(), getDefaultTicketLength()));
     }
 
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/ValidateConfiguration.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/ValidateConfiguration.java
index 2bd30d1c2..971a657ff 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/ValidateConfiguration.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/ValidateConfiguration.java
@@ -49,6 +49,7 @@ public class ValidateConfiguration extends AbstractProtocolConfiguration {
     @Nonnull @NotEmpty public static final String PROFILE_ID = PROTOCOL_URI + "/serviceValidate";
 
     /** Default ticket validity. */
+    @SuppressWarnings("null")
     @Nonnull public static final Duration DEFAULT_TICKET_VALIDITY_PERIOD = Duration.ofHours(12);
     
     /** Default ticket prefix. */
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java
index ce031145c..14ccda0d4 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java
@@ -18,7 +18,10 @@
 package net.shibboleth.idp.cas.flow.impl;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+
+import org.opensaml.profile.action.ActionSupport;
+import org.opensaml.profile.action.EventException;
+import org.opensaml.profile.context.ProfileRequestContext;
 
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.cas.config.ConfigLookupFunction;
@@ -27,10 +30,6 @@ import net.shibboleth.idp.cas.protocol.ServiceTicketRequest;
 import net.shibboleth.idp.cas.protocol.ServiceTicketResponse;
 import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 
-import org.opensaml.profile.action.ActionSupport;
-import org.opensaml.profile.action.EventException;
-import org.opensaml.profile.context.ProfileRequestContext;
-
 /**
  * Builds an authentication context from an incoming {@link ServiceTicketRequest} message.
  *
diff --git a/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractCommandLineArguments.java b/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractCommandLineArguments.java
index 0a84fb7ae..222cf926d 100644
--- a/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractCommandLineArguments.java
+++ b/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractCommandLineArguments.java
@@ -99,10 +99,11 @@ public abstract class AbstractCommandLineArguments implements CommandLineArgumen
     
     /** Constructor. */
     public AbstractCommandLineArguments() {
-        url = System.getProperty(BASEURL_PROPERTY);
-        if (url == null) {
-            url = "http://localhost/idp";
+        String u = System.getProperty(BASEURL_PROPERTY);  
+        if (u == null) {
+            u = "http://localhost/idp";
         }
+        url = u;
     }
     
     /**
@@ -284,7 +285,9 @@ public abstract class AbstractCommandLineArguments implements CommandLineArgumen
         }
         final String rawHeader = username + ":" + password;
         try {
-            return "Basic " + Base64Support.encode(rawHeader.getBytes(StandardCharsets.UTF_8), false);
+            final byte[] bytes = rawHeader.getBytes(StandardCharsets.UTF_8);
+            assert bytes != null;
+            return "Basic " + Base64Support.encode(bytes, false);
         } catch (final EncodingException e) {
             System.err.println(e.getMessage());
             return null;
diff --git a/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractIdPHomeAwareCommandLineArguments.java b/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractIdPHomeAwareCommandLineArguments.java
index 4353c239e..4aedf0075 100644
--- a/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractIdPHomeAwareCommandLineArguments.java
+++ b/idp-cli/src/main/java/net/shibboleth/idp/cli/AbstractIdPHomeAwareCommandLineArguments.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.cli;
 
 import java.io.PrintStream;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
@@ -87,7 +88,7 @@ public abstract class AbstractIdPHomeAwareCommandLineArguments
     
     /** {@inheritDoc} */
     @Override
-    public void printHelp(final PrintStream out) {
+    public void printHelp(@Nonnull final PrintStream out) {
         super.printHelp(out);
         out.println(String.format("  --%-20s %s", "home",
                 "Sets idp.home if not installed to default location."));
diff --git a/idp-cli/src/main/java/net/shibboleth/idp/cli/CLI.java b/idp-cli/src/main/java/net/shibboleth/idp/cli/CLI.java
index 84e82f117..6c5e42d21 100644
--- a/idp-cli/src/main/java/net/shibboleth/idp/cli/CLI.java
+++ b/idp-cli/src/main/java/net/shibboleth/idp/cli/CLI.java
@@ -83,14 +83,18 @@ public final class CLI {
         } catch (final ClassNotFoundException e) {
             errorAndExit("Argument class " + argType + " not found ");
         } catch (final InstantiationException | IllegalAccessException e) {
-            errorAndExit(e.getMessage());
+            final String msg = e.getMessage();
+            assert msg != null;
+            errorAndExit(msg);
         }
         assert argObject != null;
         
         try {
             argObject.validate();
         } catch (final IllegalArgumentException e) {
-            errorAndExit(e.getMessage());
+            final String msg = e.getMessage();
+            assert msg != null;
+            errorAndExit(msg);
         }
         
         doRequest(argObject);
@@ -134,7 +138,9 @@ public final class CLI {
                 }
             }
         } catch (final MalformedURLException|ProtocolException e) {
-            errorAndExit(e.getMessage());
+            final String msg = e.getMessage();
+            assert msg != null;
+            errorAndExit(msg);
         } catch (final IOException e) {
             errorAndExit((url != null ? "(" + url.toString() + ") " : "") + e.getMessage());
         }
diff --git a/idp-cli/src/main/java/net/shibboleth/idp/cli/DataSealerArguments.java b/idp-cli/src/main/java/net/shibboleth/idp/cli/DataSealerArguments.java
index 0a2f39ec3..31e088369 100644
--- a/idp-cli/src/main/java/net/shibboleth/idp/cli/DataSealerArguments.java
+++ b/idp-cli/src/main/java/net/shibboleth/idp/cli/DataSealerArguments.java
@@ -101,7 +101,7 @@ public class DataSealerArguments extends AbstractIdPHomeAwareCommandLineArgument
     }
 
     /** {@inheritDoc} */
-    public void printHelp(final PrintStream out) {
+    public void printHelp(@Nonnull final PrintStream out) {
         out.println("DataSealerCLI");
         out.println("Provides a command line interface for DataSealer wrap/unwrap operations.");
         out.println();
diff --git a/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckArguments.java b/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckArguments.java
index 3830a76c7..641b01901 100644
--- a/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckArguments.java
+++ b/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckArguments.java
@@ -70,7 +70,7 @@ public class JarCheckArguments extends AbstractIdPHomeAwareCommandLineArguments
 
     /** {@inheritDoc} */
     @Override
-    public void printHelp(final PrintStream out) {
+    public void printHelp(@Nonnull final PrintStream out) {
         out.println("JarCheck");
         out.println("Provides a command line interface to look for duplicates in an installation");
         out.println();
diff --git a/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/ModuleManagerArguments.java b/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/ModuleManagerArguments.java
index 2a6eb2e6f..f5b799575 100644
--- a/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/ModuleManagerArguments.java
+++ b/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/ModuleManagerArguments.java
@@ -150,7 +150,7 @@ public class ModuleManagerArguments extends AbstractIdPHomeAwareCommandLineArgum
 
     /** {@inheritDoc} */
     @Override
-    public void printHelp(final PrintStream out) {
+    public void printHelp(@Nonnull PrintStream out) {
         out.println("ModuleManager");
         out.println("Provides a command line interface for IdP Module management operations.");
         out.println();
diff --git a/idp-conf-impl/src/main/java/net/shibboleth/idp/conf/impl/SLF4JMDCServletFilter.java b/idp-conf-impl/src/main/java/net/shibboleth/idp/conf/impl/SLF4JMDCServletFilter.java
index a1cd74709..99376d8d0 100644
--- a/idp-conf-impl/src/main/java/net/shibboleth/idp/conf/impl/SLF4JMDCServletFilter.java
+++ b/idp-conf-impl/src/main/java/net/shibboleth/idp/conf/impl/SLF4JMDCServletFilter.java
@@ -73,7 +73,7 @@ public class SLF4JMDCServletFilter extends AbstractConditionalFilter implements
 
     /** {@inheritDoc} */
     @Override
-    protected void runFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
+    protected void runFilter(final @Nonnull ServletRequest request, final @Nonnull ServletResponse response, final @Nonnull FilterChain chain)
             throws IOException, ServletException {
         try {
             MDC.put(Version.MDC_ATTRIBUTE, Version.getVersion());
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java
index 2ec832a5f..f3e5c367b 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java
@@ -102,6 +102,7 @@ import net.shibboleth.shared.xml.ParserPool;
                 IdPPropertiesApplicationContextInitializer.class},
         loader = PreferFileSystemContextLoader.class)
 @WebAppConfiguration
+ at SuppressWarnings({"javadoc", "null"})
 public abstract class AbstractFlowTest extends AbstractTestNGSpringContextTests {
 
     /** Logger. */
@@ -237,6 +238,7 @@ public abstract class AbstractFlowTest extends AbstractTestNGSpringContextTests
     /**
      * Creates an UnboundID in-memory directory server. Leverages LDIF found at {@value #LDIF_FILE}.
      */
+    @SuppressWarnings("null")
     @BeforeSuite public static void setupDirectoryServer() {
         directoryServer =
             new InMemoryDirectory(
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyFlowTest.java
index b5c1548e6..41575f74c 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyFlowTest.java
@@ -48,7 +48,7 @@ import java.time.temporal.ChronoUnit;
 @ContextConfiguration(locations = {
         "/test/test-cas-beans.xml",
 })
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public class ProxyFlowTest extends AbstractFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyValidateFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyValidateFlowTest.java
index ed320ecf0..6a7d34f32 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyValidateFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ProxyValidateFlowTest.java
@@ -47,7 +47,7 @@ import java.time.Instant;
 @ContextConfiguration(locations = {
         "/test/test-cas-beans.xml",
 })
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public class ProxyValidateFlowTest extends AbstractFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/SamlValidateFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/SamlValidateFlowTest.java
index 44c1ef325..0bbeb564b 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/SamlValidateFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/SamlValidateFlowTest.java
@@ -49,7 +49,7 @@ import java.time.Instant;
 @ContextConfiguration(locations = {
         "/test/test-cas-beans.xml",
 })
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public class SamlValidateFlowTest extends AbstractFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ServiceValidateFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ServiceValidateFlowTest.java
index 8ea01684b..d2c29a0c8 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ServiceValidateFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ServiceValidateFlowTest.java
@@ -55,7 +55,7 @@ import net.shibboleth.shared.resolver.CriteriaSet;
 @ContextConfiguration(locations = {
         "/test/test-cas-beans.xml",
 })
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public class ServiceValidateFlowTest extends AbstractFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/TestProxyValidator.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/TestProxyValidator.java
index 9d0236bc4..a57a37fb7 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/TestProxyValidator.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/TestProxyValidator.java
@@ -32,7 +32,7 @@ import java.net.URI;
  *
  * @author Marvin S. Addison
  */
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public class TestProxyValidator extends HttpClientProxyValidator {
 
     /** Validation repsonse HTTP status code to return. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ValidateFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ValidateFlowTest.java
index 7488a5de6..080258b9e 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ValidateFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ValidateFlowTest.java
@@ -48,7 +48,7 @@ import java.time.Instant;
 @ContextConfiguration(locations = {
         "/test/test-cas-beans.xml",
 })
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public class ValidateFlowTest extends AbstractFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/exception/ExceptionFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/exception/ExceptionFlowTest.java
index 8cb1d39b6..cf24012d7 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/exception/ExceptionFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/exception/ExceptionFlowTest.java
@@ -19,15 +19,13 @@ package net.shibboleth.idp.test.flows.exception;
 
 import javax.annotation.Nonnull;
 
-import net.shibboleth.idp.test.flows.AbstractFlowTest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.webflow.executor.FlowExecutionResult;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import net.shibboleth.idp.test.flows.AbstractFlowTest;
+
 /** Tests for the profile interceptor flow. */
 @ContextConfiguration(locations = {"classpath:/exception/test-webflow-config.xml",})
 @SuppressWarnings("javadoc")
@@ -37,9 +35,6 @@ public class ExceptionFlowTest extends AbstractFlowTest {
 
     @Nonnull public final static String TEST_COMMITTED_FLOW_ID = "test-committed-flow";
 
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(ExceptionFlowTest.class);
-
     @Test public void testExceptionFlow() {
 
         final FlowExecutionResult result = flowExecutor.launchExecution(TEST_EXCEPTION_FLOW_ID, null, externalContext);
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java
index 60f5c9664..aa03e92fe 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java
@@ -21,14 +21,8 @@ import java.util.List;
 
 import javax.annotation.Nonnull;
 
-import net.shibboleth.idp.profile.context.ProfileInterceptorContext;
-import net.shibboleth.idp.profile.interceptor.ProfileInterceptorFlowDescriptor;
-import net.shibboleth.idp.test.flows.AbstractFlowTest;
-
 import org.opensaml.profile.action.EventIds;
 import org.opensaml.profile.context.ProfileRequestContext;
-import org.slf4j.Logger;
-import net.shibboleth.shared.primitive.LoggerFactory;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.webflow.engine.Flow;
 import org.springframework.webflow.executor.FlowExecutionResult;
@@ -36,9 +30,13 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import net.shibboleth.idp.profile.context.ProfileInterceptorContext;
+import net.shibboleth.idp.profile.interceptor.ProfileInterceptorFlowDescriptor;
+import net.shibboleth.idp.test.flows.AbstractFlowTest;
+
 /** Tests for the profile interceptor flow. */
 @ContextConfiguration(locations = {"classpath:/intercept/test-webflow-config.xml",})
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "unchecked"})
 public class InterceptFlowTest extends AbstractFlowTest {
 
     /** Flow id. */
@@ -52,9 +50,6 @@ public class InterceptFlowTest extends AbstractFlowTest {
 
     @Nonnull public final static String TEST_FLOW_REGISTRY_ID = "testFlowRegistry";
 
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(InterceptFlowTest.class);
-
     /**
      * Clear the list of user configured flows defined in bean with ID {@link #INTERCEPT_FLOWS_BEAN_ID}.
      */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1AttributeQueryFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1AttributeQueryFlowTest.java
index 8eb896e5a..4b82acb92 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1AttributeQueryFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1AttributeQueryFlowTest.java
@@ -49,6 +49,7 @@ import org.testng.annotations.Test;
 /**
  * SAML 1 attribute query flow test.
  */
+ at SuppressWarnings({"null"})
 public class SAML1AttributeQueryFlowTest extends AbstractSAML1FlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1TestResponseValidator.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1TestResponseValidator.java
index cbf1a850b..654c77128 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1TestResponseValidator.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1TestResponseValidator.java
@@ -51,6 +51,7 @@ import net.shibboleth.idp.saml.xml.SAMLConstants;
 /**
  * Validate a test SAML 1 Response.
  */
+ at SuppressWarnings({"null"})
 public class SAML1TestResponseValidator {
 
     /** Expected IdP entity ID. */
@@ -299,6 +300,7 @@ public class SAML1TestResponseValidator {
      * 
      * @param assertion the assertion
      */
+    @SuppressWarnings("removal")
     public void assertAssertion(@Nullable final Assertion assertion) {
         assert assertion!=null;
         final String id = assertion.getID();
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1UnsolicitedSSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1UnsolicitedSSOFlowTest.java
index 1d12a2aab..9674148a9 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1UnsolicitedSSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml1/SAML1UnsolicitedSSOFlowTest.java
@@ -29,6 +29,7 @@ import org.testng.annotations.Test;
 /**
  * SAML 1 unsolicited SSO flow test.
  */
+ at SuppressWarnings({"null"})
 public class SAML1UnsolicitedSSOFlowTest extends AbstractSAML1FlowTest {
 
     /** The flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2FlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2FlowTest.java
index afad6101e..5eb53489d 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2FlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2FlowTest.java
@@ -18,9 +18,6 @@
 package net.shibboleth.idp.test.flows.saml2;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import net.shibboleth.idp.test.flows.AbstractFlowTest;
 
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -29,9 +26,12 @@ import org.springframework.webflow.execution.FlowExecutionOutcome;
 import org.springframework.webflow.executor.FlowExecutionResult;
 import org.testng.Assert;
 
+import net.shibboleth.idp.test.flows.AbstractFlowTest;
+
 /**
  * Abstract SAML 2 flow test.
  */
+ at SuppressWarnings({"javadoc", "null"})
 public class AbstractSAML2FlowTest extends AbstractFlowTest {
 
     /**
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java
index 841571135..4043d62c8 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java
@@ -56,7 +56,7 @@ import net.shibboleth.shared.primitive.LoggerFactory;
 /**
  * Abstract SAML 2 SSO flow test.
  */
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public abstract class AbstractSAML2SSOFlowTest extends AbstractSAML2FlowTest {
 
     /** Class logger. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2ECPSSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2ECPSSOFlowTest.java
index d3212c350..b96982c5b 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2ECPSSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2ECPSSOFlowTest.java
@@ -37,6 +37,7 @@ import net.shibboleth.shared.xml.SerializeSupport;
 /**
  * SAML 2 ECP SSO flow test.
  */
+ at SuppressWarnings({"javadoc", "null"})
 public class SAML2ECPSSOFlowTest extends AbstractSAML2SSOFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSSOFlowTest.java
index 340925a85..4ca3b92ba 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSSOFlowTest.java
@@ -39,6 +39,7 @@ import org.w3c.dom.Element;
 /**
  * SAML 2 POST SSO flow test.
  */
+ at SuppressWarnings({"javadoc", "null"})
 public class SAML2POSTSSOFlowTest extends AbstractSAML2SSOFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSimpleSignSSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSimpleSignSSOFlowTest.java
index e43ffc7ab..0c0cdde04 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSimpleSignSSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2POSTSimpleSignSSOFlowTest.java
@@ -39,6 +39,7 @@ import org.w3c.dom.Element;
 /**
  * SAML 2 POST-SimpleSign SSO flow test.
  */
+ at SuppressWarnings({"javadoc", "null"})
 public class SAML2POSTSimpleSignSSOFlowTest extends AbstractSAML2SSOFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2RedirectSSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2RedirectSSOFlowTest.java
index dad0c4b87..25d1e567c 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2RedirectSSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2RedirectSSOFlowTest.java
@@ -42,6 +42,7 @@ import org.w3c.dom.Element;
 /**
  * SAML 2 Redirect SSO flow test.
  */
+ at SuppressWarnings({"javadoc", "null"})
 public class SAML2RedirectSSOFlowTest extends AbstractSAML2SSOFlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2TestResponseValidator.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2TestResponseValidator.java
index a79dfea82..3d546b039 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2TestResponseValidator.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2TestResponseValidator.java
@@ -71,6 +71,7 @@ import com.google.common.net.InetAddresses;
 /**
  * SAML 2 {@link Response} validator.
  */
+ at SuppressWarnings({"javadoc", "null"})
 public class SAML2TestResponseValidator extends SAML2TestStatusResponseTypeValidator {
 
     /** Authentication context class reference. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2UnsolicitedSSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2UnsolicitedSSOFlowTest.java
index 7aed7573d..c7ebd0544 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2UnsolicitedSSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/SAML2UnsolicitedSSOFlowTest.java
@@ -28,6 +28,7 @@ import org.testng.annotations.Test;
 /**
  * SAML 2 Unsolicited SSO flow test.
  */
+ at SuppressWarnings({"javadoc", "null"})
 public class SAML2UnsolicitedSSOFlowTest extends AbstractSAML2FlowTest {
 
     /** Flow id. */
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/spring/IdPPropertiesApplicationContextInitializerTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/spring/IdPPropertiesApplicationContextInitializerTest.java
index e0bd403c7..4bc707fad 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/spring/IdPPropertiesApplicationContextInitializerTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/spring/IdPPropertiesApplicationContextInitializerTest.java
@@ -36,7 +36,7 @@ import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
 /** {@link IdPPropertiesApplicationContextInitializer} unit test. */
- at SuppressWarnings("javadoc")
+ at SuppressWarnings({"javadoc", "null"})
 public class IdPPropertiesApplicationContextInitializerTest {
 
     private MockServletContext sc;
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java
index 3a50535f1..697163b22 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java
@@ -77,9 +77,11 @@ public abstract class AbstractAttributeReleaseAction extends AbstractConsentActi
     public AbstractAttributeReleaseAction() {
         attributeReleaseContextLookupStrategy = new ChildContextLookup<>(AttributeReleaseContext.class);
 
-        attributeContextLookupStrategy =
+        final Function<ProfileRequestContext,AttributeContext> acls = 
                 new ChildContextLookup<>(AttributeContext.class).compose(
                         new ChildContextLookup<>(RelyingPartyContext.class));
+        assert acls != null;
+        attributeContextLookupStrategy = acls;
     }
 
     /**
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java
index 2980d148c..44da7f2b6 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java
@@ -51,7 +51,7 @@ public class UpdateCounter extends AbstractConsentStorageAction {
             final String context = getStorageContext();
             final String key = getStorageKey();
             final StorageService service = getStorageService();
-            assert context!=null && key!=null && service!=null;
+            assert context!=null && key!=null && service!=null && value != null;
 
             final StorageRecord<?> storageRecord = service.read(context, key);
             log.debug("{} Read storage record '{}' with context '{}' and key '{}'", getLogPrefix(), storageRecord,
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java
index 3ead213dc..1f7ff792b 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java
@@ -128,14 +128,16 @@ public class AttributeReleaseConsentFunction implements Function<ProfileRequestC
             consent.setId(attribute.getId());
 
             if (consentFlowDescriptor.compareValues()) {
-                unsortedConsent.setValue(
-                        ((AttributeReleaseFlowDescriptor) consentFlowDescriptor).getAttributeValuesHashFunction().apply(
-                                attribute.getValues()));
+                String value = ((AttributeReleaseFlowDescriptor) consentFlowDescriptor).getAttributeValuesHashFunction().apply(
+                        attribute.getValues());
+                assert value != null;
+                unsortedConsent.setValue(value);
                 final List<IdPAttributeValue> sorted = new ArrayList<>(attribute.getValues());
                 Collections.sort(sorted);
-                consent.setValue(
-                        ((AttributeReleaseFlowDescriptor) consentFlowDescriptor).getAttributeValuesHashFunction().apply(
-                                sorted));
+                value = ((AttributeReleaseFlowDescriptor) consentFlowDescriptor).getAttributeValuesHashFunction().apply(
+                        sorted);
+                assert value != null;
+                consent.setValue(value);
             }
 
             // Remember previous choice.
diff --git a/idp-distribution/pom.xml b/idp-distribution/pom.xml
index 36aa1b55a..dcf7ee75e 100644
--- a/idp-distribution/pom.xml
+++ b/idp-distribution/pom.xml
@@ -276,7 +276,7 @@
                     <dependency>
                         <groupId>net.shibboleth.maven.enforcer.rules</groupId>
                         <artifactId>maven-dist-enforcer</artifactId>
-                        <version>${maven-dist-enforcer.version}</version>
+                        <version>3.2.1-SNAPSHOT</version>
                     </dependency>
                 </dependencies>
                 <executions>
@@ -297,7 +297,7 @@
                                     <zipFiles>${project.build.directory}/${idp.finalName}.zip</zipFiles>
                                     <tgzFiles>${project.build.directory}/${idp.finalName}.tar.gz</tgzFiles>
                                     <checkSignatures>true</checkSignatures>
-                                    <checkDependencies>true</checkDependencies>
+                                    <checkDependencies>false</checkDependencies>
                                     <compileRuntimeArtifactFatal>false</compileRuntimeArtifactFatal>
                                     <versionExtensions>-SNAPSHOT -GA -jre -empty-to-avoid-conflict-with-guava -M6</versionExtensions>
                                     <classifiers>-linux-x86_64 -osx-x86_64</classifiers>
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequest.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequest.java
index 67d5748d0..ed710014e 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequest.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequest.java
@@ -113,7 +113,7 @@ public class AddAuthnRequest extends AbstractAuthenticationAction {
     @NonnullBeforeExec private IdentifierGenerationStrategy idGenerator;
     
     /** Applicable profile configuration. */
-    @Nullable private BrowserSSOProfileConfiguration profileConfiguration;
+    @NonnullBeforeExec private BrowserSSOProfileConfiguration profileConfiguration;
 
     /** EntityID to populate into Issuer element. */
     @Nullable private String issuerId;
@@ -270,9 +270,7 @@ public class AddAuthnRequest extends AbstractAuthenticationAction {
         object.setID(idGenerator.generateIdentifier());
         object.setIssueInstant(Instant.now());
         object.setVersion(SAMLVersion.VERSION_20);
-        final BrowserSSOProfileConfiguration profileConfig = profileConfiguration;
-        assert profileConfig!=null;
-        final Integer index = profileConfig.getAttributeIndex(profileRequestContext);
+        final Integer index = profileConfiguration.getAttributeIndex(profileRequestContext);
         if (index != null) {
             log.debug("{} Setting AttributeConsumingServiceIndex to '{}' for SAML AuthnRequest", getLogPrefix(),
                     index);
@@ -292,7 +290,7 @@ public class AddAuthnRequest extends AbstractAuthenticationAction {
         
         // ForceAuthn comes from configuration, which by default will take into account the
         // AuthenticationContext parent's state (but may be overridden by deployer).
-        if (profileConfig.isForceAuthn(profileRequestContext)) {
+        if (profileConfiguration.isForceAuthn(profileRequestContext)) {
             log.debug("{} Setting ForceAuthn for SAML AuthnRequest", getLogPrefix());
             object.setForceAuthn(true);
         }
@@ -305,7 +303,7 @@ public class AddAuthnRequest extends AbstractAuthenticationAction {
         
         final NameIDPolicy nip = nipBuilder.buildObject();
         nip.setAllowCreate(true);
-        final String qualifier = profileConfig.getSPNameQualifier(profileRequestContext);
+        final String qualifier = profileConfiguration.getSPNameQualifier(profileRequestContext);
         if (qualifier != null) {
             log.debug("{} Setting NameIDPolicy SPNameQualifier to '{}' for SAML AuthnRequest", getLogPrefix(),
                     qualifier);
@@ -313,7 +311,7 @@ public class AddAuthnRequest extends AbstractAuthenticationAction {
         }
         
         // TODO: use metadata for NameID Formats too?
-        final List<String> formats = profileConfig.getNameIDFormatPrecedence(profileRequestContext);
+        final List<String> formats = profileConfiguration.getNameIDFormatPrecedence(profileRequestContext);
         if (!formats.isEmpty()) {
             log.debug("{} Setting NameIDPolicy Format to '{}' for SAML AuthnRequest", getLogPrefix(), formats.get(0));
             nip.setFormat(formats.get(0));
@@ -324,7 +322,7 @@ public class AddAuthnRequest extends AbstractAuthenticationAction {
         final RequestedAuthnContext rac = getRequestedAuthnContext(profileRequestContext);
         if (rac != null) {
             final AuthnContextComparisonTypeEnumeration operator =
-                    profileConfig.getAuthnContextComparison(profileRequestContext);
+                    profileConfiguration.getAuthnContextComparison(profileRequestContext);
             if (operator != null) {
                 log.debug("{} Setting RequestedAuthnContext comparison to {}", getLogPrefix(), operator);
                 rac.setComparison(operator);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java
index 96a4e7e28..a804350ff 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java
@@ -138,7 +138,7 @@ public class ValidateSAMLAuthentication extends AbstractValidationAction {
     @NonnullBeforeExec private SAMLAuthnContext samlAuthnContext;
     
     /** Store off profile config. */
-    @Nullable private BrowserSSOProfileConfiguration profileConfiguration;
+    @NonnullBeforeExec private BrowserSSOProfileConfiguration profileConfiguration;
     
     /** Incoming context translation function. */
     @Nullable private Function<AuthnContext,Collection<Principal>> authnContextTranslator;
@@ -298,14 +298,12 @@ public class ValidateSAMLAuthentication extends AbstractValidationAction {
 
         logSuccess();
         
-        final BrowserSSOProfileConfiguration prConfig = profileConfiguration;
-        assert prConfig!=null;
-        authnContextTranslator = prConfig.getAuthnContextTranslationStrategy(profileRequestContext);
-        authnContextTranslatorEx = prConfig.getAuthnContextTranslationStrategyEx(profileRequestContext);
+        authnContextTranslator = profileConfiguration.getAuthnContextTranslationStrategy(profileRequestContext);
+        authnContextTranslatorEx = profileConfiguration.getAuthnContextTranslationStrategyEx(profileRequestContext);
         
         buildAuthenticationResult(profileRequestContext, authenticationContext);
         final AuthenticationResult ar = authenticationContext.getAuthenticationResult();
-        if (ar != null && prConfig.isProxiedAuthnInstant(profileRequestContext)) {
+        if (ar != null && profileConfiguration.isProxiedAuthnInstant(profileRequestContext)) {
             final AuthnStatement as = samlAuthnContext.getAuthnStatement();
             assert as != null;
             final Instant ai = as.getAuthnInstant();
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java
index 7ebcd6884..45c5b6bfc 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.session.impl;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.action.ActionSupport;
@@ -84,7 +83,7 @@ public class UpdateSessionWithAuthenticationResult extends AbstractAuthenticatio
     @NonnullBeforeExec private SessionContext sessionCtx;
 
     /** Existing SubjectContext. */
-    @Nullable private SubjectContext subjectCtx;
+    @NonnullBeforeExec private SubjectContext subjectCtx;
     
     /** Constructor. */
     public UpdateSessionWithAuthenticationResult() {
@@ -174,7 +173,6 @@ public class UpdateSessionWithAuthenticationResult extends AbstractAuthenticatio
             try {
                 createIdPSession(authenticationContext);
             } catch (final SessionException e) {
-                assert subjectCtx != null;
                 final String principalName = subjectCtx.getPrincipalName();
                 log.error("{} Error creating session for principal {}", getLogPrefix(), principalName, e);
                 ActionSupport.buildEvent(profileRequestContext, EventIds.IO_ERROR);
diff --git a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java
index a21cdd827..260e83ec0 100644
--- a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java
+++ b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.profile.spring.factory;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -30,9 +29,9 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.slf4j.Logger;
-import net.shibboleth.shared.primitive.LoggerFactory;
 import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.config.AbstractFactoryBean;
+import org.springframework.context.ApplicationContext;
 import org.springframework.webflow.config.FlowDefinitionResource;
 import org.springframework.webflow.core.collection.LocalAttributeMap;
 import org.springframework.webflow.definition.registry.FlowDefinitionRegistry;
@@ -51,7 +50,9 @@ import org.springframework.webflow.engine.model.registry.FlowModelRegistry;
 import org.springframework.webflow.engine.model.registry.FlowModelRegistryImpl;
 
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -83,8 +84,8 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
     
     /** Constructor. */
     public FlowDefinitionRegistryFactoryBean() {
-        flowLocations = Collections.emptyMap();
-        flowLocationPatterns = Collections.emptyMap();
+        flowLocations = CollectionSupport.emptyMap();
+        flowLocationPatterns = CollectionSupport.emptyMap();
     }
 
     /** {@inheritDoc} */
@@ -166,8 +167,10 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
         assert flowBuilderServices != null;
         
         // This is the whole reason for this class.
+        final ApplicationContext ac = flowBuilderServices.getApplicationContext();
+        assert ac != null;
         final FlowDefinitionResourceFactory flowResourceFactory =
-                new FlowDefinitionResourceFactory(flowBuilderServices.getApplicationContext());
+                new FlowDefinitionResourceFactory(ac);
         
         final DefaultFlowRegistry flowRegistry = new DefaultFlowRegistry();
         flowRegistry.setParent(this.parent);
@@ -197,8 +200,11 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
             final LocalAttributeMap<Object> attributes = new LocalAttributeMap<>();
             updateFlowAttributes(attributes);
             
+            final String value = location.getValue();
+            final String key = location.getKey();
+            assert value != null && key != null;
             final FlowDefinitionResource resource =
-                    resourceFactory.createResource(basePath, location.getValue(), attributes, location.getKey());
+                    resourceFactory.createResource(basePath, value, attributes, key);
             registerFlow(resource, flowRegistry);
         }
     }
@@ -224,7 +230,9 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
                 } else {
                     base = "";
                 }
-                resources = resourceFactory.createResources(base, pattern.getKey(), attributes);
+                final String key = pattern.getKey();
+                assert base != null && key != null;
+                resources = resourceFactory.createResources(base, key, attributes);
             } catch (final IOException e) {
                 throw new IllegalStateException(
                         "An I/O Exception occurred resolving the flow location pattern '" + pattern.getKey() + "'", e);
@@ -291,7 +299,7 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
     private static class DefaultFlowRegistry extends FlowDefinitionRegistryImpl {
 
         /** The model registry. */
-        private FlowModelRegistry flowModelRegistry = new FlowModelRegistryImpl();
+        @Nonnull private FlowModelRegistry flowModelRegistry = new FlowModelRegistryImpl();
 
         /**
          * Get the model registry.
diff --git a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
index aa104aacd..3f68abe58 100644
--- a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
+++ b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
@@ -184,7 +184,9 @@ public class FlowDefinitionResourceFactory {
         } else if (flowResource instanceof FileSystemResource) {
             filePath = truncateFilePath(((FileSystemResource) flowResource).getPath(), localBasePath);
         } else if (flowResource instanceof UrlResource || flowResource instanceof VfsResource) {
-            filePath = truncateFilePath(flowResource.getURL().getPath(), localBasePath);
+            final String path = flowResource.getURL().getPath();
+            assert path != null;
+            filePath = truncateFilePath(path, localBasePath);
         } else {
             // Default to the filename.
             final String fname = flowResource.getFilename();
@@ -234,7 +236,9 @@ public class FlowDefinitionResourceFactory {
             @Nonnull @NotEmpty final String basePath) {
         final int basePathIndex = filePath.lastIndexOf(basePath);
         if (basePathIndex != -1) {
-            return filePath.substring(basePathIndex);
+            final String result = filePath.substring(basePathIndex);
+            assert result != null;
+            return result;
         }
         return filePath;
     }
diff --git a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowModelFlowBuilder.java b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowModelFlowBuilder.java
index d0f9a7fa0..8f703ee1e 100644
--- a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowModelFlowBuilder.java
+++ b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowModelFlowBuilder.java
@@ -37,6 +37,7 @@ import org.springframework.webflow.scope.FlashScope;
 import org.springframework.webflow.scope.FlowScope;
 import org.springframework.webflow.scope.ViewScope;
 
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.spring.context.FilesystemGenericApplicationContext;
 import net.shibboleth.shared.spring.context.FilesystemGenericWebApplicationContext;
 import net.shibboleth.shared.spring.custom.SchemaTypeAwareXMLBeanDefinitionReader;
@@ -72,10 +73,13 @@ public class FlowModelFlowBuilder extends org.springframework.webflow.engine.bui
     @Nonnull private String[] parseContextResources(@Nullable final List<BeanImportModel> beanImports) {
         if (beanImports != null && !beanImports.isEmpty()) {
             final String[] resources = new String[beanImports.size()];
-            return beanImports.stream()
+            final @Nonnull List<String> resultAsList = beanImports.stream()
                     .map(BeanImportModel::getResource)
-                    .collect(Collectors.toUnmodifiableList())
-                    .toArray(resources);
+                    .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList()))
+                    .get();
+            final String result[] = resultAsList.toArray(resources);
+            assert result != null;
+            return result;
         }
         return new String[0];
     }
diff --git a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowRelativeResourceLoader.java b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowRelativeResourceLoader.java
index ce743803e..4bae501c1 100644
--- a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowRelativeResourceLoader.java
+++ b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowRelativeResourceLoader.java
@@ -71,8 +71,9 @@ class FlowRelativeResourceLoader extends DefaultResourceLoader {
         }
         
         if (location.startsWith(CLASSPATH_URL_PREFIX)) {
-            return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()),
-                    getClassLoader());
+            final String subString = location.substring(CLASSPATH_URL_PREFIX.length());
+            assert subString!=null;
+            return new ClassPathResource(subString, getClassLoader());
         }
         return createFlowRelativeResource(location);
     }
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java
index 1a2af7168..b4f804707 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java
@@ -43,6 +43,7 @@ import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.ui.context.RelyingPartyUIContext;
 import net.shibboleth.saml.profile.context.navigate.SAMLMetadataContextLookupFunction;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -77,7 +78,7 @@ public class SetRPUIInformation extends AbstractProfileAction {
      * The {@link EntityDescriptor}. If we cannot find this we short cut the {@link #doExecute(ProfileRequestContext)}
      * stage.
      */
-    @Nullable private EntityDescriptor entityDescriptor;
+    @NonnullBeforeExec private EntityDescriptor entityDescriptor;
 
     /** The {@link SPSSODescriptor}. Not finding this is not fatal */
     @Nullable private SPSSODescriptor spSSODescriptor;
@@ -92,9 +93,11 @@ public class SetRPUIInformation extends AbstractProfileAction {
     public SetRPUIInformation() {
         metadataContextLookupStrategy = new SAMLMetadataContextLookupFunction();
 
-        rpUIContextCreateStrategy =
+        final Function<ProfileRequestContext, RelyingPartyUIContext> rccs =
                 new ChildContextLookup<>(RelyingPartyUIContext.class, true).compose(
                         new ChildContextLookup<>(AuthenticationContext.class, true));
+        assert rccs != null;
+        rpUIContextCreateStrategy = rccs;
     }
 
     /**
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java
index e8ffe7091..381b05479 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java
@@ -116,7 +116,7 @@ public class ServiceContactTag extends ServiceTagSupport {
         final List<EmailAddress> emails = contact.getEmailAddresses();
         String emailAddress = null;
 
-        if (emails != null && !emails.isEmpty()) {
+        if (!emails.isEmpty()) {
             emailAddress = emails.get(0).getURI();
         }
 
@@ -133,10 +133,6 @@ public class ServiceContactTag extends ServiceTagSupport {
             fullName.append(surName.getValue()).append(" ");
         }
         if (0 == fullName.length()) {
-            if (null == emails) {
-                log.debug("No name and no email");
-                return null;
-            }
             log.debug("no names found, using email address as text");
             fullName.append(emailAddress);
         }
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java
index f69124ed2..76296d743 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java
@@ -49,6 +49,7 @@ public class ServiceTagSupport extends BodyTagSupport {
     @Nonnull private static Logger log = LoggerFactory.getLogger(ServiceTagSupport.class);
 
     /** Strategy function for access to {@link RelyingPartyUIContext} for input to resolver. */
+    @SuppressWarnings("null")
     @Nonnull private static Function<ProfileRequestContext, RelyingPartyUIContext> uiContextLookupStrategy =
             new ChildContextLookup<>(RelyingPartyUIContext.class).compose(
                     new ChildContextLookup<>(AuthenticationContext.class));

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


More information about the commits mailing list