[ 
https://issues.apache.org/jira/browse/DIRMINA-368?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Emmanuel Lecharny closed DIRMINA-368.
-------------------------------------


> IoFilter.messageSent should have access to WriteRequest instead of the 
> written message.
> ---------------------------------------------------------------------------------------
>
>                 Key: DIRMINA-368
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-368
>             Project: MINA
>          Issue Type: Improvement
>          Components: Core
>            Reporter: Trustin Lee
>            Assignee: Trustin Lee
>             Fix For: 2.0.0-M1
>
>
> IoFilter.filterWrite() accepts WriteRequest as its parameter to allow an 
> IoFilter implementation to alter the WriteRequest or create a new 
> WriteRequest.  This is particularly useful when the filter transforms a 
> received message.  Good examples of this scenario are ProtocolCodecFilter and 
> SSLFilter.
> Because these examples are wrapping an outgoing message with an internal 
> type, the filter implementor was able to get the original message by 
> unwrapping in IoFilter.messageSent() like the following:
>     public void filterWrite(NextFilter nextFilter, IoSession session, 
> WriteRequest req) {
>         nextFilter.filterWrite(session, new WriteRequest(new 
> TransformedMessage(req.getMessage())));
>     }
>     public void messageSent(NextFilter nextFilter, IoSession session, Object 
> message) {
>         if (message instanceof TransformedMessage) {
>             nextFilter.messageSent(session, ((TransformedMessage) 
> message).getOriginalMessage());
>             return;
>         }
>         ......
>     }
> But, what if the transformation is not wrapping but unwrapping?  We can't 
> perform the reverse-transformation like we did in the example above, because 
> we don't know what the original message was in IoFilter.messageSent().
>     public void filterWrite(NextFilter nextFilter, IoSession session, 
> WriteRequest req) {
>         nextFilter.filterWrite(session, new WriteRequest(
>                 ((OuterMessage) req.getMessage()).getInnerMessage()));  // 
> Unwrap on write.
>     }
>     public void messageSent(NextFilter nextFilter, IoSession session, Object 
> message) {
>         if (message instanceof InnerMessage) {
>             // TODO Transform the message back to OuterMessage.  But how?
>         }
>         ......
>     }
> To fix this problem, there should be at least one common type that any 
> IoFilter implementation can understand, and that type has to be the parameter 
> of IoFilter.messageSent().  A good candidate is WriteRequest, which is 
> already exposed in the IoFilter interface.  With this change applied, the 
> IoFilter implementation will look like the following:
>     public void filterWrite(NextFilter nextFilter, IoSession session, 
> WriteRequest req) {
>         // Wrap on write.
>         nextFilter.filterWrite(session, new TransformedWriteRequest(request));
>     }
>     public void messageSent(NextFilter nextFilter, IoSession session, 
> WriteRequest request) {
>         if (request instanceof TransformedWriteRequest) {
>             // Unwrap on messageSent.
>             nextFilter.messageSent(session, ((TransformedWriteRequest) 
> request).getWriteRequest());
>             return;
>         }
>         ......
>     }
>     private static class TransformedWriteRequest extends WriteRequestWrapper {
>         private TransformedWriteRequest(WriteRequest req) {
>             super(req);
>         }
>         public Object getMessage() {
>             // Wrapping with TransformedWriteRequest is actually unwrapping 
> the message.
>             // and unwrapping this write request is actually wrapping the 
> message back.
>             return ((OuterMessage) super.getMessage()).getInnerMessage();
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to