1 /***
2 *
3 * Copyright 2004 Protique Ltd
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18 package org.codehaus.activemq.message;
19
20 import java.io.ByteArrayOutputStream;
21 import java.io.DataOutput;
22 import java.io.DataOutputStream;
23 import java.io.IOException;
24 import java.io.ObjectOutputStream;
25 import java.util.Iterator;
26 import java.util.Set;
27 import org.codehaus.activemq.util.BitArray;
28
29 /***
30 * Allows instances implementing Packet interface to be serailized/deserailized
31 */
32 public abstract class AbstractPacketWriter implements PacketWriter {
33 /***
34 * simple helper method to ensure null strings are catered for
35 *
36 * @param str
37 * @param dataOut
38 * @throws IOException
39 */
40 protected void writeUTF(String str, DataOutput dataOut) throws IOException {
41 if (str == null) {
42 str = "";
43 }
44 dataOut.writeUTF(str);
45 }
46
47 /***
48 * @param packet
49 * @return true if this PacketWriter can write this type of Packet
50 */
51 public boolean canWrite(Packet packet) {
52 return packet.getPacketType() == this.getPacketType();
53 }
54
55 /***
56 * Simple (but inefficent) utility method to write an object on to a stream
57 *
58 * @param object
59 * @param dataOut
60 * @throws IOException
61 */
62 protected void writeObject(Object object, DataOutput dataOut) throws IOException {
63 if (object != null) {
64 ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
65 ObjectOutputStream objOut = new ObjectOutputStream(bytesOut);
66 objOut.writeObject(object);
67 objOut.flush();
68 byte[] data = bytesOut.toByteArray();
69 dataOut.writeInt(data.length);
70 dataOut.write(data);
71 }
72 else {
73 dataOut.writeInt(0);
74 }
75 }
76
77 /***
78 * Serializes a Packet int a byte array
79 *
80 * @param packet
81 * @return the byte[]
82 * @throws IOException
83 */
84 public byte[] writePacketToByteArray(Packet packet) throws IOException {
85 ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
86 DataOutputStream dataOut = new DataOutputStream(bytesOut);
87 writePacket(packet, dataOut);
88 dataOut.flush();
89 return bytesOut.toByteArray();
90 }
91
92 /***
93 * Write a Packet instance to data output stream
94 *
95 * @param p the instance to be seralized
96 * @param dataOut the output stream
97 * @throws IOException thrown if an error occurs
98 */
99 public void writePacket(Packet p, DataOutput dataOut) throws IOException {
100 AbstractPacket packet = (AbstractPacket)p;
101 writeUTF(packet.getId(), dataOut);
102 BitArray ba = packet.getBitArray();
103 ba.set(AbstractPacket.RECEIPT_REQUIRED_INDEX, packet.isReceiptRequired());
104 Object[] visited = packet.getBrokersVisited();
105 boolean writeVisited = visited != null && visited.length > 0;
106 ba.set(AbstractPacket.BROKERS_VISITED_INDEX,writeVisited);
107 ba.writeToStream(dataOut);
108 if (writeVisited){
109 dataOut.writeShort(visited.length);
110 for(int i =0; i < visited.length; i++){
111 dataOut.writeUTF(visited[i].toString());
112 }
113 }
114 }
115 }