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
37 public class PrefixedStringEncoder extends ProtocolEncoderAdapter {
38
39 public final static int DEFAULT_PREFIX_LENGTH = 4;
40
41 public final static 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 public PrefixedStringEncoder(Charset charset, int prefixLength, int maxDataLength) {
50 this.charset = charset;
51 this.prefixLength = prefixLength;
52 this.maxDataLength = maxDataLength;
53 }
54
55 public PrefixedStringEncoder(Charset charset, int prefixLength) {
56 this(charset, prefixLength, DEFAULT_MAX_DATA_LENGTH);
57 }
58
59 public PrefixedStringEncoder(Charset charset) {
60 this(charset, DEFAULT_PREFIX_LENGTH);
61 }
62
63 public PrefixedStringEncoder() {
64 this(Charset.defaultCharset());
65 }
66
67
68
69
70
71
72 public void setPrefixLength(int prefixLength) {
73 if (prefixLength != 1 && prefixLength != 2 && prefixLength != 4) {
74 throw new IllegalArgumentException("prefixLength: " + prefixLength);
75 }
76 this.prefixLength = prefixLength;
77 }
78
79
80
81
82
83
84 public int getPrefixLength() {
85 return prefixLength;
86 }
87
88
89
90
91
92
93
94
95
96
97
98
99 public void setMaxDataLength(int maxDataLength) {
100 this.maxDataLength = maxDataLength;
101 }
102
103
104
105
106
107
108 public int getMaxDataLength() {
109 return maxDataLength;
110 }
111
112
113 public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
114 String value = (String) message;
115 IoBuffer buffer = IoBuffer.allocate(value.length()).setAutoExpand(true);
116 buffer.putPrefixedString(value, prefixLength, charset.newEncoder());
117 if (buffer.position() > maxDataLength) {
118 throw new IllegalArgumentException("Data length: " + buffer.position());
119 }
120 buffer.flip();
121 out.write(buffer);
122 }
123 }