1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.filter.codec.prefixedstring;
21
22 import org.apache.mina.core.buffer.IoBuffer;
23 import org.apache.mina.core.session.IoSession;
24 import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
25 import org.apache.mina.filter.codec.ProtocolEncoderOutput;
26 import org.apache.mina.filter.codec.ProtocolEncoder;
27
28 import java.nio.charset.Charset;
29
30
31
32
33
34
35
36 public class PrefixedStringEncoder extends ProtocolEncoderAdapter {
37
38 public final static int DEFAULT_PREFIX_LENGTH = 4;
39
40 public final static int DEFAULT_MAX_DATA_LENGTH = 2048;
41
42 private final Charset charset;
43
44 private int prefixLength = DEFAULT_PREFIX_LENGTH;
45
46 private int maxDataLength = DEFAULT_MAX_DATA_LENGTH;
47
48 public PrefixedStringEncoder(Charset charset, int prefixLength, int maxDataLength) {
49 this.charset = charset;
50 this.prefixLength = prefixLength;
51 this.maxDataLength = maxDataLength;
52 }
53
54 public PrefixedStringEncoder(Charset charset, int prefixLength) {
55 this(charset, prefixLength, DEFAULT_MAX_DATA_LENGTH);
56 }
57
58 public PrefixedStringEncoder(Charset charset) {
59 this(charset, DEFAULT_PREFIX_LENGTH);
60 }
61
62 public PrefixedStringEncoder() {
63 this(Charset.defaultCharset());
64 }
65
66
67
68
69
70
71 public void setPrefixLength(int prefixLength) {
72 if (prefixLength != 1 && prefixLength != 2 && prefixLength != 4) {
73 throw new IllegalArgumentException("prefixLength: " + prefixLength);
74 }
75 this.prefixLength = prefixLength;
76 }
77
78
79
80
81
82
83 public int getPrefixLength() {
84 return prefixLength;
85 }
86
87
88
89
90
91
92
93
94
95
96
97
98 public void setMaxDataLength(int maxDataLength) {
99 this.maxDataLength = maxDataLength;
100 }
101
102
103
104
105
106
107 public int getMaxDataLength() {
108 return maxDataLength;
109 }
110
111
112 public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
113 String value = (String) message;
114 IoBuffer buffer = IoBuffer.allocate(value.length()).setAutoExpand(true);
115 buffer.putPrefixedString(value, prefixLength, charset.newEncoder());
116 if (buffer.position() > maxDataLength) {
117 throw new IllegalArgumentException("Data length: " + buffer.position());
118 }
119 buffer.flip();
120 out.write(buffer);
121 }
122 }