[java-plugin-shibd] branch main updated: Continued work on I/O model for flows.

Scott Cantor cantor.2 at osu.edu
Wed May 29 16:20:56 UTC 2024


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

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

View the commit online:
http://git.shibboleth.net/view/?p=java-plugin-shibd.git;a=commit;h=31fe360e0d5e768863e36f0483a789ed473a0b2d

The following commit(s) were added to refs/heads/main by this push:
     new 31fe360  Continued work on I/O model for flows.
31fe360 is described below

commit 31fe360e0d5e768863e36f0483a789ed473a0b2d
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed May 29 12:20:49 2024 -0400

    Continued work on I/O model for flows.
---
 .../idp/flows/sp/abstract/sp-abstract-beans.xml    |  16 ++-
 .../idp/flows/sp/abstract/sp-abstract-flow.xml     |  13 +-
 .../shibboleth/sp/context/AgentRequestContext.java | 110 ++++++++++++++++-
 .../sp/messaging/impl/DDFMessageDecoder.java       |  66 ----------
 .../sp/profile/impl/DecodeAgentRequest.java        | 135 +++++++++++++++++++++
 .../sp/profile/impl/EncodeAgentResponse.java       | 115 ++++++++++++++++++
 .../impl/InitializeOutboundMessageContext.java     |  54 ---------
 7 files changed, 372 insertions(+), 137 deletions(-)

diff --git a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-beans.xml b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-beans.xml
index ca93b24..ebb5805 100644
--- a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-beans.xml
+++ b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-beans.xml
@@ -62,16 +62,14 @@
     <bean id="DefaultCleanupHook"
         class="net.shibboleth.idp.authn.impl.ValidateCredentials.UsernamePasswordCleanupHook" />
 
-    <bean id="DecodeMessage" class="org.opensaml.profile.action.impl.DecodeMessage" scope="prototype"
-            p:messageType="net.shibboleth.sp.ddf.DDF">
-        <constructor-arg>
-            <bean class="net.shibboleth.sp.messaging.impl.DDFMessageDecoder" scope="prototype"
-                p:httpServletRequestSupplier-ref="shibboleth.HttpServletRequestSupplier" />
-        </constructor-arg>
-    </bean>
+    <bean id="DecodeAgentRequest" class="net.shibboleth.sp.profile.impl.DecodeAgentRequest" scope="prototype"
+        p:httpServletRequestSupplier-ref="shibboleth.HttpServletRequestSupplier" />
+        
+    <bean id="EncodeAgentResponse" class="net.shibboleth.sp.profile.impl.EncodeAgentResponse" scope="prototype"
+        p:httpServletResponseSupplier-ref="shibboleth.HttpServletResponseSupplier" />
 
-    <bean id="InitializeOutboundMessageContext"
-        class="net.shibboleth.sp.profile.impl.InitializeOutboundMessageContext" scope="prototype" />
+    <bean id="RecordResponseComplete" class="net.shibboleth.idp.profile.impl.RecordResponseComplete" scope="prototype" />
+        
 
     <!-- ======== Beans for agent authentication ======== -->
 
diff --git a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-flow.xml b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-flow.xml
index 11dbaf4..97610d2 100644
--- a/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-flow.xml
+++ b/sp-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/abstract/sp-abstract-flow.xml
@@ -22,13 +22,12 @@
         <evaluate expression="ValidateAgentCredentials" />
         <evaluate expression="'proceed'" />
         
-        <transition on="proceed" to="DecodeMessage" />
-        <transition on="BypassAuthentication" to="DecodeMessage" />
+        <transition on="proceed" to="DecodeAgentRequest" />
+        <transition on="BypassAuthentication" to="DecodeAgentRequest" />
     </action-state>
     
-    <action-state id="DecodeMessage">
-        <evaluate expression="DecodeMessage" />
-        <evaluate expression="InitializeOutboundMessageContext" />
+    <action-state id="DecodeAgentRequest">
+        <evaluate expression="DecodeAgentRequest" />
         <evaluate expression="'proceed'" />
 
         <transition on="proceed" to="DoOperation" />
