KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > snmp4j > agent > agentx > AgentXPDU


1 /*_############################################################################
2   _##
3   _## SNMP4J-AgentX - AgentXPDU.java
4   _##
5   _## Copyright (C) 2005-2007 Frank Fock (SNMP4J.org)
6   _##
7   _## This program is free software; you can redistribute it and/or modify
8   _## it under the terms of the GNU General Public License version 2 as
9   _## published by the Free Software Foundation.
10   _##
11   _## This program is distributed in the hope that it will be useful,
12   _## but WITHOUT ANY WARRANTY; without even the implied warranty of
13   _## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   _## GNU General Public License for more details.
15   _##
16   _## You should have received a copy of the GNU General Public License
17   _## along with this program; if not, write to the Free Software
18   _## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19   _## MA 02110-1301 USA
20   _##
21   _##########################################################################*/

22
23 package org.snmp4j.agent.agentx;
24
25 import java.io.IOException JavaDoc;
26 import java.nio.ByteBuffer JavaDoc;
27 import java.nio.ByteOrder JavaDoc;
28 import org.snmp4j.log.LogFactory;
29 import org.snmp4j.log.LogAdapter;
30 import org.snmp4j.smi.OctetString;
31
32 public abstract class AgentXPDU {
33
34   private static final LogAdapter logger =
35       LogFactory.getLogger(AgentXPDU.class);
36
37   public static final byte RESERVED = (byte)0;
38
39   public static final byte AGENTX_OPEN_PDU = 1;
40   public static final byte AGENTX_CLOSE_PDU = 2;
41   public static final byte AGENTX_REGISTER_PDU = 3;
42   public static final byte AGENTX_UNREGISTER_PDU = 4;
43   public static final byte AGENTX_GET_PDU = 5;
44   public static final byte AGENTX_GETNEXT_PDU = 6;
45   public static final byte AGENTX_GETBULK_PDU = 7;
46   public static final byte AGENTX_TESTSET_PDU = 8;
47   public static final byte AGENTX_COMMITSET_PDU = 9;
48   public static final byte AGENTX_UNDOSET_PDU =10;
49   public static final byte AGENTX_CLEANUPSET_PDU =11;
50   public static final byte AGENTX_NOTIFY_PDU =12;
51   public static final byte AGENTX_PING_PDU =13;
52   public static final byte AGENTX_INDEXALLOCATE_PDU =14;
53   public static final byte AGENTX_INDEXDEALLOCATE_PDU =15;
54   public static final byte AGENTX_ADDAGENTCAPS_PDU =16;
55   public static final byte AGENTX_REMOVEAGENTCAPS_PDU =17;
56   public static final byte AGENTX_RESPONSE_PDU =18;
57
58   protected byte type;
59   protected byte version = AgentXProtocol.VERSION_1_0;
60   protected int sessionID;
61   protected int transactionID;
62   protected int packetID;
63   protected byte flags;
64   protected ByteOrder JavaDoc byteOrder;
65
66   protected AgentXPDU(byte type) {
67     this.type = type;
68   }
69
70   protected AgentXPDU(byte type, byte flags,
71                       int sessionID, int transactionID, int packetID) {
72     this.type = type;
73     this.flags = flags;
74     this.sessionID = sessionID;
75     this.transactionID = transactionID;
76     this.packetID = packetID;
77     byteOrder = isFlagSet(AgentXProtocol.FLAG_NETWORK_BYTE_ORDER) ?
78         ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;
79   }
80
81   protected AgentXPDU(AgentXMessageHeader header) {
82     this(header.getType(), header.getFlags(), header.getSessionID(),
83          header.getTransactionID(), header.getPacketID());
84   }
85
86   public final void addFlag(byte flag) {
87     this.flags |= flag;
88   }
89
90   public final boolean isFlagSet(int flag) {
91     return ((this.flags & flag) != 0);
92   }
93
94   public final byte getFlags() {
95     return flags;
96   }
97
98   public final int getPacketID() {
99     return packetID;
100   }
101
102   public final int getSessionID() {
103     return sessionID;
104   }
105
106   public final byte getType() {
107     return type;
108   }
109
110   public final byte getVersion() {
111     return version;
112   }
113
114   public final ByteOrder JavaDoc getByteOrder() {
115     return byteOrder;
116   }
117
118   public final int getTransactionID() {
119     return transactionID;
120   }
121
122   public void setFlags(byte flags) {
123     this.flags = flags;
124   }
125
126   public void setPacketID(int packetID) {
127     this.packetID = packetID;
128   }
129
130   public void setSessionID(int sessionID) {
131     this.sessionID = sessionID;
132   }
133
134   public void setType(byte type) {
135     this.type = type;
136   }
137
138   public void setVersion(byte version) {
139     this.version = version;
140   }
141
142   public void setByteOrder(ByteOrder JavaDoc byteOrder) {
143     this.byteOrder = byteOrder;
144   }
145
146   public void setTransactionID(int transactionID) {
147     this.transactionID = transactionID;
148   }
149
150   public void setSessionAttributes(AgentXSession session) {
151     setSessionID(session.getSessionID());
152     setByteOrder(session.getByteOrder());
153   }
154
155   protected abstract void encodePayload(ByteBuffer JavaDoc buf);
156
157   public abstract int getPayloadLength();
158
159   public final void encode(ByteBuffer JavaDoc buf) {
160     beforeEncode();
161     buf.put(version);
162     buf.put(type);
163     if (byteOrder == null) {
164       byteOrder = ByteOrder.nativeOrder();
165     }
166     if (byteOrder == ByteOrder.BIG_ENDIAN) {
167       flags |= AgentXProtocol.FLAG_NETWORK_BYTE_ORDER;
168     }
169     else {
170       flags &= ~AgentXProtocol.FLAG_NETWORK_BYTE_ORDER;
171     }
172     buf.order(byteOrder);
173     buf.put(flags);
174     buf.put(RESERVED);
175     buf.putInt(sessionID);
176     buf.putInt(transactionID);
177     buf.putInt(packetID);
178     buf.putInt(getPayloadLength());
179     encodePayload(buf);
180   }
181
182   /**
183    * Initialize flags and other things before a PDU is encoded.
184    */

185   protected abstract void beforeEncode();
186
187   public abstract void decodePayload(ByteBuffer JavaDoc buf, int length)
188       throws IOException JavaDoc;
189
190   public static AgentXPDU decode(ByteBuffer JavaDoc buf) throws IOException JavaDoc {
191     AgentXMessageHeader header = AgentXProtocol.decodeHeader(buf);
192     if (buf.remaining() < header.getPayloadLength()) {
193       throw new IOException JavaDoc("Short AgentX PDU with payload length="+
194                             header.getPayloadLength()+"<"+
195                             buf.remaining()+" remaining length");
196     }
197     try {
198       AgentXPDU pdu = createAgentXPDU(header);
199       pdu.decodePayload(buf, header.getPayloadLength());
200       return pdu;
201     }
202     catch (IOException JavaDoc iox) {
203       logger.warn("IO Exception while parsing AgentX PDU with header "+header+
204                   ", exception is: "+iox.getMessage());
205       throw new AgentXParseException(header, iox);
206     }
207   }
208
209   private static AgentXPDU createAgentXPDU(AgentXMessageHeader header) {
210     AgentXPDU pdu = null;
211     switch (header.getType()) {
212       case AGENTX_OPEN_PDU: {
213         pdu = new AgentXOpenPDU(header);
214         break;
215       }
216       case AGENTX_CLOSE_PDU: {
217         pdu = new AgentXClosePDU(header);
218         break;
219       }
220       case AGENTX_RESPONSE_PDU: {
221         pdu = new AgentXResponsePDU(header);
222         break;
223       }
224       case AGENTX_ADDAGENTCAPS_PDU: {
225         pdu = new AgentXAddAgentCapsPDU(header);
226         break;
227       }
228       case AGENTX_CLEANUPSET_PDU: {
229         pdu = new AgentXCleanupSetPDU(header);
230         break;
231       }
232       case AGENTX_COMMITSET_PDU: {
233         pdu = new AgentXCommitSetPDU(header);
234         break;
235       }
236       case AGENTX_GET_PDU: {
237         pdu = new AgentXGetPDU(header);
238         break;
239       }
240       case AGENTX_GETBULK_PDU: {
241         pdu = new AgentXGetBulkPDU(header);
242         break;
243       }
244       case AGENTX_GETNEXT_PDU: {
245         pdu = new AgentXGetNextPDU(header);
246         break;
247       }
248       case AGENTX_INDEXALLOCATE_PDU: {
249         pdu = new AgentXIndexAllocatePDU(header);
250         break;
251       }
252       case AGENTX_INDEXDEALLOCATE_PDU: {
253         pdu = new AgentXIndexDeallocatePDU(header);
254         break;
255       }
256       case AGENTX_NOTIFY_PDU: {
257         pdu = new AgentXNotifyPDU(header);
258         break;
259       }
260       case AGENTX_PING_PDU: {
261         pdu = new AgentXPingPDU(header);
262         break;
263       }
264       case AGENTX_REGISTER_PDU: {
265         pdu = new AgentXRegisterPDU(header);
266         break;
267       }
268       case AGENTX_REMOVEAGENTCAPS_PDU: {
269         pdu = new AgentXRemoveAgentCapsPDU(header);
270         break;
271       }
272       case AGENTX_TESTSET_PDU: {
273         pdu = new AgentXTestSetPDU(header);
274         break;
275       }
276       case AGENTX_UNDOSET_PDU: {
277         pdu = new AgentXUndoSetPDU(header);
278         break;
279       }
280       case AGENTX_UNREGISTER_PDU: {
281         pdu = new AgentXUnregisterPDU(header);
282         break;
283       }
284       default:
285         break;
286     }
287     return pdu;
288   }
289
290   public final boolean isConfirmedPDU() {
291     if (getType() == AGENTX_RESPONSE_PDU) {
292         return false;
293     }
294     return true;
295   }
296
297   protected String JavaDoc toStringExtMembers() {
298     return "";
299   }
300
301   public String JavaDoc toString() {
302     return getClass().getName()+"[type="+type+",version="+version+
303         ",sessionID="+sessionID+",transactionID="+transactionID+
304         ",packetID="+packetID+",byteOrder="+byteOrder+toStringExtMembers()+"]";
305   }
306
307   public static void main(String JavaDoc[] args) {
308     OctetString s = OctetString.fromHexString(args[0]);
309     ByteBuffer JavaDoc buf = ByteBuffer.wrap(s.toByteArray());
310     try {
311       AgentXPDU pdu = AgentXPDU.decode(buf);
312       System.out.println(pdu.toString());
313     }
314     catch (IOException JavaDoc ex) {
315       ex.printStackTrace();
316     }
317   }
318 }
319
Popular Tags