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
36 public abstract class AbstractMessageDecoder implements MessageDecoder {
37 private final int type;
38
39 private int sequence;
40
41 private boolean readHeader;
42
43 protected AbstractMessageDecoder(int type) {
44 this.type = type;
45 }
46
47 public MessageDecoderResult decodable(IoSession session, IoBuffer in) {
48
49 if (in.remaining() < Constants.HEADER_LEN) {
50 return MessageDecoderResult.NEED_DATA;
51 }
52
53
54 if (type == in.getShort()) {
55 return MessageDecoderResult.OK;
56 }
57
58
59 return MessageDecoderResult.NOT_OK;
60 }
61
62 public MessageDecoderResult decode(IoSession session, IoBuffer in,
63 ProtocolDecoderOutput out) throws Exception {
64
65 if (!readHeader) {
66 in.getShort();
67 sequence = in.getInt();
68 readHeader = true;
69 }
70
71
72 AbstractMessage m = decodeBody(session, in);
73
74 if (m == null) {
75 return MessageDecoderResult.NEED_DATA;
76 } else {
77 readHeader = false;
78 }
79 m.setSequence(sequence);
80 out.write(m);
81
82 return MessageDecoderResult.OK;
83 }
84
85
86
87
88 protected abstract AbstractMessage decodeBody(IoSession session,
89 IoBuffer in);
90 }