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
19 package org.codehaus.activemq.message;
20
21 import java.io.ByteArrayInputStream;
22 import java.io.DataInput;
23 import java.io.DataInputStream;
24 import java.io.IOException;
25 import java.io.ObjectInputStream;
26
27 /***
28 * Allows instances implementing Packet interface to be deserailized
29 *
30 * @version $Revision: 1.6 $
31 */
32 public abstract class AbstractPacketReader implements PacketReader {
33
34 /***
35 * @param packetType
36 * @return true if this PacketReader can a Packet of this type
37 */
38 public boolean canRead(int packetType) {
39 return this.getPacketType() == packetType;
40 }
41
42 /***
43 * pointless method - but mirrors writer
44 *
45 * @param dataIn
46 * @return the String
47 * @throws IOException
48 */
49 protected String readUTF(DataInput dataIn) throws IOException {
50 return dataIn.readUTF();
51 }
52
53
54 /***
55 * ;
56 *
57 * @param dataIn
58 * @return object
59 * @throws IOException
60 */
61 protected Object readObject(DataInput dataIn) throws IOException {
62 int dataLength = dataIn.readInt();
63 if (dataLength > 0) {
64 byte[] data = new byte[dataLength];
65 dataIn.readFully(data);
66 ByteArrayInputStream bytesIn = new ByteArrayInputStream(data);
67 ObjectInputStream objIn = new ObjectInputStream(bytesIn);
68 try {
69 return objIn.readObject();
70 }
71 catch (ClassNotFoundException ex) {
72 throw new IOException(ex.getMessage());
73 }
74 }
75 return null;
76 }
77
78 /***
79 * build a Packet instance from the data input stream
80 *
81 * @param packet A Packet object
82 * @param dataIn the data input stream to build the packet from
83 * @throws IOException
84 */
85 public void buildPacket(Packet packet, DataInput dataIn) throws IOException {
86 packet.setId(readUTF(dataIn));
87 packet.setReceiptRequired(dataIn.readBoolean());
88 }
89
90 /***
91 * Deserailizes a Packet from a byte array
92 *
93 * @param data
94 * @return the deserialized Packet
95 * @throws IOException
96 */
97 public Packet readPacketFromByteArray(byte[] data) throws IOException {
98 ByteArrayInputStream bytesIn = new ByteArrayInputStream(data);
99 DataInputStream dataIn = new DataInputStream(bytesIn);
100 Packet packet = createPacket();
101 buildPacket(packet, dataIn);
102 return packet;
103 }
104 }