[java-opensaml] branch main updated: IDP-2069 - Null handling task

Scott Cantor cantor.2 at osu.edu
Wed Mar 8 15:46:29 UTC 2023


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

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

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=5be0e69ec2190c7a3ef5399d90253fffebbde4be

The following commit(s) were added to refs/heads/main by this push:
     new 5be0e69ec IDP-2069 - Null handling task
5be0e69ec is described below

commit 5be0e69ec2190c7a3ef5399d90253fffebbde4be
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Mar 8 10:46:26 2023 -0500

    IDP-2069 - Null handling task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    Sanitized opensaml-messaging-api.
    Added ensureIn/OutboundMessageContext methods to InOutOperationContext.
---
 .../opensaml/messaging/context/BaseContext.java    |  7 ++--
 .../messaging/context/InOutOperationContext.java   | 33 ++++++++++++++++++
 .../httpclient/HttpClientRequestContext.java       |  2 +-
 .../context/navigate/RootContextLookup.java        |  1 +
 .../messaging/decoder/AbstractMessageDecoder.java  | 18 ++++------
 .../opensaml/messaging/decoder/MessageDecoder.java |  4 ++-
 .../AbstractHttpClientResponseMessageDecoder.java  | 15 +-------
 .../BaseHttpClientResponseXMLMessageDecoder.java   | 28 +++++++--------
 .../AbstractHttpServletRequestMessageDecoder.java  | 11 +++---
 .../BaseHttpServletRequestXMLMessageDecoder.java   | 40 ++++++++++++----------
 .../messaging/encoder/AbstractMessageEncoder.java  | 10 ------
 .../opensaml/messaging/encoder/MessageEncoder.java |  4 ++-
 .../AbstractHttpClientRequestMessageEncoder.java   |  7 ----
 .../BaseHttpClientRequestXMLMessageEncoder.java    | 17 ++++++---
 .../AbstractHttpServletResponseMessageEncoder.java |  6 ++--
 .../BaseHttpServletResponseXMLMessageEncoder.java  | 17 ++++++---
 .../messaging/error/MessageErrorHandler.java       |  4 ++-
 .../messaging/error/TypedMessageErrorHandler.java  |  4 ++-
 .../messaging/error/servlet/package-info.java      | 19 ----------
 .../messaging/handler/AbstractMessageHandler.java  |  9 +++--
 .../NoConfidentialityMessageChannelPredicate.java  |  2 +-
 .../logic/NoIntegrityMessageChannelPredicate.java  |  2 +-
 .../messaging/pipeline/BasicMessagePipeline.java   | 14 ++++----
 .../httpclient/BasicHttpClientMessagePipeline.java |  8 ++---
 .../httpclient/HttpClientMessagePipeline.java      |  6 ++--
 .../servlet/BasicHttpServletMessagePipeline.java   |  8 ++---
 .../servlet/HttpServletMessagePipeline.java        |  6 ++--
 .../context/InOutOperationContextText.java         |  3 +-
 .../opensaml/messaging/context/TestContext.java    |  1 -
 .../context/navigate/MessageContextLookupTest.java | 25 +++++---------
 .../RecursiveTypedParentContextLookupTest.java     | 14 +++-----
 .../handler/AbstractMessageHandlerTest.java        | 27 +++++++++++----
 32 files changed, 193 insertions(+), 179 deletions(-)

diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/BaseContext.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/BaseContext.java
index 82f534c7d..955de3c4e 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/BaseContext.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/BaseContext.java
@@ -23,15 +23,17 @@ import java.util.Iterator;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import javax.annotation.concurrent.NotThreadSafe;
 
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.collection.ClassIndexedSet;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 import org.opensaml.messaging.MessageRuntimeException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 
 /**
  * Base implementation of a component which represents the context used to store state 
@@ -57,6 +59,7 @@ import org.slf4j.LoggerFactory;
  * to this convention, auto-creation will fail.
  * </p>
  */
