netty/netty — Issue #113: DefaultChannelPipeline.replace() does not correctly replace a ChannelHandler if name is preserved
Author: chavdar
Created: 2011-12-10 22:53:17+00:00
State: open

If one tries to replace a handler in the middle of a pipeline preserving handler's name, the current implementation does not work completely correctly. The handler object is replaced in the pipeline, but calls to get() return the old handler object.

The following test cases demonstrates the behavior:

```java
package org.jboss.netty.channel;

import static org.junit.Assert.*;

import org.junit.Test;

public class TestDefaultChannelPipeline {
@Test
public void testReplaceChannelHandler() {
DefaultChannelPipeline pipeline = new DefaultChannelPipeline();

SimpleChannelHandler handler1 = new SimpleChannelHandler();
pipeline.addLast("handler1", handler1);
pipeline.addLast("handler2", handler1);
pipeline.addLast("handler3", handler1);
assertTrue(pipeline.get("handler1") == handler1);
assertTrue(pipeline.get("handler2") == handler1);
assertTrue(pipeline.get("handler3") == handler1);

SimpleChannelHandler newHandler1 = new SimpleChannelHandler();
pipeline.replace("handler1", "handler1", newHandler1);
assertTrue(pipeline.get("handler1") == newHandler1);

SimpleChannelHandler newHandler3 = new SimpleChannelHandler();
pipeline.replace("handler3", "handler3", newHandler3);
assertTrue(pipeline.get("handler3") == newHandler3);

SimpleChannelHandler newHandler2 = new SimpleChannelHandler();
pipeline.replace("handler2", "handler2", newHandler2);
assertTrue(pipeline.get("handler2") == newHandler2);
}
}
```

The last assert fails. The above behavior has been verified against the latest code in the 3.2 branch.