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

Scott Cantor cantor.2 at osu.edu
Fri Apr 7 20:00:59 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=093add7bb4a109017c08725a2a4be7550c620b72

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

commit 093add7bb4a109017c08725a2a4be7550c620b72
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Fri Apr 7 16:00:55 2023 -0400

    IDP-2069 - Null Handling Task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    Clean SAML encoders/decoders.
    Clean some tests.
---
 .../AbstractHttpServletRequestMessageDecoder.java  |   2 +-
 .../AbstractHttpServletResponseMessageEncoder.java |   3 +-
 .../soap/SAMLSOAPClientContextBuilder.java         |   2 +-
 .../binding/artifact/SAML2ArtifactType0004.java    |   2 +-
 .../binding/decoding/impl/HTTPArtifactDecoder.java |  82 ++++------
 .../binding/decoding/impl/HTTPPostDecoder.java     |   6 +-
 .../decoding/impl/HTTPRedirectDeflateDecoder.java  |   6 +-
 .../binding/decoding/impl/HTTPSOAP11Decoder.java   |  11 +-
 .../impl/HttpClientResponseSOAP11Decoder.java      |  11 +-
 .../encoding/impl/BaseSAML2MessageEncoder.java     |   5 +-
 .../binding/encoding/impl/HTTPArtifactEncoder.java |  45 ++---
 .../binding/encoding/impl/HTTPPostEncoder.java     |  52 +++---
 .../encoding/impl/HTTPPostSimpleSignEncoder.java   |  50 +++---
 .../encoding/impl/HTTPRedirectDeflateEncoder.java  |  60 +++----
 .../binding/encoding/impl/HTTPSOAP11Encoder.java   |  10 +-
 .../impl/HttpClientRequestSOAP11Encoder.java       |  15 +-
 .../binding/decoding/impl/HTTPPostDecoderTest.java |  21 ++-
 .../decoding/impl/HTTPSOAP11DecoderTest.java       |  17 +-
 .../binding/encoding/impl/HTTPPostEncoderTest.java |  64 ++++----
 .../encoding/impl/HTTPSOAP11EncoderTest.java       |  37 +++--
 .../binding/decoding/impl/HTTPPostDecoderTest.java |   6 +-
 .../impl/HTTPRedirectDeflateDecoderTest.java       |  33 ++--
 .../decoding/impl/HTTPSOAP11DecoderTest.java       |  17 +-
 .../impl/HTTPPostSimpleSignEncoderTest.java        |   3 +-
 .../impl/HTTPRedirectDeflateEncoderTest.java       | 182 +++++++++++----------
 .../encoding/impl/HTTPSOAP11EncoderTest.java       |  41 ++---
 .../http/impl/HttpClientRequestSOAP11Encoder.java  |   2 +-
 .../encoder/http/impl/HTTPSOAP11Encoder.java       |  10 +-
 .../org/opensaml/xmlsec/crypto/XMLSigningUtil.java |   4 +-
 29 files changed, 417 insertions(+), 382 deletions(-)

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 23c3ad055..5fa19bbfe 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
@@ -37,7 +37,7 @@ public abstract class AbstractHttpServletRequestMessageDecoder extends AbstractM
     @NonnullAfterInit private NonnullSupplier<HttpServletRequest> httpServletRequestSupplier;
 
     /** {@inheritDoc} */
