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 static final int DEFAULT_PREFIX_LENGTH = 4;
39
40
41 public static final int DEFAULT_MAX_DATA_LENGTH = 2048;
42
43 private final Charset charset;
44
45 private int prefixLength = DEFAULT_PREFIX_LENGTH;
46
47 private int maxDataLength = DEFAULT_MAX_DATA_LENGTH;
48
49
50
51
52
53
54
55
56 public PrefixedStringEncoder(Charset charset, int prefixLength, int maxDataLength) {
57 this.charset = charset;
58 this.prefixLength = prefixLength;
59 this.maxDataLength = maxDataLength;
60 }
61
62
63
64
65
66
67
68 public PrefixedStringEncoder(Charset charset, int prefixLength) {
69 this(charset, prefixLength, DEFAULT_MAX_DATA_LENGTH);
70 }
71
72
73
74
75
76
77 public PrefixedStringEncoder(Charset charset) {
78 this(charset, DEFAULT_PREFIX_LENGTH);
79 }
80
81
82
83
84 public PrefixedStringEncoder() {
85 this(Charset.defaultCharset());
86 }
87
88
89
90
91
92
93 public void setPrefixLength(int prefixLength) {
94 if (prefixLength != 1 && prefixLength != 2 && prefixLength != 4) {
95 throw new IllegalArgumentException("prefixLength: " + prefixLength);
96 }
97 this.prefixLength = prefixLength;
98 }
99
100
101
102
103
104
105 public int getPrefixLength() {
106 return prefixLength;
107 }
108
109
110
111
112
113
114
115
116
117
118
119
120 public void setMaxDataLength(int maxDataLength) {
121 this.maxDataLength = maxDataLength;
122 }
123
124
125
126
127
128
129 public int getMaxDataLength() {
130 return maxDataLength;
131 }
132
133
134
135
136 @Override
137 public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
138 String value = (String) message;
139 IoBuffer buffer = IoBuffer.allocate(value.length()).setAutoExpand(true);
140 buffer.putPrefixedString(value, prefixLength, charset.newEncoder());
141 if (buffer.position() > maxDataLength) {
142 throw new IllegalArgumentException("Data length: " + buffer.position());
143 }
144 buffer.flip();
145 out.write(buffer);
146 }
147 }