1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.example.sumup.codec;
21
22 import org.apache.mina.core.buffer.IoBuffer;
23 import org.apache.mina.core.session.IoSession;
24 import org.apache.mina.example.sumup.message.AbstractMessage;
25 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
26 import org.apache.mina.filter.codec.demux.MessageDecoder;
27 import org.apache.mina.filter.codec.demux.MessageDecoderResult;
28
29
30
31
32
33
34
35 public abstract class AbstractMessageDecoder implements MessageDecoder {
36 private final int type;
37
38 private int sequence;
39
40 private boolean readHeader;
41
42 protected AbstractMessageDecoder(int type) {
43 this.type = type;
44 }
45
46 public MessageDecoderResult decodable(IoSession session, IoBuffer in) {
47
48 if (in.remaining() < Constants.HEADER_LEN) {
49 return MessageDecoderResult.NEED_DATA;
50 }
51
52
53 if (type == in.getShort()) {
54 return MessageDecoderResult.OK;
55 }
56
57
58 return MessageDecoderResult.NOT_OK;
59 }
60
61 public MessageDecoderResult decode(IoSession session, IoBuffer in,
62 ProtocolDecoderOutput out) throws Exception {
63
64 if (!readHeader) {
65 in.getShort();
66 sequence = in.getInt();
67 readHeader = true;
68 }
69
70
71 AbstractMessage m = decodeBody(session, in);
72
73 if (m == null) {
74 return MessageDecoderResult.NEED_DATA;
75 } else {
76 readHeader = false;
77 }
78 m.setSequence(sequence);
79 out.write(m);
80
81 return MessageDecoderResult.OK;
82 }
83
84
85
86
87 protected abstract AbstractMessage decodeBody(IoSession session,
88 IoBuffer in);
89 }