2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.protocol.pcep.object;
10 import java.util.Collections;
11 import java.util.List;
13 import org.opendaylight.protocol.pcep.PCEPObject;
14 import org.opendaylight.protocol.pcep.PCEPTlv;
15 import org.opendaylight.protocol.pcep.tlv.OrderTlv;
16 import com.google.common.base.Objects.ToStringHelper;
19 * Structure of PCEP Requested Parameter Object.
21 * @see <a href="http://tools.ietf.org/html/rfc5440#section-7.4">PCEP Request
22 * Parameter Object [RFC5440]</a>
23 * @see <a href="http://tools.ietf.org/html/rfc5541#section-6.2.4">RP Object
25 * @see <a href="http://tools.ietf.org/html/rfc6006#section-3.3.1">The Extension
26 * of the RP Object [RFC6006]</a>
28 public class PCEPRequestParameterObject extends PCEPObject {
30 private final boolean loose;
32 private final boolean bidirectional;
34 private final boolean reoptimized;
36 private final boolean makeBeforeBreak;
38 private final boolean reportRequestOrder;
40 private final boolean suplyOFOnResponse;
45 private final boolean fragmentation;
47 private final boolean p2mp;
49 private final boolean eroCompression;
53 private final short priority;
55 private final long requestID;
57 private final List<PCEPTlv> tlvs;
60 * Constructs PCEP Requested Parameter Object only with mandatory values.
64 * @param bidirectional
68 * @param makeBeforeBreak
70 * @param suplyOFOnResponse
81 public PCEPRequestParameterObject(boolean loose, boolean bidirectional, boolean reoptimized, boolean makeBeforeBreak, boolean suplyOFOnResponse,
82 boolean fragmentation, boolean p2mp, boolean eroCompression, short priority, long requestID, boolean processed, boolean ignored) {
83 this(loose, bidirectional, reoptimized, makeBeforeBreak, false, suplyOFOnResponse, fragmentation, p2mp, eroCompression, priority, requestID, null,
88 * Constructs PCEP Requested Parameter Object also with optional Objects.
92 * @param bidirectional
96 * @param makeBeforeBreak
98 * @param reportRequestOrder
100 * @param suplyOFOnResponse
113 public PCEPRequestParameterObject(boolean loose, boolean bidirectional, boolean reoptimized, boolean makeBeforeBreak, boolean reportRequestOrder,
114 boolean suplyOFOnResponse, boolean fragmentation, boolean p2mp, boolean eroCompression, short priority, long requestID, List<PCEPTlv> tlvs,
115 boolean processed, boolean ignored) {
116 super(processed, ignored);
118 this.bidirectional = bidirectional;
119 this.reoptimized = reoptimized;
120 this.makeBeforeBreak = makeBeforeBreak;
121 this.reportRequestOrder = reportRequestOrder;
122 this.suplyOFOnResponse = suplyOFOnResponse;
123 this.fragmentation = fragmentation;
125 this.eroCompression = eroCompression;
127 this.priority = priority;
128 this.requestID = requestID;
132 this.tlvs = Collections.emptyList();
134 if (makeBeforeBreak && !reoptimized)
135 throw new IllegalArgumentException("M (make-before-break) can be set only if R (reoptimied) flag is set too.");
137 if (reportRequestOrder && !this.validateOrderTlv())
138 throw new IllegalArgumentException("D (report request order) flag is set, but missing OrderTlv.");
146 public boolean isLoose() {
151 * Gets Bidirectional flag.
155 public boolean isBidirectional() {
156 return this.bidirectional;
160 * Gets Reoptimization flag.
164 public boolean isReoptimized() {
165 return this.reoptimized;
169 * Gets make-before-break flag
173 public boolean isMakeBeforeBreak() {
174 return this.makeBeforeBreak;
178 * Gets report requested order flag
182 public boolean isReportRequestOrder() {
183 return this.reportRequestOrder;
187 * Gets report supply objective function on response flag
191 public boolean isSuplyOFOnResponse() {
192 return this.suplyOFOnResponse;
196 * @return the fragmentation
198 public boolean isFragmentation() {
199 return this.fragmentation;
205 public boolean isP2mp() {
210 * @return the eroCompression
212 public boolean isEroCompression() {
213 return this.eroCompression;
217 * Returns short representation of Priority.
221 public short getPriority() {
222 return this.priority;
226 * Returns long representation of Requested ID.
230 public long getRequestID() {
231 return this.requestID;
235 * Gets list of {@link PCEPTlv}
237 * @return List<PCEPTlv>. Can't be null, but may be empty.
239 public List<PCEPTlv> getTlvs() {
243 private boolean validateOrderTlv() {
244 for (final PCEPTlv tlv : this.tlvs) {
245 if (tlv instanceof OrderTlv)
253 public int hashCode() {
254 final int prime = 31;
255 int result = super.hashCode();
256 result = prime * result + (this.bidirectional ? 1231 : 1237);
257 result = prime * result + (this.eroCompression ? 1231 : 1237);
258 result = prime * result + (this.fragmentation ? 1231 : 1237);
259 result = prime * result + (this.loose ? 1231 : 1237);
260 result = prime * result + (this.makeBeforeBreak ? 1231 : 1237);
261 result = prime * result + (this.p2mp ? 1231 : 1237);
262 result = prime * result + this.priority;
263 result = prime * result + (this.reoptimized ? 1231 : 1237);
264 result = prime * result + (this.reportRequestOrder ? 1231 : 1237);
265 result = prime * result + (int) (this.requestID ^ (this.requestID >>> 32));
266 result = prime * result + (this.suplyOFOnResponse ? 1231 : 1237);
267 result = prime * result + ((this.tlvs == null) ? 0 : this.tlvs.hashCode());
272 public boolean equals(Object obj) {
275 if (!super.equals(obj))
277 if (this.getClass() != obj.getClass())
279 final PCEPRequestParameterObject other = (PCEPRequestParameterObject) obj;
280 if (this.bidirectional != other.bidirectional)
282 if (this.eroCompression != other.eroCompression)
284 if (this.fragmentation != other.fragmentation)
286 if (this.loose != other.loose)
288 if (this.makeBeforeBreak != other.makeBeforeBreak)
290 if (this.p2mp != other.p2mp)
292 if (this.priority != other.priority)
294 if (this.reoptimized != other.reoptimized)
296 if (this.reportRequestOrder != other.reportRequestOrder)
298 if (this.requestID != other.requestID)
300 if (this.suplyOFOnResponse != other.suplyOFOnResponse)
302 if (this.tlvs == null) {
303 if (other.tlvs != null)
305 } else if (!this.tlvs.equals(other.tlvs))
311 protected ToStringHelper addToStringAttributes(ToStringHelper toStringHelper) {
312 toStringHelper.add("loose", this.loose);
313 toStringHelper.add("bidirectional", this.bidirectional);
314 toStringHelper.add("reoptimized", this.reoptimized);
315 toStringHelper.add("makeBeforeBreak", this.makeBeforeBreak);
316 toStringHelper.add("reportRequestOrder", this.reportRequestOrder);
317 toStringHelper.add("suplyOFOnResponse", this.suplyOFOnResponse);
318 toStringHelper.add("fragmentation", this.fragmentation);
319 toStringHelper.add("p2mp", this.p2mp);
320 toStringHelper.add("eroCompression", this.eroCompression);
321 toStringHelper.add("priority", this.priority);
322 toStringHelper.add("requestID", this.requestID);
323 toStringHelper.add("tlvs", this.tlvs);
324 return super.addToStringAttributes(toStringHelper);