2 * Copyright (c) 2003 University of Murcia. All rights reserved.
\r
3 * --------------------------------------------------------------
\r
4 * For more information, please see <http://www.umu.euro6ix.org/>.
\r
7 package org.umu.cops.stack;
\r
9 import java.io.IOException;
\r
10 import java.io.OutputStream;
\r
11 import java.net.Socket;
\r
16 * @version COPSDecision.java, v 1.00 2003
\r
19 public class COPSDecision extends COPSObjBase {
\r
22 public final static byte DEC_DEF = 1;
\r
23 public final static byte DEC_STATELESS = 2;
\r
24 public final static byte DEC_REPL = 3;
\r
25 public final static byte DEC_CSI = 4;
\r
26 public final static byte DEC_NAMED = 5;
\r
29 public final static byte DEC_NULL = 0;
\r
30 public final static byte DEC_INSTALL = 1;
\r
31 public final static byte DEC_REMOVE = 2;
\r
34 public final static byte F_REQERROR = 0x1;
\r
35 public final static byte F_REQSTATE = 0x2;
\r
37 protected COPSObjHeader _objHdr;
\r
38 private COPSData _data;
\r
39 private short _cmdCode;
\r
40 private short _flags;
\r
41 private COPSData _padding;
\r
44 Constructor to create a Decision object. By default creates
\r
45 a decision object which is of fixed length.
\r
47 public COPSDecision(byte cType) {
\r
48 _objHdr = new COPSObjHeader();
\r
51 _objHdr.setCNum(COPSObjHeader.COPS_DEC);
\r
52 _objHdr.setCType(cType);
\r
53 if (cType == DEC_DEF) _objHdr.setDataLength( (short) 4);
\r
56 public COPSDecision() {
\r
57 _objHdr = new COPSObjHeader();
\r
60 _objHdr.setCNum(COPSObjHeader.COPS_DEC);
\r
61 _objHdr.setCType(DEC_DEF);
\r
62 _objHdr.setDataLength( (short) 4);
\r
66 Initialize the decision object with values from COPSObj header
\r
68 protected COPSDecision(byte[] dataPtr) {
\r
69 _objHdr = new COPSObjHeader();
\r
70 _objHdr.parse(dataPtr);
\r
71 // _objHdr.checkDataLength();
\r
75 if (_objHdr.getCType() == DEC_DEF) {
\r
76 _cmdCode |= ((short) dataPtr[4]) << 8;
\r
77 _cmdCode |= ((short) dataPtr[5]) & 0xFF;
\r
78 _flags |= ((short) dataPtr[6]) << 8;
\r
79 _flags |= ((short) dataPtr[7]) & 0xFF;
\r
81 _objHdr.setDataLength((short) 4);
\r
83 int dLen = _objHdr.getDataLength() - 4;
\r
84 COPSData d = new COPSData(dataPtr, 4, dLen);
\r
90 * Method getDataLength
\r
95 public short getDataLength() {
\r
97 if (_padding != null) lpadding = _padding.length();
\r
98 return ((short) (_objHdr.getDataLength() + lpadding));
\r
104 * Get the associated data if decision object is of cType 2 or higher
\r
106 * @return a COPSData
\r
109 public COPSData getData() {
\r
114 * Set the decision data if decision object is of cType 2 or higher
\r
116 * @param data a COPSData
\r
119 public void setData(COPSData data) {
\r
120 if (data.length() % 4 != 0) {
\r
121 int padLen = 4 - data.length() % 4;
\r
122 _padding = getPadding(padLen);
\r
125 _objHdr.setDataLength((short) data.length());
\r
129 * Retruns true if cType = 1
\r
131 * @return a boolean
\r
134 public boolean isFlagSet() {
\r
135 return ( _objHdr.getCType() == 1);
\r
139 * If cType == 1 , get the flags associated
\r
144 public short getFlags() {
\r
149 * If cType == 1 ,set the cmd code
\r
151 * @param cCode a byte
\r
154 public void setCmdCode(byte cCode) {
\r
155 _cmdCode = (short) cCode;
\r
159 * If cType == 1 ,set the cmd flags
\r
161 * @param flags a short
\r
164 public void setFlags(short flags) {
\r
169 * Method isNullDecision
\r
171 * @return a boolean
\r
174 public boolean isNullDecision() {
\r
175 return ( _cmdCode == 0);
\r
179 * Method isInstallDecision
\r
181 * @return a boolean
\r
184 public boolean isInstallDecision() {
\r
185 return ( _cmdCode == 1);
\r
189 * Method isRemoveDecision
\r
191 * @return a boolean
\r
194 public boolean isRemoveDecision() {
\r
195 return ( _cmdCode == 2);
\r
199 * Method getTypeStr
\r
204 public String getTypeStr() {
\r
205 switch (_objHdr.getCType()) {
\r
208 case DEC_STATELESS:
\r
209 return "Stateless data";
\r
211 return "Replacement data";
\r
213 return "Client specific decision data";
\r
215 return "Named decision data";
\r
222 * Method isDecision
\r
224 * @return a boolean
\r
227 public boolean isDecision() {
\r
232 * Method isLocalDecision
\r
234 * @return a boolean
\r
237 public boolean isLocalDecision() {
\r
242 * Writes data to a given network socket
\r
244 * @param id a Socket
\r
246 * @throws IOException
\r
249 public void writeData(Socket id) throws IOException {
\r
250 _objHdr.writeData(id);
\r
252 if (_objHdr.getCType() >= 2) {
\r
253 COPSUtil.writeData(id, _data.getData(), _data.length());
\r
254 if (_padding != null) {
\r
255 COPSUtil.writeData(id, _padding.getData(), _padding.length());
\r
258 byte[] buf = new byte[4];
\r
259 buf[0] = (byte) (_cmdCode >> 8);
\r
260 buf[1] = (byte) _cmdCode;
\r
261 buf[2] = (byte) (_flags >> 8);
\r
262 buf[3] = (byte) _flags;
\r
263 COPSUtil.writeData(id, buf, 4);
\r
268 * Write an object textual description in the output stream
\r
270 * @param os an OutputStream
\r
272 * @throws IOException
\r
275 public void dump(OutputStream os) throws IOException {
\r
278 if (_objHdr.getCType() == 1) {
\r
279 os.write(new String("Decision (" + getTypeStr() + ")\n").getBytes());
\r
280 os.write(new String("Command code: " + _cmdCode + "\n").getBytes());
\r
281 os.write(new String("Command flags: " + _flags + "\n").getBytes());
\r
283 os.write(new String("Decision (" + getTypeStr() + ")\n").getBytes());
\r
284 os.write(new String("Data: " + _data.str() + "\n").getBytes());
\r