Merge "Remove "response" from yang."
[packetcable.git] / packetcable-driver / src / main / java / org / pcmm / gates / impl / PCMMGateReq.java
1 /**
2  @header@
3  */
4 package org.pcmm.gates.impl;
5
6 import org.pcmm.base.IPCMMBaseObject;
7 import org.pcmm.gates.*;
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10
11 import java.util.Arrays;
12
13 /**
14  * <p>
15  * <Gate-set>=<Decision Header><TransactionID><AMID> <SubscriberID> [<GateI>]
16  * <GateSpec> <Traffic Profile> <classifier>
17  * </p>
18  */
19 public class PCMMGateReq implements IPCMMGate {
20
21     public final static Logger logger = LoggerFactory.getLogger(PCMMGateReq.class);
22
23     private boolean multicast;
24     private IGateID gateID;
25     private IAMID iamid;
26     private IPCMMError error;
27     private ISubscriberID subscriberID;
28     private ITransactionID transactionID;
29     private IGateSpec gateSpec;
30     private ITrafficProfile trafficProfile;
31     private IClassifier classifier;
32
33     public PCMMGateReq() {
34     }
35
36     public PCMMGateReq(byte[] data) {
37         short len, offset;
38         byte sNum, sType;
39         len = offset = 0;
40         sNum = sType = (byte) 0;
41         while (offset + 5 < data.length) {
42             len = 0;
43             len |= ((short) data[offset]) << 8;
44             len |= ((short) data[offset + 1]) & 0xFF;
45             sNum = data[offset + 2];
46             sType = data[offset + 3];
47             byte[] dataBuffer = Arrays.copyOfRange(data, offset, offset + len);
48             switch (sNum) {
49             case IGateID.SNUM:
50                 setGateID(new GateID(dataBuffer));
51                 break;
52             case IAMID.SNUM:
53                 setAMID(new AMID(dataBuffer));
54                 break;
55             case ISubscriberID.SNUM:
56                 setSubscriberID(new SubscriberID(dataBuffer));
57                 break;
58             case ITransactionID.SNUM:
59                 setTransactionID(new TransactionID(dataBuffer));
60                 break;
61             case IGateSpec.SNUM:
62                 setGateSpec(new GateSpec(dataBuffer));
63                 break;
64             case ITrafficProfile.SNUM:
65                 // TODO - Will need to support other traffic profiles
66                 setTrafficProfile(new DOCSISServiceClassNameTrafficProfile(dataBuffer));
67                 break;
68             case IClassifier.SNUM:
69                 setClassifier(new Classifier(dataBuffer));
70                 break;
71             case IPCMMError.SNUM:
72                 error = new PCMMError(dataBuffer);
73                 break;
74             default:
75                 logger.warn("Unhandled Object skept : S-NUM=" + sNum
76                                    + "  S-TYPE=" + sType + "  LEN=" + len);
77             }
78             offset += len;
79         }
80     }
81
82     /*
83      * (non-Javadoc)
84      *
85      * @see org.pcmm.gates.IPCMMGate#isMulticast()
86      */
87     @Override
88     public boolean isMulticast() {
89         // TODO Auto-generated method stub
90         return multicast;
91     }
92
93     /*
94      * (non-Javadoc)
95      *
96      * @see org.pcmm.gates.IPCMMGate#setGateID(short)
97      */
98     @Override
99     public void setGateID(IGateID gateid) {
100         this.gateID = gateid;
101
102     }
103
104     /*
105      * (non-Javadoc)
106      *
107      * @see org.pcmm.gates.IPCMMGate#setAMID(org.pcmm.gates.IAMID)
108      */
109     @Override
110     public void setAMID(IAMID iamid) {
111         this.iamid = iamid;
112     }
113
114     /*
115      * (non-Javadoc)
116      *
117      * @see
118      * org.pcmm.gates.IPCMMGate#getSubscriberID(org.pcmm.gates.ISubscriberID)
119      */
120     @Override
121     public void setSubscriberID(ISubscriberID subscriberID) {
122         this.subscriberID = subscriberID;
123     }
124
125     /*
126      * (non-Javadoc)
127      *
128      * @see org.pcmm.gates.IPCMMGate#getGateSpec(org.pcmm.gates.IGateSpec)
129      */
130     @Override
131     public void setGateSpec(IGateSpec gateSpec) {
132         this.gateSpec = gateSpec;
133     }
134
135     /*
136      * (non-Javadoc)
137      *
138      * @see org.pcmm.gates.IPCMMGate#getClassifier(org.pcmm.gates.IClassifier)
139      */
140     @Override
141     public void setClassifier(IClassifier classifier) {
142         this.classifier = classifier;
143     }
144
145     /*
146      * (non-Javadoc)
147      *
148      * @see
149      * org.pcmm.gates.IPCMMGate#getTrafficProfile(org.pcmm.gates.ITrafficProfile
150      * )
151      */
152     @Override
153     public void setTrafficProfile(ITrafficProfile profile) {
154         this.trafficProfile = profile;
155     }
156
157     /*
158      * (non-Javadoc)
159      *
160      * @see org.pcmm.gates.IPCMMGate#getGateID()
161      */
162     @Override
163     public IGateID getGateID() {
164         return gateID;
165     }
166
167     /*
168      * (non-Javadoc)
169      *
170      * @see org.pcmm.gates.IPCMMGate#getAMID()
171      */
172     @Override
173     public IAMID getAMID() {
174         return iamid;
175     }
176
177     /*
178      * (non-Javadoc)
179      *
180      * @see org.pcmm.gates.IPCMMGate#getSubscriberID()
181      */
182     @Override
183     public ISubscriberID getSubscriberID() {
184         return subscriberID;
185     }
186
187     /*
188      * (non-Javadoc)
189      *
190      * @see org.pcmm.gates.IPCMMGate#getGateSpec()
191      */
192     @Override
193     public IGateSpec getGateSpec() {
194         return gateSpec;
195     }
196
197     /*
198      * (non-Javadoc)
199      *
200      * @see org.pcmm.gates.IPCMMGate#getClassifier()
201      */
202     @Override
203     public IClassifier getClassifier() {
204         return classifier;
205     }
206
207     /*
208      * (non-Javadoc)
209      *
210      * @see org.pcmm.gates.IPCMMGate#getTrafficProfile()
211      */
212     @Override
213     public ITrafficProfile getTrafficProfile() {
214         return trafficProfile;
215     }
216
217     @Override
218     public void setTransactionID(ITransactionID transactionID) {
219         this.transactionID = transactionID;
220     }
221
222     @Override
223     public ITransactionID getTransactionID() {
224         return transactionID;
225     }
226
227     public IPCMMError getError() {
228         return error;
229     }
230
231     public void setError(IPCMMError error) {
232         this.error = error;
233     }
234
235     @Override
236     public byte[] getData() {
237         byte[] array = new byte[0];
238         if (getTransactionID() != null) {
239             array = fill(array, getTransactionID());
240         }
241         if (getGateID() != null) {
242             array = fill(array, getGateID());
243         }
244         if (getAMID() != null) {
245             array = fill(array, getAMID());
246
247         }
248         if (getSubscriberID() != null) {
249             array = fill(array, getSubscriberID());
250         }
251         if (getGateSpec() != null) {
252             array = fill(array, getGateSpec());
253         }
254         if (getTrafficProfile() != null) {
255             array = fill(array, getTrafficProfile());
256         }
257         if (getClassifier() != null) {
258             array = fill(array, getClassifier());
259         }
260         return array;
261     }
262
263     private byte[] fill(byte[] array, IPCMMBaseObject obj) {
264         byte[] a = obj.getAsBinaryArray();
265         int offset = array.length;
266         array = Arrays.copyOf(array, offset + a.length);
267         System.arraycopy(a, 0, array, offset, a.length);
268         return array;
269     }
270 }