View Javadoc

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