1   package testcase;
2   
3   import org.apache.mina.core.buffer.IoBuffer;
4   import org.apache.mina.core.session.IoSession;
5   import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
6   import org.apache.mina.filter.codec.ProtocolDecoderOutput;
7   import org.slf4j.Logger;
8   import org.slf4j.LoggerFactory;
9   import static testcase.MinaRegressionTest.MSG_SIZE;
10  import static testcase.MinaRegressionTest.OPEN;
11  
12  public class MyRequestDecoder extends CumulativeProtocolDecoder {
13    private static final Logger logger = LoggerFactory.getLogger(MyRequestDecoder.class);
14  
15    @Override
16    protected boolean doDecode(final IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
17      if (!session.containsAttribute(OPEN)) {
18        logger.error("!decoding for closed session {}", session.getId());
19      }
20  
21      new Thread(new Runnable() {
22        public void run() {
23          try {
24              logger.debug( "Sleep for 500 ms for session {}", session.getId() );
25              Thread.sleep(500);
26              logger.debug( "Wake up now from a 500 ms sleep for session {}", session.getId() );
27          } catch (InterruptedException ignore) {}
28          session.close(true);
29        }
30      }).start();
31  
32      // sleep so that session.close(true) is already called when decoding continues
33      logger.debug( "Sleep for 1000 ms for session {}", session.getId() );
34      Thread.sleep(1000);
35      logger.debug( "Wake up now from a 1000 ms sleep for session {}", session.getId() );
36  
37      if (!session.containsAttribute(OPEN)) {
38        logger.error("!session {} closed before decoding completes!", session.getId());
39        int i = 0;
40        
41        try
42        {
43            int j = 2 / i;
44        } 
45        catch ( Exception e )
46        {
47            //e.printStackTrace();
48        }
49      }
50  
51      // no full message
52      if (in.remaining() < MSG_SIZE) return false;
53  
54      logger.info("Done decoding for session {}", session.getId());
55  
56      if (in.hasRemaining() && !session.isClosing() && session.isConnected()) {
57        IoBuffer tmp = IoBuffer.allocate(in.remaining());
58        tmp.put(in);
59        tmp.flip();
60        out.write(tmp);
61        return true;
62      }
63  
64      return false;
65    }
66  }