On 1/27/07, Trustin Lee <[EMAIL PROTECTED]> wrote:

Hi Fernando,

On 1/25/07, Fernando C. de Castro <[EMAIL PROTECTED]> wrote:
>
>
> Hello,
>
>    I am trying to do something that I don't even know is possible. Can I
> change the codec "on the fly"?
>
>
> Let me try and explain what I'm doing so you guys can follow my
> thoughts.
>
> On my SessionHandler (extends IoHandlerAdapter) I add a Codec to the
> session as it's created:
>
> public void sessionCreated( IoSession session )
>     {
>
>
>              session.getFilterChain().clear();
>
>
>                 session.getFilterChain().addFirst  (
>                                 "idcodec",
>                                 new ProtocolCodecFilter(new
> IDprotocolCodecFactory()));
>
>     }
>
>
> OK, so it loads my IDprotocolCodecFactory which has one messageEncoder
> and one messageDecoder:
>
> public class IDprotocolCodecFactory extends DemuxingProtocolCodecFactory
> {
>         public IDprotocolCodecFactory () {
>                 super.register(IDmessageDecoder.class);
>                 super.register(IDmessageEncoder.class);
>         }
> }
>
>
> This messageDecoder waits for 2 bytes, analyses them then returns
> MessageDecoderResult.OK , and that fires the messageReceived() on my
> SessionHanlder. So far, working as expected.
>
> Then, I would like to change the Codec (e.g. the "identification stage"
> is over, now the server expects another kind of messages). So, on the
> messageReceived(), I try to change the codec:
>
>
>    public void messageReceived( IoSession session, Object message )
>     {
>
>         if (session.getFilterChain().contains("idcodec")){
>
>                         session.getFilterChain().remove("idcodec");
>                         session.getFilterChain().addFirst  (
>                                         "messagecodec",
>                                         new ProtocolCodecFilter(new
> MyMessageCodecFactory()));
>
>         }
>
>        else {
>
>        // after the "idcodec" was removed from the chain and
> "messagecodec" was placed instead,
>        // messageReceived() will be triggered by "messagecodec" and will
> always get to this 'else'.
>
>       // (or so I expect...)
>        }
>
>    }
>
> The MyMessageCodecFactory class is similar the presented
> IDprotocolCodecFactory (extends DemuxingProtocolCodecFactory )
>
>     Is it possible to change the codec like this? Because it's not
> working. It's like I'm stuck with "idcodec" forever, it never changes to
> "messagecodec".


You can if there's a contract between you and your remote peer that the
remote peer doesn't send any message while you switch your codec.  If not,
the idcodec can receive unwanted data, or data will be received when no
codec is in action.

You can work around this problem by creating a codec that delegates to the
two child codecs appropriately.  Of course, we will introduce an easier way
to replace the codec on the fly like this in 2.0:

session.getFilterChain ().replace("codec", newCodec);


I filed an issue for this problem:

https://issues.apache.org/jira/browse/DIRMINA-339

You can track it by 'watching' the issue.

Trustin
--
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP key fingerprints:
* E167 E6AF E73A CBCE EE41  4A29 544D DE48 FE95 4E7E
* B693 628E 6047 4F8F CFA4  455E 1C62 A7DC 0255 ECA6

Reply via email to