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

Rod Widdowson rdw at steadingsoftware.com
Sat Mar 11 15:51:00 UTC 2023


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

rdw 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=5e896fe2bd7b5246cfab00f96a058db5300e7894

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

commit 5e896fe2bd7b5246cfab00f96a058db5300e7894
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Sat Mar 11 15:32:25 2023 +0000

    IDP-2069 Null Handling
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    Eschew the two parameter getSubContext() method
    
    Some tests still tbd
---
 .../handler/impl/StaticMessageChannelSecurity.java |  2 +-
 .../impl/URLEvaluatingMessageChannelSecurity.java  |  2 +-
 .../HttpServletRequestMessageChannelSecurity.java  |  2 +-
 .../action/impl/StaticMessageChannelSecurity.java  |  2 +-
 .../saml/common/binding/SAMLBindingSupport.java    |  4 +-
 .../soap/SAMLSOAPClientContextBuilder.java         | 14 ++---
 .../binding/impl/SAMLProtocolAndRoleHandler.java   | 12 ++--
 ...ecordServerTLSEntityAuthenticationtHandler.java |  2 +-
 .../impl/MessageLifetimeSecurityHandler.java       |  2 +-
 .../impl/MessageReplaySecurityHandler.java         |  4 +-
 .../impl/SAMLMDClientCertAuthSecurityHandler.java  |  4 +-
 .../profile/impl/AddInResponseToToResponse.java    |  2 +-
 .../binding/decoding/impl/HTTPArtifactDecoder.java |  2 +-
 .../binding/decoding/impl/HTTPPostDecoder.java     |  2 +-
 .../binding/decoding/impl/HTTPSOAP11Decoder.java   |  2 +-
 .../impl/HttpClientResponseSOAP11Decoder.java      |  2 +-
 .../binding/encoding/impl/HTTPArtifactEncoder.java |  4 +-
 .../impl/SAML1ArtifactRequestIssuerHandler.java    |  2 +-
 .../impl/AddSubjectConfirmationToSubjects.java     |  2 +-
 .../binding/decoding/impl/HTTPArtifactDecoder.java |  2 +-
 .../binding/decoding/impl/HTTPPostDecoder.java     |  2 +-
 .../decoding/impl/HTTPPostSimpleSignDecoder.java   |  2 +-
 .../decoding/impl/HTTPRedirectDeflateDecoder.java  |  2 +-
 .../binding/decoding/impl/HTTPSOAP11Decoder.java   |  2 +-
 .../impl/HttpClientResponseSOAP11Decoder.java      |  2 +-
 .../binding/encoding/impl/HTTPArtifactEncoder.java |  4 +-
 .../ExtractChannelBindingsExtensionsHandler.java   |  2 +-
 .../impl/ExtractChannelBindingsHeadersHandler.java |  4 +-
 .../SAML2AuthnRequestsSignedSecurityHandler.java   |  4 +-
 ...ecuritySAML20AssertionTokenSecurityHandler.java |  2 +-
 .../impl/AddChannelBindingsHeaderHandlerTest.java  |  2 +-
 ...ulateSignatureSigningParametersHandlerTest.java |  2 +-
 ...SAMLAddAttributeConsumingServiceHandleTest.java |  4 +-
 .../impl/SAMLMetadataLookupHandlerTest.java        | 66 +++++++++++-----------
 .../http/AbstractPipelineHttpSOAPClient.java       |  4 +-
 .../opensaml/soap/client/http/HttpSOAPClient.java  |  4 +-
 .../soap/messaging/SOAPMessagingSupport.java       |  2 +-
 .../http/impl/HttpClientResponseSOAP11Decoder.java |  4 +-
 .../http/impl/HttpClientRequestSOAP11Encoder.java  |  6 +-
 .../decoder/http/impl/HTTPSOAP11Decoder.java       |  7 ++-
 .../encoder/http/impl/HTTPSOAP11Encoder.java       |  8 +--
 .../SOAP11FaultContextDecoratingErrorHandler.java  |  2 +-
 .../messaging/impl/AddMessageIDHandler.java        |  2 +-
 .../messaging/impl/AddRelatesToHandler.java        |  2 +-
 .../messaging/impl/ExtractMessageIDHandler.java    |  2 +-
 .../messaging/impl/ValidateActionHandler.java      |  2 +-
 .../messaging/impl/AddTimestampHandler.java        |  4 +-
 .../encoder/http/impl/HTTPSOAP11EncoderTest.java   |  4 +-
 48 files changed, 112 insertions(+), 111 deletions(-)

diff --git a/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/StaticMessageChannelSecurity.java b/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/StaticMessageChannelSecurity.java
index bf70a0c7b..234194ef9 100644
--- a/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/StaticMessageChannelSecurity.java
+++ b/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/StaticMessageChannelSecurity.java
@@ -73,7 +73,7 @@ public class StaticMessageChannelSecurity extends AbstractMessageChannelSecurity
     @Override
     protected void doInvoke(@Nonnull final MessageContext messageContext) {
         final MessageChannelSecurityContext channelContext =
-                getParentContext().getSubcontext(MessageChannelSecurityContext.class, true);
+                getParentContext().getOrCreateSubcontext(MessageChannelSecurityContext.class);
         channelContext.setConfidentialityActive(isConfidentialityActive());
         channelContext.setIntegrityActive(isIntegrityActive());
     }
