[java-identity-provider] branch main updated: Fix null checking issues and eliminate use of outdated constructs.

Scott Cantor cantor.2 at osu.edu
Thu Jan 19 21:53:12 UTC 2023


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

scantor 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=8a7b6547752a0ffb9551e70d88172583386aba18

The following commit(s) were added to refs/heads/main by this push:
     new 8a7b65477 Fix null checking issues and eliminate use of outdated constructs.
8a7b65477 is described below

commit 8a7b6547752a0ffb9551e70d88172583386aba18
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Jan 19 16:53:09 2023 -0500

    Fix null checking issues and eliminate use of outdated constructs.
---
 .../idp/profile/AbstractProfileAction.java         | 37 +++++++++++++---------
 .../net/shibboleth/idp/profile/ActionSupport.java  |  2 +-
 .../net/shibboleth/idp/profile/ScriptedAction.java | 14 ++++----
 .../AbstractConditionalProfileConfiguration.java   |  5 ++-
 .../config/AbstractProfileConfiguration.java       |  5 ---
 .../profile/config/BasicSecurityConfiguration.java |  3 +-
 .../config/BasicXMLSecurityConfiguration.java      |  3 +-
 .../config/logic/DetailedErrorsPredicate.java      |  8 +++--
 .../config/logic/ResolveAttributesPredicate.java   |  8 +++--
 ...IdentifierGenerationStrategyLookupFunction.java |  6 ++--
 ...ignatureSigningConfigurationLookupFunction.java |  3 +-
 ...pClientSecurityConfigurationLookupFunction.java | 12 ++++---
 ...ignatureSigningConfigurationLookupFunction.java | 14 ++++----
 ...atureValidationConfigurationLookupFunction.java | 14 ++++----
 .../profile/context/MultiRelyingPartyContext.java  |  8 +----
 .../navigate/RelyingPartyContextLookupById.java    | 19 +++++------
 .../navigate/RelyingPartyContextLookupByLabel.java |  2 +-
 .../navigate/ResponderIdLookupFunction.java        | 14 ++++----
 .../navigate/ScriptedContextLookupFunction.java    |  4 +--
 .../navigate/SpringEventToViewLookupFunction.java  |  2 +-
 .../SpringStatusMessageLookupFunction.java         |  6 ++--
 .../WebFlowCurrentEventLookupFunction.java         | 18 +++++------
 ...wRequestContextProfileRequestContextLookup.java |  8 +++--
 .../AbstractProfileInterceptorAction.java          |  4 ++-
 .../profile/interceptor/ExternalInterceptor.java   |  1 +
 .../ProfileInterceptorFlowDescriptor.java          |  4 +--
 .../idp/profile/logic/DateAttributePredicate.java  | 10 +++---
 .../idp/profile/logic/LoopDetectionPredicate.java  |  7 +++-
 .../idp/profile/logic/RegexAttributePredicate.java |  1 +
 .../idp/profile/logic/ScriptedPredicate.java       |  5 +--
 .../profile/logic/SimpleAttributePredicate.java    |  5 +--
 .../profile/logic/SpringExpressionPredicate.java   |  2 +-
 .../relyingparty/RelyingPartyConfiguration.java    | 17 ++++------
 .../AbstractProfileInterceptorResultTest.java      | 23 +++-----------
 34 files changed, 155 insertions(+), 139 deletions(-)

diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
index d242857f2..22fb80229 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
@@ -28,7 +28,6 @@ import javax.annotation.concurrent.ThreadSafe;
 import net.shibboleth.idp.profile.context.SpringRequestContext;
 import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileRequestContextLookup;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
-import net.shibboleth.shared.component.ComponentSupport;
 import net.shibboleth.shared.logic.Constraint;
 
 import org.opensaml.profile.action.AbstractConditionalProfileAction;
@@ -77,7 +76,7 @@ public abstract class AbstractProfileAction
     @Nonnull private Function<RequestContext,ProfileRequestContext> profileContextLookupStrategy;
 
     /** MessageSource injected by Spring, typically the parent ApplicationContext itself. */
-    @Nonnull private MessageSource messageSource;
+    @Nullable private MessageSource messageSource;
     
     /**
      * Constructor.
@@ -113,9 +112,15 @@ public abstract class AbstractProfileAction
 
     /** {@inheritDoc} */
     @Override