-    @Nullable public HttpServletRequest getHttpServletRequest() {
+    @NonnullAfterInit public HttpServletRequest getHttpServletRequest() {
         if (httpServletRequestSupplier != null) {
             return httpServletRequestSupplier.get();
         }
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 9e9c5beac..23e001559 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
@@ -70,4 +70,5 @@ public abstract class AbstractHttpServletResponseMessageEncoder extends Abstract
             throw new ComponentInitializationException("HTTP servlet response cannot be null");
         }
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-api/src/main/java/org/opensaml/saml/common/messaging/soap/SAMLSOAPClientContextBuilder.java b/opensaml-saml-api/src/main/java/org/opensaml/saml/common/messaging/soap/SAMLSOAPClientContextBuilder.java
index 0b0893263..b4b07a5d7 100644
--- a/opensaml-saml-api/src/main/java/org/opensaml/saml/common/messaging/soap/SAMLSOAPClientContextBuilder.java
+++ b/opensaml-saml-api/src/main/java/org/opensaml/saml/common/messaging/soap/SAMLSOAPClientContextBuilder.java
@@ -343,7 +343,7 @@ public class SAMLSOAPClientContextBuilder<InboundMessageType extends SAMLObject,
      * 
      * @throws MessageException if any required data is not supplied and can not be derived from other supplied data
      */
-    public InOutOperationContext build() throws MessageException {
+    @Nonnull public InOutOperationContext build() throws MessageException {
         if (getOutboundMessage() == null) {
             errorMissingData("Outbound message");
         }
diff --git a/opensaml-saml-api/src/main/java/org/opensaml/saml/saml2/binding/artifact/SAML2ArtifactType0004.java b/opensaml-saml-api/src/main/java/org/opensaml/saml/saml2/binding/artifact/SAML2ArtifactType0004.java
index bb44530c4..ca3a152f3 100644
--- a/opensaml-saml-api/src/main/java/org/opensaml/saml/saml2/binding/artifact/SAML2ArtifactType0004.java
+++ b/opensaml-saml-api/src/main/java/org/opensaml/saml/saml2/binding/artifact/SAML2ArtifactType0004.java
@@ -30,7 +30,7 @@ import org.opensaml.saml.common.binding.artifact.SAMLSourceIDArtifact;
 public class SAML2ArtifactType0004 extends AbstractSAML2Artifact implements SAMLSourceIDArtifact {
 
     /** SAML 2 artifact type code (0x0004). */
-    @Nonnull  public static final byte[] TYPE_CODE = { 0, 4 };
+    @Nonnull public static final byte[] TYPE_CODE = { 0, 4 };
 
     /** 20 byte artifact source ID. */
     @Nonnull private byte[] sourceID;
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPArtifactDecoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPArtifactDecoder.java
index c154d5b57..a2589dabc 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPArtifactDecoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPArtifactDecoder.java
@@ -52,6 +52,7 @@ import org.opensaml.saml.saml2.core.Artifact;
 import org.opensaml.saml.saml2.core.ArtifactResolve;
 import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.opensaml.saml.saml2.core.Issuer;
+import org.opensaml.saml.saml2.core.Status;
 import org.opensaml.saml.saml2.core.StatusCode;
 import org.opensaml.saml.saml2.metadata.ArtifactResolutionService;
 import org.opensaml.saml.saml2.metadata.RoleDescriptor;
@@ -60,7 +61,6 @@ import org.opensaml.soap.client.SOAPClient;
 import org.opensaml.soap.client.http.PipelineFactoryHttpSOAPClient;
 import org.opensaml.soap.common.SOAPException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
@@ -70,6 +70,7 @@ import net.shibboleth.shared.codec.DecodingException;
 import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.Resolver;
@@ -104,16 +105,16 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
     @NonnullAfterInit private Resolver<String, CriteriaSet> selfEntityIDResolver;
     
     /** SOAP client. */
-    private SOAPClient soapClient;
+    @NonnullAfterInit private SOAPClient soapClient;
     
     /** The SOAP client message pipeline name. */
-    private String soapPipelineName;
+    @Nullable private String soapPipelineName;
     
     /** SOAP client security configuration profile ID. */
-    private String soapClientSecurityConfigurationProfileId;
+    @Nullable private String soapClientSecurityConfigurationProfileId;
     
     /** Identifier generation strategy. */
-    private IdentifierGenerationStrategy idStrategy;
+    @NonnullAfterInit private IdentifierGenerationStrategy idStrategy;
 
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
@@ -150,19 +151,6 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
         if (artifactEndpointResolver == null) {
             artifactEndpointResolver = new DefaultEndpointResolver<>();
         }
-        
-    }
-    
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        super.doDestroy();
-        bindingDescriptor = null;
-        artifactBuilderFactory = null;
-        artifactEndpointResolver = null;
-        roleDescriptorResolver = null;
-        peerEntityRole = null;
-        soapClient = null;
-        idStrategy = null;
     }
 
     /**
@@ -198,7 +186,7 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      * 
      * @param resolver the resolver instance
      */
-    public void setSelfEntityIDResolver(@Nonnull final Resolver<String, CriteriaSet> resolver) {
+    public void setSelfEntityIDResolver(@Nullable final Resolver<String, CriteriaSet> resolver) {
         checkSetterPreconditions();
         selfEntityIDResolver = resolver;
     }
@@ -217,7 +205,7 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      * 
      * @param role  the peer entity role
      */
-    public void setPeerEntityRole(@Nonnull final QName role) {
+    public void setPeerEntityRole(@Nullable final QName role) {
         checkSetterPreconditions();
         peerEntityRole = role;
     }
@@ -301,7 +289,7 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      * 
      * @param client the SOAP client
      */
-    public void setSOAPClient(@Nonnull final SOAPClient client) {
+    public void setSOAPClient(@Nullable final SOAPClient client) {
         checkSetterPreconditions();
         soapClient = client;
     }
@@ -405,15 +393,9 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
         
         try {
             final SAML2Artifact artifact = parseArtifact(encodedArtifact);
-            
             final RoleDescriptor peerRoleDescriptor = resolvePeerRoleDescriptor(artifact);
-            if (peerRoleDescriptor == null) {
-                throw new MessageDecodingException("Failed to resolve peer RoleDescriptor based on inbound artifact");
-            }
-            
-            final ArtifactResolutionService ars = resolveArtifactEndpoint(artifact, peerRoleDescriptor);
-
-            final SAMLObject inboundMessage = dereferenceArtifact(artifact, peerRoleDescriptor, ars);
+            final String resolutionEndpoint = resolveArtifactEndpoint(artifact, peerRoleDescriptor);
+            final SAMLObject inboundMessage = dereferenceArtifact(artifact, peerRoleDescriptor, resolutionEndpoint);
 
             messageContext.setMessage(inboundMessage);
         } catch (final MessageDecodingException e) {
@@ -428,12 +410,12 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      * 
      * @param artifact the artifact to de-reference
      * @param peerRoleDescriptor the peer RoleDescriptor
-     * @param ars the peer's artifact resolution service endpoint
+     * @param endpoint the peer's artifact resolution service endpoint
      * @return the de-referenced artifact
      * @throws MessageDecodingException if there is fatal error, or if the artifact was not successfully resolved
      */
     @Nonnull private SAMLObject dereferenceArtifact(@Nonnull final SAML2Artifact artifact, 
-            @Nonnull final RoleDescriptor peerRoleDescriptor, @Nonnull final ArtifactResolutionService ars) 
+            @Nonnull final RoleDescriptor peerRoleDescriptor, @Nonnull final String endpoint) 
                     throws MessageDecodingException {
         
         try {
@@ -442,7 +424,7 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
             // TODO can assume/enforce response as ArtifactResponse here?
             final InOutOperationContext opContext = new SAMLSOAPClientContextBuilder<>()
                     .setOutboundMessage(buildArtifactResolveRequestMessage(
-                            artifact, ars.getLocation(), peerRoleDescriptor, selfEntityID))
+                            artifact, endpoint, peerRoleDescriptor, selfEntityID))
                     .setProtocol(SAMLConstants.SAML20P_NS)
                     .setPipelineName(getSOAPPipelineName())
                     .setSecurityConfigurationProfileId(getSOAPClientSecurityConfigurationProfileId())
@@ -450,14 +432,15 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
                     .setSelfEntityID(selfEntityID)
                     .build();
         
-            log.trace("Executing ArtifactResolve over SOAP 1.1 binding to endpoint: {}", ars.getLocation());
-            soapClient.send(ars.getLocation(), opContext);
-            final Object response = opContext.getInboundMessageContext().getMessage();
+            log.trace("Executing ArtifactResolve over SOAP 1.1 binding to endpoint: {}", endpoint);
+            soapClient.send(endpoint, opContext);
+            final MessageContext inboundContext = opContext.getInboundMessageContext();
+            final Object response = inboundContext != null ? inboundContext.getMessage() : null;
             if (response instanceof ArtifactResponse) {
                 return validateAndExtractResponseMessage((ArtifactResponse) response);
             }
             throw new MessageDecodingException("SOAP message payload was not an instance of ArtifactResponse: " 
-                    + response.getClass().getName());
+                    + (response != null ? response.getClass().getName() : "(null)"));
         } catch (final MessageException | SOAPException | SecurityException | EncodingException e) {
             throw new MessageDecodingException("Error dereferencing artifact", e);
         }
@@ -472,22 +455,22 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      */
     @Nonnull private SAMLObject validateAndExtractResponseMessage(@Nonnull final ArtifactResponse artifactResponse) 
             throws MessageDecodingException {
-        if (artifactResponse.getStatus() == null 
-                || artifactResponse.getStatus().getStatusCode() == null 
-                || artifactResponse.getStatus().getStatusCode().getValue() == null) {
-            
+        
+        final Status status = artifactResponse.getStatus();
+        final StatusCode statusCode = status != null ? status.getStatusCode() : null;
+        if (statusCode == null || statusCode.getValue() == null) {
             throw new MessageDecodingException("ArtifactResponse included no StatusCode, could not validate");
-            
-        } else if (!StatusCode.SUCCESS.equals(artifactResponse.getStatus().getStatusCode().getValue())){
+        } else if (!StatusCode.SUCCESS.equals(statusCode.getValue())){
             throw new MessageDecodingException("ArtifactResponse carried non-success StatusCode: " 
-                    + artifactResponse.getStatus().getStatusCode().getValue());
+                    + statusCode.getValue());
         }
         
-        if (artifactResponse.getMessage() == null) {
+        final SAMLObject msg = artifactResponse.getMessage();
+        if (msg == null) {
             throw new MessageDecodingException("ArtifactResponse carried an empty message payload");
         }
         
-        return artifactResponse.getMessage();
+        return msg;
     }
 
     /**
@@ -559,11 +542,13 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      * 
      * @param artifact the artifact
      * @param peerRoleDescriptor the peer RoleDescriptor
+     * 
      * @return the peer artifact resolution service endpoint
+     * 
      * @throws MessageDecodingException if there is a fatal error resolving the endpoint, 
      *          or the endpoint could not be resolved
      */
-    @Nonnull private ArtifactResolutionService resolveArtifactEndpoint(@Nonnull final SAML2Artifact artifact,
+    @Nonnull private String resolveArtifactEndpoint(@Nonnull final SAML2Artifact artifact,
             @Nonnull final RoleDescriptor peerRoleDescriptor) throws MessageDecodingException {
         
         final RoleDescriptorCriterion roleDescriptorCriterion = new RoleDescriptorCriterion(peerRoleDescriptor);
@@ -589,7 +574,10 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
         try {
             final ArtifactResolutionService ars = artifactEndpointResolver.resolveSingle(criteriaSet);
             if (ars != null) {
-                return ars;
+                final String loc = ars.getLocation();
+                if (loc != null) {
+                    return loc;
+                }
             }
             throw new MessageDecodingException("Unable to resolve ArtifactResolutionService endpoint");
         } catch (final ResolverException e) {
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoder.java
index 10ef6a704..f8cfef0fb 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoder.java
@@ -34,7 +34,6 @@ import org.opensaml.saml.common.binding.decoding.SAMLMessageDecoder;
 import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
 import org.opensaml.saml.common.xml.SAMLConstants;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
@@ -42,6 +41,7 @@ import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.DecodingException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /** Message decoder implementing the SAML 2.0 HTTP POST binding. */
 public class HTTPPostDecoder extends BaseHttpServletRequestXMLMessageDecoder implements SAMLMessageDecoder {
@@ -113,7 +113,8 @@ public class HTTPPostDecoder extends BaseHttpServletRequestXMLMessageDecoder imp
      * @throws MessageDecodingException thrown if the message does not contain a base64 encoded SAML message, 
      *                                      or the message can not be base64-decoded.
      */
-    protected InputStream getBase64DecodedMessage(final HttpServletRequest request) throws MessageDecodingException {
+    @Nonnull protected InputStream getBase64DecodedMessage(final HttpServletRequest request)
+            throws MessageDecodingException {
         log.debug("Getting Base64 encoded message from request");
         String encodedMessage = request.getParameter("SAMLRequest");
         if (Strings.isNullOrEmpty(encodedMessage)) {
@@ -125,6 +126,7 @@ public class HTTPPostDecoder extends BaseHttpServletRequestXMLMessageDecoder imp
                     + "SAMLResponse paramter.  Invalid request for SAML 2 HTTP POST binding.");
             throw new MessageDecodingException("No SAML message present in request");
         }
+        assert encodedMessage != null;
 
         try {
             log.trace("Base64 decoding SAML message:\n{}", encodedMessage);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoder.java
index fb4e9bbd6..35d3aba5a 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoder.java
@@ -36,13 +36,13 @@ import org.opensaml.saml.common.binding.decoding.SAMLMessageDecoder;
 import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
 import org.opensaml.saml.common.xml.SAMLConstants;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
 import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.Base64Support;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -129,7 +129,7 @@ public class HTTPRedirectDeflateDecoder extends BaseHttpServletRequestXMLMessage
      * 
      * @throws MessageDecodingException thrown if the message can not be decoded
      */
-    protected InputStream decodeMessage(final String message) throws MessageDecodingException {
+    @Nonnull protected InputStream decodeMessage(@Nonnull final String message) throws MessageDecodingException {
         log.debug("Base64 decoding and inflating SAML message");
 
         try {
@@ -146,7 +146,7 @@ public class HTTPRedirectDeflateDecoder extends BaseHttpServletRequestXMLMessage
      * 
      * @param messageContext the current message context
      */
-    protected void populateBindingContext(final MessageContext messageContext) {
+    protected void populateBindingContext(@Nonnull final MessageContext messageContext) {
         final SAMLBindingContext bindingContext = messageContext.ensureSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11Decoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11Decoder.java
index 2523ee472..2cb9cb16e 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11Decoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11Decoder.java
@@ -29,9 +29,9 @@ import org.opensaml.saml.common.binding.impl.SAMLSOAPDecoderBodyHandler;
 import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
 import org.opensaml.saml.common.xml.SAMLConstants;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * SAML 2.0 SOAP 1.1 over HTTP binding decoder.
@@ -79,9 +79,12 @@ public class HTTPSOAP11Decoder extends org.opensaml.soap.soap11.decoder.http.imp
     protected void doDecode() throws MessageDecodingException {
         super.doDecode();
         
-        populateBindingContext(getMessageContext());
+        final MessageContext msgCtx = getMessageContext();
+        assert msgCtx != null;
         
-        final Object samlMessage = getMessageContext().getMessage();
+        populateBindingContext(msgCtx);
+        
+        final Object samlMessage = msgCtx.getMessage();
         if (samlMessage instanceof SAMLObject) {
             log.debug("Decoded SOAP message which included SAML message of type {}",
                     ((SAMLObject) samlMessage).getElementQName());
@@ -95,7 +98,7 @@ public class HTTPSOAP11Decoder extends org.opensaml.soap.soap11.decoder.http.imp
      * 
      * @param messageContext the current message context
      */
-    protected void populateBindingContext(final MessageContext messageContext) {
+    protected void populateBindingContext(@Nonnull final MessageContext messageContext) {
         final SAMLBindingContext bindingContext = messageContext.ensureSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java
index 60147002c..d5e410c49 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java
@@ -29,9 +29,9 @@ import org.opensaml.saml.common.binding.impl.SAMLSOAPDecoderBodyHandler;
 import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
 import org.opensaml.saml.common.xml.SAMLConstants;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * SAML 2.0 SOAP 1.1 over HTTP binding decoder for HttpClient HttpResponse.
@@ -80,9 +80,12 @@ public class HttpClientResponseSOAP11Decoder
     protected void doDecode() throws MessageDecodingException {
         super.doDecode();
         
-        populateBindingContext(getMessageContext());
+        final MessageContext msgCtx = getMessageContext();
+        assert msgCtx != null;
         
-        final Object samlMessage = getMessageContext().getMessage();
+        populateBindingContext(msgCtx);
+        
+        final Object samlMessage = msgCtx.getMessage();
         if (samlMessage instanceof SAMLObject) {
             log.debug("Decoded SOAP message which included SAML message of type {}",
                     ((SAMLObject) samlMessage).getElementQName());
@@ -96,7 +99,7 @@ public class HttpClientResponseSOAP11Decoder
      * 
      * @param messageContext the current message context
      */
-    protected void populateBindingContext(final MessageContext messageContext) {
+    protected void populateBindingContext(@Nonnull final MessageContext messageContext) {
         final SAMLBindingContext bindingContext = messageContext.ensureSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/BaseSAML2MessageEncoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/BaseSAML2MessageEncoder.java
index 0295cf60a..e13e52e9a 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/BaseSAML2MessageEncoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/BaseSAML2MessageEncoder.java
@@ -19,6 +19,8 @@ package org.opensaml.saml.saml2.binding.encoding.impl;
 
 import java.net.URI;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.encoder.MessageEncodingException;
 import org.opensaml.messaging.encoder.servlet.BaseHttpServletResponseXMLMessageEncoder;
@@ -41,7 +43,8 @@ public abstract class BaseSAML2MessageEncoder extends BaseHttpServletResponseXML
      * 
      * @throws MessageEncodingException throw if no relying party endpoint is available
      */
-    protected URI getEndpointURL(final MessageContext messageContext) throws MessageEncodingException {
+    @Nonnull protected URI getEndpointURL(@Nonnull final MessageContext messageContext)
+            throws MessageEncodingException {
         try {
             return SAMLBindingSupport.getEndpointURL(messageContext);
         } catch (final BindingException e) {
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPArtifactEncoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPArtifactEncoder.java
index c5f628c64..442ebf3cd 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPArtifactEncoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPArtifactEncoder.java
@@ -39,9 +39,9 @@ import org.opensaml.saml.common.xml.SAMLConstants;
 import org.opensaml.saml.config.SAMLConfigurationSupport;
 import org.opensaml.saml.saml2.binding.artifact.SAML2Artifact;
 import org.opensaml.saml.saml2.binding.artifact.SAML2ArtifactBuilder;
+import org.opensaml.saml.saml2.binding.artifact.SAML2ArtifactBuilderFactory;
 import org.opensaml.saml.saml2.binding.artifact.SAML2ArtifactType0004;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import jakarta.servlet.http.HttpServletResponse;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
@@ -53,6 +53,7 @@ import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.net.URLBuilder;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -84,12 +85,11 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
     /** Constructor. */
     public HTTPArtifactEncoder() {
         defaultArtifactType = SAML2ArtifactType0004.TYPE_CODE;
-        setVelocityTemplateId(DEFAULT_TEMPLATE_ID);
+        velocityTemplateId = DEFAULT_TEMPLATE_ID;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public String getBindingURI() {
+    @Nonnull @NotEmpty public String getBindingURI() {
         return SAMLConstants.SAML2_ARTIFACT_BINDING_URI;
     }
     
@@ -193,24 +193,10 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
         }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    protected void doDestroy() {
-        velocityEngine = null;
-        velocityTemplateId = null;
-        artifactMap = null;
-        
-        super.doDestroy();
-    }
-
     /** {@inheritDoc} */
     @Override
     protected void doEncode() throws MessageEncodingException {
-        final HttpServletResponse response = getHttpServletResponse();
-        if (response == null) {
-            throw new MessageEncodingException("HttpServletResponse was null");
-        }
-        response.setCharacterEncoding("UTF-8");
+        getHttpServletResponse().setCharacterEncoding("UTF-8");
 
         if (postEncoding) {
             postEncode();
@@ -229,6 +215,7 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
         log.debug("Performing HTTP POST SAML 2 artifact encoding");
         
         final MessageContext messageContext = getMessageContext();
+        assert messageContext != null;
 
         log.debug("Creating velocity context");
         final VelocityContext context = new VelocityContext();
@@ -256,6 +243,7 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
             log.debug("Invoking velocity template");
             final HttpServletResponse response = getHttpServletResponse();
             try (final OutputStreamWriter outWriter = new OutputStreamWriter(response.getOutputStream())) {
+                assert velocityEngine != null;
                 velocityEngine.mergeTemplate(velocityTemplateId, "UTF-8", context, outWriter);
                 outWriter.flush();
             }
@@ -274,8 +262,10 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
         log.debug("Performing HTTP GET SAML 2 artifact encoding");
 
         final MessageContext messageContext = getMessageContext();
+        assert messageContext != null;
         
         final String endpointUrl = getEndpointURL(messageContext).toString();
+        assert endpointUrl != null;
         
         final URLBuilder urlBuilder;
         try {
@@ -288,10 +278,6 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
         queryParams.clear();
 
         final SAML2Artifact artifact = buildArtifact(messageContext);
-        if (artifact == null) {
-            log.error("Unable to build artifact for message to relying party");
-            throw new MessageEncodingException("Unable to build artifact for message to relying party");
-        }
         try {
             queryParams.add(new Pair<>("SAMLart", 
                     Base64Support.encode(artifact.getArtifactBytes(), Base64Support.UNCHUNKED)));
@@ -313,6 +299,7 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
         }
     }
 
+// Checkstyle: CyclomaticComplexity OFF
     /**
      * Builds the SAML 2 artifact for the outgoing message.
      * 
@@ -340,13 +327,16 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
         final SAML2ArtifactBuilder<?> artifactBuilder;
         final byte[] artifactType = getSAMLArtifactType(messageContext);
         if (artifactType != null) {
-            artifactBuilder = SAMLConfigurationSupport.getSAML2ArtifactBuilderFactory()
-                    .getArtifactBuilder(artifactType);
+            final SAML2ArtifactBuilderFactory factory = SAMLConfigurationSupport.getSAML2ArtifactBuilderFactory();
+            artifactBuilder = factory != null ? factory.getArtifactBuilder(artifactType) : null;
         } else {
-            artifactBuilder = SAMLConfigurationSupport.getSAML2ArtifactBuilderFactory()
-                    .getArtifactBuilder(defaultArtifactType);
+            final SAML2ArtifactBuilderFactory factory = SAMLConfigurationSupport.getSAML2ArtifactBuilderFactory();
+            artifactBuilder = factory != null ? factory.getArtifactBuilder(defaultArtifactType) : null;
             storeSAMLArtifactType(messageContext, defaultArtifactType);
         }
+        if (artifactBuilder == null) {
+            throw new MessageEncodingException("Unable to obtain SAML2ArtifactBuilder");
+        }
 
         final SAML2Artifact artifact = artifactBuilder.buildArtifact(messageContext);
         if (artifact == null) {
@@ -366,6 +356,7 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
 
         return artifact;
     }
+// Checkstyle: CyclomaticComplexity ON
     
     /**
      * Get the outbound message issuer.
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostEncoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostEncoder.java
index 4e42389c0..1f9bf6bf8 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostEncoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostEncoder.java
@@ -22,6 +22,7 @@ import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
@@ -33,14 +34,17 @@ import org.opensaml.saml.common.xml.SAMLConstants;
 import org.opensaml.saml.saml2.core.RequestAbstractType;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.codec.HTMLEncoder;
 import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
+import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.servlet.HttpServletSupport;
 import net.shibboleth.shared.xml.SerializeSupport;
 
@@ -55,21 +59,21 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
     @Nonnull @NotEmpty public static final String DEFAULT_TEMPLATE_ID = "/templates/saml2-post-binding.vm";
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(HTTPPostEncoder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(HTTPPostEncoder.class);
 
     /** Velocity engine used to evaluate the template when performing POST encoding. */
-    private VelocityEngine velocityEngine;
+    @NonnullAfterInit private VelocityEngine velocityEngine;
 
     /** ID of the Velocity template used when performing POST encoding. */
-    private String velocityTemplateId;
+    @Nonnull private String velocityTemplateId;
     
     /** Constructor. */
     public HTTPPostEncoder() {
-        setVelocityTemplateId(DEFAULT_TEMPLATE_ID);
+        velocityTemplateId = DEFAULT_TEMPLATE_ID;
     }
 
     /** {@inheritDoc} */
-    public String getBindingURI() {
+    @Nonnull @NotEmpty public String getBindingURI() {
         return SAMLConstants.SAML2_POST_BINDING_URI;
     }
     
@@ -78,7 +82,7 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
      * 
      * @return return the VelocityEngine instance
      */
-    public VelocityEngine getVelocityEngine() {
+    @NonnullAfterInit public VelocityEngine getVelocityEngine() {
         return velocityEngine;
     }
 
@@ -87,7 +91,7 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
      * 
      * @param newVelocityEngine the new VelocityEngine instane
      */
-    public void setVelocityEngine(final VelocityEngine newVelocityEngine) {
+    public void setVelocityEngine(@Nullable final VelocityEngine newVelocityEngine) {
         checkSetterPreconditions();
         velocityEngine = newVelocityEngine;
     }
@@ -99,7 +103,7 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
      * 
      * @return return the Velocity template id
      */
-    public String getVelocityTemplateId() {
+    @Nonnull @NotEmpty public String getVelocityTemplateId() {
         return velocityTemplateId;
     }
 
@@ -110,27 +114,19 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
      * 
      * @param newVelocityTemplateId the new Velocity template id
      */
-    public void setVelocityTemplateId(final String newVelocityTemplateId) {
+    public void setVelocityTemplateId(@Nonnull @NotEmpty final String newVelocityTemplateId) {
         checkSetterPreconditions();
-        velocityTemplateId = newVelocityTemplateId;
-    }
-    
-    /** {@inheritDoc} */
-    protected void doDestroy() {
-        velocityEngine = null;
-        velocityTemplateId = null;
-        super.doDestroy();
+        velocityTemplateId = Constraint.isNotNull(StringSupport.trimOrNull(newVelocityTemplateId),
+                "Velocity template ID cannot be null or empty");
     }
 
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
+        
         if (velocityEngine == null) {
             throw new ComponentInitializationException("VelocityEngine must be supplied");
         }
-        if (velocityTemplateId == null) {
-            throw new ComponentInitializationException("Velocity template id must be supplied");
-        }
     }
 
     /** {@inheritDoc} */
@@ -143,6 +139,7 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
         }
         
         final String endpointURL = getEndpointURL(messageContext).toString();
+        assert endpointURL != null;
 
         postEncode(messageContext, endpointURL);
     }
@@ -155,7 +152,7 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
      * 
      * @throws MessageEncodingException thrown if there is a problem encoding the message
      */
-    protected void postEncode(final MessageContext messageContext, final String endpointURL) 
+    protected void postEncode(@Nonnull final MessageContext messageContext, @Nonnull final String endpointURL) 
             throws MessageEncodingException {
         log.debug("Invoking Velocity template to create POST body");
         try {
@@ -164,6 +161,7 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
             populateVelocityContext(context, messageContext, endpointURL);
 
             final HttpServletResponse response = getHttpServletResponse();
+            assert response != null;
             
             HttpServletSupport.addNoCacheHeaders(response);
             HttpServletSupport.setUTF8Encoding(response);
@@ -187,8 +185,9 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
      * @param endpointURL endpoint URL to which to encode message
      * @throws MessageEncodingException thrown if there is a problem encoding the message
      */
-    protected void populateVelocityContext(final VelocityContext velocityContext,
-            final MessageContext messageContext, final String endpointURL) throws MessageEncodingException {
+    protected void populateVelocityContext(@Nonnull final VelocityContext velocityContext,
+            @Nonnull final MessageContext messageContext, @Nonnull final String endpointURL)
+                    throws MessageEncodingException {
 
         final String encodedEndpointURL = HTMLEncoder.encodeForHTMLAttribute(endpointURL);
         log.debug("Encoding action url of '{}' with encoded value '{}'", endpointURL, encodedEndpointURL);
@@ -196,6 +195,8 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
         velocityContext.put("binding", getBindingURI());
         
         final SAMLObject outboundMessage = (SAMLObject) messageContext.getMessage();
+        // Checked above.
+        assert outboundMessage != null;
         
         log.debug("Marshalling and Base64 encoding SAML message");
         final Element domMessage = marshallMessage(outboundMessage);
@@ -226,4 +227,5 @@ public class HTTPPostEncoder extends BaseSAML2MessageEncoder {
             velocityContext.put("RelayState", encodedRelayState);
         }
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoder.java
index befe7a42c..d0c8fe156 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoder.java
@@ -20,6 +20,7 @@ package org.opensaml.saml.saml2.binding.encoding.impl;
 import java.io.UnsupportedEncodingException;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.apache.velocity.VelocityContext;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
@@ -32,13 +33,11 @@ import org.opensaml.saml.common.messaging.SAMLMessageSecuritySupport;
 import org.opensaml.saml.common.xml.SAMLConstants;
 import org.opensaml.security.SecurityException;
 import org.opensaml.security.credential.Credential;
-import org.opensaml.security.credential.CredentialSupport;
 import org.opensaml.xmlsec.SignatureSigningParameters;
 import org.opensaml.xmlsec.crypto.XMLSigningUtil;
 import org.opensaml.xmlsec.keyinfo.KeyInfoGenerator;
 import org.opensaml.xmlsec.signature.KeyInfo;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
@@ -46,6 +45,7 @@ import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.DecodingException;
 import net.shibboleth.shared.codec.EncodingException;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.SerializeSupport;
 
 /**
@@ -57,7 +57,7 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
     @Nonnull @NotEmpty public static final String DEFAULT_TEMPLATE_ID = "/templates/saml2-post-simplesign-binding.vm";
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(HTTPPostSimpleSignEncoder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(HTTPPostSimpleSignEncoder.class);
     
     /** Constructor. */
     public HTTPPostSimpleSignEncoder() {
@@ -65,20 +65,23 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
     }
 
     /** {@inheritDoc} */
-    public String getBindingURI() {
+    @Nonnull @NotEmpty public String getBindingURI() {
         return SAMLConstants.SAML2_POST_SIMPLE_SIGN_BINDING_URI;
     }
 
     /** {@inheritDoc} */
-    protected void populateVelocityContext(final VelocityContext velocityContext, final MessageContext messageContext,
-            final String endpointURL) throws MessageEncodingException {
+    protected void populateVelocityContext(@Nonnull final VelocityContext velocityContext,
+            @Nonnull final MessageContext messageContext, @Nonnull @NotEmpty final String endpointURL)
+                    throws MessageEncodingException {
 
         super.populateVelocityContext(velocityContext, messageContext, endpointURL);
 
         final SignatureSigningParameters signingParameters = 
                 SAMLMessageSecuritySupport.getContextSigningParameters(messageContext);
         
-        if (signingParameters == null || signingParameters.getSigningCredential() == null) {
+        final Credential signingCredential = signingParameters != null
+                ? signingParameters.getSigningCredential() : null;
+        if (signingParameters == null || signingCredential == null) {
             log.debug("No signing credential was supplied, skipping HTTP-Post simple signing");
             return;
         }
@@ -87,13 +90,12 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
         velocityContext.put("SigAlg", sigAlgURI);
 
         final String formControlData = buildFormDataToSign(velocityContext, messageContext, sigAlgURI);
-        velocityContext.put("Signature", generateSignature(signingParameters.getSigningCredential(), 
-                sigAlgURI, formControlData));
+        velocityContext.put("Signature", generateSignature(signingCredential, sigAlgURI, formControlData));
 
         
         final KeyInfoGenerator kiGenerator = signingParameters.getKeyInfoGenerator();
         if (kiGenerator != null) {
-            final String kiBase64 = buildKeyInfo(signingParameters.getSigningCredential(), kiGenerator);
+            final String kiBase64 = buildKeyInfo(signingCredential, kiGenerator);
             if (!Strings.isNullOrEmpty(kiBase64)) {
                 velocityContext.put("KeyInfo", kiBase64);
             }
@@ -108,8 +110,8 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
      * @throws MessageEncodingException thrown if there is an error generating or marshalling the KeyInfo
      * @return the marshalled, serialized and base64-encoded KeyInfo, or null if none was generated
      */
-    protected String buildKeyInfo(final Credential signingCredential, final KeyInfoGenerator kiGenerator)
-            throws MessageEncodingException {
+    @Nullable protected String buildKeyInfo(@Nonnull final Credential signingCredential,
+            @Nonnull final KeyInfoGenerator kiGenerator) throws MessageEncodingException {
 
         try {
             final KeyInfo keyInfo = kiGenerator.generate(signingCredential);
@@ -149,7 +151,8 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
      * 
      * @return the form control data string for signature computation
      */
-    protected String buildFormDataToSign(final VelocityContext velocityContext, final MessageContext messageContext,
+    @Nonnull protected String buildFormDataToSign(@Nonnull final VelocityContext velocityContext,
+            @Nonnull final MessageContext messageContext,
             final String sigAlgURI) throws MessageEncodingException {
         final StringBuilder builder = new StringBuilder();
 
@@ -164,7 +167,9 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
         } else {
             msgB64 = (String) velocityContext.get("SAMLResponse");
         }
-       
+        // One or the other is populated...
+        assert msgB64 != null;
+      
         String msg = null;
         try {
             msg = new String(Base64Support.decode(msgB64), "UTF-8");
@@ -203,11 +208,12 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
      * @throws MessageEncodingException thrown if the algorithm URI is not supplied explicitly and 
      *          could not be derived from the supplied credential
      */
-    protected String getSignatureAlgorithmURI(final SignatureSigningParameters signingParameters)
+    @Nonnull protected String getSignatureAlgorithmURI(final SignatureSigningParameters signingParameters)
             throws MessageEncodingException {
         
-        if (signingParameters.getSignatureAlgorithm() != null) {
-            return signingParameters.getSignatureAlgorithm();
+        final String alg = signingParameters.getSignatureAlgorithm();
+        if (alg != null) {
+            return alg;
         }
 
         throw new MessageEncodingException("The signing algorithm URI could not be determined");
@@ -224,13 +230,11 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
      * 
      * @throws MessageEncodingException there is an error computing the signature
      */
-    protected String generateSignature(final Credential signingCredential, final String algorithmURI,
-            final String formData)
+    @Nonnull protected String generateSignature(@Nonnull final Credential signingCredential,
+            @Nonnull final String algorithmURI, final String formData)
             throws MessageEncodingException {
 
-        log.debug(String.format(
-                "Generating signature with key type '%s', algorithm URI '%s' over form control string '%s'",
-                CredentialSupport.extractSigningKey(signingCredential).getAlgorithm(), algorithmURI, formData));
+        log.debug("Generating signature with algorithm URI '{}' over form control string '{}'", algorithmURI, formData);
 
         String b64Signature = null;
         try {
@@ -252,4 +256,4 @@ public class HTTPPostSimpleSignEncoder extends HTTPPostEncoder {
         return b64Signature;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoder.java
index fb3673b41..8163d71c3 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoder.java
@@ -46,17 +46,18 @@ import org.opensaml.security.credential.CredentialSupport;
 import org.opensaml.xmlsec.SignatureSigningParameters;
 import org.opensaml.xmlsec.crypto.XMLSigningUtil;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Lists;
 
 import jakarta.servlet.http.HttpServletResponse;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.net.URLBuilder;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.servlet.HttpServletSupport;
 import net.shibboleth.shared.xml.SerializeSupport;
@@ -73,15 +74,10 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
             CollectionSupport.setOf("SAMLEncoding", "SAMLRequest", "SAMLResponse", "RelayState", "SigAlg", "Signature");
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(HTTPRedirectDeflateEncoder.class);
-
-    /** Constructor. */
-    public HTTPRedirectDeflateEncoder() {
-        
-    }
+    @Nonnull private final Logger log = LoggerFactory.getLogger(HTTPRedirectDeflateEncoder.class);
 
     /** {@inheritDoc} */
-    public String getBindingURI() {
+    @Nonnull @NotEmpty public String getBindingURI() {
         return SAMLConstants.SAML2_REDIRECT_BINDING_URI;
     }
 
@@ -94,6 +90,7 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
         }
 
         final String endpointURL = getEndpointURL(messageContext).toString();
+        assert endpointURL != null;
 
         removeSignature((SAMLObject) outboundMessage);
 
@@ -102,6 +99,7 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
         final String redirectURL = buildRedirectURL(messageContext, endpointURL, encodedMessage);
 
         final HttpServletResponse response = getHttpServletResponse();
+        assert response != null;
         HttpServletSupport.addNoCacheHeaders(response);
         HttpServletSupport.setUTF8Encoding(response);
 
@@ -117,7 +115,7 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
      * 
      * @param message current message context
      */
-    protected void removeSignature(final SAMLObject message) {
+    protected void removeSignature(@Nonnull final SAMLObject message) {
         if (message instanceof SignableSAMLObject) {
             final SignableSAMLObject signableMessage = (SignableSAMLObject) message;
             if (signableMessage.isSigned()) {
@@ -136,7 +134,8 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
      * 
      * @throws MessageEncodingException thrown if there is a problem compressing the message
      */
-    protected String deflateAndBase64Encode(final SAMLObject message) throws MessageEncodingException {
+    @Nonnull protected String deflateAndBase64Encode(@Nonnull final SAMLObject message)
+            throws MessageEncodingException {
         log.debug("Deflating and Base64 encoding SAML message");
         try {
             final String messageStr = SerializeSupport.nodeToString(marshallMessage(message));
@@ -166,8 +165,9 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
      * 
      * @throws MessageEncodingException thrown if the SAML message is neither a RequestAbstractType or Response
      */
-    protected String buildRedirectURL(final MessageContext messageContext, final String endpoint, final String message)
-            throws MessageEncodingException {
+    @Nonnull protected String buildRedirectURL(@Nonnull final MessageContext messageContext,
+            @Nonnull @NotEmpty final String endpoint, @Nonnull @NotEmpty final String message)
+                    throws MessageEncodingException {
         log.debug("Building URL to redirect client to");
         
         URLBuilder urlBuilder = null;
@@ -205,14 +205,15 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
 
         final SignatureSigningParameters signingParameters = 
                 SAMLMessageSecuritySupport.getContextSigningParameters(messageContext);
-        if (signingParameters != null && signingParameters.getSigningCredential() != null) {
+        final Credential signingCred = signingParameters != null ? signingParameters.getSigningCredential() : null;
+        if (signingParameters != null && signingCred != null) {
             final String sigAlgURI =  getSignatureAlgorithmURI(signingParameters);
             final Pair<String, String> sigAlg = new Pair<>("SigAlg", sigAlgURI);
             queryParams.add(sigAlg);
             final String sigMaterial = urlBuilder.buildQueryString();
+            assert sigMaterial != null;
 
-            queryParams.add(new Pair<>("Signature", generateSignature(
-                    signingParameters.getSigningCredential(), sigAlgURI, sigMaterial)));
+            queryParams.add(new Pair<>("Signature", generateSignature(signingCred, sigAlgURI, sigMaterial)));
 
             // Add original params to the beginning of the list preserving their original order.
             if (!originalParams.isEmpty()) {
@@ -234,7 +235,7 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
      * 
      * @param queryParams the list of query params on which to operate
      */
-    protected void removeDisallowedQueryParams(final @Nonnull List<Pair<String, String>> queryParams) {
+    protected void removeDisallowedQueryParams(@Nonnull final List<Pair<String, String>> queryParams) {
         final Iterator<Pair<String,String>> iter = queryParams.iterator();
         while (iter.hasNext()) {
             final String paramName = StringSupport.trimOrNull(iter.next().getFirst());
@@ -255,11 +256,12 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
      * @throws MessageEncodingException thrown if the algorithm URI is not supplied explicitly and 
      *          could not be derived from the supplied credential
      */
-    protected String getSignatureAlgorithmURI(final SignatureSigningParameters signingParameters)
+    @Nonnull protected String getSignatureAlgorithmURI(@Nonnull final SignatureSigningParameters signingParameters)
             throws MessageEncodingException {
         
-        if (signingParameters.getSignatureAlgorithm() != null) {
-            return signingParameters.getSignatureAlgorithm();
+        final String alg = signingParameters.getSignatureAlgorithm();
+        if (alg != null) {
+            return alg;
         }
 
         throw new MessageEncodingException("The signing algorithm URI could not be determined");
@@ -276,30 +278,27 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
      * 
      * @throws MessageEncodingException there is an error computing the signature
      */
-    protected String generateSignature(final Credential signingCredential, final String algorithmURI,
-            final String queryString)
-            throws MessageEncodingException {
+    @Nonnull protected String generateSignature(@Nonnull final Credential signingCredential,
+            @Nonnull final String algorithmURI, @Nonnull final String queryString) throws MessageEncodingException {
 
-        log.debug(String.format("Generating signature with key type '%s', algorithm URI '%s' over query string '%s'",
-                CredentialSupport.extractSigningKey(signingCredential).getAlgorithm(), algorithmURI, queryString));
+        log.debug("Generating signature with algorithm URI '{}' over query string '{}'", algorithmURI, queryString);
 
-        String b64Signature = null;
         try {
             final byte[] rawSignature =
                     XMLSigningUtil.signWithURI(signingCredential, algorithmURI, queryString.getBytes("UTF-8"));
-            b64Signature = Base64Support.encode(rawSignature, Base64Support.UNCHUNKED);
+            final String b64Signature = Base64Support.encode(rawSignature, Base64Support.UNCHUNKED);
             log.debug("Generated digital signature value (base64-encoded) {}", b64Signature);
+            return b64Signature;
         } catch (final SecurityException e) {
             log.error("Error during URL signing process: {}", e.getMessage());
             throw new MessageEncodingException("Unable to sign URL query string", e);
         } catch (final UnsupportedEncodingException e) {
             // UTF-8 encoding is required to be supported by all JVMs
+            throw new MessageEncodingException("Unable to access UTF-8 character encoding?", e);
         } catch (final EncodingException e) {
             log.error("Error during URL signing process: {}", e.getMessage());
             throw new MessageEncodingException("Unable to base64 encode signature of URL query string", e);
         }
-
-        return b64Signature;
     }
 
     /** A subclass of {@link DeflaterOutputStream} which defaults in a no-wrap {@link Deflater} instance and
@@ -314,7 +313,7 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
          * @param os the output stream
          * @param level the compression level (0-9)
          */
-        public NoWrapAutoEndDeflaterOutputStream(final OutputStream os, final int level) {
+        public NoWrapAutoEndDeflaterOutputStream(@Nonnull final OutputStream os, final int level) {
             super(os, new Deflater(level, true));
         }
 
@@ -327,4 +326,5 @@ public class HTTPRedirectDeflateEncoder extends BaseSAML2MessageEncoder {
         }
 
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11Encoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11Encoder.java
index 3aaa443fc..02e7e99fe 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11Encoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11Encoder.java
@@ -17,9 +17,14 @@
 
 package org.opensaml.saml.saml2.binding.encoding.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.common.binding.encoding.SAMLMessageEncoder;
 import org.opensaml.saml.common.xml.SAMLConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * SAML 2.0 SOAP 1.1 over HTTP binding encoder.
  */
@@ -32,14 +37,13 @@ public class HTTPSOAP11Encoder extends org.opensaml.soap.soap11.encoder.http.imp
     }
 
     /** {@inheritDoc} */
-    @Override
-    public String getBindingURI() {
+    @Nonnull @NotEmpty public String getBindingURI() {
         return SAMLConstants.SAML2_SOAP11_BINDING_URI;
     }
     
     /** {@inheritDoc} */
     @Override
-    protected String getSOAPAction() {
+    @Nullable protected String getSOAPAction() {
         return "http://www.oasis-open.org/committees/security";
     }
     
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HttpClientRequestSOAP11Encoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HttpClientRequestSOAP11Encoder.java
index 60d7e0617..fc3229dd0 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HttpClientRequestSOAP11Encoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/encoding/impl/HttpClientRequestSOAP11Encoder.java
@@ -17,9 +17,14 @@
 
 package org.opensaml.saml.saml2.binding.encoding.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.common.binding.encoding.SAMLMessageEncoder;
 import org.opensaml.saml.common.xml.SAMLConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * SAML 2.0 SOAP 1.1 over HTTP binding encoder for HttpClient HttpRequest.
  */
@@ -27,20 +32,14 @@ public class HttpClientRequestSOAP11Encoder
         extends org.opensaml.soap.client.soap11.encoder.http.impl.HttpClientRequestSOAP11Encoder
         implements SAMLMessageEncoder {
 
-    /** Constructor. */
-    public HttpClientRequestSOAP11Encoder() {
-        
-    }
-
     /** {@inheritDoc} */
-    @Override
-    public String getBindingURI() {
+    @Nonnull @NotEmpty public String getBindingURI() {
         return SAMLConstants.SAML2_SOAP11_BINDING_URI;
     }
     
     /** {@inheritDoc} */
     @Override
-    protected String getSOAPAction() {
+    @Nullable protected String getSOAPAction() {
         return "http://www.oasis-open.org/committees/security";
     }
     
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoderTest.java
index 5cd6458ca..88eb447b0 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoderTest.java
@@ -20,6 +20,8 @@ package org.opensaml.saml.saml1.binding.decoding.impl;
 import java.net.MalformedURLException;
 import java.net.URL;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.decoder.MessageDecodingException;
@@ -30,6 +32,7 @@ import org.springframework.mock.web.MockHttpServletRequest;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
+import org.w3c.dom.Element;
 
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.DecodingException;
@@ -69,8 +72,9 @@ public class HTTPPostDecoderTest extends XMLObjectBaseTestCase {
      */
     @Test
     public void testDecode() throws Exception {
-        Response samlResponse = (Response) unmarshallElement("/org/opensaml/saml/saml1/binding/Response.xml");
-
+        final Response samlResponse = (Response) unmarshallElement("/org/opensaml/saml/saml1/binding/Response.xml");
+        assert samlResponse != null;
+        
         String deliveredEndpointURL = samlResponse.getRecipient();
 
         httpRequest.setParameter("SAMLResponse", encodeMessage(samlResponse));
@@ -78,7 +82,8 @@ public class HTTPPostDecoderTest extends XMLObjectBaseTestCase {
         populateRequestURL(httpRequest, deliveredEndpointURL);
 
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
         Assert.assertTrue(messageContext.getMessage() instanceof Response);
         Assert.assertEquals(SAMLBindingSupport.getRelayState(messageContext), expectedRelayValue);
@@ -110,6 +115,7 @@ public class HTTPPostDecoderTest extends XMLObjectBaseTestCase {
         } catch (MalformedURLException e) {
             Assert.fail("Malformed URL: " + e.getMessage());
         }
+        assert url != null;
         request.setScheme(url.getProtocol());
         request.setServerName(url.getHost());
         if (url.getPort() != -1) {
@@ -125,10 +131,11 @@ public class HTTPPostDecoderTest extends XMLObjectBaseTestCase {
         request.setQueryString(url.getQuery());
     }
 
-    protected String encodeMessage(SAMLObject message) throws Exception {
-        marshallerFactory.getMarshaller(message).marshall(message);
-        String messageStr = SerializeSupport.nodeToString(message.getDOM());
+    protected String encodeMessage(@Nonnull SAMLObject message) throws Exception {
+        final Element dom = marshallerFactory.ensureMarshaller(message).marshall(message);
+        String messageStr = SerializeSupport.nodeToString(dom);
 
         return Base64Support.encode(messageStr.getBytes("UTF-8"), Base64Support.UNCHUNKED);
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11DecoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11DecoderTest.java
index 321915944..e651df7d6 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11DecoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11DecoderTest.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.saml.saml1.binding.decoding.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -27,6 +29,7 @@ import org.springframework.mock.web.MockHttpServletRequest;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
+import org.w3c.dom.Element;
 
 import net.shibboleth.shared.testing.ConstantSupplier;
 import net.shibboleth.shared.xml.SerializeSupport;
@@ -66,14 +69,16 @@ public class HTTPSOAP11DecoderTest extends XMLObjectBaseTestCase {
         httpRequest.setContent(requestContent.getBytes());
         
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
-        Assert.assertNotNull(messageContext.getSubcontext(SOAP11Context.class).getEnvelope());
+        Assert.assertNotNull(messageContext.ensureSubcontext(SOAP11Context.class).getEnvelope());
         Assert.assertTrue(messageContext.getMessage() instanceof Request);
     }
     
-    protected String encodeMessage(XMLObject message) throws MarshallingException {
-        marshallerFactory.getMarshaller(message).marshall(message);
-        return SerializeSupport.nodeToString(message.getDOM());
+    protected String encodeMessage(@Nonnull final XMLObject message) throws MarshallingException {
+        final Element dom = marshallerFactory.ensureMarshaller(message).marshall(message);
+        return SerializeSupport.nodeToString(dom);
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPPostEncoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPPostEncoderTest.java
index 78bd5b795..71e044180 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPPostEncoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPPostEncoderTest.java
@@ -52,6 +52,7 @@ import net.shibboleth.shared.testing.ConstantSupplier;
 /**
  * Test class for SAML 1 HTTP Post encoding.
  */
+ at SuppressWarnings("javadoc")
 public class HTTPPostEncoderTest extends XMLObjectBaseTestCase {
 
     /** Velocity template engine. */
@@ -67,33 +68,32 @@ public class HTTPPostEncoderTest extends XMLObjectBaseTestCase {
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEncoding() throws Exception {
-        SAMLObjectBuilder<Response> requestBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
-        Response samlMessage = requestBuilder.buildObject();
+        final SAMLObjectBuilder<Response> requestBuilder =
+                (SAMLObjectBuilder<Response>) builderFactory.<Response>ensureBuilder(Response.DEFAULT_ELEMENT_NAME);
+        final Response samlMessage = requestBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setVersion(SAMLVersion.VERSION_11);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
-        Endpoint samlEndpoint = endpointBuilder.buildObject();
+        final SAMLObjectBuilder<Endpoint> endpointBuilder =
+                (SAMLObjectBuilder<Endpoint>) builderFactory.<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response");
 
-        MessageContext messageContext = new MessageContext();
+        final MessageContext messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+            .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         
-        SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
+        final SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
         handler.invoke(messageContext);
         
-        MockHttpServletResponse response = new MockHttpServletResponse();
+        final MockHttpServletResponse response = new MockHttpServletResponse();
         
-        HTTPPostEncoder encoder = new HTTPPostEncoder();
+        final HTTPPostEncoder encoder = new HTTPPostEncoder();
         encoder.setMessageContext(messageContext);
         encoder.setHttpServletResponseSupplier(new ConstantSupplier<>(response));
         
@@ -122,40 +122,42 @@ public class HTTPPostEncoderTest extends XMLObjectBaseTestCase {
         }
         Assert.assertTrue(sawDocType);
         
-        Element head = webDoc.selectFirst("html > head");
-        Assert.assertNotNull(head);
-        Element metaCharSet = head.selectFirst("meta[charset]");
-        Assert.assertNotNull(metaCharSet);
+        final Element head = webDoc.selectFirst("html > head");
+        assert head != null;
+        final Element metaCharSet = head.selectFirst("meta[charset]");
+        assert metaCharSet != null;
         Assert.assertEquals(metaCharSet.attr("charset").toLowerCase(), "utf-8");
         
-        Element body = webDoc.selectFirst("html > body");
-        Assert.assertNotNull(body);
+        final Element body = webDoc.selectFirst("html > body");
+        assert body != null;
         Assert.assertEquals(body.attr("onload"), "document.forms[0].submit()");
         
-        Element form = body.selectFirst("form");
-        Assert.assertNotNull(form);
+        final Element form = body.selectFirst("form");
+        assert form != null;
         Assert.assertEquals(form.attr("method").toLowerCase(), "post");
         Assert.assertEquals(form.attr("action"), "http://example.org/response");
         
-        Element relayState = form.selectFirst("input[name=TARGET]");
-        Assert.assertNotNull(relayState);
+        final Element relayState = form.selectFirst("input[name=TARGET]");
+        assert relayState != null;
         Assert.assertEquals(relayState.val(), "relay");
         
-        Element noscriptMsg = body.selectFirst("noscript > p");
-        Assert.assertNotNull(noscriptMsg);
+        final Element noscriptMsg = body.selectFirst("noscript > p");
+        assert noscriptMsg != null;
         Assert.assertTrue(noscriptMsg.text().contains("Since your browser does not support JavaScript"));
         
-        Element samlResponse = form.selectFirst("input[name=SAMLResponse]");
-        Assert.assertNotNull(samlResponse);
+        final Element samlResponse = form.selectFirst("input[name=SAMLResponse]");
+        assert samlResponse != null;
         Assert.assertNotNull(samlResponse.val());
         try (ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Support.decode(samlResponse.val()))) {
-            XMLObject xmlObject = XMLObjectSupport.unmarshallFromInputStream(parserPool, inputStream);
+            final XMLObject xmlObject = XMLObjectSupport.unmarshallFromInputStream(parserPool, inputStream);
             Assert.assertTrue(xmlObject instanceof Response);
-            assertXMLEquals(xmlObject.getDOM().getOwnerDocument(), samlMessage);
+            final org.w3c.dom.Element xmlDOM = xmlObject.getDOM();
+            assert xmlDOM != null;
+            assertXMLEquals(xmlDOM.getOwnerDocument(), samlMessage);
         }
         
-        Element submit = body.selectFirst("noscript > div > input[type=submit]");
-        Assert.assertNotNull(submit);
+        final Element submit = body.selectFirst("noscript > div > input[type=submit]");
+        assert submit != null;
         Assert.assertEquals(submit.val(), "Continue");
     }
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPSOAP11EncoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPSOAP11EncoderTest.java
index c034be666..e270a1878 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPSOAP11EncoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPSOAP11EncoderTest.java
@@ -32,6 +32,7 @@ import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext;
 import org.opensaml.saml.saml1.core.Request;
 import org.opensaml.saml.saml2.metadata.AssertionConsumerService;
 import org.opensaml.saml.saml2.metadata.Endpoint;
+import org.opensaml.soap.soap11.Body;
 import org.opensaml.soap.soap11.Envelope;
 import org.springframework.mock.web.MockHttpServletResponse;
 import org.testng.Assert;
@@ -50,30 +51,28 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
      * @throws Exception if something goes wrong
      */
     @Test
-    @SuppressWarnings("unchecked")
     public void testEncoding() throws Exception {
-        SAMLObjectBuilder<Request> requestBuilder = (SAMLObjectBuilder<Request>) builderFactory
-                .getBuilder(Request.DEFAULT_ELEMENT_NAME);
-        Request request = requestBuilder.buildObject();
+        final SAMLObjectBuilder<Request> requestBuilder =
+                (SAMLObjectBuilder<Request>) builderFactory.<Request>ensureBuilder(Request.DEFAULT_ELEMENT_NAME);
+        final Request request = requestBuilder.buildObject();
         request.setID("foo");
         request.setIssueInstant(Instant.ofEpochMilli(0));
         request.setVersion(SAMLVersion.VERSION_11);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
-        Endpoint samlEndpoint = endpointBuilder.buildObject();
+        final SAMLObjectBuilder<Endpoint> endpointBuilder =
+                (SAMLObjectBuilder<Endpoint>) builderFactory.<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response");
 
-        MessageContext messageContext = new MessageContext();
+        final MessageContext messageContext = new MessageContext();
         messageContext.setMessage(request);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class).ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         
-        MockHttpServletResponse response = new MockHttpServletResponse();
+        final MockHttpServletResponse response = new MockHttpServletResponse();
         
-        HTTPSOAP11Encoder encoder = new HTTPSOAP11Encoder();
+        final HTTPSOAP11Encoder encoder = new HTTPSOAP11Encoder();
         encoder.setMessageContext(messageContext);
         encoder.setHttpServletResponseSupplier(new ConstantSupplier<>(response));
         
@@ -86,19 +85,21 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals(response.getHeader("Cache-control"), "no-cache, no-store", "Unexpected cache controls");
         Assert.assertEquals(response.getHeader("SOAPAction"), "http://www.oasis-open.org/committees/security");
         
-        try (ByteArrayInputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray())) {
-            XMLObject xmlObject = XMLObjectSupport.unmarshallFromInputStream(parserPool, inputStream);
+        try (final ByteArrayInputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray())) {
+            final XMLObject xmlObject = XMLObjectSupport.unmarshallFromInputStream(parserPool, inputStream);
             Assert.assertNotNull(xmlObject);
             Assert.assertTrue(xmlObject instanceof Envelope);
-            Envelope envelope = (Envelope) xmlObject;
+            final Envelope envelope = (Envelope) xmlObject;
             Assert.assertNull(envelope.getHeader());
-            Assert.assertNotNull(envelope.getBody());
-            Assert.assertEquals(envelope.getBody().getUnknownXMLObjects().size(), 1);
-            Request outboundRequest = (Request) envelope.getBody().getUnknownXMLObjects().get(0);
+            final Body body = envelope.getBody();
+            assert body != null;
+            Assert.assertEquals(body.getUnknownXMLObjects().size(), 1);
+            Request outboundRequest = (Request) body.getUnknownXMLObjects().get(0);
             outboundRequest.releaseDOM();
             outboundRequest.releaseChildrenDOM(true);
             outboundRequest.setParent(null);
             assertXMLEquals(XMLObjectSupport.marshall(outboundRequest).getOwnerDocument(), request);
         }
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoderTest.java
index a05e96171..ee2473b4f 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostDecoderTest.java
@@ -69,7 +69,8 @@ public class HTTPPostDecoderTest extends XMLObjectBaseTestCase {
                 + "xuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIi8+");
         
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
         Assert.assertTrue(messageContext.getMessage() instanceof RequestAbstractType);
         Assert.assertEquals(SAMLBindingSupport.getRelayState(messageContext), expectedRelayValue);
@@ -107,7 +108,8 @@ public class HTTPPostDecoderTest extends XMLObjectBaseTestCase {
                 + "2FtbHA6UmVzcG9uc2U+");
 
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
         Assert.assertTrue(messageContext.getMessage() instanceof Response);
         Assert.assertEquals(SAMLBindingSupport.getRelayState(messageContext), expectedRelayValue);
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoderTest.java
index bfda59c08..f1225f80f 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPRedirectDeflateDecoderTest.java
@@ -24,6 +24,8 @@ import java.net.URL;
 import java.util.zip.Deflater;
 import java.util.zip.DeflaterOutputStream;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.messaging.context.MessageContext;
@@ -38,15 +40,14 @@ import org.springframework.mock.web.MockHttpServletRequest;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
+import org.w3c.dom.Element;
 
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.testing.ConstantSupplier;
 import net.shibboleth.shared.xml.SerializeSupport;
 
-/**
- *
- */
+ at SuppressWarnings("javadoc")
 public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
 
     private String expectedRelayValue = "relay";
@@ -81,7 +82,8 @@ public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
         populateRequestURL(httpRequest, "http://example.org");
 
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
         Assert.assertTrue(messageContext.getMessage() instanceof Response);
         Assert.assertEquals(SAMLBindingSupport.getRelayState(messageContext), expectedRelayValue);
@@ -90,14 +92,16 @@ public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
     @Test
     public void testRequestDecoding() throws MessageDecodingException, MessageEncodingException, 
                                                             MarshallingException, EncodingException {
-        AuthnRequest samlRequest =
+        final AuthnRequest samlRequest =
                 (AuthnRequest) unmarshallElement("/org/opensaml/saml/saml2/binding/AuthnRequest.xml");
+        assert samlRequest != null;
         samlRequest.setDestination(null);
 
         httpRequest.setParameter("SAMLRequest", encodeMessage(samlRequest));
 
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
         Assert.assertTrue(messageContext.getMessage() instanceof RequestAbstractType);
         Assert.assertEquals(SAMLBindingSupport.getRelayState(messageContext), expectedRelayValue);
@@ -117,15 +121,17 @@ public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
     @Test
     public void testExplicitDefaultSAMLEncoding() 
             throws MessageDecodingException, MessageEncodingException, MarshallingException, EncodingException {
-        AuthnRequest samlRequest =
+        final AuthnRequest samlRequest =
                 (AuthnRequest) unmarshallElement("/org/opensaml/saml/saml2/binding/AuthnRequest.xml");
+        assert samlRequest != null;
         samlRequest.setDestination(null);
 
         httpRequest.setParameter("SAMLRequest", encodeMessage(samlRequest));
         httpRequest.setParameter("SAMLEncoding", "urn:oasis:names:tc:SAML:2.0:bindings:URL-Encoding:DEFLATE");
 
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
         Assert.assertTrue(messageContext.getMessage() instanceof RequestAbstractType);
         Assert.assertEquals(SAMLBindingSupport.getRelayState(messageContext), expectedRelayValue);
@@ -134,8 +140,9 @@ public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
     @Test(expectedExceptions=MessageDecodingException.class)
     public void testUnsupportedSAMLEncoding() 
             throws MessageDecodingException, MessageEncodingException, MarshallingException, EncodingException {
-        AuthnRequest samlRequest =
+        final AuthnRequest samlRequest =
                 (AuthnRequest) unmarshallElement("/org/opensaml/saml/saml2/binding/AuthnRequest.xml");
+        assert samlRequest != null;
         samlRequest.setDestination(null);
 
         httpRequest.setParameter("SAMLRequest", encodeMessage(samlRequest));
@@ -151,6 +158,7 @@ public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
         } catch (MalformedURLException e) {
             Assert.fail("Malformed URL: " + e.getMessage());
         }
+        assert url != null;
         request.setScheme(url.getProtocol());
         request.setServerName(url.getHost());
         if (url.getPort() != -1) {
@@ -166,10 +174,10 @@ public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
         request.setQueryString(url.getQuery());
     }
 
-    protected String encodeMessage(SAMLObject message) throws MessageEncodingException, MarshallingException, EncodingException {
+    protected String encodeMessage(@Nonnull final SAMLObject message) throws MessageEncodingException, MarshallingException, EncodingException {
         try {
-            marshallerFactory.getMarshaller(message).marshall(message);
-            String messageStr = SerializeSupport.nodeToString(message.getDOM());
+            final Element dom = marshallerFactory.ensureMarshaller(message).marshall(message);
+            String messageStr = SerializeSupport.nodeToString(dom);
 
             ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
             Deflater deflater = new Deflater(Deflater.DEFLATED, true);
@@ -182,4 +190,5 @@ public class HTTPRedirectDeflateDecoderTest extends XMLObjectBaseTestCase {
             throw new MessageEncodingException("Unable to DEFLATE and Base64 encode SAML message", e);
         }
     }
+    
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11DecoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11DecoderTest.java
index c12073787..93fc8c9f6 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11DecoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPSOAP11DecoderTest.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.saml.saml2.binding.decoding.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -27,6 +29,7 @@ import org.springframework.mock.web.MockHttpServletRequest;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
+import org.w3c.dom.Element;
 
 import net.shibboleth.shared.testing.ConstantSupplier;
 import net.shibboleth.shared.xml.SerializeSupport;
@@ -67,14 +70,16 @@ public class HTTPSOAP11DecoderTest extends XMLObjectBaseTestCase {
         httpRequest.setContent(requestContent.getBytes());
 
         decoder.decode();
-        MessageContext messageContext = decoder.getMessageContext();
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
 
-        Assert.assertNotNull(messageContext.getSubcontext(SOAP11Context.class).getEnvelope());
+        Assert.assertNotNull(messageContext.ensureSubcontext(SOAP11Context.class).getEnvelope());
         Assert.assertTrue(messageContext.getMessage() instanceof Response);
     }
     
-    protected String encodeMessage(XMLObject message) throws MarshallingException {
-        marshallerFactory.getMarshaller(message).marshall(message);
-        return SerializeSupport.nodeToString(message.getDOM());
+    protected String encodeMessage(@Nonnull final XMLObject message) throws MarshallingException {
+        final Element dom = marshallerFactory.ensureMarshaller(message).marshall(message);
+        return SerializeSupport.nodeToString(dom);
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoderTest.java
index 0e7f9f115..e42c2cdc0 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPPostSimpleSignEncoderTest.java
@@ -65,6 +65,7 @@ import net.shibboleth.shared.testing.ConstantSupplier;
 /**
  * Test case for {@link HTTPPostEncoder}.
  */
+ at SuppressWarnings("javadoc")
 public class HTTPPostSimpleSignEncoderTest extends XMLObjectBaseTestCase {
 
     /** Velocity template engine. */
@@ -86,7 +87,7 @@ public class HTTPPostSimpleSignEncoderTest extends XMLObjectBaseTestCase {
      */
     @Test
     public void testResponseEncoding() throws Exception {
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder =
+        final SAMLObjectBuilder<StatusCode> statusCodeBuilder =
                 (SAMLObjectBuilder<StatusCode>) builderFactory.<StatusCode>ensureBuilder(
                         StatusCode.DEFAULT_ELEMENT_NAME);
         StatusCode statusCode = statusCodeBuilder.buildObject();
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoderTest.java
index 50ececf86..7bb24d4d0 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPRedirectDeflateEncoderTest.java
@@ -47,7 +47,6 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 import org.w3c.dom.Document;
 
-import jakarta.servlet.http.HttpServletResponse;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.net.URISupport;
 import net.shibboleth.shared.net.URLBuilder;
@@ -64,44 +63,43 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
      * @throws Exception if something goes wrong
      */
     @Test
-    @SuppressWarnings("unchecked")
     public void testResponseEncoding() throws Exception {
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
-                .getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
-        StatusCode statusCode = statusCodeBuilder.buildObject();
+        final SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
+                .<StatusCode>ensureBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
+        final StatusCode statusCode = statusCodeBuilder.buildObject();
         statusCode.setValue(StatusCode.SUCCESS);
 
-        SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
-                .getBuilder(Status.DEFAULT_ELEMENT_NAME);
-        Status responseStatus = statusBuilder.buildObject();
+        final SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
+                .<Status>ensureBuilder(Status.DEFAULT_ELEMENT_NAME);
+        final Status responseStatus = statusBuilder.buildObject();
         responseStatus.setStatusCode(statusCode);
 
-        SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
-        Response samlMessage = responseBuilder.buildObject();
+        final SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
+                .<Response>ensureBuilder(Response.DEFAULT_ELEMENT_NAME);
+        final Response samlMessage = responseBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setVersion(SAMLVersion.VERSION_20);
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setStatus(responseStatus);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
-        Endpoint samlEndpoint = endpointBuilder.buildObject();
+        final SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
+                .<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response");
         
-        MessageContext messageContext = new MessageContext();
+        final MessageContext messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+            .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         
-        SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
+        final SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
         handler.invoke(messageContext);
         
-        MockHttpServletResponse response = new MockHttpServletResponse();
+        final MockHttpServletResponse response = new MockHttpServletResponse();
         
-        HTTPRedirectDeflateEncoder encoder = new HTTPRedirectDeflateEncoder();
+        final HTTPRedirectDeflateEncoder encoder = new HTTPRedirectDeflateEncoder();
         encoder.setMessageContext(messageContext);
         encoder.setHttpServletResponseSupplier(new ConstantSupplier<>(response));
         
@@ -112,13 +110,14 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals("UTF-8", response.getCharacterEncoding(), "Unexpected character encoding");
         Assert.assertEquals(response.getHeader("Cache-control"), "no-cache, no-store", "Unexpected cache controls");
         
-        Assert.assertNotNull(response.getRedirectedUrl());
-        URLBuilder urlBuilder = new URLBuilder(response.getRedirectedUrl());
+        final String redirectedUrl = response.getRedirectedUrl();
+        assert redirectedUrl != null;
+        final URLBuilder urlBuilder = new URLBuilder(redirectedUrl);
         Assert.assertEquals(urlBuilder.getScheme(), "http");
         Assert.assertEquals(urlBuilder.getHost(), "example.org");
         Assert.assertEquals(urlBuilder.getPath(), "/response");
         
-        Map<String,String> queryParams = URISupport.buildQueryMap(urlBuilder.getQueryParams());
+        final Map<String,String> queryParams = URISupport.buildQueryMap(urlBuilder.getQueryParams());
         Assert.assertFalse(queryParams.containsKey("Signature"));
         Assert.assertFalse(queryParams.containsKey("SigAlg"));
         Assert.assertTrue(queryParams.containsKey("RelayState"));
@@ -141,44 +140,43 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
      * @throws Exception if something goes wrong
      */
     @Test
-    @SuppressWarnings("unchecked")
     public void testResponseEncodingWithEndpointQueryParams() throws Exception {
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
-                .getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
-        StatusCode statusCode = statusCodeBuilder.buildObject();
+        final SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
+                .<StatusCode>ensureBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
+        final StatusCode statusCode = statusCodeBuilder.buildObject();
         statusCode.setValue(StatusCode.SUCCESS);
 
-        SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
-                .getBuilder(Status.DEFAULT_ELEMENT_NAME);
-        Status responseStatus = statusBuilder.buildObject();
+        final SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
+                .<Status>ensureBuilder(Status.DEFAULT_ELEMENT_NAME);
+        final Status responseStatus = statusBuilder.buildObject();
         responseStatus.setStatusCode(statusCode);
 
-        SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
-        Response samlMessage = responseBuilder.buildObject();
+        final SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
+                .<Response>ensureBuilder(Response.DEFAULT_ELEMENT_NAME);
+        final Response samlMessage = responseBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setVersion(SAMLVersion.VERSION_20);
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setStatus(responseStatus);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
-        Endpoint samlEndpoint = endpointBuilder.buildObject();
+        final SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
+                .<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response?foo=bar&abc=123");
         
-        MessageContext messageContext = new MessageContext();
+        final MessageContext messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+            .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         
-        SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
+        final SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
         handler.invoke(messageContext);
         
-        MockHttpServletResponse response = new MockHttpServletResponse();
+        final MockHttpServletResponse response = new MockHttpServletResponse();
         
-        HTTPRedirectDeflateEncoder encoder = new HTTPRedirectDeflateEncoder();
+        final HTTPRedirectDeflateEncoder encoder = new HTTPRedirectDeflateEncoder();
         encoder.setMessageContext(messageContext);
         encoder.setHttpServletResponseSupplier(new ConstantSupplier<>(response));
         
@@ -189,8 +187,9 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals("UTF-8", response.getCharacterEncoding(), "Unexpected character encoding");
         Assert.assertEquals(response.getHeader("Cache-control"), "no-cache, no-store", "Unexpected cache controls");
         
-        Assert.assertNotNull(response.getRedirectedUrl());
-        URLBuilder urlBuilder = new URLBuilder(response.getRedirectedUrl());
+        final String redirectedUrl = response.getRedirectedUrl();
+        assert redirectedUrl != null;
+        final URLBuilder urlBuilder = new URLBuilder(redirectedUrl);
         Assert.assertEquals(urlBuilder.getScheme(), "http");
         Assert.assertEquals(urlBuilder.getHost(), "example.org");
         Assert.assertEquals(urlBuilder.getPath(), "/response");
@@ -222,28 +221,27 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
      * @throws Exception if something goes wrong
      */
     @Test
-    @SuppressWarnings("unchecked")
     public void testResponseEncodingWithDisallowedEndpointQueryParams() throws Exception {
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
-                .getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
+                .<StatusCode>ensureBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
         StatusCode statusCode = statusCodeBuilder.buildObject();
         statusCode.setValue(StatusCode.SUCCESS);
 
-        SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
-                .getBuilder(Status.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
+                .<Status>ensureBuilder(Status.DEFAULT_ELEMENT_NAME);
         Status responseStatus = statusBuilder.buildObject();
         responseStatus.setStatusCode(statusCode);
 
-        SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
+                .<Response>ensureBuilder(Response.DEFAULT_ELEMENT_NAME);
         Response samlMessage = responseBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setVersion(SAMLVersion.VERSION_20);
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setStatus(responseStatus);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
+                .<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
         Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response?foo=bar&abc=123&SAMLEncoding=blah&SAMLRequest=blah&SAMLResponse=blah&RelayState=blah&SigAlg=blah&Signature=blah");
@@ -251,8 +249,8 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         MessageContext messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+            .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         
         SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
         handler.invoke(messageContext);
@@ -270,8 +268,9 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals("UTF-8", response.getCharacterEncoding(), "Unexpected character encoding");
         Assert.assertEquals(response.getHeader("Cache-control"), "no-cache, no-store", "Unexpected cache controls");
         
-        Assert.assertNotNull(response.getRedirectedUrl());
-        URLBuilder urlBuilder = new URLBuilder(response.getRedirectedUrl());
+        final String redirectedUrl = response.getRedirectedUrl();
+        assert redirectedUrl != null;
+        final URLBuilder urlBuilder = new URLBuilder(redirectedUrl);
         Assert.assertEquals(urlBuilder.getScheme(), "http");
         Assert.assertEquals(urlBuilder.getHost(), "example.org");
         Assert.assertEquals(urlBuilder.getPath(), "/response");
@@ -309,26 +308,26 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
     @Test
     @SuppressWarnings("unchecked")
     public void testResponseEncodingWithSimpleSign() throws Exception {
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
-                .getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
+                .<StatusCode>ensureBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
         StatusCode statusCode = statusCodeBuilder.buildObject();
         statusCode.setValue(StatusCode.SUCCESS);
 
-        SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
-                .getBuilder(Status.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
+                .<Status>ensureBuilder(Status.DEFAULT_ELEMENT_NAME);
         Status responseStatus = statusBuilder.buildObject();
         responseStatus.setStatusCode(statusCode);
 
-        SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
+                .<Response>ensureBuilder(Response.DEFAULT_ELEMENT_NAME);
         Response samlMessage = responseBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setVersion(SAMLVersion.VERSION_20);
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setStatus(responseStatus);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
+                .<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
         Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response");
@@ -336,14 +335,14 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         MessageContext messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+            .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         KeyPair kp = KeySupport.generateKeyPair("RSA", 1024, null);
         
         SignatureSigningParameters signingParameters = new SignatureSigningParameters();
         signingParameters.setSigningCredential(CredentialSupport.getSimpleCredential(kp.getPublic(), kp.getPrivate()));
         signingParameters.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);
-        messageContext.getSubcontext(SecurityParametersContext.class, true).setSignatureSigningParameters(signingParameters);
+        messageContext.ensureSubcontext(SecurityParametersContext.class).setSignatureSigningParameters(signingParameters);
         
         SAMLOutboundDestinationHandler handler = new SAMLOutboundDestinationHandler();
         handler.invoke(messageContext);
@@ -358,8 +357,9 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         encoder.prepareContext();
         encoder.encode();
         
-        Assert.assertNotNull(response.getRedirectedUrl());
-        URLBuilder urlBuilder = new URLBuilder(response.getRedirectedUrl());
+        final String redirectedUrl = response.getRedirectedUrl();
+        assert redirectedUrl != null;
+        final URLBuilder urlBuilder = new URLBuilder(redirectedUrl);
         Assert.assertEquals(urlBuilder.getScheme(), "http");
         Assert.assertEquals(urlBuilder.getHost(), "example.org");
         Assert.assertEquals(urlBuilder.getPath(), "/response");
@@ -392,30 +392,29 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
      * @throws Exception if something goes wrong
      */
     @Test
-    @SuppressWarnings("unchecked")
     public void OSJ271() throws Exception {
         // First we generate the signature with a redirect URL that does not have query params.
         
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
-                .getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
+                .<StatusCode>ensureBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
         StatusCode statusCode = statusCodeBuilder.buildObject();
         statusCode.setValue(StatusCode.SUCCESS);
 
-        SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
-                .getBuilder(Status.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
+                .<Status>ensureBuilder(Status.DEFAULT_ELEMENT_NAME);
         Status responseStatus = statusBuilder.buildObject();
         responseStatus.setStatusCode(statusCode);
 
-        SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
+                .<Response>ensureBuilder(Response.DEFAULT_ELEMENT_NAME);
         Response samlMessage = responseBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setVersion(SAMLVersion.VERSION_20);
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setStatus(responseStatus);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
+                .<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
         Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response");
@@ -423,14 +422,14 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         MessageContext messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+            .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         KeyPair kp = KeySupport.generateKeyPair("RSA", 1024, null);
         
         SignatureSigningParameters signingParameters = new SignatureSigningParameters();
         signingParameters.setSigningCredential(CredentialSupport.getSimpleCredential(kp.getPublic(), kp.getPrivate()));
         signingParameters.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);
-        messageContext.getSubcontext(SecurityParametersContext.class, true).setSignatureSigningParameters(signingParameters);
+        messageContext.ensureSubcontext(SecurityParametersContext.class).setSignatureSigningParameters(signingParameters);
         
         // NOTE: So that we can get an exact signature comparison without and with query params, we do not invoke
         // the SAMLOutboundDestinationHandler, which would change the data being signed. Not correct vis-a-vis actual 
@@ -446,8 +445,9 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         encoder.prepareContext();
         encoder.encode();
         
-        Assert.assertNotNull(response.getRedirectedUrl());
-        URLBuilder urlBuilder = new URLBuilder(response.getRedirectedUrl());
+        String redirectedUrl = response.getRedirectedUrl();
+        assert redirectedUrl != null;
+        URLBuilder urlBuilder = new URLBuilder(redirectedUrl);
         Assert.assertEquals(urlBuilder.getScheme(), "http");
         Assert.assertEquals(urlBuilder.getHost(), "example.org");
         Assert.assertEquals(urlBuilder.getPath(), "/response");
@@ -481,10 +481,10 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+        .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         
-        messageContext.getSubcontext(SecurityParametersContext.class, true).setSignatureSigningParameters(signingParameters);
+        messageContext.ensureSubcontext(SecurityParametersContext.class).setSignatureSigningParameters(signingParameters);
         
         final MockHttpServletResponse response2 = new MockHttpServletResponse();
         
@@ -496,8 +496,9 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         encoder.prepareContext();
         encoder.encode();
         
-        Assert.assertNotNull(response2.getRedirectedUrl());
-        urlBuilder = new URLBuilder(response2.getRedirectedUrl());
+        redirectedUrl = response.getRedirectedUrl();
+        assert redirectedUrl != null;
+        urlBuilder = new URLBuilder(redirectedUrl);
         Assert.assertEquals(urlBuilder.getScheme(), "http");
         Assert.assertEquals(urlBuilder.getHost(), "example.org");
         Assert.assertEquals(urlBuilder.getPath(), "/response");
@@ -530,4 +531,5 @@ public class HTTPRedirectDeflateEncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals(signatureWithoutParams, signatureWithParams);
         
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11EncoderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11EncoderTest.java
index b2971d1f8..b82e7dc18 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11EncoderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/encoding/impl/HTTPSOAP11EncoderTest.java
@@ -34,6 +34,7 @@ import org.opensaml.saml.saml2.core.Status;
 import org.opensaml.saml.saml2.core.StatusCode;
 import org.opensaml.saml.saml2.metadata.AssertionConsumerService;
 import org.opensaml.saml.saml2.metadata.Endpoint;
+import org.opensaml.soap.soap11.Body;
 import org.opensaml.soap.soap11.Envelope;
 import org.springframework.mock.web.MockHttpServletResponse;
 import org.testng.Assert;
@@ -52,41 +53,40 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
      * @throws Exception if something goes wrong
      */
     @Test
-    @SuppressWarnings("unchecked")
     public void testResponseEncoding() throws Exception {
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
-                .getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
-        StatusCode statusCode = statusCodeBuilder.buildObject();
+        final SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
+                .<StatusCode>ensureBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
+        final StatusCode statusCode = statusCodeBuilder.buildObject();
         statusCode.setValue(StatusCode.SUCCESS);
 
-        SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
-                .getBuilder(Status.DEFAULT_ELEMENT_NAME);
-        Status responseStatus = statusBuilder.buildObject();
+        final SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
+                .<Status>ensureBuilder(Status.DEFAULT_ELEMENT_NAME);
+        final Status responseStatus = statusBuilder.buildObject();
         responseStatus.setStatusCode(statusCode);
 
-        SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
-        Response samlMessage = responseBuilder.buildObject();
+        final SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
+                .<Response>ensureBuilder(Response.DEFAULT_ELEMENT_NAME);
+        final Response samlMessage = responseBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setVersion(SAMLVersion.VERSION_20);
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setStatus(responseStatus);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
+                .<Endpoint>ensureBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
         Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response");
         
-        MessageContext messageContext = new MessageContext();
+        final MessageContext messageContext = new MessageContext();
         messageContext.setMessage(samlMessage);
         SAMLBindingSupport.setRelayState(messageContext, "relay");
-        messageContext.getSubcontext(SAMLPeerEntityContext.class, true)
-            .getSubcontext(SAMLEndpointContext.class, true).setEndpoint(samlEndpoint);
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class)
+            .ensureSubcontext(SAMLEndpointContext.class).setEndpoint(samlEndpoint);
         
         final MockHttpServletResponse response = new MockHttpServletResponse();
         
-        HTTPSOAP11Encoder encoder = new HTTPSOAP11Encoder();
+        final HTTPSOAP11Encoder encoder = new HTTPSOAP11Encoder();
         encoder.setMessageContext(messageContext);
         encoder.setHttpServletResponseSupplier(new ConstantSupplier<>(response));
         
@@ -99,15 +99,16 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals(response.getHeader("Cache-control"), "no-cache, no-store", "Unexpected cache controls");
         Assert.assertEquals(response.getHeader("SOAPAction"), "http://www.oasis-open.org/committees/security");
         
-        try (ByteArrayInputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray())) {
+        try (final ByteArrayInputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray())) {
             XMLObject xmlObject = XMLObjectSupport.unmarshallFromInputStream(parserPool, inputStream);
             Assert.assertNotNull(xmlObject);
             Assert.assertTrue(xmlObject instanceof Envelope);
             Envelope envelope = (Envelope) xmlObject;
             Assert.assertNull(envelope.getHeader());
-            Assert.assertNotNull(envelope.getBody());
-            Assert.assertEquals(envelope.getBody().getUnknownXMLObjects().size(), 1);
-            Response outboundResponse = (Response) envelope.getBody().getUnknownXMLObjects().get(0);
+            final Body body = envelope.getBody();
+            assert body != null;
+            Assert.assertEquals(body.getUnknownXMLObjects().size(), 1);
+            Response outboundResponse = (Response) body.getUnknownXMLObjects().get(0);
             outboundResponse.releaseDOM();
             outboundResponse.releaseChildrenDOM(true);
             outboundResponse.setParent(null);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
index 67bfe870c..2b5f0ba8a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
@@ -237,7 +237,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
     }
     
     /** {@inheritDoc} */
-    protected XMLObject getMessageToLog() {
+    @Nullable protected XMLObject getMessageToLog() {
         return getMessageContext().ensureSubcontext(SOAP11Context.class).getEnvelope();
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java
index fe3a02aca..ef912a466 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java
@@ -39,10 +39,10 @@ import org.opensaml.soap.soap11.FaultCode;
 import org.opensaml.soap.soap11.Header;
 import org.opensaml.soap.wsaddressing.Action;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
 import jakarta.servlet.http.HttpServletResponse;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.servlet.HttpServletSupport;
 import net.shibboleth.shared.xml.SerializeSupport;
 
@@ -52,13 +52,13 @@ import net.shibboleth.shared.xml.SerializeSupport;
 public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(HTTPSOAP11Encoder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(HTTPSOAP11Encoder.class);
     
     /** SOAP Envelope builder. */
-    private SOAPObjectBuilder<Envelope> envBuilder;
+    @Nonnull private SOAPObjectBuilder<Envelope> envBuilder;
     
     /** SOAP Body builder. */
-    private SOAPObjectBuilder<Body> bodyBuilder;
+    @Nonnull private SOAPObjectBuilder<Body> bodyBuilder;
     
     /** Constructor. */
     public HTTPSOAP11Encoder() {
@@ -213,7 +213,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      * 
      * @return a SOAPAction HTTP header URI value
      */
-    protected String getSOAPAction() {
+    @Nullable protected String getSOAPAction() {
         final Envelope env = getSOAPEnvelope();
         final Header header = env != null ? env.getHeader() : null;
         if (header == null) {
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/crypto/XMLSigningUtil.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/crypto/XMLSigningUtil.java
index 722ee796d..03409ce0f 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/crypto/XMLSigningUtil.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/crypto/XMLSigningUtil.java
@@ -46,8 +46,8 @@ public final class XMLSigningUtil {
      * @return the computed signature or MAC value
      * @throws SecurityException throw if the computation process results in an error
      */
-    public static byte[] signWithURI(@Nonnull final Credential signingCredential, @Nonnull final String algorithmURI,
-            @Nonnull final byte[] input) throws SecurityException {
+    @Nonnull public static byte[] signWithURI(@Nonnull final Credential signingCredential,
+            @Nonnull final String algorithmURI, @Nonnull final byte[] input) throws SecurityException {
 
         final String jcaAlgorithmID = AlgorithmSupport.getAlgorithmID(algorithmURI);
         if (jcaAlgorithmID == null) {

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


More information about the commits mailing list