@@ -48,8 +47,8 @@
 
     <!-- Pick back up with outbound side. -->
 
-    <action-state id="HandleOutboundMessage">
-        <evaluate expression="EncodeMessage" />
+    <action-state id="EncodeAgentResponse">
+        <evaluate expression="EncodeAgentResponse" />
         <evaluate expression="RecordResponseComplete" />
         <evaluate expression="'proceed'" />
         
diff --git a/sp-server-api/src/main/java/net/shibboleth/sp/context/AgentRequestContext.java b/sp-server-api/src/main/java/net/shibboleth/sp/context/AgentRequestContext.java
index fefe176..c799fb9 100644
--- a/sp-server-api/src/main/java/net/shibboleth/sp/context/AgentRequestContext.java
+++ b/sp-server-api/src/main/java/net/shibboleth/sp/context/AgentRequestContext.java
@@ -19,11 +19,18 @@ import javax.annotation.Nullable;
 
 import org.opensaml.messaging.context.BaseContext;
 
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import net.shibboleth.sp.Agent;
 import net.shibboleth.sp.Application;
+import net.shibboleth.sp.ddf.DDF;
 
 /**
- * General context for an agent request tracking basic information about the request.
+ * General context for an agent request tracking basic information about the request, the messages
+ * from and back to the agent, and wrapped servlet interfaces.
+ * 
+ * <p>This context leaves the real input and output message trees free for use by existing
+ * classes.</p>
  */
 public class AgentRequestContext extends BaseContext {
 
@@ -33,6 +40,18 @@ public class AgentRequestContext extends BaseContext {
     /** Application for which the request was made. */
     @Nullable private Application application;
     
+    /** Input message. */
+    @Nullable private DDF input;
+
+    /** Output message. */
+    @Nullable private DDF output;
+
+    /** Wrapped servlet request backed by input. */
+    @Nullable private HttpServletRequest wrappedHttpServletRequest;
+
+    /** Wrapped servlet response backed by output. */
+    @Nullable private HttpServletResponse wrappedHttpServletResponse;
+
     /**
      * Get the agent making the request.
      * 
@@ -74,5 +93,94 @@ public class AgentRequestContext extends BaseContext {
         application = app;
         return this;
     }
+
+    /**
+     * Get the input message from the agent.
+     * 
+     * @return input message
+     */
+    @Nullable public DDF getInput() {
+        return input;
+    }
+
+    /**
+     * Set the input message from the agent.
+     * 
+     * @param ddf input message
+     * 
+     * @return this context 
+     */
+    @Nonnull public AgentRequestContext setInput(@Nullable final DDF ddf) {
+        input = ddf;
+        
+        return this;
+    }
+
+    /**
+     * Get the output message for the agent.
+     * 
+     * @return output message
+     */
+    @Nullable public DDF getOutput() {
+        return output;
+    }
+
+    /**
+     * Set the output message for the agent.
+     * 
+     * @param ddf output message
+     * 
+     * @return this context 
+     */
+    @Nonnull public AgentRequestContext setOutput(@Nullable final DDF ddf) {
+        output = ddf;
+        
+        return this;
+    }
+
+    /**
+     * Get the wrapped servlet request backed by the input message.
+     * 
+     * @return wrapped servlet request
+     */
+    @Nullable public HttpServletRequest getWrappedHttpServletRequest() {
+        return wrappedHttpServletRequest;
+    }
+
+    /**
+     * Set the wrapped servlet request backed by the input message.
+     * 
+     * @param wrapped wrapped servlet request
+     * 
+     * @return this context
+     */
+    @Nonnull public AgentRequestContext setWrappedHttpServletRequest(@Nonnull final HttpServletRequest wrapped) {
+        wrappedHttpServletRequest = wrapped;
+        
+        return this;
+    }
+
+    /**
+     * Get the wrapped servlet response backed by the output message.
+     * 
+     * @return wrapped servlet response
+     */
+    @Nullable public HttpServletResponse getWrappedHttpServletResponse() {
+        return wrappedHttpServletResponse;
+    }
+
+    /**
+     * Set the wrapped servlet response backed by the output message.
+     * 
+     * @param wrapped wrapped servlet response
+     * 
+     * @return this context
+     */
+    @Nonnull public AgentRequestContext setWrappedHttpServletResponse(@Nonnull final HttpServletResponse wrapped) {
+        wrappedHttpServletResponse = wrapped;
+        
+        return this;
+    }
+
     
 }
\ No newline at end of file
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/messaging/impl/DDFMessageDecoder.java b/sp-server-impl/src/main/java/net/shibboleth/sp/messaging/impl/DDFMessageDecoder.java
deleted file mode 100644
index b4a4d7a..0000000
--- a/sp-server-impl/src/main/java/net/shibboleth/sp/messaging/impl/DDFMessageDecoder.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.shibboleth.sp.messaging.impl;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.opensaml.messaging.context.MessageContext;
-import org.opensaml.messaging.decoder.MessageDecoder;
-import org.opensaml.messaging.decoder.MessageDecodingException;
-import org.opensaml.messaging.decoder.servlet.AbstractHttpServletRequestMessageDecoder;
-
-import jakarta.servlet.http.HttpServletRequest;
-import net.shibboleth.sp.ddf.DDF;
-
-/**
- * {@link MessageDecoder} to process DDF request bodies in supported formats.
- * 
- * <p>The MIME type in the request is used to deermine what form of parsing and deserialization
- * to use.</p>
- * 
- * <p>The only supported type at present is a custom type representing a record-oriented
- * syntax.</p>
- */
-public class DDFMessageDecoder extends AbstractHttpServletRequestMessageDecoder {
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doDecode() throws MessageDecodingException {
-        
-        final HttpServletRequest request = getHttpServletRequest();
-        if (!"POST".equalsIgnoreCase(request.getMethod())) {
-            throw new MessageDecodingException("This message decoder only supports the HTTP POST method");
-        }
-
-        final String contentType = request.getContentType();
-        if (contentType == null) {
-            throw new MessageDecodingException("Content-Type header not present in request");
-        } else if (!contentType.equals("text/plain")) {
-            throw new MessageDecodingException("Content-Type was unsupported");
-        }
-
-        try (final InputStream in = request.getInputStream()) {
-            assert in != null;
-            final DDF msg = DDF.deserialize(in);
-            final MessageContext messageContext = new MessageContext();
-            messageContext.setMessage(msg);
-            setMessageContext(messageContext);
-        } catch (final IOException e) {
-            throw new MessageDecodingException("Unable to obtain input stream from HttpServletRequest", e);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/DecodeAgentRequest.java b/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/DecodeAgentRequest.java
new file mode 100644
index 0000000..4c6410a
--- /dev/null
+++ b/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/DecodeAgentRequest.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.sp.profile.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.function.Function;
+
+import javax.annotation.Nonnull;
+
+import org.opensaml.messaging.context.navigate.ChildContextLookup;
+import org.opensaml.profile.action.ActionSupport;
+import org.opensaml.profile.action.EventIds;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.slf4j.Logger;
+
+import jakarta.servlet.http.HttpServletRequest;
+import net.shibboleth.idp.profile.AbstractProfileAction;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
+import net.shibboleth.sp.context.AgentRequestContext;
+import net.shibboleth.sp.ddf.DDF;
+
+/**
+ * A profile action to decode an agent request and stash the resulting {@link DDF} in the
+ * {@link AgentRequestContext}.
+ * 
+ * <p>The MIME type in the request is used to deermine what form of parsing and deserialization
+ * to use. The only supported type at present is "text/plain" representing a record-oriented
+ * syntax.</p>
+ * 
+ * <p>An empty output message object is also created.</p>
+ * 
+ * @event {@link EventIds#PROCEED_EVENT_ID}
+ * @event {@link EventIds#INVALID_PROFILE_CTX}
+ * @event {@link EventIds#INVALID_MESSAGE}
+ * @post <pre>AgentRequestContext.getInput() != null</pre>
+ * @post <pre>AgentRequestContext.getOutput() != null</pre>
+ */
+public class DecodeAgentRequest extends AbstractProfileAction {
+
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(DecodeAgentRequest.class);
+    
+    /** Lookup strategy for {@link AgentRequestContext}. */
+    @Nonnull private Function<ProfileRequestContext,AgentRequestContext> agentRequestContextLookupStrategy;
+
+    /** Cached context to populate. */
+    @NonnullBeforeExec private AgentRequestContext agentRequestContext;
+    
+    /** Constructor. */
+    public DecodeAgentRequest() {
+        agentRequestContextLookupStrategy = new ChildContextLookup<>(AgentRequestContext.class);
+    }
+    
+    /**
+     * Sets the lookup strategy for the {@link AgentRequestContext}.
+     * 
+     * @param strategy lookup strategy
+     */
+    public void setAgentRequestContextLookupStrategy(
+            @Nonnull final Function<ProfileRequestContext,AgentRequestContext> strategy) {
+        checkSetterPreconditions();
+        
+        agentRequestContextLookupStrategy = Constraint.isNotNull(strategy,
+                "AgentRequestContext lookup strategy cannot be null");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
+        agentRequestContext = agentRequestContextLookupStrategy.apply(profileRequestContext);
+        if (agentRequestContext == null) {
+            log.error("{} No AgentRequestContext found", getLogPrefix());
+            ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_PROFILE_CTX);
+            return false;
+        }
+        
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        
+        final HttpServletRequest request = getHttpServletRequest();
+        if (request == null) {
+            log.error("{} No HttpServletRequest available", getLogPrefix());
+            ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_PROFILE_CTX);
+            return;
+        }
+        
+        if (!"POST".equalsIgnoreCase(request.getMethod())) {
+            log.warn("{} Invalid HTTP request method, only POST supported: ", getLogPrefix(), request.getMethod());
+            ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_MESSAGE);
+            return;
+        }
+
+        final String contentType = request.getContentType();
+        if (contentType == null || !contentType.equals("text/plain")) {
+            log.warn("{} Invalid HTTP content type, only text/plain supported: ", getLogPrefix(), contentType);
+            ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_MESSAGE);
+            return;
+        }
+
+        try (final InputStream in = request.getInputStream()) {
+            assert in != null;
+            final DDF msg = DDF.deserialize(in);
+            agentRequestContext.setInput(msg);
+            agentRequestContext.setOutput(new DDF());
+        } catch (final IOException e) {
+            log.warn("{} Unable to parse input message from HttpServletRequest", getLogPrefix(), e);
+            ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_MESSAGE);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/EncodeAgentResponse.java b/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/EncodeAgentResponse.java
new file mode 100644
index 0000000..dc29855
--- /dev/null
+++ b/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/EncodeAgentResponse.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.sp.profile.impl;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.function.Function;
+
+import javax.annotation.Nonnull;
+
+import org.opensaml.messaging.context.navigate.ChildContextLookup;
+import org.opensaml.profile.action.ActionSupport;
+import org.opensaml.profile.action.EventIds;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.slf4j.Logger;
+
+import jakarta.servlet.http.HttpServletResponse;
+import net.shibboleth.idp.profile.AbstractProfileAction;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
+import net.shibboleth.sp.context.AgentRequestContext;
+import net.shibboleth.sp.ddf.DDF;
+
+/**
+ * A profile action to encode an agent response from the output {@link DDF} in the
+ * {@link AgentRequestContext}.
+ * 
+ * @event {@link EventIds#PROCEED_EVENT_ID}
+ * @event {@link EventIds#INVALID_PROFILE_CTX}
+ * @event {@link EventIds#INVALID_MESSAGE}
+ * @event {@link EventIds#IO_ERROR}
+ * @pre <pre>AgentRequestContext.getOutput() != null</pre>
+ */
+public class EncodeAgentResponse extends AbstractProfileAction {
+
+    /** Class logger. */
+    @Nonnull private final Logger log = LoggerFactory.getLogger(EncodeAgentResponse.class);
+    
+    /** Lookup strategy for {@link AgentRequestContext}. */
+    @Nonnull private Function<ProfileRequestContext,AgentRequestContext> agentRequestContextLookupStrategy;
+
+    /** Cached context containing the output message. */
+    @NonnullBeforeExec private DDF outputMessage;
+    
+    /** Constructor. */
+    public EncodeAgentResponse() {
+        agentRequestContextLookupStrategy = new ChildContextLookup<>(AgentRequestContext.class);
+    }
+    
+    /**
+     * Sets the lookup strategy for the {@link AgentRequestContext}.
+     * 
+     * @param strategy lookup strategy
+     */
+    public void setAgentRequestContextLookupStrategy(
+            @Nonnull final Function<ProfileRequestContext,AgentRequestContext> strategy) {
+        checkSetterPreconditions();
+        
+        agentRequestContextLookupStrategy = Constraint.isNotNull(strategy,
+                "AgentRequestContext lookup strategy cannot be null");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
+        final AgentRequestContext agentRequestContext = agentRequestContextLookupStrategy.apply(profileRequestContext);
+        outputMessage = agentRequestContext != null ? agentRequestContext.getOutput() : null;
+        if (outputMessage == null) {
+            log.error("{} No output message found", getLogPrefix());
+            ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_MESSAGE);
+            return false;
+        }
+        
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        
+        final HttpServletResponse response = getHttpServletResponse();
+        if (response == null) {
+            log.error("{} No HttpServletResponse available", getLogPrefix());
+            ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_PROFILE_CTX);
+            return;
+        }
+
+        try (final OutputStream out = response.getOutputStream()) {
+            assert out != null;
+            outputMessage.serialize(out);
+        } catch (final IOException e) {
+            log.warn("{} Unable to serialize output message", getLogPrefix(), e);
+            ActionSupport.buildEvent(profileRequestContext, EventIds.IO_ERROR);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/InitializeOutboundMessageContext.java b/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/InitializeOutboundMessageContext.java
deleted file mode 100644
index fd815d9..0000000
--- a/sp-server-impl/src/main/java/net/shibboleth/sp/profile/impl/InitializeOutboundMessageContext.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.shibboleth.sp.profile.impl;
-
-import javax.annotation.Nonnull;
-
-import org.opensaml.messaging.context.MessageContext;
-import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
-import org.slf4j.Logger;
-
-import net.shibboleth.idp.profile.AbstractProfileAction;
-import net.shibboleth.shared.primitive.LoggerFactory;
-import net.shibboleth.sp.ddf.DDF;
-
-/**
- * Action that adds an outbound {@link MessageContext} and an empty {@link DDF} message to a
- * {@link ProfileRequestContext}.
- * 
- * @event {@link EventIds#PROCEED_EVENT_ID}
- * @post <pre>ProfileRequestContext.ensureOutboundMessageContext().getMessage() instanceof DDF</pre>
- */
-public class InitializeOutboundMessageContext extends AbstractProfileAction {
-
-    /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(InitializeOutboundMessageContext.class);
-
-    /** Constructor. */
-    public InitializeOutboundMessageContext() {
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
-
-        final MessageContext msgCtx = new MessageContext();
-        msgCtx.setMessage(new DDF());
-        profileRequestContext.setOutboundMessageContext(msgCtx);
-
-        log.debug("{} Initialized outbound message context", getLogPrefix());
-    }
-
-}
\ No newline at end of file

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


More information about the commits mailing list