blob: 594e40c1bfc3d8fe709b23ade74bcd95203c8b21 [file] [log] [blame]
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -07001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.pcepio.protocol.ver1;
17
18import java.util.LinkedList;
19import java.util.ListIterator;
20
21import org.jboss.netty.buffer.ChannelBuffer;
22import org.onosproject.pcepio.exceptions.PcepParseException;
23import org.onosproject.pcepio.protocol.PcepError;
24import org.onosproject.pcepio.protocol.PcepErrorInfo;
25import org.onosproject.pcepio.protocol.PcepErrorObject;
26import org.onosproject.pcepio.protocol.PcepRPObject;
27import org.onosproject.pcepio.protocol.PcepTEObject;
28import org.onosproject.pcepio.types.PcepObjectHeader;
29import org.slf4j.Logger;
30import org.slf4j.LoggerFactory;
31
32import com.google.common.base.MoreObjects;
33
34/**
35 * Provides PCEP Error Info.
36 * Reference :PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02.
37 */
38public class PcepErrorInfoVer1 implements PcepErrorInfo {
39
40 protected static final Logger log = LoggerFactory.getLogger(PcepErrorInfoVer1.class);
41 //Error list is optional
42 private LinkedList<PcepError> errList;
43
44 /**
45 * Constructor to add PCEP error object to the list.
46 *
47 * @param llRPObjList list of PCEP RP object
48 * @param llTEObjList list of PCEP TE object
49 * @param llErrObjList list of PCEP error object
50 */
51 public PcepErrorInfoVer1(LinkedList<PcepRPObject> llRPObjList, LinkedList<PcepTEObject> llTEObjList,
52 LinkedList<PcepErrorObject> llErrObjList) {
Sho SHIMIZU9b8274c2015-09-04 15:54:24 -070053 this.errList = new LinkedList<>();
Sho SHIMIZU28c91c82015-09-03 11:40:02 -070054 if ((llErrObjList != null) && (!llErrObjList.isEmpty())) {
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070055 this.errList.add(new PcepErrorVer1(llRPObjList, llTEObjList, llErrObjList));
56 }
57 }
58
59 /**
60 * Constructor to initialize error info.
61 *
62 * @param errll linked list or pcep error
63 */
64 public PcepErrorInfoVer1(LinkedList<PcepError> errll) {
65 this.errList = errll;
66 }
67
68 @Override
69 public boolean isErrorInfoPresent() {
Phanendra Mandaf346ea82015-09-04 15:21:39 -070070 return !this.errList.isEmpty();
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -070071 }
72
73 @Override
74 public void read(ChannelBuffer cb) throws PcepParseException {
75 PcepObjectHeader tempObjHeader;
76
77 while (0 < cb.readableBytes()) {
78 cb.markReaderIndex();
79 tempObjHeader = PcepObjectHeader.read(cb);
80 cb.resetReaderIndex();
81 byte yObjClass = tempObjHeader.getObjClass();
82 if ((yObjClass != PcepRPObjectVer1.RP_OBJ_CLASS) && (yObjClass != PcepTEObjectVer1.TE_OBJ_CLASS)
83 && (yObjClass != PcepErrorObjectVer1.ERROR_OBJ_CLASS)) {
84 throw new PcepParseException("Unknown Object is present in PCEP-ERROR. Object Class: " + yObjClass);
85 }
86
87 this.errList.add(PcepErrorVer1.read(cb));
88 }
89 }
90
91 @Override
92 public void write(ChannelBuffer cb) throws PcepParseException {
93 //write <error>
94 ListIterator<PcepError> listIterator = errList.listIterator();
95 while (listIterator.hasNext()) {
96 PcepError pcepError = listIterator.next();
97
98 //RP Object list is optional
99 LinkedList<PcepRPObject> llRPObjList = pcepError.getRPObjList();
100 if (llRPObjList != null) {
101 ListIterator<PcepRPObject> rpListIterator = llRPObjList.listIterator();
102 while (rpListIterator.hasNext()) {
103 rpListIterator.next().write(cb);
104 }
105 }
106
107 //TE Object list is optional
108 LinkedList<PcepTEObject> llTEObjList = pcepError.getTEObjList();
109 if (llTEObjList != null) {
110 ListIterator<PcepTEObject> teListIterator = llTEObjList.listIterator();
111 while (teListIterator.hasNext()) {
112 teListIterator.next().write(cb);
113 }
114 }
115
116 // <error-obj-list> is mandatory
117 boolean bIsErrorObjListFound = false;
118
119 LinkedList<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
120 if (llErrObjList != null) {
121 ListIterator<PcepErrorObject> errObjListIterator = llErrObjList.listIterator();
122 while (errObjListIterator.hasNext()) {
123 errObjListIterator.next().write(cb);
124 bIsErrorObjListFound = true;
125 }
126 }
127
128 if (!bIsErrorObjListFound) {
129 throw new PcepParseException("<error-obj-list> is mandatory.");
130 }
131 }
132 }
133
134 @Override
135 public LinkedList<Integer> getErrorType() {
Sho SHIMIZU9b8274c2015-09-04 15:54:24 -0700136 LinkedList<Integer> errorType = new LinkedList<>();
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700137 ListIterator<PcepError> listIterator = errList.listIterator();
138 PcepErrorObject errObj;
139 int error;
140 while (listIterator.hasNext()) {
141 PcepError pcepError = listIterator.next();
142 LinkedList<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
143 if (llErrObjList != null) {
144 ListIterator<PcepErrorObject> errObjListIterator = llErrObjList.listIterator();
145 while (errObjListIterator.hasNext()) {
146 errObj = errObjListIterator.next();
147 error = errObj.getErrorType();
148 errorType.add(error);
149 }
150 }
151 }
152 return errorType;
153 }
154
155 @Override
156 public LinkedList<Integer> getErrorValue() {
Sho SHIMIZU9b8274c2015-09-04 15:54:24 -0700157 LinkedList<Integer> errorValue = new LinkedList<>();
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700158 ListIterator<PcepError> listIterator = errList.listIterator();
159 PcepErrorObject errObj;
160 int error;
161 while (listIterator.hasNext()) {
162 PcepError pcepError = listIterator.next();
163 LinkedList<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
164 if (llErrObjList != null) {
165 ListIterator<PcepErrorObject> errObjListIterator = llErrObjList.listIterator();
166 while (errObjListIterator.hasNext()) {
167 errObj = errObjListIterator.next();
168 error = errObj.getErrorValue();
169 errorValue.add(error);
170 }
171 }
172 }
173 return errorValue;
174 }
175
176 /**
177 * Builder class for PCEP error info.
178 */
179 public static class Builder implements PcepErrorInfo.Builder {
180 private LinkedList<PcepError> errll;
181
182 @Override
183 public PcepErrorInfo build() {
184 return new PcepErrorInfoVer1(errll);
185 }
186
187 @Override
188 public LinkedList<PcepError> getPcepErrorList() {
189 return this.errll;
190 }
191
192 @Override
193 public Builder setPcepErrorList(LinkedList<PcepError> errll) {
194 this.errll = errll;
195 return this;
196 }
197 }
198
199 @Override
200 public String toString() {
Sho SHIMIZU7cdbcf72015-09-03 14:43:05 -0700201 return MoreObjects.toStringHelper(getClass())
202 .add("ErrorList", errList).toString();
Sho SHIMIZUe81e4db2015-09-03 09:44:38 -0700203 }
204}