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;
21
22 import java.util.Queue;
23
24 import org.apache.mina.core.buffer.IoBuffer;
25 import org.apache.mina.util.CircularQueue;
26
27
28
29
30
31
32
33 public abstract class AbstractProtocolEncoderOutput implements
34 ProtocolEncoderOutput {
35 private final Queue<Object> messageQueue = new CircularQueue<Object>();
36 private boolean buffersOnly = true;
37
38 public AbstractProtocolEncoderOutput() {
39 }
40
41 public Queue<Object> getMessageQueue() {
42 return messageQueue;
43 }
44
45 public void write(Object encodedMessage) {
46 if (encodedMessage instanceof IoBuffer) {
47 IoBuffer buf = (IoBuffer) encodedMessage;
48 if (buf.hasRemaining()) {
49 messageQueue.offer(buf);
50 } else {
51 throw new IllegalArgumentException(
52 "buf is empty. Forgot to call flip()?");
53 }
54 } else {
55 messageQueue.offer(encodedMessage);
56 buffersOnly = false;
57 }
58 }
59
60 public void mergeAll() {
61 if (!buffersOnly) {
62 throw new IllegalStateException(
63 "the encoded message list contains a non-buffer.");
64 }
65
66 final int size = messageQueue.size();
67
68 if (size < 2) {
69
70 return;
71 }
72
73
74 int sum = 0;
75 for (Object b : messageQueue) {
76 sum += ((IoBuffer) b).remaining();
77 }
78
79
80 IoBuffer newBuf = IoBuffer.allocate(sum);
81
82
83 for (; ;) {
84 IoBuffer buf = (IoBuffer) messageQueue.poll();
85 if (buf == null) {
86 break;
87 }
88
89 newBuf.put(buf);
90 }
91
92
93 newBuf.flip();
94 messageQueue.add(newBuf);
95 }
96 }