+ at NotThreadSafe
 public abstract class BaseContext implements Iterable<BaseContext> {
 
     /** Logger. */
@@ -239,7 +242,7 @@ public abstract class BaseContext implements Iterable<BaseContext> {
             log.trace("New subcontext with type '{}' is currently a subcontext of "
                     + "parent with type '{}', removing it",
                     new Object[]{subcontext.getClass().getName(), oldParent.getClass().getName(),});
-            subcontext.getParent().removeSubcontext(subcontext);
+            oldParent.removeSubcontext(subcontext);
         }
         
         // Set parent pointer of new subcontext to this instance
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/InOutOperationContext.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/InOutOperationContext.java
index 209bec067..f4a260111 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/InOutOperationContext.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/InOutOperationContext.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.messaging.context;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 /**
@@ -58,6 +59,22 @@ public class InOutOperationContext extends BaseContext {
         return inboundContext;
     }
     
+    /**
+     * Gets the inbound message context, creating an empty one if it does not already exist.
+     * 
+     * @return an existing, or new, inbound message context
+     * 
+     * @since 5.0.0
+     */
+    @Nonnull public MessageContext ensureInboundMessageContext() {
+        if (inboundContext != null) {
+            return inboundContext;
+        }
+
+        setInboundMessageContext(new MessageContext());
+        return ensureInboundMessageContext();
+    }
+    
     /**
      * Sets the inbound message context.
      * 
@@ -85,6 +102,22 @@ public class InOutOperationContext extends BaseContext {
     @Nullable public MessageContext getOutboundMessageContext() {
         return outboundContext;
     }
+
+    /**
+     * Gets the outbound message context, creating an empty one if it does not already exist.
+     * 
+     * @return an existing, or new, outbound message context
+     * 
+     * @since 5.0.0
+     */
+    @Nonnull public MessageContext ensureOutboundMessageContext() {
+        if (outboundContext != null) {
+            return outboundContext;
+        }
+
+        setOutboundMessageContext(new MessageContext());
+        return ensureOutboundMessageContext();
+    }
     
     /**
      * Sets the outbound message context.
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java
index eeac9117a..b394f380b 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/httpclient/HttpClientRequestContext.java
@@ -29,7 +29,7 @@ import org.opensaml.messaging.context.BaseContext;
 public final class HttpClientRequestContext extends BaseContext {
     
     /** The HttpClientContext instance. */
-    private HttpClientContext httpClientContext;
+    @Nullable private HttpClientContext httpClientContext;
 
     /**
      * Get the {@link HttpClientContext} instance.
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/navigate/RootContextLookup.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/navigate/RootContextLookup.java
index e40aabef9..535ce0b17 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/navigate/RootContextLookup.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/context/navigate/RootContextLookup.java
@@ -60,6 +60,7 @@ public class RootContextLookup<StartContext extends BaseContext, RootContext ext
         if (input.getParent() == null){
             if (claz != null) {
                 if (claz.isInstance(input)) {
+                    assert claz != null;
                     return claz.cast(input);
                 }
                 throw new ClassCastException("Root context was not of the expected type");
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/AbstractMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/AbstractMessageDecoder.java
index f5d4790dd..467702837 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/AbstractMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/AbstractMessageDecoder.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.messaging.decoder;
 
+import javax.annotation.Nullable;
+
 import org.opensaml.messaging.context.MessageContext;
 
 import net.shibboleth.shared.component.AbstractInitializableComponent;
@@ -29,11 +31,10 @@ public abstract class AbstractMessageDecoder extends AbstractInitializableCompon
         implements MessageDecoder, UnmodifiableComponent {
 
     /** Message context. */
-    private MessageContext messageContext;
+    @Nullable private MessageContext messageContext;
 
     /** {@inheritDoc} */
-    @Override
-    public MessageContext getMessageContext() {
+    @Nullable public MessageContext getMessageContext() {
         return messageContext;
     }
 
@@ -42,23 +43,15 @@ public abstract class AbstractMessageDecoder extends AbstractInitializableCompon
      * 
      * @param context the message context
      */
-    protected void setMessageContext(final MessageContext context) {
+    protected void setMessageContext(@Nullable final MessageContext context) {
         messageContext = context;
     }
 
     /** {@inheritDoc} */
-    @Override
     public void decode() throws MessageDecodingException {
         checkComponentActive();
         doDecode();
     }
-    
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        messageContext = null;
-        
-        super.doDestroy();
-    }
 
     /**
      * Performs the decoding logic. By the time this is called, this decoder has already been initialized and checked to
@@ -67,4 +60,5 @@ public abstract class AbstractMessageDecoder extends AbstractInitializableCompon
      * @throws MessageDecodingException thrown if there is a problem decoding the message
      */
     protected abstract void doDecode() throws MessageDecodingException;
+
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/MessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/MessageDecoder.java
index 1d0434072..9de044fc7 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/MessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/MessageDecoder.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.messaging.decoder;
 
+import javax.annotation.Nullable;
+
 import org.opensaml.messaging.context.MessageContext;
 
 import net.shibboleth.shared.component.DestructableComponent;
@@ -45,5 +47,5 @@ public interface MessageDecoder extends InitializableComponent, DestructableComp
      * 
      * @return the decoded message context
      */
-    MessageContext getMessageContext();
+    @Nullable MessageContext getMessageContext();
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
index 7e0c36ad0..86e8086b0 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
@@ -21,7 +21,6 @@ import javax.annotation.Nullable;
 
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.opensaml.messaging.decoder.AbstractMessageDecoder;
-import org.opensaml.messaging.decoder.MessageDecodingException;
 
 import net.shibboleth.shared.component.ComponentInitializationException;
 
@@ -32,7 +31,7 @@ public abstract class AbstractHttpClientResponseMessageDecoder extends AbstractM
         implements HttpClientResponseMessageDecoder {
 
     /** The HTTP client response. */
-    private ClassicHttpResponse response;
+    @Nullable private ClassicHttpResponse response;
 
     /** {@inheritDoc} */
     @Nullable public ClassicHttpResponse getHttpResponse() {
@@ -45,18 +44,6 @@ public abstract class AbstractHttpClientResponseMessageDecoder extends AbstractM
 
         response = clientResponse;
     }
-    
-    /** {@inheritDoc} */
-    public void decode() throws MessageDecodingException {
-        super.decode();
-    }
-
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        response = null;
-        
-        super.doDestroy();
-    }
 
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java
index 7bf6f7b3a..33a36975e 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/BaseHttpClientResponseXMLMessageDecoder.java
@@ -20,9 +20,12 @@ package org.opensaml.messaging.decoder.httpclient;
 import java.io.InputStream;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.ParserPool;
 import net.shibboleth.shared.xml.SerializeSupport;
 import net.shibboleth.shared.xml.XMLParserException;
@@ -32,9 +35,10 @@ import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.decoder.MessageDecodingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.w3c.dom.Element;
 
 /**
@@ -44,13 +48,13 @@ import org.w3c.dom.Element;
 public abstract class BaseHttpClientResponseXMLMessageDecoder extends AbstractHttpClientResponseMessageDecoder {
     
     /** Used to log protocol messages. */
-    private Logger protocolMessageLog = LoggerFactory.getLogger("PROTOCOL_MESSAGE");
+    @Nonnull private Logger protocolMessageLog = LoggerFactory.getLogger("PROTOCOL_MESSAGE");
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(BaseHttpClientResponseXMLMessageDecoder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(BaseHttpClientResponseXMLMessageDecoder.class);
 
     /** Parser pool used to deserialize the message. */
-    private ParserPool parserPool;
+    @NonnullAfterInit private ParserPool parserPool;
 
     /** Constructor. */
     public BaseHttpClientResponseXMLMessageDecoder() {
@@ -73,7 +77,7 @@ public abstract class BaseHttpClientResponseXMLMessageDecoder extends AbstractHt
      * 
      * @return parser pool used to deserialize incoming messages
      */
-    @Nonnull public ParserPool getParserPool() {
+    @NonnullAfterInit public ParserPool getParserPool() {
         return parserPool;
     }
 
@@ -87,13 +91,6 @@ public abstract class BaseHttpClientResponseXMLMessageDecoder extends AbstractHt
         parserPool = pool;
     }
     
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        parserPool = null;
-        
-        super.doDestroy();
-    }
-    
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
@@ -128,8 +125,9 @@ public abstract class BaseHttpClientResponseXMLMessageDecoder extends AbstractHt
      * 
      * @return the XMLObject message considered to be the protocol message for logging purposes
      */
-    protected Object getMessageToLog() {
-        return getMessageContext().getMessage();
+    @Nullable protected Object getMessageToLog() {
+        final MessageContext mc = getMessageContext();
+        return mc != null ? mc.getMessage() : null;
     }
 
     /**
@@ -141,7 +139,7 @@ public abstract class BaseHttpClientResponseXMLMessageDecoder extends AbstractHt
      * 
      * @throws MessageDecodingException thrown if there is a problem deserializing and unmarshalling the message
      */
-    protected XMLObject unmarshallMessage(final InputStream messageStream) throws MessageDecodingException {
+    protected XMLObject unmarshallMessage(@Nonnull final InputStream messageStream) throws MessageDecodingException {
         try {
             final XMLObject message = XMLObjectSupport.unmarshallFromInputStream(getParserPool(), messageStream);
             return message;
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java
index 2a073c655..f49c558fd 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java
@@ -36,12 +36,12 @@ public abstract class AbstractHttpServletRequestMessageDecoder extends AbstractM
     @Nullable private NonnullSupplier<HttpServletRequest> httpServletRequestSupplier;
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public HttpServletRequest getHttpServletRequest() {
-        if (httpServletRequestSupplier == null) {
-            return null;
+        if (httpServletRequestSupplier != null) {
+            return httpServletRequestSupplier.get();
         }
-        return httpServletRequestSupplier.get();
+        
+        return null;
     }
 
     /**
@@ -75,4 +75,5 @@ public abstract class AbstractHttpServletRequestMessageDecoder extends AbstractM
             throw new ComponentInitializationException("HTTP Servlet request cannot be null");
         }
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/BaseHttpServletRequestXMLMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/BaseHttpServletRequestXMLMessageDecoder.java
index 2ff0cd130..470a24703 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/BaseHttpServletRequestXMLMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/BaseHttpServletRequestXMLMessageDecoder.java
@@ -20,21 +20,25 @@ package org.opensaml.messaging.decoder.servlet;
 import java.io.InputStream;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.decoder.MessageDecoder;
 import org.opensaml.messaging.decoder.MessageDecodingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.w3c.dom.Element;
 
 import jakarta.servlet.http.HttpServletRequest;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.ParserPool;
 import net.shibboleth.shared.xml.SerializeSupport;
 import net.shibboleth.shared.xml.XMLParserException;
@@ -51,7 +55,7 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
     @Nonnull private final Logger log = LoggerFactory.getLogger(BaseHttpServletRequestXMLMessageDecoder.class);
 
     /** Parser pool used to deserialize the message. */
-    @Nonnull private ParserPool parserPool;
+    @NonnullAfterInit private ParserPool parserPool;
 
     /** Constructor. */
     public BaseHttpServletRequestXMLMessageDecoder() {
@@ -62,9 +66,14 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
     public void decode() throws MessageDecodingException {
         log.debug("Beginning to decode message from HttpServletRequest");
         
-        log.debug("HttpServletRequest indicated Content-Type: {}", getHttpServletRequest().getContentType());
+        final HttpServletRequest request = getHttpServletRequest();
+        if (request == null) {
+            throw new MessageDecodingException("HttpServletRequest was null");
+        }
+        
+        log.debug("HttpServletRequest indicated Content-Type: {}", request.getContentType());
         
-        validateHttpRequest(getHttpServletRequest());
+        validateHttpRequest(request);
         
         super.decode();
         
@@ -78,7 +87,7 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
      * 
      * @return parser pool used to deserialize incoming messages
      */
-    @Nonnull public ParserPool getParserPool() {
+    @NonnullAfterInit public ParserPool getParserPool() {
         return parserPool;
     }
 
@@ -88,15 +97,7 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
      * @param pool parser pool used to deserialize incoming messages
      */
     public void setParserPool(@Nonnull final ParserPool pool) {
-        Constraint.isNotNull(pool, "ParserPool cannot be null");
-        parserPool = pool;
-    }
-    
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        parserPool = null;
-        
-        super.doDestroy();
+        parserPool = Constraint.isNotNull(pool, "ParserPool cannot be null");
     }
     
     /** {@inheritDoc} */
@@ -114,7 +115,7 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
     protected void logDecodedMessage() {
         if (protocolMessageLog.isDebugEnabled() ){
             final Object message = getMessageToLog();
-            if (message == null || !(message instanceof XMLObject)) {
+            if (!(message instanceof XMLObject)) {
                 log.warn("Decoded message was null or unsupported, nothing to log");
                 return;
             }
@@ -133,8 +134,9 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
      * 
      * @return the XMLObject message considered to be the protocol message for logging purposes
      */
-    protected Object getMessageToLog() {
-        return getMessageContext().getMessage();
+    @Nullable protected Object getMessageToLog() {
+        final MessageContext mc = getMessageContext();
+        return mc != null ? mc.getMessage() : null;
     }
 
     /**
@@ -146,7 +148,7 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
      * 
      * @throws MessageDecodingException thrown if there is a problem deserializing and unmarshalling the message
      */
-    protected XMLObject unmarshallMessage(final InputStream messageStream) throws MessageDecodingException {
+    protected XMLObject unmarshallMessage(@Nonnull final InputStream messageStream) throws MessageDecodingException {
         try {
             final XMLObject message = XMLObjectSupport.unmarshallFromInputStream(getParserPool(), messageStream);
             return message;
@@ -174,7 +176,7 @@ public abstract class BaseHttpServletRequestXMLMessageDecoder extends AbstractHt
      * 
      * @throws MessageDecodingException if request is not considered valid
      */
-    protected void validateHttpRequest(final HttpServletRequest request) throws MessageDecodingException {
+    protected void validateHttpRequest(@Nonnull final HttpServletRequest request) throws MessageDecodingException {
         // Default is no-op
     }
 
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java
index 9028610bc..6d5f5cc02 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java
@@ -35,7 +35,6 @@ public abstract class AbstractMessageEncoder extends AbstractInitializableCompon
     @Nullable private MessageContext messageContext;
 
     /** {@inheritDoc} */
-    @Override
     public synchronized void setMessageContext(@Nullable final MessageContext context) {
         checkSetterPreconditions();
 
@@ -43,7 +42,6 @@ public abstract class AbstractMessageEncoder extends AbstractInitializableCompon
     }
 
     /** {@inheritDoc} */
-    @Override
     public void encode() throws MessageEncodingException {
         checkComponentActive();
         doEncode();
@@ -53,7 +51,6 @@ public abstract class AbstractMessageEncoder extends AbstractInitializableCompon
      * 
      * Default implementation is a no-op.
      */
-    @Override
     public void prepareContext() throws MessageEncodingException {
         
     }
@@ -67,13 +64,6 @@ public abstract class AbstractMessageEncoder extends AbstractInitializableCompon
         return messageContext;
     }
 
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        messageContext = null;
-
-        super.doDestroy();
-    }
-
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/MessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/MessageEncoder.java
index 7a8a79dd9..7f3a32dc5 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/MessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/MessageEncoder.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.messaging.encoder;
 
+import javax.annotation.Nullable;
+
 import org.opensaml.messaging.context.MessageContext;
 
 import net.shibboleth.shared.component.DestructableComponent;
@@ -69,5 +71,5 @@ public interface MessageEncoder extends InitializableComponent, DestructableComp
      * 
      * @param messageContext the message context
      */
-    void setMessageContext(MessageContext messageContext);
+    void setMessageContext(@Nullable MessageContext messageContext);
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
index 0bb1077b8..1b3bdb3d0 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
@@ -46,13 +46,6 @@ public abstract class AbstractHttpClientRequestMessageEncoder extends AbstractMe
         request = httpRequest;
     }
 
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        request = null;
-
-        super.doDestroy();
-    }
-
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/BaseHttpClientRequestXMLMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/BaseHttpClientRequestXMLMessageEncoder.java
index 2bd325465..e0f0e1f4a 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/BaseHttpClientRequestXMLMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/BaseHttpClientRequestXMLMessageEncoder.java
@@ -23,11 +23,13 @@ import javax.annotation.Nullable;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.encoder.MessageEncodingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.w3c.dom.Element;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.SerializeSupport;
 
 /**
@@ -43,8 +45,14 @@ public abstract class BaseHttpClientRequestXMLMessageEncoder  extends AbstractHt
 
     /** {@inheritDoc} */
     public void encode() throws MessageEncodingException {
-        if (log.isDebugEnabled() && getMessageContext().getMessage() != null) {
-            log.debug("Beginning encode of message of type: {}", getMessageContext().getMessage().getClass().getName());
+        if (log.isDebugEnabled()) {
+            final MessageContext mc = getMessageContext();
+            if (mc != null) {
+                final Object msg = mc.getMessage();
+                if (msg != null) {
+                    log.debug("Beginning encode of message of type: {}", msg.getClass().getName());
+                }
+            }
         }
 
         super.encode();
@@ -80,7 +88,8 @@ public abstract class BaseHttpClientRequestXMLMessageEncoder  extends AbstractHt
      * @return the XMLObject message considered to be the protocol message for logging purposes
      */
     @Nullable protected Object getMessageToLog() {
-        return getMessageContext().getMessage();
+        final MessageContext mc = getMessageContext();
+        return mc != null ? mc.getMessage() : null;
     }
 
     /**
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java
index 41889ddfe..9d2294f17 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java
@@ -38,10 +38,10 @@ public abstract class AbstractHttpServletResponseMessageEncoder extends Abstract
      * {@inheritDoc}
      */
     @Nullable public HttpServletResponse getHttpServletResponse() {
-        if (httpServletResponseSupplier == null) {
-            return null;
+        if (httpServletResponseSupplier != null) {
+            return httpServletResponseSupplier.get();
         }
-        return httpServletResponseSupplier.get();
+        return null;
     }
 
     /**
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java
index eda7f59d9..cbe024bf4 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java
@@ -23,11 +23,13 @@ import javax.annotation.Nullable;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.encoder.MessageEncodingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.w3c.dom.Element;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.SerializeSupport;
 
 /**
@@ -43,8 +45,14 @@ public abstract class BaseHttpServletResponseXMLMessageEncoder  extends Abstract
 
     /** {@inheritDoc} */
     public void encode() throws MessageEncodingException {
-        if (log.isDebugEnabled() && getMessageContext().getMessage() != null) {
-            log.debug("Beginning encode of message of type: {}", getMessageContext().getMessage().getClass().getName());
+        if (log.isDebugEnabled()) {
+            final MessageContext mc = getMessageContext();
+            if (mc != null) {
+                final Object msg = mc.getMessage();
+                if (msg != null) {
+                    log.debug("Beginning encode of message of type: {}", msg.getClass().getName());
+                }
+            }
         }
 
         super.encode();
@@ -80,7 +88,8 @@ public abstract class BaseHttpServletResponseXMLMessageEncoder  extends Abstract
      * @return the XMLObject message considered to be the protocol message for logging purposes
      */
     @Nullable protected Object getMessageToLog() {
-        return getMessageContext().getMessage();
+        final MessageContext mc = getMessageContext();
+        return mc != null ? mc.getMessage() : null;
     }
 
     /**
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/MessageErrorHandler.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/MessageErrorHandler.java
index 33259ab6b..ea94f9e36 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/MessageErrorHandler.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/MessageErrorHandler.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.messaging.error;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.messaging.context.MessageContext;
 
 /**
@@ -31,6 +33,6 @@ public interface MessageErrorHandler {
      * @param messageContext the message context being processed, if available
      * @return true if error was successfully handled, false otherwise
      */
-    boolean handleError(Throwable t, MessageContext messageContext);
+    boolean handleError(@Nonnull Throwable t, @Nonnull MessageContext messageContext);
 
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/TypedMessageErrorHandler.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/TypedMessageErrorHandler.java
index 3a954ab2a..0351f4a77 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/TypedMessageErrorHandler.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/TypedMessageErrorHandler.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.messaging.error;
 
+import javax.annotation.Nonnull;
+
 /**
  * A specialization of error handler that explicitly indicates that it is capable of handling 
  * one or more types of throwable errors.
@@ -29,6 +31,6 @@ public interface TypedMessageErrorHandler extends MessageErrorHandler {
      * @param t the type of error about which to query
      * @return true iff the handle can handle the specified error type
      */
-    boolean handlesError(Throwable t);
+    boolean handlesError(@Nonnull Throwable t);
 
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/servlet/package-info.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/servlet/package-info.java
deleted file mode 100644
index 483de072e..000000000
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/error/servlet/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Licensed to the University Corporation for Advanced Internet Development,
- * Inc. (UCAID) under one or more contributor license agreements.  See the
- * NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The UCAID licenses this file to You under the Apache
- * License, Version 2.0 (the "License"); you may not use this file except in
- * compliance with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** Classes for message-related error handling in a servlet environment. */
-package org.opensaml.messaging.error.servlet;
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/handler/AbstractMessageHandler.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/handler/AbstractMessageHandler.java
index 971787111..162434300 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/handler/AbstractMessageHandler.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/handler/AbstractMessageHandler.java
@@ -23,14 +23,13 @@ import javax.annotation.Nonnull;
 
 import org.opensaml.messaging.context.MessageContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicates;
 
 import net.shibboleth.shared.annotation.Prototype;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.PredicateSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * A base abstract implementation of {@link MessageHandler}.
@@ -39,14 +38,14 @@ import net.shibboleth.shared.logic.Constraint;
 public abstract class AbstractMessageHandler extends AbstractInitializableComponent implements MessageHandler {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(AbstractMessageHandler.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(AbstractMessageHandler.class);
     
     /** Condition dictating whether to run or not. */
     @Nonnull private Predicate<MessageContext> activationCondition;
     
     /** Constructor. */
     public AbstractMessageHandler() {
-        activationCondition = Predicates.alwaysTrue();
+        activationCondition = PredicateSupport.alwaysTrue();
     }
     
     /**
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoConfidentialityMessageChannelPredicate.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoConfidentialityMessageChannelPredicate.java
index 74be672ba..880e86c4b 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoConfidentialityMessageChannelPredicate.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoConfidentialityMessageChannelPredicate.java
@@ -35,7 +35,7 @@ public class NoConfidentialityMessageChannelPredicate implements Predicate<Messa
     /** {@inheritDoc} */
     public boolean test(@Nullable final MessageContext input) {
         return input == null
-                || !input.getSubcontext(MessageChannelSecurityContext.class, true).isConfidentialityActive();
+                || !input.getOrCreateSubcontext(MessageChannelSecurityContext.class).isConfidentialityActive();
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoIntegrityMessageChannelPredicate.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoIntegrityMessageChannelPredicate.java
index 35a47bbc9..b7706cf27 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoIntegrityMessageChannelPredicate.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/logic/NoIntegrityMessageChannelPredicate.java
@@ -34,7 +34,7 @@ public class NoIntegrityMessageChannelPredicate implements Predicate<MessageCont
 
     /** {@inheritDoc} */
     public boolean test(@Nullable final MessageContext input) {
-        return input == null || !input.getSubcontext(MessageChannelSecurityContext.class, true).isIntegrityActive();
+        return input == null || !input.getOrCreateSubcontext(MessageChannelSecurityContext.class).isIntegrityActive();
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/BasicMessagePipeline.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/BasicMessagePipeline.java
index 15db7f799..8a40366d1 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/BasicMessagePipeline.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/BasicMessagePipeline.java
@@ -33,10 +33,10 @@ public class BasicMessagePipeline
         implements MessagePipeline {
     
     /** Message encoder. */
-    private MessageEncoder encoder;
+    @Nonnull private MessageEncoder encoder;
     
     /** Message decoder. */
-    private MessageDecoder decoder;
+    @Nonnull  private MessageDecoder decoder;
     
     /** Outbound payload message handler. */
     private MessageHandler outboundPayloadHandler;
@@ -55,12 +55,12 @@ public class BasicMessagePipeline
      */
     public BasicMessagePipeline(@Nonnull final MessageEncoder newEncoder, 
             @Nonnull final MessageDecoder newDecoder) {
-        setEncoder(newEncoder);
-        setDecoder(newDecoder);
+        encoder = Constraint.isNotNull(newEncoder, "MessageEncoder can not be null");
+        decoder = Constraint.isNotNull(newDecoder, "MessageDecoder can not be null");
     }
 
     /** {@inheritDoc} */
-    public MessageEncoder getEncoder() {
+    @Nonnull public MessageEncoder getEncoder() {
         return encoder;
     }
     
@@ -70,11 +70,11 @@ public class BasicMessagePipeline
      * @param newEncoder the new message encoder
      */
     protected void setEncoder(@Nonnull final MessageEncoder newEncoder) {
-       encoder = Constraint.isNotNull(newEncoder, "MessageEncoder can not be null") ;
+       encoder = Constraint.isNotNull(newEncoder, "MessageEncoder can not be null");
     }
 
     /** {@inheritDoc} */
-    public MessageDecoder getDecoder() {
+    @Nonnull public MessageDecoder getDecoder() {
         return decoder;
     }
     
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/BasicHttpClientMessagePipeline.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/BasicHttpClientMessagePipeline.java
index 3914f3de9..eebc382eb 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/BasicHttpClientMessagePipeline.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/BasicHttpClientMessagePipeline.java
@@ -42,12 +42,12 @@ public class BasicHttpClientMessagePipeline extends BasicMessagePipeline impleme
     }
 
     /** {@inheritDoc} */
-    public HttpClientRequestMessageEncoder getEncoder() {
+    @Nonnull public HttpClientRequestMessageEncoder getEncoder() {
         return (HttpClientRequestMessageEncoder) super.getEncoder();
     }
 
     /** {@inheritDoc} */
-    protected void setEncoder(final MessageEncoder encoder) {
+    protected void setEncoder(@Nonnull final MessageEncoder encoder) {
         if (!(encoder instanceof HttpClientRequestMessageEncoder)) {
             throw new IllegalArgumentException("HttpClientRequestMessageEncoder is required");
         }
@@ -55,12 +55,12 @@ public class BasicHttpClientMessagePipeline extends BasicMessagePipeline impleme
     }
 
     /** {@inheritDoc} */
-    public HttpClientResponseMessageDecoder getDecoder() {
+    @Nonnull public HttpClientResponseMessageDecoder getDecoder() {
         return (HttpClientResponseMessageDecoder) super.getDecoder();
     }
 
     /** {@inheritDoc} */
-    protected void setDecoder(final MessageDecoder decoder) {
+    protected void setDecoder(@Nonnull final MessageDecoder decoder) {
         if (!(decoder instanceof HttpClientResponseMessageDecoder)) {
             throw new IllegalArgumentException("HttpClientResponseMessageDecoder is required");
         }
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/HttpClientMessagePipeline.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/HttpClientMessagePipeline.java
index df5da9506..e3fd8fee4 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/HttpClientMessagePipeline.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/httpclient/HttpClientMessagePipeline.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.messaging.pipeline.httpclient;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.messaging.decoder.httpclient.HttpClientResponseMessageDecoder;
 import org.opensaml.messaging.encoder.httpclient.HttpClientRequestMessageEncoder;
 import org.opensaml.messaging.pipeline.MessagePipeline;
@@ -31,13 +33,13 @@ public interface HttpClientMessagePipeline extends MessagePipeline {
      * 
      * <p>Narrows the super-interface return type to {@link HttpClientRequestMessageEncoder}.</p>
      */
-    public HttpClientRequestMessageEncoder getEncoder();
+    @Nonnull public HttpClientRequestMessageEncoder getEncoder();
     
     /**
      * {@inheritDoc} 
      * 
      * <p>Narrows the super-interface return type to {@link HttpClientResponseMessageDecoder}.</p>
      */
-    public HttpClientResponseMessageDecoder getDecoder();
+    @Nonnull public HttpClientResponseMessageDecoder getDecoder();
 
 }
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/BasicHttpServletMessagePipeline.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/BasicHttpServletMessagePipeline.java
index fdf027d75..51fe0c4b1 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/BasicHttpServletMessagePipeline.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/BasicHttpServletMessagePipeline.java
@@ -42,12 +42,12 @@ public class BasicHttpServletMessagePipeline extends BasicMessagePipeline implem
     }
 
     /** {@inheritDoc} */
-    public HttpServletResponseMessageEncoder getEncoder() {
+    @Nonnull public HttpServletResponseMessageEncoder getEncoder() {
         return (HttpServletResponseMessageEncoder) super.getEncoder();
     }
 
     /** {@inheritDoc} */
-    protected void setEncoder(final MessageEncoder encoder) {
+    protected void setEncoder(@Nonnull final MessageEncoder encoder) {
         if (!(encoder instanceof HttpServletResponseMessageEncoder)) {
             throw new IllegalArgumentException("HttpServletResponseMessageEncoder is required");
         }
@@ -55,12 +55,12 @@ public class BasicHttpServletMessagePipeline extends BasicMessagePipeline implem
     }
 
     /** {@inheritDoc} */
-    public HttpServletRequestMessageDecoder getDecoder() {
+    @Nonnull public HttpServletRequestMessageDecoder getDecoder() {
         return (HttpServletRequestMessageDecoder) super.getDecoder();
     }
 
     /** {@inheritDoc} */
-    protected void setDecoder(final MessageDecoder decoder) {
+    protected void setDecoder(@Nonnull final MessageDecoder decoder) {
         if (!(decoder instanceof HttpServletRequestMessageDecoder)) {
             throw new IllegalArgumentException("HttpServletRequestMessageDecoder is required");
         }
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/HttpServletMessagePipeline.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/HttpServletMessagePipeline.java
index 163059cd5..14162ea07 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/HttpServletMessagePipeline.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/pipeline/servlet/HttpServletMessagePipeline.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.messaging.pipeline.servlet;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.messaging.decoder.servlet.HttpServletRequestMessageDecoder;
 import org.opensaml.messaging.encoder.servlet.HttpServletResponseMessageEncoder;
 import org.opensaml.messaging.pipeline.MessagePipeline;
@@ -31,13 +33,13 @@ public interface HttpServletMessagePipeline extends MessagePipeline {
      * 
      * <p>Narrows the super-interface return type to {@link HttpServletResponseMessageEncoder}.</p>
      */
-    public HttpServletResponseMessageEncoder getEncoder();
+    @Nonnull public HttpServletResponseMessageEncoder getEncoder();
     
     /**
      * {@inheritDoc} 
      * 
      * <p>Narrows the super-interface return type to {@link HttpServletRequestMessageDecoder}.</p>
      */
-    public HttpServletRequestMessageDecoder getDecoder();
+    @Nonnull public HttpServletRequestMessageDecoder getDecoder();
 
 }
diff --git a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/InOutOperationContextText.java b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/InOutOperationContextText.java
index d6188fe21..424c2422b 100644
--- a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/InOutOperationContextText.java
+++ b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/InOutOperationContextText.java
@@ -21,8 +21,9 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 /**
- *
+ * Unit test for {@link InOutOperationContext}.
  */
+ at SuppressWarnings("javadoc")
 public class InOutOperationContextText {
     
     @Test
diff --git a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/TestContext.java b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/TestContext.java
index 7200991b7..be8d30df5 100644
--- a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/TestContext.java
+++ b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/TestContext.java
@@ -17,7 +17,6 @@
 
 package org.opensaml.messaging.context;
 
-import org.opensaml.messaging.context.BaseContext;
 
 /**
  * A concrete test context implementation for use in unit tests.
diff --git a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/MessageContextLookupTest.java b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/MessageContextLookupTest.java
index ca44cea0a..64f6ae4ac 100644
--- a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/MessageContextLookupTest.java
+++ b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/MessageContextLookupTest.java
@@ -25,8 +25,10 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import net.shibboleth.shared.logic.ConstraintViolationException;
-
+/**
+ * Unit test for {@link MessageContextLookup}.
+ */
+ at SuppressWarnings("javadoc")
 public class MessageContextLookupTest {
     
     private InOutOperationContext opContext;
@@ -39,7 +41,7 @@ public class MessageContextLookupTest {
     @Test
     public void testInboundFromSame() {
         MockContext input = new MockContext();
-        opContext.getInboundMessageContext().addSubcontext(input);
+        opContext.ensureInboundMessageContext().addSubcontext(input);
         MessageContextLookup<BaseContext> lookup  = new MessageContextLookup<>(Direction.INBOUND);
         Assert.assertSame(lookup.apply(input), opContext.getInboundMessageContext());
     }
@@ -47,7 +49,7 @@ public class MessageContextLookupTest {
     @Test
     public void testOutboundFromSame() {
         MockContext input = new MockContext();
-        opContext.getOutboundMessageContext().addSubcontext(input);
+        opContext.ensureOutboundMessageContext().addSubcontext(input);
         MessageContextLookup<BaseContext> lookup  = new MessageContextLookup<>(Direction.OUTBOUND);
         Assert.assertSame(lookup.apply(input), opContext.getOutboundMessageContext());
     }
@@ -55,7 +57,7 @@ public class MessageContextLookupTest {
     @Test
     public void testInboundFromCrosswalk() {
         MockContext input = new MockContext();
-        opContext.getOutboundMessageContext().addSubcontext(input);
+        opContext.ensureOutboundMessageContext().addSubcontext(input);
         MessageContextLookup<BaseContext> lookup  = new MessageContextLookup<>(Direction.INBOUND);
         Assert.assertSame(lookup.apply(input), opContext.getInboundMessageContext());
     }
@@ -63,7 +65,7 @@ public class MessageContextLookupTest {
     @Test
     public void testOutboundFromCrosswalk() {
         MockContext input = new MockContext();
-        opContext.getInboundMessageContext().addSubcontext(input);
+        opContext.ensureInboundMessageContext().addSubcontext(input);
         MessageContextLookup<BaseContext> lookup  = new MessageContextLookup<>(Direction.OUTBOUND);
         Assert.assertSame(lookup.apply(input), opContext.getOutboundMessageContext());
     }
@@ -74,17 +76,6 @@ public class MessageContextLookupTest {
         Assert.assertNull(lookup.apply(new MessageContext()));
     }
     
-    @Test(expectedExceptions=ConstraintViolationException.class)
-    public void testCtorNoDirection() {
-        new MessageContextLookup<>(null);
-    }
-    
-    @Test(expectedExceptions=ConstraintViolationException.class)
-    public void testCtorNoLookup() {
-        new MessageContextLookup<>(Direction.INBOUND, null);
-    }
-    
-    
     // Helpers
     
     private static class MockContext extends BaseContext {
diff --git a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/RecursiveTypedParentContextLookupTest.java b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/RecursiveTypedParentContextLookupTest.java
index 5758a6c55..9147c630a 100644
--- a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/RecursiveTypedParentContextLookupTest.java
+++ b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/context/navigate/RecursiveTypedParentContextLookupTest.java
@@ -23,13 +23,14 @@ import org.opensaml.messaging.context.MessageContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import net.shibboleth.shared.logic.ConstraintViolationException;
-
 /**
- *
+ * Unit test for {@link RecursiveTypedParentContextLookup}.
  */
 public class RecursiveTypedParentContextLookupTest {
 
+    /**
+     * Unit test.
+     */
     @Test
     public void testBasic() {
         MockContext1 mc1 = new MockContext1();
@@ -39,7 +40,7 @@ public class RecursiveTypedParentContextLookupTest {
         InOutOperationContext opContext = new InOutOperationContext(null, null);
         
         opContext.setInboundMessageContext(in);
-        opContext.getInboundMessageContext().addSubcontext(mc1);
+        opContext.ensureInboundMessageContext().addSubcontext(mc1);
         mc1.addSubcontext(mc2);
         mc2.addSubcontext(mc3);
         
@@ -52,11 +53,6 @@ public class RecursiveTypedParentContextLookupTest {
         Assert.assertNull(new RecursiveTypedParentContextLookup<>(InOutOperationContext.class).apply(null));
     }
     
-    @Test(expectedExceptions=ConstraintViolationException.class)
-    public void testCtor() {
-        new RecursiveTypedParentContextLookup<>(null);
-    }
-    
     // Helpers
     
     public static class MockContext1 extends BaseContext {
diff --git a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/handler/AbstractMessageHandlerTest.java b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/handler/AbstractMessageHandlerTest.java
index bdfcccfb1..3043e9d96 100644
--- a/opensaml-messaging-api/src/test/java/org/opensaml/messaging/handler/AbstractMessageHandlerTest.java
+++ b/opensaml-messaging-api/src/test/java/org/opensaml/messaging/handler/AbstractMessageHandlerTest.java
@@ -24,7 +24,7 @@ import org.opensaml.messaging.context.MessageContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicates;
+import net.shibboleth.shared.logic.PredicateSupport;
 
 /** Unit test for {@link AbstractMessageHandler}. */
 public class AbstractMessageHandlerTest {
@@ -129,23 +129,33 @@ public class AbstractMessageHandlerTest {
         }
     }
     
+    /**
+     * Test handler with an always true activation condition.
+     * 
+     * @throws Exception
+     */
     @Test
     public void testTrueActivationCondition() throws Exception {
         final MockMutatingHandler handler = new MockMutatingHandler();
-        handler.setActivationCondition(Predicates.alwaysTrue());
+        handler.setActivationCondition(PredicateSupport.alwaysTrue());
         handler.initialize();
         
         MessageContext messageContext = new MessageContext();
         handler.invoke(messageContext);
         
         Assert.assertTrue(messageContext.containsSubcontext(MockContext.class));
-        Assert.assertEquals(messageContext.getSubcontext(MockContext.class).value, "hello");
+        Assert.assertEquals(messageContext.getOrCreateSubcontext(MockContext.class).value, "hello");
     }
 
+    /**
+     * Test handler with an always false activation condition.
+     * 
+     * @throws Exception
+     */
     @Test
     public void testFalseActivationCondition() throws Exception {
         final MockMutatingHandler handler = new MockMutatingHandler();
-        handler.setActivationCondition(Predicates.alwaysFalse());
+        handler.setActivationCondition(PredicateSupport.alwaysFalse());
         handler.initialize();
         
         MessageContext messageContext = new MessageContext();
@@ -211,12 +221,17 @@ public class AbstractMessageHandlerTest {
     
     private class MockMutatingHandler extends AbstractMessageHandler {
 
-        protected void doInvoke(MessageContext messageContext) throws MessageHandlerException {
-            messageContext.getSubcontext(MockContext.class, true).value = "hello";
+        protected void doInvoke(@Nonnull MessageContext messageContext) throws MessageHandlerException {
+            messageContext.getOrCreateSubcontext(MockContext.class).value = "hello";
         }
     }
     
+    /**
+     * Mock context
+     */
     public static class MockContext extends BaseContext {
+        
+        /** Mock value. */
         public String value;
     }
 

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


More information about the commits mailing list