1 /*
2 * $HeadURL: /cvsroot/insight/Insight/remote-protocol/src/com/mindtree/insight/remoteprotocol/PacketDataSizeOverLimitsException.java,v $
3 * $Date: 2005/08/09 18:39:17 $
4 * $Revision: 1.1 $
5 * $Author: m1001025 $
6 *
7 * Copyright (c) 2005 MindTree Consulting Ltd.
8 *
9 * This file is part of Insight Remote Protocol Library.
10 *
11 * Insight Remote Protocol Library is free software: you can redistribute it
12 * and/or modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation, either version 3 of the License,
14 * or (at your option) any later version.
15 *
16 * Insight Remote Protocol Library is distributed in the hope that it will be
17 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
19 * Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * Insight Remote Protocol Library. If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 package com.mindtree.techworks.insight.remoteprotocol.spi;
26
27 import java.io.Serializable;
28
29 import com.mindtree.techworks.insight.remoteprotocol.PacketDataSizeOverLimitsException;
30 import com.mindtree.techworks.insight.remoteprotocol.RemoteProtocolException;
31
32
33 /**
34 * Abstract class representing the data content in the
35 * {@link com.mindtree.techworks.insight.remoteprotocol.spi.DataPacket DataPacket}. This
36 * class contains the <code>byte</code> representation of the data. Specific
37 * subclasses may provide methods to access the data in a friendlier way. Unless
38 * an object of this class is an instance of <code>NullMessageDataContent</code>,
39 * setting <code>null</code> data is not allowed.
40 *
41 * @see com.mindtree.techworks.insight.remoteprotocol.spi.DataPacket
42 * @see com.mindtree.techworks.insight.remoteprotocol.spi.PacketHeader
43 * @author <a href="mailto:bindul_bhowmik@mindtree.com">Bindul Bhowmik</a>
44 * @version $Revision: 1.2 $ $Date: 2005/08/09 18:39:16 $
45 */
46 public abstract class PacketDataContent implements Serializable {
47
48 /**
49 * SVUID for Object Serialization
50 */
51 private static final long serialVersionUID = 5823310926240802099L;
52
53 /**
54 * The maximum number of bytes a data packet can have. It is enforced by the
55 */
56 public static final int MAX_PACKET_DATA_SIZE = 5000;
57
58 // -------------------------------------------------------------------------
59 // Instance variables
60 // -------------------------------------------------------------------------
61
62 /**
63 * Packet Data without the header
64 */
65 protected byte [] packetData;
66
67 /**
68 * Identifies the type of this message packet.
69 */
70 protected MessageType messageType;
71
72 // -------------------------------------------------------------------------
73 // Constructors
74 // -------------------------------------------------------------------------
75
76 /**
77 * Creates an instance of PacketDataContent object
78 */
79 public PacketDataContent () {
80
81 // No Args constructor.
82 }
83
84 /**
85 * Creates an instance of PacketDataContent object.
86 * <p>
87 * The <code>byte []</code> passed in should be complete data for the
88 * packet including the header. The constructor will start reading data for
89 * this packet leaving the bytes required for the Header.
90 * </p>
91 * <p>
92 * <b>Note:</b> Using this constructor requires that certain fields
93 * regarding this packet be already set in the header. In particular the
94 * following fields in the header are used:
95 * <ul>
96 * <li>{@link PacketHeader#getDataLength() dataLength}</li>
97 * <li>{@link PacketHeader#getMessageType() messageType}</li>
98 * </ul>
99 * </p>
100 *
101 * @param completePacketData
102 * @param packetHeader
103 */
104 public PacketDataContent (byte [] completePacketData,
105 PacketHeader packetHeader) {
106
107 this.messageType = packetHeader.getMessageType ();
108 if (packetHeader.getDataLength () != 0) {
109 this.packetData = new byte [packetHeader.getDataLength ()];
110 System.arraycopy (completePacketData, packetHeader
111 .getPacketHeaderLength (), this.packetData, 0, packetHeader
112 .getDataLength ());
113 }
114 }
115
116 // -------------------------------------------------------------------------
117 // Accessors
118 // -------------------------------------------------------------------------
119
120 /**
121 * Returns the length of the data in the packet.
122 *
123 * @return the number of bytes in the data.
124 */
125 public int getLength () {
126
127 return null == this.packetData ? 0 : this.packetData.length;
128 }
129
130
131 /**
132 * Returns the messageType
133 *
134 * @return Returns the messageType.
135 */
136 public MessageType getMessageType () {
137
138 return messageType;
139 }
140
141
142 /**
143 * Sets the messageType field
144 *
145 * @param messageType
146 * The messageType to set.
147 */
148 public void setMessageType (MessageType messageType) {
149
150 this.messageType = messageType;
151 }
152
153
154 /**
155 * Returns the packetData. Although it would be more appropriate to use the
156 * specific methods in the subtype of this class to get the data in the
157 * correct format.
158 *
159 * @return Returns the packetData.
160 */
161 public byte [] getPacketData () {
162
163 return packetData;
164 }
165
166
167 /**
168 * Sets the packetData field
169 *
170 * @param packetData
171 * The packetData to set.
172 * @throws PacketDataSizeOverLimitsException
173 * This may be thrown if the packet data is over limit
174 * @throws RemoteProtocolException
175 * This may be thrown by a subclass overriding this method to
176 * indicate some invalid data.
177 */
178 public void setPacketData (byte [] packetData)
179 throws RemoteProtocolException {
180
181 if (null == packetData) {
182 throw new RemoteProtocolException ("Null data!");
183 }
184 checkPacketDataSize (packetData);
185 this.packetData = packetData;
186 }
187
188 // -------------------------------------------------------------------------
189 // Utility methods
190 // -------------------------------------------------------------------------
191
192 /**
193 * Checks the packet data size and ensures that this is less than
194 * {@link #MAX_PACKET_DATA_SIZE MAX_PACKET_DATA_SIZE}. This method is
195 * called before setting packet data. If subclasses override the
196 * <code>#setPacketData(byte[])</code> method, then they should call this
197 * method before setting the data.
198 *
199 * @param dataToSet
200 * Checks the data to set
201 * @throws PacketDataSizeOverLimitsException
202 * If the data size is over the allowed limit
203 */
204 protected void checkPacketDataSize (byte [] dataToSet)
205 throws PacketDataSizeOverLimitsException {
206
207 if (dataToSet.length > MAX_PACKET_DATA_SIZE) {
208 throw new PacketDataSizeOverLimitsException ("Allowed length: "
209 + MAX_PACKET_DATA_SIZE + ". Size of data sent in: "
210 + dataToSet.length);
211 }
212 }
213
214 }