-    @Nonnull public Event execute(@Nonnull final RequestContext springRequestContext) {
+    @Nullable public Event execute(@Nullable final RequestContext springRequestContext) {
         checkComponentActive();
 
+        if (springRequestContext == null) {
+            // Suspect this is impossible but SWF is not annotated as such.
+            log.error("{} Spring request context is not available", getLogPrefix());
+            return ActionSupport.buildEvent(this, EventIds.INVALID_PROFILE_CTX);
+        }
+        
         final ProfileRequestContext profileRequestContext =
                 profileContextLookupStrategy.apply(springRequestContext);
         if (profileRequestContext == null) {
@@ -142,12 +147,13 @@ public abstract class AbstractProfileAction
      * @param profileRequestContext a profile request context
      * @return a Web Flow event produced by the action
      */
-    @Nonnull protected Event doExecute(@Nonnull final RequestContext springRequestContext,
+    @Nullable protected Event doExecute(@Nonnull final RequestContext springRequestContext,
             @Nonnull final ProfileRequestContext profileRequestContext) {
         
         // Attach the Spring context to the context tree.
         final SpringRequestContext springSubcontext =
-                profileRequestContext.getSubcontext(SpringRequestContext.class, true);      
+                profileRequestContext.getOrCreateSubcontext(SpringRequestContext.class);
+        assert springSubcontext != null;
         springSubcontext.setRequestContext(springRequestContext);
 
         try {
@@ -171,7 +177,7 @@ public abstract class AbstractProfileAction
      * @param profileRequestContext the profile request context to examine
      * @return  an event based on the profile request context, or "proceed"
      */
-    @Nonnull protected Event getResult(@Nonnull final ProfileAction action,
+    @Nullable protected Event getResult(@Nonnull final ProfileAction action,
             @Nonnull final ProfileRequestContext profileRequestContext) {
         
         // Check for an EventContext on output.
@@ -180,13 +186,12 @@ public abstract class AbstractProfileAction
             final Object event = eventCtx.getEvent();
             
             if (event instanceof Event) {
-                return (Event) eventCtx.getEvent();
+                return (Event) event;
             } else if (event instanceof String) {
-                return ActionSupport.buildEvent(action, (String) eventCtx.getEvent());
+                return ActionSupport.buildEvent(action, (String) event);
             } else if (event instanceof AttributeMap) {
-                @SuppressWarnings("unchecked")
-                final AttributeMap<Object> map = (AttributeMap<Object>) eventCtx.getEvent();
-                return ActionSupport.buildEvent(action, map.getString("eventId", EventIds.PROCEED_EVENT_ID), map); 
+                final AttributeMap<Object> map = (AttributeMap<Object>) event;
+                return ActionSupport.buildEvent(action, map.getString("eventId", EventIds.PROCEED_EVENT_ID), map);
             }
         }
         
@@ -316,13 +321,14 @@ public abstract class AbstractProfileAction
     
     /** {@inheritDoc} */
     @Override
-    public void setMessageSource(final MessageSource source) {
+    public void setMessageSource(@Nullable final MessageSource source) {
         messageSource = source;
     }
 
     /** {@inheritDoc} */
     @Override
-    public String getMessage(final String code, final Object[] args, final String defaultMessage, final Locale locale) {
+    @Nullable public String getMessage(@Nonnull final String code, @Nullable final Object[] args,
+            @Nullable final String defaultMessage, @Nonnull final Locale locale) {
         if (messageSource != null) {
             return messageSource.getMessage(code, args, defaultMessage, locale);
         }
@@ -331,7 +337,8 @@ public abstract class AbstractProfileAction
 
     /** {@inheritDoc} */
     @Override
-    public String getMessage(final String code, final Object[] args, final Locale locale) {
+    @Nonnull public String getMessage(@Nonnull final String code, @Nullable final Object[] args,
+            @Nonnull final Locale locale) {
         if (messageSource != null) {
             return messageSource.getMessage(code, args, locale);
         }
@@ -340,7 +347,7 @@ public abstract class AbstractProfileAction
 
     /** {@inheritDoc} */
     @Override
-    public String getMessage(final MessageSourceResolvable resolvable, final Locale locale) {
+    @Nonnull public String getMessage(@Nonnull final MessageSourceResolvable resolvable, @Nonnull final Locale locale) {
         if (messageSource != null) {
             return messageSource.getMessage(resolvable, locale);
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java
index ec7bff5a1..d02254f6d 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java
@@ -69,7 +69,7 @@ public final class ActionSupport {
      * @return the constructed {@link Event}
      */
     @Nonnull public static Event buildEvent(@Nonnull final Object source, @Nonnull final String eventId,
-            @Nonnull final AttributeMap<Object> eventAttributes) {
+            @Nullable final AttributeMap<Object> eventAttributes) {
         Constraint.isNotNull(source, "Component cannot be null");
 
         final String trimmedEventId =
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java
index a7ddc3113..372dd4e9f 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java
@@ -119,7 +119,7 @@ public class ScriptedAction extends AbstractProfileAction {
     }
 
     /** {@inheritDoc} */
-    @Override public void doExecute(@Nullable final ProfileRequestContext profileContext) {
+    @Override public void doExecute(@Nonnull final ProfileRequestContext profileContext) {
 
         final String result = scriptEvaluator.execute(profileContext);
         if (result == null) {
@@ -141,7 +141,8 @@ public class ScriptedAction extends AbstractProfileAction {
      * @throws IOException if the file doesn't exist.
      */
     @SuppressWarnings("removal")
-    static public ScriptedAction resourceScript(@Nonnull @NotEmpty final String engineName, @Nonnull final Resource resource)
+    public static ScriptedAction resourceScript(@Nonnull @NotEmpty final String engineName,
+            @Nonnull final Resource resource)
             throws ScriptException, IOException {
         try (final InputStream is = resource.getInputStream()) {
             final EvaluableScript script = new EvaluableScript();
@@ -160,7 +161,8 @@ public class ScriptedAction extends AbstractProfileAction {
      * @throws ScriptException if the compile fails
      * @throws IOException if the file doesn't exist.
      */
-    static public ScriptedAction resourceScript(@Nonnull final Resource resource) throws ScriptException, IOException {
+    public static ScriptedAction resourceScript(@Nonnull final Resource resource)
+            throws ScriptException, IOException {
         return resourceScript(DEFAULT_ENGINE, resource);
     }
 
@@ -173,7 +175,7 @@ public class ScriptedAction extends AbstractProfileAction {
      * @throws ScriptException if the compile fails
      */
     @SuppressWarnings("removal")
-    static public ScriptedAction inlineScript(@Nonnull @NotEmpty final String engineName,
+    public static ScriptedAction inlineScript(@Nonnull @NotEmpty final String engineName,
             @Nonnull @NotEmpty final String scriptSource) throws ScriptException {
         final EvaluableScript script = new EvaluableScript();
                 script.setEngineName(engineName);
@@ -189,7 +191,7 @@ public class ScriptedAction extends AbstractProfileAction {
      * @return the predicate
      * @throws ScriptException if the compile fails
      */
-    static public ScriptedAction inlineScript(@Nonnull @NotEmpty final String scriptSource) throws ScriptException {
+    public static ScriptedAction inlineScript(@Nonnull @NotEmpty final String scriptSource) throws ScriptException {
         return inlineScript(DEFAULT_ENGINE, scriptSource);
     }
 
@@ -229,7 +231,7 @@ public class ScriptedAction extends AbstractProfileAction {
         /** {@inheritDoc} */
         @Override
         protected void prepareContext(@Nonnull final ScriptContext scriptContext, @Nullable final Object... input) {
-            scriptContext.setAttribute("profileContext", input[0], ScriptContext.ENGINE_SCOPE);
+            scriptContext.setAttribute("profileContext", input != null ? input[0] : null, ScriptContext.ENGINE_SCOPE);
         }
     }
     
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java
index 32f7b47b2..068b9bed4 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java
@@ -21,11 +21,10 @@ import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
-import com.google.common.base.Predicates;
-
 import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.PredicateSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -48,7 +47,7 @@ public abstract class AbstractConditionalProfileConfiguration extends AbstractPr
     public AbstractConditionalProfileConfiguration(@Nonnull @NotEmpty @ParameterName(name="id") final String id) {
         super(id);
         
-        activationCondition = Predicates.alwaysTrue();
+        activationCondition = PredicateSupport.alwaysTrue();
     }
 
     /** {@inheritDoc} */
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java
index 7c3eceab2..b99bf6cce 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java
@@ -37,8 +37,6 @@ import net.shibboleth.shared.logic.FunctionSupport;
 import net.shibboleth.shared.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Base class for {@link ProfileConfiguration} implementations. */
 public abstract class AbstractProfileConfiguration extends AbstractIdentifiableInitializableComponent
@@ -47,9 +45,6 @@ public abstract class AbstractProfileConfiguration extends AbstractIdentifiableI
     /** Default value for disallowedFeatures property. */
     @Nonnull public static final Integer DEFAULT_DISALLOWED_FEATURES = 0; 
 
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractProfileConfiguration.class);
-
     /** Lookup function to supply inboundFlows property. */
     @Nonnull private Function<ProfileRequestContext,List<String>> inboundFlowsLookupStrategy;
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicSecurityConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicSecurityConfiguration.java
index 453bdd29c..74fd7e47c 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicSecurityConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicSecurityConfiguration.java
@@ -64,7 +64,8 @@ public class BasicSecurityConfiguration implements SecurityConfiguration {
      * @param skew the clock skew, must be greater than 0
      * @param generator the identifier generator, must not be null
      */
-    public BasicSecurityConfiguration(@Nonnull final Duration skew, @Nonnull final IdentifierGenerationStrategy generator) {
+    public BasicSecurityConfiguration(@Nonnull final Duration skew,
+            @Nonnull final IdentifierGenerationStrategy generator) {
         Constraint.isNotNull(skew, "Clock skew cannot be null");
         Constraint.isFalse(skew.isNegative() || skew.isZero(), "Clock skew must be greater than 0");
         
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicXMLSecurityConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicXMLSecurityConfiguration.java
index 1f0261342..5de8ff089 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicXMLSecurityConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/BasicXMLSecurityConfiguration.java
@@ -61,7 +61,8 @@ public class BasicXMLSecurityConfiguration extends BasicSecurityConfiguration im
      * @param skew the clock skew, must be greater than 0
      * @param generator the identifier generator, must not be null
      */
-    public BasicXMLSecurityConfiguration(@Nonnull final Duration skew, @Nonnull final IdentifierGenerationStrategy generator) {
+    public BasicXMLSecurityConfiguration(@Nonnull final Duration skew,
+            @Nonnull final IdentifierGenerationStrategy generator) {
         super(skew, generator);
     }
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java
index ba3260010..f729c8b82 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java
@@ -21,6 +21,7 @@ import javax.annotation.Nullable;
 
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.profile.logic.AbstractRelyingPartyPredicate;
+import net.shibboleth.idp.relyingparty.RelyingPartyConfiguration;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -33,8 +34,11 @@ public class DetailedErrorsPredicate extends AbstractRelyingPartyPredicate {
     public boolean test(@Nullable final ProfileRequestContext input) {
         if (input != null) {
             final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
-            if (rpc != null && rpc.getConfiguration() != null) {
-                return rpc.getConfiguration().isDetailedErrors(input);
+            if (rpc != null) {
+                final RelyingPartyConfiguration config = rpc.getConfiguration();
+                if (config != null) {
+                    return config.isDetailedErrors(input);
+                }
             }
         }
         
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/ResolveAttributesPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/ResolveAttributesPredicate.java
index edfa3e6d7..1ce488de7 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/ResolveAttributesPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/ResolveAttributesPredicate.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.profile.config.logic;
 import javax.annotation.Nullable;
 
 import net.shibboleth.idp.profile.config.AttributeResolvingProfileConfiguration;
+import net.shibboleth.idp.profile.config.ProfileConfiguration;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.profile.logic.AbstractRelyingPartyPredicate;
 
@@ -36,8 +37,11 @@ public class ResolveAttributesPredicate extends AbstractRelyingPartyPredicate {
     public boolean test(@Nullable final ProfileRequestContext input) {
         if (input != null) {
             final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
-            if (rpc != null && rpc.getProfileConfig() instanceof AttributeResolvingProfileConfiguration) {
-                return ((AttributeResolvingProfileConfiguration) rpc.getProfileConfig()).isResolveAttributes(input);
+            if (rpc != null) {
+                final ProfileConfiguration pc = rpc.getProfileConfig();
+                if (pc instanceof AttributeResolvingProfileConfiguration) {
+                    return ((AttributeResolvingProfileConfiguration) pc).isResolveAttributes(input);
+                }
             }
         }
         
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/IdentifierGenerationStrategyLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/IdentifierGenerationStrategyLookupFunction.java
index 82c00b137..74eea7820 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/IdentifierGenerationStrategyLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/IdentifierGenerationStrategyLookupFunction.java
@@ -40,6 +40,9 @@ public class IdentifierGenerationStrategyLookupFunction
     /** A resolver for default security configurations. */
     @Nullable private RelyingPartyConfigurationResolver rpResolver;
 
+    /** Default strategy to return. */
+    @Nullable private IdentifierGenerationStrategy defaultGenerator;
+
     /**
      * Set the resolver for default security configurations.
      * 
@@ -48,9 +51,6 @@ public class IdentifierGenerationStrategyLookupFunction
     public void setRelyingPartyConfigurationResolver(@Nullable final RelyingPartyConfigurationResolver resolver) {
         rpResolver = resolver;
     }
-
-    /** Default strategy to return. */
-    @Nullable private IdentifierGenerationStrategy defaultGenerator;
     
     /**
      * Set the default {@link IdentifierGenerationStrategy} to return.
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SignatureSigningConfigurationLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SignatureSigningConfigurationLookupFunction.java
index a28ff8651..f4efbe9b3 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SignatureSigningConfigurationLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SignatureSigningConfigurationLookupFunction.java
@@ -74,7 +74,8 @@ public class SignatureSigningConfigurationLookupFunction
         if (input != null && rpResolver != null) {
             final SecurityConfiguration defaultConfig =
                     rpResolver.getDefaultSecurityConfiguration(input.getProfileId());
-            if (defaultConfig instanceof XMLSecurityConfiguration xsc && xsc.getSignatureSigningConfiguration() != null) {
+            if (defaultConfig instanceof XMLSecurityConfiguration xsc &&
+                    xsc.getSignatureSigningConfiguration() != null) {
                 configs.add(xsc.getSignatureSigningConfiguration());
             }
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/HttpClientSecurityConfigurationLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/HttpClientSecurityConfigurationLookupFunction.java
index e80f1e8f4..fa3e4dce7 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/HttpClientSecurityConfigurationLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/HttpClientSecurityConfigurationLookupFunction.java
@@ -71,11 +71,13 @@ public class HttpClientSecurityConfigurationLookupFunction
             }
             
             // Check for a per-profile default (relying party independent) config.
-            if (pc != null && rpResolver != null) {
-                final SecurityConfiguration defaultConfig =
-                        rpResolver.getDefaultSecurityConfiguration(pc.getId());
-                if (defaultConfig != null && defaultConfig.getHttpClientSecurityConfiguration() != null) {
-                    configs.add(defaultConfig.getHttpClientSecurityConfiguration());
+            if (pc != null) {
+                final String id = pc.getId();
+                if (id != null && rpResolver != null) {
+                    final SecurityConfiguration defaultConfig = rpResolver.getDefaultSecurityConfiguration(id);
+                    if (defaultConfig != null && defaultConfig.getHttpClientSecurityConfiguration() != null) {
+                        configs.add(defaultConfig.getHttpClientSecurityConfiguration());
+                    }
                 }
             }
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureSigningConfigurationLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureSigningConfigurationLookupFunction.java
index 054cb4548..b61bb3e70 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureSigningConfigurationLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureSigningConfigurationLookupFunction.java
@@ -72,12 +72,14 @@ public class SignatureSigningConfigurationLookupFunction
             }
             
             // Check for a per-profile default (relying party independent) config.
-            if (pc != null && rpResolver != null) {
-                final SecurityConfiguration defaultConfig =
-                        rpResolver.getDefaultSecurityConfiguration(pc.getId());
-                if (defaultConfig instanceof XMLSecurityConfiguration xsc &&
-                        xsc.getSignatureSigningConfiguration() != null) {
-                    configs.add(xsc.getSignatureSigningConfiguration());
+            if (pc != null) {
+                final String id = pc.getId();
+                if (id != null && rpResolver != null) {
+                    final SecurityConfiguration defaultConfig = rpResolver.getDefaultSecurityConfiguration(id);
+                    if (defaultConfig instanceof XMLSecurityConfiguration xsc &&
+                            xsc.getSignatureSigningConfiguration() != null) {
+                        configs.add(xsc.getSignatureSigningConfiguration());
+                    }
                 }
             }
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureValidationConfigurationLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureValidationConfigurationLookupFunction.java
index 7d971f7f1..e6953964c 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureValidationConfigurationLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/messaging/SignatureValidationConfigurationLookupFunction.java
@@ -72,12 +72,14 @@ public class SignatureValidationConfigurationLookupFunction
             }
             
             // Check for a per-profile default (relying party independent) config.
-            if (pc != null && rpResolver != null) {
-                final SecurityConfiguration defaultConfig =
-                        rpResolver.getDefaultSecurityConfiguration(pc.getId());
-                if (defaultConfig instanceof XMLSecurityConfiguration xsc &&
-                        xsc.getSignatureValidationConfiguration() != null) {
-                    configs.add(xsc.getSignatureValidationConfiguration());
+            if (pc != null) {
+                final String id = pc.getId();
+                if (id != null && rpResolver != null) {
+                    final SecurityConfiguration defaultConfig = rpResolver.getDefaultSecurityConfiguration(id);
+                    if (defaultConfig instanceof XMLSecurityConfiguration xsc &&
+                            xsc.getSignatureValidationConfiguration() != null) {
+                        configs.add(xsc.getSignatureValidationConfiguration());
+                    }
                 }
             }
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java
index 9d9440390..43d188c31 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java
@@ -60,9 +60,6 @@ public final class MultiRelyingPartyContext extends BaseContext {
     /** An iterator to track progress through the set of relying parties. */
     @Nullable private Iterator<RelyingPartyContext> relyingPartyIterator;
     
-    /** Tracks the context being operated on. */
-    @Nullable private RelyingPartyContext relyingPartyCtx;
-    
     /** Constructor. */
     public MultiRelyingPartyContext() {
         relyingPartyIdMap = new HashMap<>();
@@ -118,6 +115,7 @@ public final class MultiRelyingPartyContext extends BaseContext {
         if (fresh || relyingPartyIterator == null) {
             relyingPartyIterator = new RelyingPartyContextIterator(this);
         }
+        assert relyingPartyIterator != null;
         return relyingPartyIterator;
     }
 
@@ -179,9 +177,6 @@ public final class MultiRelyingPartyContext extends BaseContext {
      * Wrapper for an iterator that tracks the current object.
      */
     private class RelyingPartyContextIterator implements Iterator<RelyingPartyContext> {
-
-        /** Outer ctx. */
-        @Nonnull private final MultiRelyingPartyContext multiCtx;
         
         /** Embedded iterator. */
         @Nonnull private final Iterator<RelyingPartyContext> iterator;
@@ -195,7 +190,6 @@ public final class MultiRelyingPartyContext extends BaseContext {
          * @param ctx outer context
          */
         public RelyingPartyContextIterator(@Nonnull final MultiRelyingPartyContext ctx) {
-            multiCtx = ctx;
             iterator = ctx.relyingPartyIdMap.values().iterator();
         }
         
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java
index 38796309c..4b36589d4 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java
@@ -17,7 +17,7 @@
 
 package net.shibboleth.idp.profile.context.navigate;
 
-import java.util.function.Function;
+import java.util.function.BiFunction;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -26,17 +26,16 @@ import net.shibboleth.idp.profile.context.MultiRelyingPartyContext;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
-import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
- * A function that returns a {@link RelyingPartyContext} based on ID.
+ * A {@link BiFunction} that returns a {@link RelyingPartyContext} based on ID.
  * 
  * <p>If a label is provided, the context will be auto-created if it doesn't already exist.</p>
  */
 public class RelyingPartyContextLookupById
-        implements Function<Pair<MultiRelyingPartyContext,String>, RelyingPartyContext> {
+        implements BiFunction<MultiRelyingPartyContext,String,RelyingPartyContext> {
 
     /** Label to use for auto-creation. */
     @Nullable private final String label; 
@@ -56,21 +55,23 @@ public class RelyingPartyContextLookupById
     }
 
     /** {@inheritDoc} */
-    @Nullable public RelyingPartyContext apply(@Nullable final Pair<MultiRelyingPartyContext,String> input) {
-        if (input == null || input.getFirst() == null) {
+    @Nullable public RelyingPartyContext apply(@Nullable final MultiRelyingPartyContext input1,
+            @Nullable final String input2) {
+        if (input1 == null) {
             return null;
         }
         
-        final String id = StringSupport.trimOrNull(input.getSecond()); 
+        final String id = StringSupport.trimOrNull(input2); 
         if (id == null) {
             return null;
         }
         
-        RelyingPartyContext rpCtx = input.getFirst().getRelyingPartyContextById(id);
+        RelyingPartyContext rpCtx = input1.getRelyingPartyContextById(id);
         if (rpCtx == null && label != null) {
             rpCtx = new RelyingPartyContext();
             rpCtx.setRelyingPartyId(id);
-            input.getFirst().addRelyingPartyContext(label, rpCtx);
+            assert label != null;
+            input1.addRelyingPartyContext(label, rpCtx);
         }
         
         return rpCtx;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java
index 8456614c6..770e7d072 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java
@@ -37,7 +37,7 @@ public class RelyingPartyContextLookupByLabel
         implements Function<MultiRelyingPartyContext, Collection<RelyingPartyContext>> {
 
     /** Label to use for auto-creation. */
-    @Nullable private final String label; 
+    @Nonnull private final String label; 
     
     /**
      * Constructor.
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java
index fc0d505ad..c308ea44f 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java
@@ -20,7 +20,9 @@ package net.shibboleth.idp.profile.context.navigate;
 import javax.annotation.Nullable;
 
 import net.shibboleth.idp.profile.config.OverriddenIssuerProfileConfiguration;
+import net.shibboleth.idp.profile.config.ProfileConfiguration;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
+import net.shibboleth.idp.relyingparty.RelyingPartyConfiguration;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -41,17 +43,17 @@ public class ResponderIdLookupFunction extends AbstractRelyingPartyLookupFunctio
         if (input != null) {
             final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
             if (rpc != null) {
-                
-                if (rpc.getProfileConfig() instanceof OverriddenIssuerProfileConfiguration) {
-                    final String issuer =
-                            ((OverriddenIssuerProfileConfiguration) rpc.getProfileConfig()).getIssuer(input);
+                final ProfileConfiguration pc = rpc.getProfileConfig();
+                if (pc instanceof OverriddenIssuerProfileConfiguration) {
+                    final String issuer = ((OverriddenIssuerProfileConfiguration) pc).getIssuer(input);
                     if (issuer != null) {
                         return issuer;
                     }
                 }
                 
-                if (rpc.getConfiguration() != null) {
-                    return rpc.getConfiguration().getResponderId(input);
+                final RelyingPartyConfiguration rpConfig = rpc.getConfiguration();
+                if (rpConfig != null) {
+                    return rpConfig.getResponderId(input);
                 }
             }
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java
index bb8c89c0a..9de586bf0 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java
@@ -111,8 +111,8 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
     protected void prepareContext(@Nonnull final ScriptContext scriptContext, @Nullable final Object... input) {
         // We don't actually know that the context is a PRC, but we'll keep this for compatibility.
         // We can't use the variable name "context" because Rhino appears to reserve that name.
-        scriptContext.setAttribute("profileContext", input[0], ScriptContext.ENGINE_SCOPE);
-        scriptContext.setAttribute("input", input[0], ScriptContext.ENGINE_SCOPE);
+        scriptContext.setAttribute("profileContext", input != null ? input[0] : null, ScriptContext.ENGINE_SCOPE);
+        scriptContext.setAttribute("input", input != null ? input[0] : null, ScriptContext.ENGINE_SCOPE);
     }
     
     /**
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java
index 79db5e7f1..100e41972 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java
@@ -60,7 +60,7 @@ public class SpringEventToViewLookupFunction implements Function<Event,String> {
      * 
      * @param map map to use
      */
-    public void setEventMap(@Nonnull @NonnullElements final Map<String,String> map) {
+    public void setEventMap(@Nullable @NonnullElements final Map<String,String> map) {
         if (map == null) {
             eventMap = Collections.emptyMap();
         } else {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java
index 4a705f688..15baf8888 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java
@@ -38,7 +38,7 @@ import org.springframework.webflow.execution.RequestContext;
 public class SpringStatusMessageLookupFunction implements Function<ProfileRequestContext, String>, MessageSourceAware {
 
     /** MessageSource injected by Spring, typically the parent ApplicationContext itself. */
-    @Nonnull private MessageSource messageSource;
+    @Nullable private MessageSource messageSource;
     
     /** {@inheritDoc} */
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
@@ -50,6 +50,8 @@ public class SpringStatusMessageLookupFunction implements Function<ProfileReques
                         ? springRequestContext.getCurrentEvent() : null;
                 if (previousEvent != null) {
                     try {
+                        assert messageSource != null;
+                        assert springRequestContext != null;
                         return messageSource.getMessage(previousEvent.getId(), null,
                                 springRequestContext.getExternalContext().getLocale());
                     } catch (final NoSuchMessageException e) {
@@ -64,7 +66,7 @@ public class SpringStatusMessageLookupFunction implements Function<ProfileReques
 
     /** {@inheritDoc} */
     @Override
-    public void setMessageSource(final MessageSource source) {
+    public void setMessageSource(@Nonnull final MessageSource source) {
         messageSource = source;
     }
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
index bfc17869d..a69d1926a 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
@@ -46,18 +46,18 @@ public class WebFlowCurrentEventLookupFunction implements Function<ProfileReques
             eventCtx = input.getSubcontext(PreviousEventContext.class);
         }
         
-        // If nothing in the Spring layer, just return what we have.
         final SpringRequestContext springContext = input.getSubcontext(SpringRequestContext.class);
-        if (springContext == null || springContext.getRequestContext() == null
-                || springContext.getRequestContext().getCurrentEvent() == null) {
+        final RequestContext springRequest = springContext != null ? springContext.getRequestContext() : null;
+
+        
+        // If nothing in the Spring layer, just return what we have.
+        if (springRequest == null || springRequest.getCurrentEvent() == null) {
             return eventCtx;
         }
-        
-        final RequestContext springRequest = springContext.getRequestContext();
-        
-        if (eventCtx == null || eventCtx.getEvent() == null
-                || !Objects.equals(eventCtx.getEvent().toString(), springRequest.getCurrentEvent().getId())) {
-            eventCtx = input.getSubcontext(EventContext.class, true);
+
+        final Object current = eventCtx != null ? eventCtx.getEvent() : null;
+        if (current == null || !Objects.equals(current.toString(), springRequest.getCurrentEvent().getId())) {
+            eventCtx = input.getOrCreateSubcontext(EventContext.class);
             eventCtx.setEvent(springRequest.getCurrentEvent());
         }
         
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java
index 72c168191..6eb58818a 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java
@@ -34,9 +34,11 @@ public class WebflowRequestContextProfileRequestContextLookup implements
 
     /** {@inheritDoc} */
     @Nullable public ProfileRequestContext apply(@Nullable final RequestContext requestContext) {
-        final Object ctx = requestContext.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
-        if (ctx instanceof ProfileRequestContext) {
-            return (ProfileRequestContext) ctx;
+        if (requestContext != null) {
+            final Object ctx = requestContext.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
+            if (ctx instanceof ProfileRequestContext) {
+                return (ProfileRequestContext) ctx;
+            }
         }
         
         return null;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java
index e7ca0b1a6..d5f806cc2 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java
@@ -78,6 +78,7 @@ public abstract class AbstractProfileInterceptorAction extends
             return false;
         }
 
+        assert profileInterceptorContext != null;
         return doPreExecute(profileRequestContext, profileInterceptorContext)
                 && super.doPreExecute(profileRequestContext);
     }
@@ -98,6 +99,7 @@ public abstract class AbstractProfileInterceptorAction extends
 
     /** {@inheritDoc} */
     @Override protected final void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        assert profileInterceptorContext != null;
         doExecute(profileRequestContext, profileInterceptorContext);
     }
 
@@ -112,4 +114,4 @@ public abstract class AbstractProfileInterceptorAction extends
 
     }
 
-}
+}
\ No newline at end of file
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ExternalInterceptor.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ExternalInterceptor.java
index 438a2d249..a1a1e4918 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ExternalInterceptor.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ExternalInterceptor.java
@@ -99,6 +99,7 @@ public abstract class ExternalInterceptor {
             throw new ExternalInterceptorException("No conversation key found in request");
         }
         
+        assert key != null;
         final ProfileRequestContext profileRequestContext = getProfileRequestContext(key, request);
         final ExternalInterceptorContext extContext = getExternalInterceptorContext(profileRequestContext);
         extContext.getExternalInterceptor().doStart(request, profileRequestContext, extContext);
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java
index 0cb17cd4e..a942ed00b 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java
@@ -26,12 +26,12 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.storage.StorageService;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicates;
 
 import net.shibboleth.idp.profile.FlowDescriptor;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.PredicateSupport;
 
 /**
  * A descriptor for a profile interceptor flow.
@@ -59,7 +59,7 @@ public class ProfileInterceptorFlowDescriptor extends AbstractIdentifiableInitia
 
     /** Constructor. */
     public ProfileInterceptorFlowDescriptor() {
-        activationCondition = Predicates.alwaysTrue();
+        activationCondition = PredicateSupport.alwaysTrue();
         supportsNonBrowser = true;
     }
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DateAttributePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DateAttributePredicate.java
index 06a02b58b..53d03b465 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DateAttributePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DateAttributePredicate.java
@@ -30,6 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import java.time.DateTimeException;
 import java.time.Duration;
@@ -54,7 +55,7 @@ public class DateAttributePredicate extends AbstractAttributePredicate {
     @Nonnull @NotEmpty private final String attributeName;
 
     /** Formatter used to parse string-based date attribute values. */
-    @Nonnull private final DateTimeFormatter dateTimeFormatter;
+    @Nullable private final DateTimeFormatter dateTimeFormatter;
 
     /** Offset from system time used for date comparisons. */
     @Nonnull private Duration systemTimeOffset;
@@ -70,7 +71,7 @@ public class DateAttributePredicate extends AbstractAttributePredicate {
     public DateAttributePredicate(@Nonnull @NotEmpty @ParameterName(name="attribute") final String attribute) {
         attributeName = Constraint.isNotNull(attribute, "Attribute cannot be null");
         dateTimeFormatter = null;
-        systemTimeOffset = java.time.Duration.ZERO;
+        systemTimeOffset = Duration.ZERO;
     }
 
     /**
@@ -85,7 +86,7 @@ public class DateAttributePredicate extends AbstractAttributePredicate {
         
         attributeName = Constraint.isNotNull(attribute, "Attribute cannot be null");
         dateTimeFormatter = Constraint.isNotNull(formatter, "Formatter cannot be null");
-        systemTimeOffset = java.time.Duration.ZERO;
+        systemTimeOffset = Duration.ZERO;
     }
 
     /**
@@ -100,7 +101,7 @@ public class DateAttributePredicate extends AbstractAttributePredicate {
         attributeName = Constraint.isNotNull(attribute, "Attribute cannot be null");
         dateTimeFormatter = DateTimeFormatter.ofPattern(
                 Constraint.isNotNull(formatString, "Format string cannot be null"));
-        systemTimeOffset = java.time.Duration.ZERO;
+        systemTimeOffset = Duration.ZERO;
     }
 
     /**
@@ -157,6 +158,7 @@ public class DateAttributePredicate extends AbstractAttributePredicate {
                 }
                 dateString = ((StringAttributeValue) value).getValue();
                 try {
+                    assert dateTimeFormatter != null;
                     if (Instant.from(dateTimeFormatter.parse(dateString)).plus(systemTimeOffset).isAfter(now)) {
                         return true;
                     }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/LoopDetectionPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/LoopDetectionPredicate.java
index dbe079f4b..44f97ccbb 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/LoopDetectionPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/LoopDetectionPredicate.java
@@ -110,7 +110,12 @@ public class LoopDetectionPredicate extends AbstractRelyingPartyPredicate {
             if (meterName != null) {
                 meterName = MetricRegistry.name("net.shibboleth.idp.loopDetection", meterName,
                         username.replace(".",""));
-                final Meter meter = MetricsSupport.getMetricRegistry().meter(meterName,
+                final MetricRegistry registry = MetricsSupport.getMetricRegistry();
+                if (registry == null) {
+                    log.error("MetricRegistry was unavailable");
+                    return false;
+                }
+                final Meter meter = registry.meter(meterName,
                         new MetricSupplier<Meter>() {
                             public Meter newMetric() {
                                 return new Meter(new SlidingTimeWindowMovingAverages());
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java
index 4709f9891..6caf2986a 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java
@@ -113,6 +113,7 @@ public class RegexAttributePredicate extends AbstractAttributePredicate {
         
         for (final IdPAttributeValue value : attribute.getValues()) {
             if (value instanceof StringAttributeValue) {
+                assert pattern != null;
                 final Matcher m = pattern.matcher(((StringAttributeValue)value).getValue());
                 if (m.matches()) {
                     log.debug("Found matching value '{}' in attribute '{}'", m.group(), attributeId);
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java
index 9b57633c2..c34814e80 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java
@@ -71,7 +71,7 @@ public class ScriptedPredicate
     @Override
     protected void prepareContext(@Nonnull final ScriptContext scriptContext, @Nullable final Object... input) {
         super.prepareContext(scriptContext, input);
-        scriptContext.setAttribute("profileContext", input[0], ScriptContext.ENGINE_SCOPE);
+        scriptContext.setAttribute("profileContext", input != null ? input[0] : null, ScriptContext.ENGINE_SCOPE);
     }
     
     /**
@@ -102,7 +102,8 @@ public class ScriptedPredicate
      * @throws ScriptException if the compile fails
      * @throws IOException if the file doesn't exist.
      */
-    public static ScriptedPredicate resourceScript(final Resource resource) throws ScriptException, IOException {
+    public static ScriptedPredicate resourceScript(@Nonnull final Resource resource)
+            throws ScriptException, IOException {
         return resourceScript(DEFAULT_ENGINE, resource);
     }
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java
index 17f2abb25..778571f44 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java
@@ -149,9 +149,10 @@ public class SimpleAttributePredicate extends AbstractAttributePredicate {
         
         for (final IdPAttributeValue value : attribute.getValues()) {
             if (scope != null && value instanceof ScopedStringAttributeValue) {
+                final String scopeCopy = scope;
                 if ("*".equals(toMatch) || toMatch.equals(((ScopedStringAttributeValue) value).getValue())) {
-                    if ("*".equals(scope) || scope.equals(((ScopedStringAttributeValue) value).getScope())) {
-                        log.debug("Found matching value ({}) and scope ({}) in attribute {}", toMatch, scope,
+                    if ("*".equals(scopeCopy) || scopeCopy.equals(((ScopedStringAttributeValue) value).getScope())) {
+                        log.debug("Found matching value ({}) and scope ({}) in attribute {}", toMatch, scopeCopy,
                                 attribute.getId());
                         return true;
                     }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SpringExpressionPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SpringExpressionPredicate.java
index c30192c05..4ec918d15 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SpringExpressionPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SpringExpressionPredicate.java
@@ -48,7 +48,7 @@ public class SpringExpressionPredicate
     @Override
     protected void prepareContext(@Nonnull final EvaluationContext context, @Nullable final Object... input) {
         super.prepareContext(context, input);
-        context.setVariable("profileContext", input[0]);
+        context.setVariable("profileContext", input != null ? input[0] : input);
     }
 
 }
\ No newline at end of file
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java
index 03d340790..63672d328 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java
@@ -29,12 +29,9 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicates;
 
 import net.shibboleth.idp.profile.config.ProfileConfiguration;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
@@ -44,17 +41,15 @@ import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.IdentifiedComponent;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.logic.PredicateSupport;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /** The configuration that applies to a given relying party. */
 public class RelyingPartyConfiguration extends AbstractIdentifiableInitializableComponent implements
         IdentifiedComponent, Predicate<ProfileRequestContext> {
     
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(RelyingPartyConfiguration.class);
-    
     /** Lookup function to supply <code>responderId</code> property. */
-    @Nonnull private Function<ProfileRequestContext,String> responderIdLookupStrategy;
+    @NonnullAfterInit private Function<ProfileRequestContext,String> responderIdLookupStrategy;
 
     /** Controls whether detailed information about errors should be exposed. */
     @Nonnull private Predicate<ProfileRequestContext> detailedErrorsPredicate;
@@ -68,8 +63,8 @@ public class RelyingPartyConfiguration extends AbstractIdentifiableInitializable
 
     /** Constructor. */
     public RelyingPartyConfiguration() {
-        activationCondition = Predicates.alwaysTrue();
-        detailedErrorsPredicate = Predicates.alwaysFalse();
+        activationCondition = PredicateSupport.alwaysTrue();
+        detailedErrorsPredicate = PredicateSupport.alwaysFalse();
         profileConfigurationsLookupStrategy = FunctionSupport.constant(null);
     }
 
@@ -127,7 +122,7 @@ public class RelyingPartyConfiguration extends AbstractIdentifiableInitializable
      */
     public void setDetailedErrors(final boolean flag) {
         checkSetterPreconditions();
-        detailedErrorsPredicate = flag ? Predicates.alwaysTrue() : Predicates.alwaysFalse();
+        detailedErrorsPredicate = PredicateSupport.constant(flag);
     }
     
     /**
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorResultTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorResultTest.java
index e01d2c0f4..2da9d1cc8 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorResultTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorResultTest.java
@@ -29,6 +29,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 /** {@link AbstractProfileInterceptorResult} unit test. */
+ at SuppressWarnings("javadoc")
 public class AbstractProfileInterceptorResultTest {
 
     @Test(expectedExceptions = ConstraintViolationException.class)
@@ -46,24 +47,9 @@ public class AbstractProfileInterceptorResultTest {
         new MockAbstractProfileInterceptorResult("context", "key", "", Instant.ofEpochMilli(100));
     }
 
-    @Test(expectedExceptions = ConstraintViolationException.class)
-    public void testNullContext() {
-        new MockAbstractProfileInterceptorResult(null, "key", "value", Instant.ofEpochMilli(100));
-    }
-
-    @Test(expectedExceptions = ConstraintViolationException.class)
-    public void testNullKey() {
-        new MockAbstractProfileInterceptorResult("context", null, "value", Instant.ofEpochMilli(100));
-    }
-
-    @Test(expectedExceptions = ConstraintViolationException.class)
-    public void testNullValue() {
-        new MockAbstractProfileInterceptorResult("context", "key", null, Instant.ofEpochMilli(100));
-    }
-
     @Test(expectedExceptions = ConstraintViolationException.class)
     public void testNegativeExpiration() {
-        new MockAbstractProfileInterceptorResult("context", "key", null, Instant.ofEpochMilli(-100));
+        new MockAbstractProfileInterceptorResult("context", "key", "value", Instant.ofEpochMilli(-100));
     }
 
     @Test public void testNullExpiration() {
@@ -76,7 +62,7 @@ public class AbstractProfileInterceptorResultTest {
     }
 
     @Test(expectedExceptions = ConstraintViolationException.class) public void testZeroExpiration() {
-        new MockAbstractProfileInterceptorResult("context", "key", null, Instant.ofEpochMilli(0));
+        new MockAbstractProfileInterceptorResult("context", "key", "value", Instant.ofEpochMilli(0));
     }
 
     @Test public void testResult() {
@@ -96,4 +82,5 @@ public class AbstractProfileInterceptorResultTest {
             super(context, key, value, expiration);
         }
     }
-}
+
+}
\ No newline at end of file

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


More information about the commits mailing list