You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Trustin Lee (JIRA)" <ji...@apache.org> on 2007/04/11 15:40:32 UTC
[jira] Resolved: (DIRMINA-368) IoFilter.messageSent should have
access to WriteRequest instead of the written message.
[ https://issues.apache.org/jira/browse/DIRMINA-368?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Trustin Lee resolved DIRMINA-368.
---------------------------------
Resolution: Fixed
The change has been checked in. DIRMINA-92 will be the first issue that utilizes this change.
> 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
> Assigned To: 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.