diff --git a/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/URLEvaluatingMessageChannelSecurity.java b/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/URLEvaluatingMessageChannelSecurity.java
index 20751fd89..5bd04de6d 100644
--- a/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/URLEvaluatingMessageChannelSecurity.java
+++ b/opensaml-messaging-impl/src/main/java/org/opensaml/messaging/handler/impl/URLEvaluatingMessageChannelSecurity.java
@@ -120,7 +120,7 @@ public class URLEvaluatingMessageChannelSecurity extends AbstractMessageChannelS
     @Override
     protected void doInvoke(@Nonnull final MessageContext messageContext) {
         final MessageChannelSecurityContext channelContext =
-                getParentContext().getSubcontext(MessageChannelSecurityContext.class, true);
+                getParentContext().getOrCreateSubcontext(MessageChannelSecurityContext.class);
         
         final String scheme = urlBuilder.getScheme();
         // Note that below we don't care about port if scheme != https,
diff --git a/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/HttpServletRequestMessageChannelSecurity.java b/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/HttpServletRequestMessageChannelSecurity.java
index ee6819e19..75c5848f7 100644
--- a/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/HttpServletRequestMessageChannelSecurity.java
+++ b/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/HttpServletRequestMessageChannelSecurity.java
@@ -68,7 +68,7 @@ public class HttpServletRequestMessageChannelSecurity extends AbstractMessageCha
     @Override
     protected void doExecute(final ProfileRequestContext profileRequestContext) {
         final MessageChannelSecurityContext channelContext =
-                getParentContext().getSubcontext(MessageChannelSecurityContext.class, true);
+                getParentContext().getOrCreateSubcontext(MessageChannelSecurityContext.class);
         
         final HttpServletRequest request = getHttpServletRequest();
         if (request.isSecure() && (!defaultPortInsecure || request.getLocalPort() != 443)) {
diff --git a/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/StaticMessageChannelSecurity.java b/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/StaticMessageChannelSecurity.java
index adc4aee2f..68b9934a6 100644
--- a/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/StaticMessageChannelSecurity.java
+++ b/opensaml-profile-impl/src/main/java/org/opensaml/profile/action/impl/StaticMessageChannelSecurity.java
@@ -73,7 +73,7 @@ public class StaticMessageChannelSecurity extends AbstractMessageChannelSecurity
     @Override
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         final MessageChannelSecurityContext channelContext =
-                getParentContext().getSubcontext(MessageChannelSecurityContext.class, true);
+                getParentContext().getOrCreateSubcontext(MessageChannelSecurityContext.class);
         channelContext.setConfidentialityActive(isConfidentialityActive());
         channelContext.setIntegrityActive(isIntegrityActive());
     }
diff --git a/opensaml-saml-api/src/main/java/org/opensaml/saml/common/binding/SAMLBindingSupport.java b/opensaml-saml-api/src/main/java/org/opensaml/saml/common/binding/SAMLBindingSupport.java
index 2f9af89ad..2a372b092 100644
--- a/opensaml-saml-api/src/main/java/org/opensaml/saml/common/binding/SAMLBindingSupport.java
+++ b/opensaml-saml-api/src/main/java/org/opensaml/saml/common/binding/SAMLBindingSupport.java
@@ -78,7 +78,7 @@ public final class SAMLBindingSupport {
      */
     public static void setRelayState(@Nonnull final MessageContext messageContext, 
             @Nullable final String relayState) {
-        messageContext.getSubcontext(SAMLBindingContext.class, true).setRelayState(relayState);
+        messageContext.getOrCreateSubcontext(SAMLBindingContext.class).setRelayState(relayState);
     }
     
     /**
@@ -266,7 +266,7 @@ public final class SAMLBindingSupport {
      */
     public static boolean isIntendedDestinationEndpointURIRequired(
             @Nonnull final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, false);
+        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class);
         if (bindingContext == null) {
             return false;
         }
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 45c89cf08..e0443ee91 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
@@ -342,7 +342,7 @@ public class SAMLSOAPClientContextBuilder<InboundMessageType extends SAMLObject,
         
         final Function<MessageContext,CriteriaSet> tlsStrategy = getTLSCriteriaSetStrategy();
         if (tlsStrategy != null) {
-            outboundContext.getSubcontext(HttpClientSecurityContext.class, true)
+            outboundContext.getOrCreateSubcontext(HttpClientSecurityContext.class)
                 .setTLSCriteriaSetStrategy(tlsStrategy);
         }
         
@@ -352,22 +352,22 @@ public class SAMLSOAPClientContextBuilder<InboundMessageType extends SAMLObject,
         final BaseContext parent = opContext;
         
         if (getProtocol() != null) {
-            parent.getSubcontext(SAMLProtocolContext.class, true).setProtocol(getProtocol());
+            parent.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(getProtocol());
         }
         
         if (getPipelineName() != null) {
-            parent.getSubcontext(SOAPClientContext.class, true).setPipelineName(getPipelineName());
+            parent.getOrCreateSubcontext(SOAPClientContext.class).setPipelineName(getPipelineName());
         }
         
         if (getSecurityConfigurationProfileId() != null) {
-            parent.getSubcontext(SOAPClientSecurityContext.class, true).setSecurityConfigurationProfileId(
+            parent.getOrCreateSubcontext(SOAPClientSecurityContext.class).setSecurityConfigurationProfileId(
                     getSecurityConfigurationProfileId());
         }
         
         //TODO is this required always?
         final String selfID = getSelfEntityID();
         if (selfID != null) {
-            final SAMLSelfEntityContext selfContext = parent.getSubcontext(SAMLSelfEntityContext.class, true);
+            final SAMLSelfEntityContext selfContext = parent.getOrCreateSubcontext(SAMLSelfEntityContext.class);
             selfContext.setEntityId(selfID);
         }
         
@@ -380,12 +380,12 @@ public class SAMLSOAPClientContextBuilder<InboundMessageType extends SAMLObject,
         if (peerRoleName == null) {
             errorMissingData("Peer role");
         }
-        final SAMLPeerEntityContext peerContext = parent.getSubcontext(SAMLPeerEntityContext.class, true);
+        final SAMLPeerEntityContext peerContext = parent.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setEntityId(peerID);
         peerContext.setRole(peerRoleName);
         
         //  Both optional, could be resolved in SOAP handling pipeline by handler(s)
-        final SAMLMetadataContext metadataContext = peerContext.getSubcontext(SAMLMetadataContext.class, true);
+        final SAMLMetadataContext metadataContext = peerContext.getOrCreateSubcontext(SAMLMetadataContext.class);
         metadataContext.setEntityDescriptor(getPeerEntityDescriptor());
         metadataContext.setRoleDescriptor(getPeerRoleDescriptor());
         
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/impl/SAMLProtocolAndRoleHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/impl/SAMLProtocolAndRoleHandler.java
index 618bb0725..5e415ee32 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/impl/SAMLProtocolAndRoleHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/impl/SAMLProtocolAndRoleHandler.java
@@ -123,27 +123,27 @@ public class SAMLProtocolAndRoleHandler extends AbstractMessageHandler {
         }
         
         if (samlProtocol != null) {
-            messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(samlProtocol);
+            messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(samlProtocol);
         } else if (copySource != null) {
             final SAMLProtocolContext sourceProtocolContext = copySource.getSubcontext(SAMLProtocolContext.class);
             if (sourceProtocolContext != null) {
-                messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(
+                messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(
                         sourceProtocolContext.getProtocol());
             }
         }
-        if (messageContext.getSubcontext(SAMLProtocolContext.class, true).getProtocol() == null) {
+        if (messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).getProtocol() == null) {
             throw new MessageHandlerException("SAML protocol was not supplied and could not be dynamically resolved");
         }
         
         if (peerRole != null) {
-            messageContext.getSubcontext(entityContextClass, true).setRole(peerRole);
+            messageContext.getOrCreateSubcontext(entityContextClass).setRole(peerRole);
         } else if (copySource != null) {
             final AbstractSAMLEntityContext sourceEntityContext = copySource.getSubcontext(entityContextClass);
             if (sourceEntityContext != null) {
-                messageContext.getSubcontext(entityContextClass, true).setRole(sourceEntityContext.getRole());
+                messageContext.getOrCreateSubcontext(entityContextClass).setRole(sourceEntityContext.getRole());
             }
         }
-        if (messageContext.getSubcontext(entityContextClass, true).getRole() == null) {
+        if (messageContext.getOrCreateSubcontext(entityContextClass).getRole() == null) {
             throw new MessageHandlerException("SAML role was not supplied and could not be dynamically resolved");
         }
         
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java
index 5600e50ce..a94d5eaca 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/CheckAndRecordServerTLSEntityAuthenticationtHandler.java
@@ -123,7 +123,7 @@ public class CheckAndRecordServerTLSEntityAuthenticationtHandler extends Abstrac
                 log.debug("HttpClientContext indicates successful server TLS, storing result in entity context {}", 
                         entityContextClass.getName());
                 final AbstractAuthenticatableSAMLEntityContext entityContext = 
-                        messageContext.getSubcontext(entityContextClass, true);
+                        messageContext.getOrCreateSubcontext(entityContextClass);
                 entityContext.setAuthenticated(true);
                 if (entityContext.getEntityId() == null && entityIDLookup != null) {
                     log.debug("Context entityID was null, attempting to resolve");
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageLifetimeSecurityHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageLifetimeSecurityHandler.java
index f7da8cef4..a3b7f088a 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageLifetimeSecurityHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageLifetimeSecurityHandler.java
@@ -122,7 +122,7 @@ public class MessageLifetimeSecurityHandler extends AbstractMessageHandler {
     /** {@inheritDoc} */
     @Override
     public void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
-        final SAMLMessageInfoContext msgInfoContext = messageContext.getSubcontext(SAMLMessageInfoContext.class, true);
+        final SAMLMessageInfoContext msgInfoContext = messageContext.getOrCreateSubcontext(SAMLMessageInfoContext.class);
         
         if (msgInfoContext.getMessageIssueInstant() == null) {
             if (requiredRule) {
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageReplaySecurityHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageReplaySecurityHandler.java
index c1b0e1132..4580cc022 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageReplaySecurityHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/MessageReplaySecurityHandler.java
@@ -124,14 +124,14 @@ public class MessageReplaySecurityHandler extends AbstractMessageHandler {
     /** {@inheritDoc} */
     @Override
     protected void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
-        final SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        final SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         
         String entityID = StringSupport.trimOrNull(peerContext.getEntityId());
         if (entityID == null) {
             entityID = "(unknown)";
         }
         
-        final SAMLMessageInfoContext msgInfoContext = messageContext.getSubcontext(SAMLMessageInfoContext.class, true);
+        final SAMLMessageInfoContext msgInfoContext = messageContext.getOrCreateSubcontext(SAMLMessageInfoContext.class);
 
         final String messageId = StringSupport.trimOrNull(msgInfoContext.getMessageId());
         if (messageId == null) {
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/SAMLMDClientCertAuthSecurityHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/SAMLMDClientCertAuthSecurityHandler.java
index f25f678e3..507fc2862 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/SAMLMDClientCertAuthSecurityHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/impl/SAMLMDClientCertAuthSecurityHandler.java
@@ -130,14 +130,14 @@ public class SAMLMDClientCertAuthSecurityHandler extends BaseClientCertAuthSecur
     protected void setAuthenticatedCertificatePresenterEntityID(@Nonnull final MessageContext messageContext,
             @Nullable final String entityID) {
         log.trace("Storing authenticatable entityID '{}' in context: {}", entityID, entityContextClass);
-        messageContext.getSubcontext(entityContextClass, true).setEntityId(entityID);
+        messageContext.getOrCreateSubcontext(entityContextClass).setEntityId(entityID);
     }
 
     /** {@inheritDoc} */
     @Override
     protected void setAuthenticatedState(@Nonnull final MessageContext messageContext, final boolean authenticated) {
         log.trace("Storing authenticated entity state '{}' in context: {}", authenticated, entityContextClass);
-        messageContext.getSubcontext(entityContextClass, true).setAuthenticated(authenticated);
+        messageContext.getOrCreateSubcontext(entityContextClass).setAuthenticated(authenticated);
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/profile/impl/AddInResponseToToResponse.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/profile/impl/AddInResponseToToResponse.java
index 62432a44c..b237fb0e5 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/profile/impl/AddInResponseToToResponse.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/profile/impl/AddInResponseToToResponse.java
@@ -185,7 +185,7 @@ public class AddInResponseToToResponse extends AbstractConditionalProfileAction
                 }
             }
             
-            final SAMLMessageInfoContext infoCtx = inMsgCtx.getSubcontext(SAMLMessageInfoContext.class, true);
+            final SAMLMessageInfoContext infoCtx = inMsgCtx.getOrCreateSubcontext(SAMLMessageInfoContext.class);
             if (infoCtx == null) {
                 log.debug("No inbound SAMLMessageInfoContext available");
                 return null;
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPArtifactDecoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPArtifactDecoder.java
index 7a0651599..8b561cfc6 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPArtifactDecoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPArtifactDecoder.java
@@ -131,7 +131,7 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoder.java
index cc9a4f07b..5b1a16709 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPPostDecoder.java
@@ -109,7 +109,7 @@ public class HTTPPostDecoder extends BaseHttpServletRequestXMLMessageDecoder imp
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11Decoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11Decoder.java
index effc1bd1a..370e9869c 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11Decoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HTTPSOAP11Decoder.java
@@ -96,7 +96,7 @@ public class HTTPSOAP11Decoder extends org.opensaml.soap.soap11.decoder.http.imp
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java
index b4d9fd67e..bd5231b0e 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/decoding/impl/HttpClientResponseSOAP11Decoder.java
@@ -97,7 +97,7 @@ public class HttpClientResponseSOAP11Decoder
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPArtifactEncoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPArtifactEncoder.java
index 8067e4e6c..a7dd785b6 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPArtifactEncoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/encoding/impl/HTTPArtifactEncoder.java
@@ -239,7 +239,7 @@ public class HTTPArtifactEncoder extends BaseSAML1MessageEncoder {
      */
     private void storeSAMLArtifactType(@Nonnull final MessageContext messageContext,
             @Nonnull @NotEmpty final byte[] artifactType) {
-        messageContext.getSubcontext(SAMLArtifactContext.class, true).setArtifactType(artifactType);
+        messageContext.getOrCreateSubcontext(SAMLArtifactContext.class).setArtifactType(artifactType);
     }
 
     /**
@@ -250,7 +250,7 @@ public class HTTPArtifactEncoder extends BaseSAML1MessageEncoder {
      * @return the artifact type
      */
     @Nullable private byte[] getSAMLArtifactType(@Nonnull final MessageContext messageContext) {
-        return messageContext.getSubcontext(SAMLArtifactContext.class, true).getArtifactType();
+        return messageContext.getOrCreateSubcontext(SAMLArtifactContext.class).getArtifactType();
     }
     
 }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/impl/SAML1ArtifactRequestIssuerHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/impl/SAML1ArtifactRequestIssuerHandler.java
index c83385dee..b697e9578 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/impl/SAML1ArtifactRequestIssuerHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/binding/impl/SAML1ArtifactRequestIssuerHandler.java
@@ -96,7 +96,7 @@ public class SAML1ArtifactRequestIssuerHandler extends AbstractMessageHandler {
             
             log.debug("{} Derived issuer of aritfact resolution request as {}", getLogPrefix(),
                     entry.getRelyingPartyId());
-            messageContext.getSubcontext(SAMLPeerEntityContext.class, true).setEntityId(entry.getRelyingPartyId());
+            messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class).setEntityId(entry.getRelyingPartyId());
         } catch (final IOException e) {
             log.error("{} Error resolving first artifact in request: {}", getLogPrefix(), artifact, e);
         }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/profile/impl/AddSubjectConfirmationToSubjects.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/profile/impl/AddSubjectConfirmationToSubjects.java
index e5eefbb96..866232b3d 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/profile/impl/AddSubjectConfirmationToSubjects.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml1/profile/impl/AddSubjectConfirmationToSubjects.java
@@ -166,7 +166,7 @@ public class AddSubjectConfirmationToSubjects extends AbstractProfileAction {
         }
         
         final SAMLBindingContext bindingCtx = profileRequestContext.getOutboundMessageContext().getSubcontext(
-                SAMLBindingContext.class, false);
+                SAMLBindingContext.class);
         artifactProfile = bindingCtx != null
                 && Objects.equals(bindingCtx.getBindingUri(), SAMLConstants.SAML1_ARTIFACT_BINDING_URI);
         
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 de1946335..0191136a5 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
@@ -653,7 +653,7 @@ public class HTTPArtifactDecoder extends BaseHttpServletRequestXMLMessageDecoder
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
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 50e53ec91..6a26a165c 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
@@ -144,7 +144,7 @@ public class HTTPPostDecoder extends BaseHttpServletRequestXMLMessageDecoder imp
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostSimpleSignDecoder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostSimpleSignDecoder.java
index a410d48c6..d4657c0b3 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostSimpleSignDecoder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/decoding/impl/HTTPPostSimpleSignDecoder.java
@@ -42,7 +42,7 @@ public class HTTPPostSimpleSignDecoder extends HTTPPostDecoder {
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(getBindingDescriptor());
         bindingContext.setHasBindingSignature(
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 ff183b503..dc7b7fd43 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
@@ -147,7 +147,7 @@ public class HTTPRedirectDeflateDecoder extends BaseHttpServletRequestXMLMessage
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(
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 76bb2d403..b62e200df 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
@@ -96,7 +96,7 @@ public class HTTPSOAP11Decoder extends org.opensaml.soap.soap11.decoder.http.imp
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
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 cea45436a..9782020d6 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
@@ -97,7 +97,7 @@ public class HttpClientResponseSOAP11Decoder
      * @param messageContext the current message context
      */
     protected void populateBindingContext(final MessageContext messageContext) {
-        final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class, true);
+        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(bindingDescriptor);
         bindingContext.setHasBindingSignature(false);
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 107771f7a..df7764156 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
@@ -406,7 +406,7 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
      */
     private void storeSAMLArtifactType(@Nonnull final MessageContext messageContext,
             @Nonnull @NotEmpty final byte[] artifactType) {
-        messageContext.getSubcontext(SAMLArtifactContext.class, true).setArtifactType(artifactType);
+        messageContext.getOrCreateSubcontext(SAMLArtifactContext.class).setArtifactType(artifactType);
     }
 
     /**
@@ -417,7 +417,7 @@ public class HTTPArtifactEncoder extends BaseSAML2MessageEncoder {
      * @return the artifact type
      */
     @Nullable private byte[] getSAMLArtifactType(@Nonnull final MessageContext messageContext) {
-        return messageContext.getSubcontext(SAMLArtifactContext.class, true).getArtifactType();
+        return messageContext.getOrCreateSubcontext(SAMLArtifactContext.class).getArtifactType();
     }
     
 }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsExtensionsHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsExtensionsHandler.java
index 816023752..104610737 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsExtensionsHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsExtensionsHandler.java
@@ -82,7 +82,7 @@ public class ExtractChannelBindingsExtensionsHandler extends AbstractMessageHand
         }
 
         final Collection<ChannelBindings> channelBindings =
-                messageContext.getSubcontext(ChannelBindingsContext.class, true).getChannelBindings();
+                messageContext.getOrCreateSubcontext(ChannelBindingsContext.class).getChannelBindings();
         for (final XMLObject cb : bindings) {
             if (cb instanceof ChannelBindings) {
                 channelBindings.add((ChannelBindings) cb);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsHeadersHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsHeadersHandler.java
index 6f9f9eea9..872a931c0 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsHeadersHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/ExtractChannelBindingsHeadersHandler.java
@@ -98,8 +98,8 @@ public class ExtractChannelBindingsHeadersHandler extends AbstractMessageHandler
             log.debug("{} No ChannelBindings header blocks found", getLogPrefix());
         } else {
             log.debug("{} {} ChannelBindings header block(s) found", getLogPrefix(), channelBindings.size());
-            messageContext.getSubcontext(SOAP11Context.class).getSubcontext(ChannelBindingsContext.class,
-                    true).getChannelBindings().addAll(channelBindings);
+            messageContext.getSubcontext(SOAP11Context.class).getOrCreateSubcontext(ChannelBindingsContext.class).
+                getChannelBindings().addAll(channelBindings);
         }
     }
     
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/SAML2AuthnRequestsSignedSecurityHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/SAML2AuthnRequestsSignedSecurityHandler.java
index 12769a035..1235100b6 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/SAML2AuthnRequestsSignedSecurityHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/security/impl/SAML2AuthnRequestsSignedSecurityHandler.java
@@ -80,14 +80,14 @@ public class SAML2AuthnRequestsSignedSecurityHandler extends AbstractMessageHand
      */
     protected boolean isRequestSigningRequired(@Nonnull final MessageContext messageContext) {
         
-        final SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        final SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         if (peerContext == null || Strings.isNullOrEmpty(peerContext.getEntityId())) {
             log.warn("SAML peer entityID was not available, unable to evaluate rule");
             return false;
         }
         final String messageIssuer = peerContext.getEntityId();
         
-        final SAMLMetadataContext metadataContext = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        final SAMLMetadataContext metadataContext = peerContext.getOrCreateSubcontext(SAMLMetadataContext.class);
         if (metadataContext == null || metadataContext.getRoleDescriptor() == null) {
             log.warn("SAMLPeerContext did not contain either a SAMLMetadataContext or a RoleDescriptor, " 
                     + "unable to evaluate rule");
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java
index 6e6eb22ce..ae4136553 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java
@@ -251,7 +251,7 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
             return;
         }
         
-        final WSSecurityContext wsContext = messageContext.getSubcontext(WSSecurityContext.class, true);
+        final WSSecurityContext wsContext = messageContext.getOrCreateSubcontext(WSSecurityContext.class);
         
         for (final Assertion assertion : assertions) {
             final SAML20AssertionValidator validator = resolveValidator(messageContext, assertion);
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/AddChannelBindingsHeaderHandlerTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/AddChannelBindingsHeaderHandlerTest.java
index f21887839..998c939ad 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/AddChannelBindingsHeaderHandlerTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/AddChannelBindingsHeaderHandlerTest.java
@@ -98,7 +98,7 @@ public class AddChannelBindingsHeaderHandlerTest extends OpenSAMLInitBaseTestCas
 
         final Envelope env = XMLObjectProviderRegistrySupport.getBuilderFactory().<Envelope>getBuilderOrThrow(
                 Envelope.DEFAULT_ELEMENT_NAME).buildObject(Envelope.DEFAULT_ELEMENT_NAME);
-        messageCtx.getSubcontext(SOAP11Context.class, true).setEnvelope(env);
+        messageCtx.getOrCreateSubcontext(SOAP11Context.class).setEnvelope(env);
         
         handler.invoke(messageCtx);
         
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/PopulateSignatureSigningParametersHandlerTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/PopulateSignatureSigningParametersHandlerTest.java
index 8266df5a8..5ceb5b65b 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/PopulateSignatureSigningParametersHandlerTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/PopulateSignatureSigningParametersHandlerTest.java
@@ -96,7 +96,7 @@ public class PopulateSignatureSigningParametersHandlerTest extends OpenSAMLInitB
                 new ChildContextLookup<MessageContext,SecurityParametersContext>(SecurityParametersContext.class, true));
         handler.initialize();
         
-        prc.getSubcontext(SecurityParametersContext.class, true).setSignatureSigningParameters(new SignatureSigningParameters());
+        prc.getOrCreateSubcontext(SecurityParametersContext.class).setSignatureSigningParameters(new SignatureSigningParameters());
         
         handler.invoke(prc.getOutboundMessageContext());
         Assert.assertSame(prc.getSubcontext(SecurityParametersContext.class).getSignatureSigningParameters(),
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLAddAttributeConsumingServiceHandleTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLAddAttributeConsumingServiceHandleTest.java
index be6775163..c63bef3d7 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLAddAttributeConsumingServiceHandleTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLAddAttributeConsumingServiceHandleTest.java
@@ -45,7 +45,7 @@ public class SAMLAddAttributeConsumingServiceHandleTest extends XMLObjectBaseTes
     private SPSSODescriptor noACS;
     
     private SAMLMetadataContext getMetadataContext(final MessageContext message) {
-        return message.getSubcontext(SAMLPeerEntityContext.class, true).getSubcontext(SAMLMetadataContext.class, true);
+        return message.getOrCreateSubcontext(SAMLPeerEntityContext.class).getSubcontext(SAMLMetadataContext.class, true);
     }
     
     private SAMLAddAttributeConsumingServiceHandler handler() throws ComponentInitializationException {
@@ -157,7 +157,7 @@ public class SAMLAddAttributeConsumingServiceHandleTest extends XMLObjectBaseTes
         
         navigatedHandler.setMetadataContextLookupStrategy(new ParentContextLookup<>(SAMLMetadataContext.class));
         final SAMLMetadataContext metadataContext = new SAMLMetadataContext();
-        final MessageContext messageContext = metadataContext.getSubcontext(MessageContext.class, true);
+        final MessageContext messageContext = metadataContext.getOrCreateSubcontext(MessageContext.class);
         metadataContext.setRoleDescriptor(withACS);
         
         final AuthnRequest request = SAML2ActionTestingSupport.buildAuthnRequest();
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLMetadataLookupHandlerTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLMetadataLookupHandlerTest.java
index 91555f7b3..0e7afc788 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLMetadataLookupHandlerTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/impl/SAMLMetadataLookupHandlerTest.java
@@ -128,7 +128,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         peerContext.setRole(org.opensaml.saml.saml2.metadata.SPSSODescriptor.DEFAULT_ELEMENT_NAME);
         
         handler.invoke(messageContext);
-        Assert.assertNull(messageContext.getSubcontext(SAMLMetadataContext.class, false));
+        Assert.assertNull(messageContext.getSubcontext(SAMLMetadataContext.class));
     }
     
     @Test
@@ -136,7 +136,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setRoleDescriptorResolver(roleResolver);
         handler.initialize();
         
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
         
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
@@ -144,7 +144,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         messageContext.setMessage(request);
 
         handler.invoke(messageContext);
-        Assert.assertNull(peerContext.getSubcontext(SAMLMetadataContext.class, false));
+        Assert.assertNull(peerContext.getSubcontext(SAMLMetadataContext.class));
     }
  
     @Test
@@ -152,7 +152,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setRoleDescriptorResolver(roleResolver);
         handler.initialize();
         
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(SPSSODescriptor.DEFAULT_ELEMENT_NAME);
         
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
@@ -160,7 +160,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         messageContext.setMessage(request);
 
         handler.invoke(messageContext);
-        Assert.assertNull(peerContext.getSubcontext(SAMLMetadataContext.class, false));
+        Assert.assertNull(peerContext.getSubcontext(SAMLMetadataContext.class));
     }
 
     @Test
@@ -168,16 +168,16 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setRoleDescriptorResolver(roleResolver);
         handler.initialize();
         
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol("urn:foo");
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol("urn:foo");
         
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
         messageContext.setMessage(request);
 
         handler.invoke(messageContext);
-        Assert.assertNull(peerContext.getSubcontext(SAMLMetadataContext.class, false));
+        Assert.assertNull(peerContext.getSubcontext(SAMLMetadataContext.class));
     }
     
     @Test
@@ -185,9 +185,9 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setRoleDescriptorResolver(roleResolver);
         handler.initialize();
         
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML11P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML11P_NS);
         
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
@@ -195,7 +195,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
 
         handler.invoke(messageContext);
         
-        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
         Assert.assertNotNull(mdCtx.getEntityDescriptor());
@@ -207,10 +207,10 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setRoleDescriptorResolver(roleResolver);
         handler.initialize();
         
-        SAMLPresenterEntityContext presenterContext = messageContext.getSubcontext(SAMLPresenterEntityContext.class, true);
+        SAMLPresenterEntityContext presenterContext = messageContext.getOrCreateSubcontext(SAMLPresenterEntityContext.class);
         presenterContext.setEntityId("https://carmenwiki.osu.edu/shibboleth");
         presenterContext.setRole(SPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML20P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML20P_NS);
         
         AuthnRequest authnRequest = SAML2ActionTestingSupport.buildAuthnRequest();
         authnRequest.getIssuer().setValue("https://carmenwiki.osu.edu/shibboleth");
@@ -218,7 +218,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
 
         handler.invoke(messageContext);
         
-        SAMLMetadataContext mdCtx = presenterContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = presenterContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
         Assert.assertNotNull(mdCtx.getEntityDescriptor());
@@ -230,9 +230,9 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setCopyContextStrategy(copyContextStrategy);
         handler.initialize();
 
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML11P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML11P_NS);
 
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
@@ -240,7 +240,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
 
         handler.invoke(messageContext);
 
-        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotSame(mdCtx, existingMetadataContext);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
@@ -257,9 +257,9 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setCopyContextStrategy(copyContextStrategy);
         handler.initialize();
 
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML11P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML11P_NS);
 
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
@@ -267,7 +267,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
 
         handler.invoke(messageContext);
 
-        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotSame(mdCtx, existingMetadataContext);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
@@ -284,9 +284,9 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setCopyContextStrategy(copyContextStrategy);
         handler.initialize();
 
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML11P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML11P_NS);
 
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
@@ -294,7 +294,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
 
         handler.invoke(messageContext);
 
-        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotSame(mdCtx, existingMetadataContext);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
@@ -311,9 +311,9 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setCopyContextStrategy(copyContextStrategy);
         handler.initialize();
 
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML11P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML11P_NS);
 
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
@@ -321,7 +321,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
 
         handler.invoke(messageContext);
 
-        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotSame(mdCtx, existingMetadataContext);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
@@ -338,9 +338,9 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setCopyContextStrategy(copyContextStrategy);
         handler.initialize();
 
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML11P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML11P_NS);
 
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
@@ -348,7 +348,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
 
         handler.invoke(messageContext);
 
-        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotSame(mdCtx, existingMetadataContext);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
@@ -362,11 +362,11 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         handler.setRoleDescriptorResolver(roleResolver);
         handler.initialize();
         
-        SAMLPeerEntityContext peerContext = messageContext.getSubcontext(SAMLPeerEntityContext.class, true);
+        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
         peerContext.setRole(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(SAMLConstants.SAML11P_NS);
+        messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML11P_NS);
         
-        messageContext.getSubcontext(SAMLMetadataLookupParametersContext.class, true).setDetectDuplicateEntityIDs(DetectDuplicateEntityIDs.Batch);
+        messageContext.getOrCreateSubcontext(SAMLMetadataLookupParametersContext.class).setDetectDuplicateEntityIDs(DetectDuplicateEntityIDs.Batch);
         
         Request request = SAML1ActionTestingSupport.buildAttributeQueryRequest(null);
         ((AttributeQuery) request.getQuery()).setResource("urn:mace:incommon:osu.edu");
@@ -381,7 +381,7 @@ public class SAMLMetadataLookupHandlerTest extends XMLObjectBaseTestCase {
         // For good measure actually test resolution and that hasn't caused any failures due to side effects, etc.
         handler.invoke(messageContext);
         
-        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class, false);
+        SAMLMetadataContext mdCtx = peerContext.getSubcontext(SAMLMetadataContext.class);
         Assert.assertNotNull(mdCtx);
         Assert.assertNotNull(mdCtx.getRoleDescriptor());
         Assert.assertNotNull(mdCtx.getEntityDescriptor());
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java
index 19db0bb00..0fe6d5978 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/AbstractPipelineHttpSOAPClient.java
@@ -184,7 +184,7 @@ public abstract class AbstractPipelineHttpSOAPClient
         HttpClientMessagePipeline pipeline = null;
         try {
             // Store the endpoint URI
-            operationContext.getSubcontext(SOAPClientContext.class, true).setDestinationURI(endpoint);
+            operationContext.getOrCreateSubcontext(SOAPClientContext.class).setDestinationURI(endpoint);
             
             // Pipeline resolution
             pipeline = resolvePipeline(operationContext);
@@ -394,7 +394,7 @@ public abstract class AbstractPipelineHttpSOAPClient
      */
     @Nonnull protected HttpClientContext resolveClientContext(@Nonnull final InOutOperationContext operationContext) {
         final HttpClientRequestContext requestContext = 
-                operationContext.getOutboundMessageContext().getSubcontext(HttpClientRequestContext.class, true);
+                operationContext.getOutboundMessageContext().getOrCreateSubcontext(HttpClientRequestContext.class);
         if (requestContext.getHttpClientContext() == null) {
             requestContext.setHttpClientContext(HttpClientContext.create());
         }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java
index b0789b410..1d0cafd03 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/client/http/HttpSOAPClient.java
@@ -313,7 +313,7 @@ public class HttpSOAPClient extends AbstractInitializableComponent implements SO
             }
             final Envelope response = unmarshallResponse(httpResponse.getEntity().getContent());
             context.setInboundMessageContext(new MessageContext());
-            context.getInboundMessageContext().getSubcontext(SOAP11Context.class, true).setEnvelope(response);
+            context.getInboundMessageContext().getOrCreateSubcontext(SOAP11Context.class).setEnvelope(response);
             //TODO: goes away?
             //evaluateSecurityPolicy(messageContext);
         } catch (final IOException e) {
@@ -338,7 +338,7 @@ public class HttpSOAPClient extends AbstractInitializableComponent implements SO
             }
             final Envelope response = unmarshallResponse(httpResponse.getEntity().getContent());
             context.setInboundMessageContext(new MessageContext());
-            context.getInboundMessageContext().getSubcontext(SOAP11Context.class, true).setEnvelope(response);
+            context.getInboundMessageContext().getOrCreateSubcontext(SOAP11Context.class).setEnvelope(response);
 
             if (response.getBody() != null) {
                 final List<XMLObject> faults = response.getBody().getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME);
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/messaging/SOAPMessagingSupport.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/messaging/SOAPMessagingSupport.java
index 9def41b32..87f55c9fa 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/messaging/SOAPMessagingSupport.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/messaging/SOAPMessagingSupport.java
@@ -60,7 +60,7 @@ public final class SOAPMessagingSupport {
      */
     @Nonnull public static InboundSOAPContext getInboundSOAPContext(@Nonnull final MessageContext messageContext) {
         Constraint.isNotNull(messageContext, "Message context cannot be null");
-        return messageContext.getSubcontext(InboundSOAPContext.class, true);
+        return messageContext.getOrCreateSubcontext(InboundSOAPContext.class);
     }
 
     /**
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
index eb1a2bdcf..dd8ab58cf 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
@@ -91,7 +91,7 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
             
             switch(responseStatusCode) {
                 case HttpStatus.SC_OK:
-                    final SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class, true);
+                    final SOAP11Context soapContext = messageContext.getOrCreateSubcontext(SOAP11Context.class);
                     processSuccessResponse(response, soapContext);
                     break;
                 case HttpStatus.SC_INTERNAL_SERVER_ERROR:
@@ -221,7 +221,7 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
     /** {@inheritDoc} */
     @Override
     protected XMLObject getMessageToLog() {
-        return getMessageContext().getSubcontext(SOAP11Context.class, true).getEnvelope();
+        return getMessageContext().getOrCreateSubcontext(SOAP11Context.class).getEnvelope();
     }
     
 }
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 85ae4d0fa..830bf8ea6 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
@@ -143,7 +143,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * @param envelope the SOAP envelope
      */
     protected void storeSOAPEnvelope(final Envelope envelope) {
-        getMessageContext().getSubcontext(SOAP11Context.class, true).setEnvelope(envelope);
+        getMessageContext().getOrCreateSubcontext(SOAP11Context.class).setEnvelope(envelope);
     }
 
     /**
@@ -152,7 +152,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * @return the previously stored SOAP envelope
      */
     protected Envelope getSOAPEnvelope() {
-        return getMessageContext().getSubcontext(SOAP11Context.class, true).getEnvelope();
+        return getMessageContext().getOrCreateSubcontext(SOAP11Context.class).getEnvelope();
     }
 
     /**
@@ -231,7 +231,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
     
     /** {@inheritDoc} */
     protected XMLObject getMessageToLog() {
-        return getMessageContext().getSubcontext(SOAP11Context.class, true).getEnvelope();
+        return getMessageContext().getOrCreateSubcontext(SOAP11Context.class).getEnvelope();
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java
index 0601b6f17..f28f84657 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java
@@ -34,10 +34,11 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.net.MediaType;
 
-import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.servlet.HttpServletSupport;
 
+import jakarta.servlet.http.HttpServletRequest;
+
 /**
  * Basic SOAP 1.1 decoder for HTTP transport.
  * 
@@ -95,7 +96,7 @@ public class HTTPSOAP11Decoder extends BaseHttpServletRequestXMLMessageDecoder {
         final Envelope soapMessage;
         try {
             soapMessage = (Envelope) unmarshallMessage(request.getInputStream());
-            messageContext.getSubcontext(SOAP11Context.class, true).setEnvelope(soapMessage);
+            messageContext.getOrCreateSubcontext(SOAP11Context.class).setEnvelope(soapMessage);
         } catch (final IOException e) {
             log.error("Unable to obtain input stream from HttpServletRequest: {}", e.getMessage());
             throw new MessageDecodingException("Unable to obtain input stream from HttpServletRequest", e);
@@ -130,7 +131,7 @@ public class HTTPSOAP11Decoder extends BaseHttpServletRequestXMLMessageDecoder {
     /** {@inheritDoc} */
     @Override
     protected XMLObject getMessageToLog() {
-        return getMessageContext().getSubcontext(SOAP11Context.class, true).getEnvelope();
+        return getMessageContext().getOrCreateSubcontext(SOAP11Context.class).getEnvelope();
     }
 
     /** {@inheritDoc} */
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 605850a5f..a4a9af498 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
@@ -112,7 +112,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      * @param envelope the SOAP envelope
      */
     protected void storeSOAPEnvelope(final Envelope envelope) {
-        getMessageContext().getSubcontext(SOAP11Context.class, true).setEnvelope(envelope);
+        getMessageContext().getOrCreateSubcontext(SOAP11Context.class).setEnvelope(envelope);
     }
 
     /**
@@ -121,7 +121,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      * @return the previously stored SOAP envelope
      */
     protected Envelope getSOAPEnvelope() {
-        return getMessageContext().getSubcontext(SOAP11Context.class, true).getEnvelope();
+        return getMessageContext().getOrCreateSubcontext(SOAP11Context.class).getEnvelope();
     }
 
     /**
@@ -216,7 +216,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      */
     protected int getHTTPResponseStatusCode() {
         final Integer contextStatus =
-                getMessageContext().getSubcontext(SOAP11Context.class, true).getHTTPResponseStatus();
+                getMessageContext().getOrCreateSubcontext(SOAP11Context.class).getHTTPResponseStatus();
         if (contextStatus != null) {
             return contextStatus;
         }
@@ -235,7 +235,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
     
     /** {@inheritDoc} */
     protected XMLObject getMessageToLog() {
-        return getMessageContext().getSubcontext(SOAP11Context.class, true).getEnvelope();
+        return getMessageContext().getOrCreateSubcontext(SOAP11Context.class).getEnvelope();
     }
     
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/messaging/impl/SOAP11FaultContextDecoratingErrorHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/messaging/impl/SOAP11FaultContextDecoratingErrorHandler.java
index 066038887..334ab17de 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/messaging/impl/SOAP11FaultContextDecoratingErrorHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/messaging/impl/SOAP11FaultContextDecoratingErrorHandler.java
@@ -103,7 +103,7 @@ public class SOAP11FaultContextDecoratingErrorHandler implements TypedMessageErr
         SOAPMessagingSupport.registerSOAP11Fault(messageContext, fault);
         
         if (wsAddressingActionURI != null) {
-            messageContext.getSubcontext(WSAddressingContext.class, true).setFaultActionURI(wsAddressingActionURI);
+            messageContext.getOrCreateSubcontext(WSAddressingContext.class).setFaultActionURI(wsAddressingActionURI);
         }
         
         return true;
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java
index cc662a66c..ef7a5865b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java
@@ -89,7 +89,7 @@ public class AddMessageIDHandler extends AbstractHeaderGeneratingMessageHandler
      * @return the retrieved or generated message ID
      */
     @Nonnull protected String getMessageID(final MessageContext messageContext) {
-        final WSAddressingContext addressing = messageContext.getSubcontext(WSAddressingContext.class, false);
+        final WSAddressingContext addressing = messageContext.getSubcontext(WSAddressingContext.class);
         if (addressing != null && addressing.getMessageIDURI() != null) {
             return addressing.getMessageIDURI();
         } else if (getIdentifierGenerationStrategy() != null) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java
index daa1ac2bd..a828c6261 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java
@@ -93,7 +93,7 @@ public class AddRelatesToHandler extends AbstractHeaderGeneratingMessageHandler
             return false;
         }
         
-        final WSAddressingContext addressing = messageContext.getSubcontext(WSAddressingContext.class, false);
+        final WSAddressingContext addressing = messageContext.getSubcontext(WSAddressingContext.class);
         if (addressing != null) {
             relatesToURI = addressing.getRelatesToURI();
             if (relationshipType == null) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java
index 3e79258ec..507a84661 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java
@@ -52,7 +52,7 @@ public class ExtractMessageIDHandler extends AbstractMessageHandler {
         final String headerValue = header != null ? StringSupport.trimOrNull(header.getURI()) : null;
         log.debug("Extracted inbound WS-Addressing MessageID value: {}", headerValue);
         if (header != null && headerValue != null) {
-            messageContext.getSubcontext(WSAddressingContext.class, true).setMessageIDURI(headerValue);
+            messageContext.getOrCreateSubcontext(WSAddressingContext.class).setMessageIDURI(headerValue);
             SOAPMessagingSupport.registerUnderstoodHeader(messageContext, header);
         }
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java
index ea1f17aaa..832fc2eb4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java
@@ -79,7 +79,7 @@ public class ValidateActionHandler extends AbstractMessageHandler {
         }
         
         // A non-null subcontext value will override what is statically configured
-        final WSAddressingContext addressing = messageContext.getSubcontext(WSAddressingContext.class, false);
+        final WSAddressingContext addressing = messageContext.getSubcontext(WSAddressingContext.class);
         if (addressing != null && addressing.getActionURI() != null) {
             expectedActionURI = addressing.getActionURI();
         }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java
index 5b2b6c7d7..294452a96 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java
@@ -193,7 +193,7 @@ public class AddTimestampHandler extends AbstractHeaderGeneratingMessageHandler
      */
     @Nullable protected Instant getCreatedValue(@Nonnull final MessageContext messageContext) {
         Instant value = null;
-        final WSSecurityContext security = messageContext.getSubcontext(WSSecurityContext.class, false);
+        final WSSecurityContext security = messageContext.getSubcontext(WSSecurityContext.class);
         if (security != null) {
             value = security.getTimestampCreated();
         }
@@ -221,7 +221,7 @@ public class AddTimestampHandler extends AbstractHeaderGeneratingMessageHandler
     @Nullable protected Instant getExpiresValue(@Nonnull final MessageContext messageContext, 
             @Nullable final Instant created) {
         Instant value = null;
-        final WSSecurityContext security = messageContext.getSubcontext(WSSecurityContext.class, false);
+        final WSSecurityContext security = messageContext.getSubcontext(WSSecurityContext.class);
         if (security != null) {
             value = security.getTimestampExpires();
         }
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java
index 4708cb1dd..27acc51bd 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java
@@ -196,7 +196,7 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
         
         MessageContext messageContext = new MessageContext();
         messageContext.setMessage(payload);
-        messageContext.getSubcontext(SOAP11Context.class, true).setEnvelope(envelope);
+        messageContext.getOrCreateSubcontext(SOAP11Context.class).setEnvelope(envelope);
         
         MockHttpServletResponse response = new MockHttpServletResponse();
         
@@ -380,7 +380,7 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
         MessageContext messageContext = new MessageContext();
         messageContext.setMessage(payload);
         
-        messageContext.getSubcontext(SOAP11Context.class, true).setHTTPResponseStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+        messageContext.getOrCreateSubcontext(SOAP11Context.class).setHTTPResponseStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
         
         MockHttpServletResponse response = new MockHttpServletResponse();
         

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


More information about the commits mailing list