janani b
Committed by Patrick Liu

[ONOS-4744] Leafref implementation and UT

Change-Id: I151797185e0bb1695c0640b667ae76ef87c4d4b0
Showing 73 changed files with 4869 additions and 133 deletions
...@@ -34,5 +34,10 @@ public enum ResolvableType { ...@@ -34,5 +34,10 @@ public enum ResolvableType {
34 /** 34 /**
35 * Identifies the if-feature. 35 * Identifies the if-feature.
36 */ 36 */
37 - YANG_IF_FEATURE 37 + YANG_IF_FEATURE,
38 +
39 + /**
40 + * Identifies the leafref.
41 + */
42 + YANG_LEAFREF
38 } 43 }
......
...@@ -24,6 +24,11 @@ import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; ...@@ -24,6 +24,11 @@ import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
24 24
25 import com.google.common.base.Strings; 25 import com.google.common.base.Strings;
26 26
27 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED;
28 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED;
29 +import static org.onosproject.yangutils.datamodel.utils.RestrictionResolver.processLengthRestriction;
30 +import static org.onosproject.yangutils.datamodel.utils.RestrictionResolver.processRangeRestriction;
31 +import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypeUtils.isOfRangeRestrictedType;
27 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY; 32 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY;
28 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BITS; 33 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BITS;
29 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BOOLEAN; 34 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BOOLEAN;
...@@ -34,11 +39,6 @@ import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangData ...@@ -34,11 +39,6 @@ import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangData
34 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF; 39 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
35 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.STRING; 40 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.STRING;
36 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UNION; 41 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UNION;
37 -import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED;
38 -import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED;
39 -import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypeUtils.isOfRangeRestrictedType;
40 -import static org.onosproject.yangutils.datamodel.utils.RestrictionResolver.processLengthRestriction;
41 -import static org.onosproject.yangutils.datamodel.utils.RestrictionResolver.processRangeRestriction;
42 42
43 /** 43 /**
44 * Represents the derived information. 44 * Represents the derived information.
...@@ -334,6 +334,9 @@ public class YangDerivedInfo<T> ...@@ -334,6 +334,9 @@ public class YangDerivedInfo<T>
334 return RESOLVED; 334 return RESOLVED;
335 } 335 }
336 } 336 }
337 + } else if (baseType.getDataType() == LEAFREF) {
338 + setEffectiveBuiltInType(baseType.getDataType());
339 + return RESOLVED;
337 } else { 340 } else {
338 setEffectiveBuiltInType(baseType.getDataType()); 341 setEffectiveBuiltInType(baseType.getDataType());
339 /* 342 /*
...@@ -412,7 +415,6 @@ public class YangDerivedInfo<T> ...@@ -412,7 +415,6 @@ public class YangDerivedInfo<T>
412 } 415 }
413 } 416 }
414 } 417 }
415 -
416 /* 418 /*
417 * Check if the data type is the one which can't be restricted, in this 419 * Check if the data type is the one which can't be restricted, in this
418 * case check whether no self restrictions should be present. 420 * case check whether no self restrictions should be present.
...@@ -426,7 +428,6 @@ public class YangDerivedInfo<T> ...@@ -426,7 +428,6 @@ public class YangDerivedInfo<T>
426 throw new DataModelException("YANG file error: Restrictions can't be applied to a given type"); 428 throw new DataModelException("YANG file error: Restrictions can't be applied to a given type");
427 } 429 }
428 } 430 }
429 -
430 // Throw exception for unsupported types 431 // Throw exception for unsupported types
431 throw new DataModelException("Linker error: Unable to process the derived type."); 432 throw new DataModelException("Linker error: Unable to process the derived type.");
432 } 433 }
......
1 +/*
2 + * Copyright 2016-present 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 + */
16 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import java.io.Serializable;
20 +import java.util.Iterator;
21 +import java.util.LinkedList;
22 +import java.util.List;
23 +
24 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
25 +import org.onosproject.yangutils.datamodel.utils.Parsable;
26 +import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
27 +import org.onosproject.yangutils.datamodel.utils.YangConstructType;
28 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
29 +
30 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED;
31 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED;
32 +
33 +/*
34 + * Reference:RFC 6020.
35 + * The leafref type is used to reference a particular leaf instance in
36 + * the data tree. The "path" substatement (Section 9.9.2) selects a set
37 + * of leaf instances, and the leafref value space is the set of values
38 + * of these leaf instances.
39 + */
40 +
41 +/**
42 + * Represents the leafref information.
43 + *
44 + * @param <T> YANG leafref info
45 + */
46 +public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangIfFeatureHolder {
47 +
48 + private static final long serialVersionUID = 286201644L;
49 +
50 + /**
51 + * YANG data type.
52 + */
53 + private YangType effectiveDataType;
54 +
55 + /**
56 + * Referred leaf/leaf-list for the path specified in the leafref type.
57 + */
58 + private T referredLeafOrLeafList;
59 +
60 + /**
61 + * Path of the leafref.
62 + */
63 + private String path;
64 +
65 + /**
66 + * Leafref path type. Either absolute or relative path.
67 + */
68 + private YangPathArgType pathType;
69 +
70 + /**
71 + * List of atomic paths in absolute Path.
72 + */
73 + private List<YangAtomicPath> atomicPath;
74 +
75 + /**
76 + * YANG relative path.
77 + */
78 + private YangRelativePath relativePath;
79 +
80 + /**
81 + * Status of resolution. If completely resolved enum value is "RESOLVED",
82 + * if not enum value is "UNRESOLVED", in case reference of grouping/typedef/leafref
83 + * is added to uses/type/leafref but it's not resolved value of enum should be
84 + * "INTRA_FILE_RESOLVED".
85 + */
86 + private ResolvableStatus resolvableStatus;
87 +
88 + /**
89 + * Require instance status in leafref type.
90 + */
91 + private boolean requireInstance;
92 +
93 + /**
94 + * List of if-feature.
95 + */
96 + private List<YangIfFeature> ifFeatureList;
97 +
98 + /**
99 + * Returns the status of the require instance in leafref.
100 + *
101 + * @return status of the require instance
102 + */
103 + public boolean getRequireInstance() {
104 + return requireInstance;
105 + }
106 +
107 + /**
108 + * Sets the status of the require instance in leafref.
109 + *
110 + * @param requireInstance status of the require instance
111 + */
112 + public void setRequireInstance(boolean requireInstance) {
113 + this.requireInstance = requireInstance;
114 + }
115 +
116 + /**
117 + * Returns the type of data.
118 + *
119 + * @return the data type
120 + */
121 + public YangType getEffectiveDataType() {
122 + return effectiveDataType;
123 + }
124 +
125 + /**
126 + * Sets the type of data.
127 + *
128 + * @param effectiveDataType data type
129 + */
130 + public void setEffectiveDataType(YangType effectiveDataType) {
131 + this.effectiveDataType = effectiveDataType;
132 + }
133 +
134 + /**
135 + * Returns the path of the leafref.
136 + *
137 + * @return path of the leafref
138 + */
139 + public String getPath() {
140 + return path;
141 + }
142 +
143 + /**
144 + * Sets the path of the leafref.
145 + *
146 + * @param path leafref path
147 + */
148 + public void setPath(String path) {
149 + this.path = path;
150 + }
151 +
152 + /**
153 + * Returns the type of path in the leafref.
154 + *
155 + * @return type of path
156 + */
157 + public YangPathArgType getPathType() {
158 + return pathType;
159 + }
160 +
161 + /**
162 + * Sets the type of path in the leafref. It can be either absolute or relative type.
163 + *
164 + * @param pathType type of path
165 + */
166 + public void setPathType(YangPathArgType pathType) {
167 + this.pathType = pathType;
168 + }
169 +
170 + /**
171 + * Returns the list of atomic path.
172 + *
173 + * @return list of atomic path
174 + */
175 + public List<YangAtomicPath> getAtomicPath() {
176 + return atomicPath;
177 + }
178 +
179 + /**
180 + * Sets the list of atomic path.
181 + *
182 + * @param atomicPath list of atomic path.
183 + */
184 + public void setAtomicPath(List<YangAtomicPath> atomicPath) {
185 + this.atomicPath = atomicPath;
186 + }
187 +
188 + /**
189 + * Returns the object of relative path.
190 + *
191 + * @return object of relative path
192 + */
193 + public YangRelativePath getRelativePath() {
194 + return relativePath;
195 + }
196 +
197 + /**
198 + * Sets the object of relative path.
199 + *
200 + * @param relativePath object of relative path.
201 + */
202 + public void setRelativePath(YangRelativePath relativePath) {
203 + this.relativePath = relativePath;
204 + }
205 +
206 + /**
207 + * Returns the object of referred leaf/leaf-list.
208 + *
209 + * @return object of referred leaf/leaf-list
210 + */
211 + public T getReferredLeafOrLeafList() {
212 + return referredLeafOrLeafList;
213 + }
214 +
215 + /**
216 + * Sets the object of referred leaf/leaf-list.
217 + *
218 + * @param targetExtendedInfo object of referred leaf/leaf-list
219 + */
220 + public void setReferredLeafOrLeafList(T targetExtendedInfo) {
221 + this.referredLeafOrLeafList = targetExtendedInfo;
222 + }
223 +
224 + @Override
225 + public List<YangIfFeature> getIfFeatureList() {
226 + return ifFeatureList;
227 + }
228 +
229 + @Override
230 + public void addIfFeatureList(YangIfFeature ifFeature) {
231 + if (getIfFeatureList() == null) {
232 + setIfFeatureList(new LinkedList<>());
233 + }
234 + getIfFeatureList().add(ifFeature);
235 + }
236 +
237 + @Override
238 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
239 + this.ifFeatureList = ifFeatureList;
240 + }
241 +
242 + @Override
243 + public YangConstructType getYangConstructType() {
244 + return YangConstructType.LEAFREF_DATA;
245 + }
246 +
247 + @Override
248 + public void validateDataOnEntry() throws DataModelException {
249 + // TODO auto-generated method stub, to be implemented by parser
250 + }
251 +
252 + @Override
253 + public void validateDataOnExit() throws DataModelException {
254 + // TODO auto-generated method stub, to be implemented by parser
255 + }
256 +
257 + @Override
258 + public ResolvableStatus getResolvableStatus() {
259 + return resolvableStatus;
260 + }
261 +
262 + @Override
263 + public void setResolvableStatus(ResolvableStatus resolvableStatus) {
264 + this.resolvableStatus = resolvableStatus;
265 + }
266 +
267 + @Override
268 + public void resolve() throws DataModelException {
269 +
270 + if (getReferredLeafOrLeafList() == null) {
271 + throw new DataModelException("Linker Error: The leafref does not refer to any leaf/leaf-list.");
272 + }
273 +
274 + // Initiate the resolution
275 + try {
276 + setResolvableStatus(getResolution());
277 + } catch (DataModelException e) {
278 + throw new DataModelException(e.getMessage());
279 + }
280 + }
281 +
282 + /**
283 + * Returns the resolution status by getting the effective built-in type.
284 + *
285 + * @return status of resolution
286 + * @throws DataModelException a violation of data model rules
287 + */
288 + private ResolvableStatus getResolution() throws DataModelException {
289 +
290 + if (getReferredLeafOrLeafList() instanceof YangLeaf) {
291 + YangLeaf yangLeaf = ((YangLeaf) getReferredLeafOrLeafList());
292 + YangType baseType = yangLeaf.getDataType();
293 +
294 + if (baseType.getDataType() == YangDataTypes.LEAFREF) {
295 + YangLeafRef referredLeafRefInfo = (YangLeafRef) (yangLeaf.getDataType().getDataTypeExtendedInfo());
296 + /*
297 + * Check whether the referred typedef is resolved.
298 + */
299 + if (referredLeafRefInfo.getResolvableStatus() != INTRA_FILE_RESOLVED
300 + && referredLeafRefInfo.getResolvableStatus() != RESOLVED) {
301 + throw new DataModelException("Linker Error: Referred typedef is not resolved for type.");
302 + }
303 +
304 + /*
305 + * Check if the referred typedef is intra file resolved, if yes
306 + * sets current status also to intra file resolved .
307 + */
308 + if ((referredLeafRefInfo.getResolvableStatus() == INTRA_FILE_RESOLVED)) {
309 + return INTRA_FILE_RESOLVED;
310 + }
311 +
312 + // Add the if-feature list from referred leafref to current leafref.
313 + List<YangIfFeature> referredLeafIfFeatureListFromLeafref = referredLeafRefInfo.getIfFeatureList();
314 + if (referredLeafIfFeatureListFromLeafref != null && !referredLeafIfFeatureListFromLeafref.isEmpty()) {
315 + Iterator<YangIfFeature> referredLeafIfFeature = referredLeafIfFeatureListFromLeafref.iterator();
316 + while (referredLeafIfFeature.hasNext()) {
317 + YangIfFeature ifFeature = referredLeafIfFeature.next();
318 + addIfFeatureList(ifFeature);
319 + }
320 + }
321 + setEffectiveDataType(referredLeafRefInfo.getEffectiveDataType());
322 + } else if (baseType.getDataType() == YangDataTypes.DERIVED) {
323 + /*
324 + * Check whether the referred typedef is resolved.
325 + */
326 + if (baseType.getResolvableStatus() != INTRA_FILE_RESOLVED
327 + && baseType.getResolvableStatus() != RESOLVED) {
328 + throw new DataModelException("Linker Error: Referred typedef is not resolved for type.");
329 + }
330 + /*
331 + * Check if the referred typedef is intra file resolved, if yes
332 + * sets current status also to intra file resolved .
333 + */
334 + if ((baseType.getResolvableStatus() == INTRA_FILE_RESOLVED)) {
335 + return INTRA_FILE_RESOLVED;
336 + }
337 + setEffectiveDataType(baseType);
338 + } else {
339 + setEffectiveDataType(baseType);
340 + }
341 +
342 + // Add the if-feature list from referred leaf to current leafref.
343 + List<YangIfFeature> referredLeafIfFeatureList = yangLeaf.getIfFeatureList();
344 + if (referredLeafIfFeatureList != null && !referredLeafIfFeatureList.isEmpty()) {
345 + Iterator<YangIfFeature> referredLeafIfFeature = referredLeafIfFeatureList.iterator();
346 + while (referredLeafIfFeature.hasNext()) {
347 + YangIfFeature ifFeature = referredLeafIfFeature.next();
348 + addIfFeatureList(ifFeature);
349 + }
350 + }
351 + return RESOLVED;
352 + } else if (getReferredLeafOrLeafList() instanceof YangLeafList) {
353 + YangLeafList yangLeafList = ((YangLeafList) getReferredLeafOrLeafList());
354 + YangType baseType = yangLeafList.getDataType();
355 +
356 + if (baseType.getDataType() == YangDataTypes.LEAFREF) {
357 + YangLeafRef referredLeafRefInfo = (YangLeafRef) yangLeafList.getDataType().getDataTypeExtendedInfo();
358 + /*
359 + * Check whether the referred typedef is resolved.
360 + */
361 + if (referredLeafRefInfo.getResolvableStatus() != INTRA_FILE_RESOLVED
362 + && referredLeafRefInfo.getResolvableStatus() != RESOLVED) {
363 + throw new DataModelException("Linker Error: Referred typedef is not resolved for type.");
364 + }
365 + /*
366 + * Check if the referred typedef is intra file resolved, if yes
367 + * sets current status also to intra file resolved .
368 + */
369 + if ((referredLeafRefInfo.getResolvableStatus() == INTRA_FILE_RESOLVED)) {
370 + return INTRA_FILE_RESOLVED;
371 + }
372 + // Add the if-feature list from referred leafref to current leafref.
373 + List<YangIfFeature> referredLeafListIfFeatureListFromLeafref = referredLeafRefInfo.getIfFeatureList();
374 + if (referredLeafListIfFeatureListFromLeafref != null
375 + && !referredLeafListIfFeatureListFromLeafref.isEmpty()) {
376 + Iterator<YangIfFeature> referredLeafListIfFeature = referredLeafListIfFeatureListFromLeafref
377 + .iterator();
378 + while (referredLeafListIfFeature.hasNext()) {
379 + YangIfFeature ifFeature = referredLeafListIfFeature.next();
380 + addIfFeatureList(ifFeature);
381 + }
382 + }
383 + setEffectiveDataType(referredLeafRefInfo.getEffectiveDataType());
384 + } else if (baseType.getDataType() == YangDataTypes.DERIVED) {
385 + /*
386 + * Check whether the referred typedef is resolved.
387 + */
388 + if (baseType.getResolvableStatus() != INTRA_FILE_RESOLVED
389 + && baseType.getResolvableStatus() != RESOLVED) {
390 + throw new DataModelException("Linker Error: Referred typedef is not resolved for type.");
391 + }
392 + /*
393 + * Check if the referred typedef is intra file resolved, if yes
394 + * sets current status also to intra file resolved .
395 + */
396 + if ((baseType.getResolvableStatus() == INTRA_FILE_RESOLVED)) {
397 + return INTRA_FILE_RESOLVED;
398 + }
399 + setEffectiveDataType(baseType);
400 + } else {
401 + setEffectiveDataType(baseType);
402 + }
403 + // Add the if-feature list from referred leaf-list to current leafref.
404 + List<YangIfFeature> referredLeafListIfFeatureList = yangLeafList.getIfFeatureList();
405 + if (referredLeafListIfFeatureList != null && !referredLeafListIfFeatureList.isEmpty()) {
406 + Iterator<YangIfFeature> referredLeafListIfFeature = referredLeafListIfFeatureList.iterator();
407 + while (referredLeafListIfFeature.hasNext()) {
408 + YangIfFeature ifFeature = referredLeafListIfFeature.next();
409 + addIfFeatureList(ifFeature);
410 + }
411 + }
412 + return RESOLVED;
413 + } else {
414 + throw new DataModelException("Linker Error: The leafref must refer only to leaf/leaf-list.");
415 + }
416 + }
417 +}
...@@ -211,6 +211,11 @@ public class YangModule ...@@ -211,6 +211,11 @@ public class YangModule
211 private List<YangResolutionInfo> ifFeatureResolutionList; 211 private List<YangResolutionInfo> ifFeatureResolutionList;
212 212
213 /** 213 /**
214 + * leafref resolution list.
215 + */
216 + private List<YangResolutionInfo> leafrefResolutionList;
217 +
218 + /**
214 * Creates a YANG node of module type. 219 * Creates a YANG node of module type.
215 */ 220 */
216 public YangModule() { 221 public YangModule() {
...@@ -219,6 +224,7 @@ public class YangModule ...@@ -219,6 +224,7 @@ public class YangModule
219 derivedTypeResolutionList = new LinkedList<>(); 224 derivedTypeResolutionList = new LinkedList<>();
220 usesResolutionList = new LinkedList<>(); 225 usesResolutionList = new LinkedList<>();
221 ifFeatureResolutionList = new LinkedList<>(); 226 ifFeatureResolutionList = new LinkedList<>();
227 + leafrefResolutionList = new LinkedList<>();
222 importList = new LinkedList<YangImport>(); 228 importList = new LinkedList<YangImport>();
223 includeList = new LinkedList<YangInclude>(); 229 includeList = new LinkedList<YangInclude>();
224 listOfLeaf = new LinkedList<YangLeaf>(); 230 listOfLeaf = new LinkedList<YangLeaf>();
...@@ -589,8 +595,10 @@ public class YangModule ...@@ -589,8 +595,10 @@ public class YangModule
589 return derivedTypeResolutionList; 595 return derivedTypeResolutionList;
590 } else if (type == ResolvableType.YANG_USES) { 596 } else if (type == ResolvableType.YANG_USES) {
591 return usesResolutionList; 597 return usesResolutionList;
592 - } else { 598 + } else if (type == ResolvableType.YANG_IF_FEATURE) {
593 return ifFeatureResolutionList; 599 return ifFeatureResolutionList;
600 + } else {
601 + return leafrefResolutionList;
594 } 602 }
595 } 603 }
596 604
...@@ -603,6 +611,8 @@ public class YangModule ...@@ -603,6 +611,8 @@ public class YangModule
603 usesResolutionList.add(resolutionInfo); 611 usesResolutionList.add(resolutionInfo);
604 } else if (type == ResolvableType.YANG_IF_FEATURE) { 612 } else if (type == ResolvableType.YANG_IF_FEATURE) {
605 ifFeatureResolutionList.add(resolutionInfo); 613 ifFeatureResolutionList.add(resolutionInfo);
614 + } else {
615 + leafrefResolutionList.add(resolutionInfo);
606 } 616 }
607 } 617 }
608 618
...@@ -615,6 +625,8 @@ public class YangModule ...@@ -615,6 +625,8 @@ public class YangModule
615 usesResolutionList = resolutionList; 625 usesResolutionList = resolutionList;
616 } else if (type == ResolvableType.YANG_IF_FEATURE) { 626 } else if (type == ResolvableType.YANG_IF_FEATURE) {
617 ifFeatureResolutionList.add((YangResolutionInfo) resolutionList); 627 ifFeatureResolutionList.add((YangResolutionInfo) resolutionList);
628 + } else if (type == ResolvableType.YANG_LEAFREF) {
629 + leafrefResolutionList = resolutionList;
618 } 630 }
619 631
620 } 632 }
......
...@@ -209,6 +209,11 @@ public class YangSubModule ...@@ -209,6 +209,11 @@ public class YangSubModule
209 private List<YangResolutionInfo> ifFeatureResolutionList; 209 private List<YangResolutionInfo> ifFeatureResolutionList;
210 210
211 /** 211 /**
212 + * leafref resolution list.
213 + */
214 + private List<YangResolutionInfo> leafrefResolutionList;
215 +
216 + /**
212 * Creates a sub module node. 217 * Creates a sub module node.
213 */ 218 */
214 public YangSubModule() { 219 public YangSubModule() {
...@@ -216,6 +221,7 @@ public class YangSubModule ...@@ -216,6 +221,7 @@ public class YangSubModule
216 derivedTypeResolutionList = new LinkedList<>(); 221 derivedTypeResolutionList = new LinkedList<>();
217 usesResolutionList = new LinkedList<>(); 222 usesResolutionList = new LinkedList<>();
218 ifFeatureResolutionList = new LinkedList<>(); 223 ifFeatureResolutionList = new LinkedList<>();
224 + leafrefResolutionList = new LinkedList<>();
219 importList = new LinkedList<YangImport>(); 225 importList = new LinkedList<YangImport>();
220 includeList = new LinkedList<YangInclude>(); 226 includeList = new LinkedList<YangInclude>();
221 listOfLeaf = new LinkedList<YangLeaf>(); 227 listOfLeaf = new LinkedList<YangLeaf>();
...@@ -551,8 +557,10 @@ public class YangSubModule ...@@ -551,8 +557,10 @@ public class YangSubModule
551 return derivedTypeResolutionList; 557 return derivedTypeResolutionList;
552 } else if (type == ResolvableType.YANG_USES) { 558 } else if (type == ResolvableType.YANG_USES) {
553 return usesResolutionList; 559 return usesResolutionList;
554 - } else { 560 + } else if (type == ResolvableType.YANG_IF_FEATURE) {
555 return ifFeatureResolutionList; 561 return ifFeatureResolutionList;
562 + } else {
563 + return leafrefResolutionList;
556 } 564 }
557 } 565 }
558 566
...@@ -565,6 +573,8 @@ public class YangSubModule ...@@ -565,6 +573,8 @@ public class YangSubModule
565 usesResolutionList.add(resolutionInfo); 573 usesResolutionList.add(resolutionInfo);
566 } else if (type == ResolvableType.YANG_IF_FEATURE) { 574 } else if (type == ResolvableType.YANG_IF_FEATURE) {
567 ifFeatureResolutionList.add(resolutionInfo); 575 ifFeatureResolutionList.add(resolutionInfo);
576 + } else {
577 + leafrefResolutionList.add(resolutionInfo);
568 } 578 }
569 } 579 }
570 580
...@@ -576,7 +586,9 @@ public class YangSubModule ...@@ -576,7 +586,9 @@ public class YangSubModule
576 } else if (type == ResolvableType.YANG_USES) { 586 } else if (type == ResolvableType.YANG_USES) {
577 usesResolutionList = resolutionList; 587 usesResolutionList = resolutionList;
578 } else if (type == ResolvableType.YANG_IF_FEATURE) { 588 } else if (type == ResolvableType.YANG_IF_FEATURE) {
579 - ifFeatureResolutionList = resolutionList; 589 + ifFeatureResolutionList.add((YangResolutionInfo) resolutionList);
590 + } else if (type == ResolvableType.YANG_LEAFREF) {
591 + leafrefResolutionList = resolutionList;
580 } 592 }
581 593
582 } 594 }
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
17 package org.onosproject.yangutils.datamodel; 17 package org.onosproject.yangutils.datamodel;
18 18
19 import java.io.Serializable; 19 import java.io.Serializable;
20 +
20 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 21 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
21 import org.onosproject.yangutils.datamodel.utils.Parsable; 22 import org.onosproject.yangutils.datamodel.utils.Parsable;
22 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; 23 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
...@@ -43,7 +44,7 @@ import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangData ...@@ -43,7 +44,7 @@ import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangData
43 * | bit | 9.7.4 | 0..n | - YangBit used in YangBits | 44 * | bit | 9.7.4 | 0..n | - YangBit used in YangBits |
44 * | enum | 9.6.4 | 0..n | - YangEnum used in YangEnumeration | 45 * | enum | 9.6.4 | 0..n | - YangEnum used in YangEnumeration |
45 * | length | 9.4.4 | 0..1 | - used for string | 46 * | length | 9.4.4 | 0..1 | - used for string |
46 - * | path | 9.9.2 | 0..1 | - TODO leaf-ref | 47 + * | path | 9.9.2 | 0..1 | - path for referred leaf/leaf-list |
47 * | pattern | 9.4.6 | 0..n | - used for string | 48 * | pattern | 9.4.6 | 0..n | - used for string |
48 * | range | 9.2.4 | 0..1 | - used for integer data type | 49 * | range | 9.2.4 | 0..1 | - used for integer data type |
49 * | require-instance | 9.13.2 | 0..1 | - TODO instance-identifier | 50 * | require-instance | 9.13.2 | 0..1 | - TODO instance-identifier |
...@@ -67,11 +68,6 @@ public class YangType<T> ...@@ -67,11 +68,6 @@ public class YangType<T>
67 private YangNodeIdentifier nodeIdentifier; 68 private YangNodeIdentifier nodeIdentifier;
68 69
69 /** 70 /**
70 - * Java package in which the Java type is defined.
71 - */
72 - private String javaPackage;
73 -
74 - /**
75 * YANG data type. 71 * YANG data type.
76 */ 72 */
77 private YangDataTypes dataType; 73 private YangDataTypes dataType;
...@@ -137,24 +133,6 @@ public class YangType<T> ...@@ -137,24 +133,6 @@ public class YangType<T>
137 } 133 }
138 134
139 /** 135 /**
140 - * Returns the Java package where the type is defined.
141 - *
142 - * @return Java package where the type is defined
143 - */
144 - public String getJavaPackage() {
145 - return javaPackage;
146 - }
147 -
148 - /**
149 - * Sets Java package where the type is defined.
150 - *
151 - * @param javaPackage Java package where the type is defined
152 - */
153 - public void setJavaPackage(String javaPackage) {
154 - this.javaPackage = javaPackage;
155 - }
156 -
157 - /**
158 * Returns the type of data. 136 * Returns the type of data.
159 * 137 *
160 * @return the data type 138 * @return the data type
...@@ -209,6 +187,16 @@ public class YangType<T> ...@@ -209,6 +187,16 @@ public class YangType<T>
209 } 187 }
210 188
211 /** 189 /**
190 + * Resets the class attributes to its default value.
191 + */
192 + public void resetYangType() {
193 + nodeIdentifier = new YangNodeIdentifier();
194 + resolvableStatus = ResolvableStatus.UNRESOLVED;
195 + dataType = null;
196 + dataTypeExtendedInfo = null;
197 + }
198 +
199 + /**
212 * Returns the type of the parsed data. 200 * Returns the type of the parsed data.
213 * 201 *
214 * @return returns TYPE_DATA 202 * @return returns TYPE_DATA
......
...@@ -24,6 +24,7 @@ import org.onosproject.yangutils.datamodel.ResolvableType; ...@@ -24,6 +24,7 @@ import org.onosproject.yangutils.datamodel.ResolvableType;
24 import org.onosproject.yangutils.datamodel.YangIfFeature; 24 import org.onosproject.yangutils.datamodel.YangIfFeature;
25 import org.onosproject.yangutils.datamodel.YangLeaf; 25 import org.onosproject.yangutils.datamodel.YangLeaf;
26 import org.onosproject.yangutils.datamodel.YangLeafList; 26 import org.onosproject.yangutils.datamodel.YangLeafList;
27 +import org.onosproject.yangutils.datamodel.YangLeafRef;
27 import org.onosproject.yangutils.datamodel.YangLeavesHolder; 28 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
28 import org.onosproject.yangutils.datamodel.YangNode; 29 import org.onosproject.yangutils.datamodel.YangNode;
29 import org.onosproject.yangutils.datamodel.YangReferenceResolver; 30 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
...@@ -171,6 +172,10 @@ public final class DataModelUtils { ...@@ -171,6 +172,10 @@ public final class DataModelUtils {
171 .getEntityToResolve() instanceof YangIfFeature) { 172 .getEntityToResolve() instanceof YangIfFeature) {
172 resolutionNode.addToResolutionList(resolutionInfo, 173 resolutionNode.addToResolutionList(resolutionInfo,
173 ResolvableType.YANG_IF_FEATURE); 174 ResolvableType.YANG_IF_FEATURE);
175 + } else if (resolutionInfo.getEntityToResolveInfo()
176 + .getEntityToResolve() instanceof YangLeafRef) {
177 + resolutionNode.addToResolutionList(resolutionInfo,
178 + ResolvableType.YANG_LEAFREF);
174 } 179 }
175 } 180 }
176 181
......
...@@ -25,14 +25,14 @@ public enum YangDataTypes { ...@@ -25,14 +25,14 @@ public enum YangDataTypes {
25 * 25 *
26 * int8 represents integer values between -128 and 127, inclusively. 26 * int8 represents integer values between -128 and 127, inclusively.
27 */ 27 */
28 - INT8, 28 + INT8("int8"),
29 29
30 /** 30 /**
31 * Reference:RFC 6020. 31 * Reference:RFC 6020.
32 * 32 *
33 * int16 represents integer values between -32768 and 32767, inclusively. 33 * int16 represents integer values between -32768 and 32767, inclusively.
34 */ 34 */
35 - INT16, 35 + INT16("int16"),
36 36
37 /** 37 /**
38 * Reference:RFC 6020. 38 * Reference:RFC 6020.
...@@ -40,7 +40,7 @@ public enum YangDataTypes { ...@@ -40,7 +40,7 @@ public enum YangDataTypes {
40 * int32 represents integer values between -2147483648 and 2147483647, 40 * int32 represents integer values between -2147483648 and 2147483647,
41 * inclusively. 41 * inclusively.
42 */ 42 */
43 - INT32, 43 + INT32("int32"),
44 44
45 /** 45 /**
46 * Reference:RFC 6020. 46 * Reference:RFC 6020.
...@@ -48,28 +48,28 @@ public enum YangDataTypes { ...@@ -48,28 +48,28 @@ public enum YangDataTypes {
48 * int64 represents integer values between -9223372036854775808 and 48 * int64 represents integer values between -9223372036854775808 and
49 * 9223372036854775807, inclusively. 49 * 9223372036854775807, inclusively.
50 */ 50 */
51 - INT64, 51 + INT64("int64"),
52 52
53 /** 53 /**
54 * Reference:RFC 6020. 54 * Reference:RFC 6020.
55 * 55 *
56 * uint8 represents integer values between 0 and 255, inclusively. 56 * uint8 represents integer values between 0 and 255, inclusively.
57 */ 57 */
58 - UINT8, 58 + UINT8("uint8"),
59 59
60 /** 60 /**
61 * Reference:RFC 6020. 61 * Reference:RFC 6020.
62 * 62 *
63 * uint16 represents integer values between 0 and 65535, inclusively. 63 * uint16 represents integer values between 0 and 65535, inclusively.
64 */ 64 */
65 - UINT16, 65 + UINT16("uint16"),
66 66
67 /** 67 /**
68 * Reference:RFC 6020. 68 * Reference:RFC 6020.
69 * 69 *
70 * uint32 represents integer values between 0 and 4294967295, inclusively. 70 * uint32 represents integer values between 0 and 4294967295, inclusively.
71 */ 71 */
72 - UINT32, 72 + UINT32("uint32"),
73 73
74 /** 74 /**
75 * Reference:RFC 6020. 75 * Reference:RFC 6020.
...@@ -77,7 +77,7 @@ public enum YangDataTypes { ...@@ -77,7 +77,7 @@ public enum YangDataTypes {
77 * uint64 represents integer values between 0 and 18446744073709551615, 77 * uint64 represents integer values between 0 and 18446744073709551615,
78 * inclusively. 78 * inclusively.
79 */ 79 */
80 - UINT64, 80 + UINT64("uint64"),
81 81
82 /** 82 /**
83 * Reference:RFC 6020. 83 * Reference:RFC 6020.
...@@ -88,7 +88,7 @@ public enum YangDataTypes { ...@@ -88,7 +88,7 @@ public enum YangDataTypes {
88 * a negative power of ten, i.e., expressible as "i x 10^-n" where i is an 88 * a negative power of ten, i.e., expressible as "i x 10^-n" where i is an
89 * integer64 and n is an integer between 1 and 18, inclusively. 89 * integer64 and n is an integer between 1 and 18, inclusively.
90 */ 90 */
91 - DECIMAL64, // TODO: need to implement in type. 91 + DECIMAL64("decimal64"), // TODO: need to implement in type.
92 92
93 /** 93 /**
94 * Reference:RFC 6020. 94 * Reference:RFC 6020.
...@@ -97,14 +97,14 @@ public enum YangDataTypes { ...@@ -97,14 +97,14 @@ public enum YangDataTypes {
97 * characters are tab, carriage return, line feed, and the legal characters 97 * characters are tab, carriage return, line feed, and the legal characters
98 * of Unicode and ISO/IEC 10646 98 * of Unicode and ISO/IEC 10646
99 */ 99 */
100 - STRING, 100 + STRING("string"),
101 101
102 /** 102 /**
103 * Reference:RFC 6020. 103 * Reference:RFC 6020.
104 * 104 *
105 * The boolean built-in type represents a boolean value. 105 * The boolean built-in type represents a boolean value.
106 */ 106 */
107 - BOOLEAN, 107 + BOOLEAN("boolean"),
108 108
109 /** 109 /**
110 * Reference:RFC 6020. 110 * Reference:RFC 6020.
...@@ -112,7 +112,7 @@ public enum YangDataTypes { ...@@ -112,7 +112,7 @@ public enum YangDataTypes {
112 * The enumeration built-in type represents values from a set of assigned 112 * The enumeration built-in type represents values from a set of assigned
113 * names. 113 * names.
114 */ 114 */
115 - ENUMERATION, 115 + ENUMERATION("enumeration"),
116 116
117 /** 117 /**
118 * Reference:RFC 6020. 118 * Reference:RFC 6020.
...@@ -121,7 +121,7 @@ public enum YangDataTypes { ...@@ -121,7 +121,7 @@ public enum YangDataTypes {
121 * set of flags identified by small integer position numbers starting at 0. 121 * set of flags identified by small integer position numbers starting at 0.
122 * Each bit number has an assigned name. 122 * Each bit number has an assigned name.
123 */ 123 */
124 - BITS, 124 + BITS("bits"),
125 125
126 /** 126 /**
127 * Reference:RFC 6020. 127 * Reference:RFC 6020.
...@@ -129,7 +129,7 @@ public enum YangDataTypes { ...@@ -129,7 +129,7 @@ public enum YangDataTypes {
129 * The binary built-in type represents any binary data, i.e., a sequence of 129 * The binary built-in type represents any binary data, i.e., a sequence of
130 * octets. 130 * octets.
131 */ 131 */
132 - BINARY, 132 + BINARY("binary"),
133 133
134 /** 134 /**
135 * Reference:RFC 6020. 135 * Reference:RFC 6020.
...@@ -150,14 +150,14 @@ public enum YangDataTypes { ...@@ -150,14 +150,14 @@ public enum YangDataTypes {
150 * more features, then the leaf with the leafref type MUST also be 150 * more features, then the leaf with the leafref type MUST also be
151 * conditional based on at least the same set of features. 151 * conditional based on at least the same set of features.
152 */ 152 */
153 - LEAFREF, // TODO: need to implement in type. 153 + LEAFREF("leafref"),
154 154
155 /** 155 /**
156 * Reference:RFC 6020. 156 * Reference:RFC 6020.
157 * 157 *
158 * The identityref type is used to reference an existing identity. 158 * The identityref type is used to reference an existing identity.
159 */ 159 */
160 - IDENTITYREF, 160 + IDENTITYREF("identityref"),
161 161
162 /** 162 /**
163 * Reference:RFC 6020. 163 * Reference:RFC 6020.
...@@ -167,7 +167,7 @@ public enum YangDataTypes { ...@@ -167,7 +167,7 @@ public enum YangDataTypes {
167 * 167 *
168 * An empty type cannot have a default value. 168 * An empty type cannot have a default value.
169 */ 169 */
170 - EMPTY, 170 + EMPTY("empty"),
171 171
172 /** 172 /**
173 * Reference:RFC 6020. 173 * Reference:RFC 6020.
...@@ -189,7 +189,7 @@ public enum YangDataTypes { ...@@ -189,7 +189,7 @@ public enum YangDataTypes {
189 * Any default value or "units" property defined in the member types is not 189 * Any default value or "units" property defined in the member types is not
190 * inherited by the union type. 190 * inherited by the union type.
191 */ 191 */
192 - UNION, 192 + UNION("union"),
193 193
194 /** 194 /**
195 * Reference:RFC 6020. 195 * Reference:RFC 6020.
...@@ -212,12 +212,26 @@ public enum YangDataTypes { ...@@ -212,12 +212,26 @@ public enum YangDataTypes {
212 * valid data. All such leaf nodes MUST reference existing nodes or leaf 212 * valid data. All such leaf nodes MUST reference existing nodes or leaf
213 * nodes with their default value in use for the data to be valid. 213 * nodes with their default value in use for the data to be valid.
214 */ 214 */
215 - INSTANCE_IDENTIFIER, 215 + INSTANCE_IDENTIFIER("instance-identifier"),
216 216
217 /** 217 /**
218 * Derived data type. 218 * Derived data type.
219 */ 219 */
220 - DERIVED; 220 + DERIVED("derived");
221 +
222 + /**
223 + * Defined type from the enum value.
224 + */
225 + private String definedType;
226 +
227 + /**
228 + * Constructs type value from enum.
229 + *
230 + * @param definedType value of enum
231 + */
232 + YangDataTypes(String definedType) {
233 + this.definedType = definedType;
234 + }
221 235
222 /** 236 /**
223 * Returns YANG data type for corresponding type name. 237 * Returns YANG data type for corresponding type name.
...@@ -228,7 +242,7 @@ public enum YangDataTypes { ...@@ -228,7 +242,7 @@ public enum YangDataTypes {
228 public static YangDataTypes getType(String name) { 242 public static YangDataTypes getType(String name) {
229 name = name.replace("\"", ""); 243 name = name.replace("\"", "");
230 for (YangDataTypes yangDataType : values()) { 244 for (YangDataTypes yangDataType : values()) {
231 - if (yangDataType.name().toLowerCase().equals(name)) { 245 + if (yangDataType.definedType.toLowerCase().equals(name)) {
232 return yangDataType; 246 return yangDataType;
233 } 247 }
234 } 248 }
......
...@@ -161,6 +161,8 @@ public class YangLinkerManager ...@@ -161,6 +161,8 @@ public class YangLinkerManager
161 ((YangReferenceResolver) yangNode).resolveInterFileLinking(ResolvableType.YANG_USES); 161 ((YangReferenceResolver) yangNode).resolveInterFileLinking(ResolvableType.YANG_USES);
162 ((YangReferenceResolver) yangNode) 162 ((YangReferenceResolver) yangNode)
163 .resolveInterFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); 163 .resolveInterFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE);
164 + ((YangReferenceResolver) yangNode)
165 + .resolveInterFileLinking(ResolvableType.YANG_LEAFREF);
164 } catch (DataModelException e) { 166 } catch (DataModelException e) {
165 String errorInfo = "Error in file: " + yangNode.getName() + " at line: " 167 String errorInfo = "Error in file: " + yangNode.getName() + " at line: "
166 + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE + e.getMessage(); 168 + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE + e.getMessage();
......
...@@ -22,7 +22,8 @@ import java.util.List; ...@@ -22,7 +22,8 @@ import java.util.List;
22 import java.util.Stack; 22 import java.util.Stack;
23 23
24 import org.onosproject.yangutils.datamodel.Resolvable; 24 import org.onosproject.yangutils.datamodel.Resolvable;
25 -import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; 25 +import org.onosproject.yangutils.datamodel.ResolvableType;
26 +import org.onosproject.yangutils.datamodel.YangAtomicPath;
26 import org.onosproject.yangutils.datamodel.YangDerivedInfo; 27 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
27 import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo; 28 import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo;
28 import org.onosproject.yangutils.datamodel.YangFeature; 29 import org.onosproject.yangutils.datamodel.YangFeature;
...@@ -31,15 +32,29 @@ import org.onosproject.yangutils.datamodel.YangGrouping; ...@@ -31,15 +32,29 @@ import org.onosproject.yangutils.datamodel.YangGrouping;
31 import org.onosproject.yangutils.datamodel.YangIfFeature; 32 import org.onosproject.yangutils.datamodel.YangIfFeature;
32 import org.onosproject.yangutils.datamodel.YangImport; 33 import org.onosproject.yangutils.datamodel.YangImport;
33 import org.onosproject.yangutils.datamodel.YangInclude; 34 import org.onosproject.yangutils.datamodel.YangInclude;
35 +import org.onosproject.yangutils.datamodel.YangInput;
36 +import org.onosproject.yangutils.datamodel.YangLeaf;
37 +import org.onosproject.yangutils.datamodel.YangLeafList;
38 +import org.onosproject.yangutils.datamodel.YangLeafRef;
39 +import org.onosproject.yangutils.datamodel.YangLeavesHolder;
40 +import org.onosproject.yangutils.datamodel.YangList;
41 +import org.onosproject.yangutils.datamodel.YangModule;
34 import org.onosproject.yangutils.datamodel.YangNode; 42 import org.onosproject.yangutils.datamodel.YangNode;
35 import org.onosproject.yangutils.datamodel.YangNodeIdentifier; 43 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
44 +import org.onosproject.yangutils.datamodel.YangOutput;
45 +import org.onosproject.yangutils.datamodel.YangPathArgType;
46 +import org.onosproject.yangutils.datamodel.YangPathPredicate;
36 import org.onosproject.yangutils.datamodel.YangReferenceResolver; 47 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
48 +import org.onosproject.yangutils.datamodel.YangRelativePath;
37 import org.onosproject.yangutils.datamodel.YangResolutionInfo; 49 import org.onosproject.yangutils.datamodel.YangResolutionInfo;
50 +import org.onosproject.yangutils.datamodel.YangRpc;
51 +import org.onosproject.yangutils.datamodel.YangSubModule;
38 import org.onosproject.yangutils.datamodel.YangType; 52 import org.onosproject.yangutils.datamodel.YangType;
39 import org.onosproject.yangutils.datamodel.YangTypeDef; 53 import org.onosproject.yangutils.datamodel.YangTypeDef;
40 import org.onosproject.yangutils.datamodel.YangUses; 54 import org.onosproject.yangutils.datamodel.YangUses;
41 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 55 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
42 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; 56 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
57 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
43 import org.onosproject.yangutils.linker.YangLinkingPhase; 58 import org.onosproject.yangutils.linker.YangLinkingPhase;
44 59
45 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTER_FILE_LINKED; 60 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTER_FILE_LINKED;
...@@ -52,6 +67,10 @@ import static org.onosproject.yangutils.linker.YangLinkingPhase.INTER_FILE; ...@@ -52,6 +67,10 @@ import static org.onosproject.yangutils.linker.YangLinkingPhase.INTER_FILE;
52 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTRA_FILE; 67 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTRA_FILE;
53 import static org.onosproject.yangutils.utils.UtilConstants.FEATURE_LINKER_ERROR; 68 import static org.onosproject.yangutils.utils.UtilConstants.FEATURE_LINKER_ERROR;
54 import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERROR; 69 import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERROR;
70 +import static org.onosproject.yangutils.utils.UtilConstants.INPUT;
71 +import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
72 +import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF_LINKER_ERROR;
73 +import static org.onosproject.yangutils.utils.UtilConstants.OUTPUT;
55 import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR; 74 import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR;
56 75
57 /** 76 /**
...@@ -124,7 +143,7 @@ public class YangResolutionInfoImpl<T> ...@@ -124,7 +143,7 @@ public class YangResolutionInfoImpl<T>
124 143
125 setCurReferenceResolver(dataModelRootNode); 144 setCurReferenceResolver(dataModelRootNode);
126 145
127 - // Current node to resolve, it can be a YANG type, YANG uses or YANG if-feature. 146 + // Current node to resolve, it can be a YANG type, YANG uses or YANG if-feature or YANG leafref.
128 T entityToResolve = getEntityToResolveInfo().getEntityToResolve(); 147 T entityToResolve = getEntityToResolveInfo().getEntityToResolve();
129 148
130 // Check if linking is already done 149 // Check if linking is already done
...@@ -138,13 +157,15 @@ public class YangResolutionInfoImpl<T> ...@@ -138,13 +157,15 @@ public class YangResolutionInfoImpl<T>
138 } 157 }
139 } else { 158 } else {
140 throw new DataModelException("Data Model Exception: Entity to resolved is other than " + 159 throw new DataModelException("Data Model Exception: Entity to resolved is other than " +
141 - "type/uses/if-feature"); 160 + "type/uses/if-feature/leafref");
142 } 161 }
143 162
144 // Push the initial entity to resolve in stack. 163 // Push the initial entity to resolve in stack.
145 addInPartialResolvedStack(getEntityToResolveInfo()); 164 addInPartialResolvedStack(getEntityToResolveInfo());
146 165
147 linkAndResolvePartialResolvedStack(); 166 linkAndResolvePartialResolvedStack();
167 +
168 + addDerivedRefTypeToRefTypeResolutionList();
148 } 169 }
149 170
150 /** 171 /**
...@@ -204,8 +225,10 @@ public class YangResolutionInfoImpl<T> ...@@ -204,8 +225,10 @@ public class YangResolutionInfoImpl<T>
204 errorInfo = TYPEDEF_LINKER_ERROR; 225 errorInfo = TYPEDEF_LINKER_ERROR;
205 } else if (resolvable instanceof YangUses) { 226 } else if (resolvable instanceof YangUses) {
206 errorInfo = GROUPING_LINKER_ERROR; 227 errorInfo = GROUPING_LINKER_ERROR;
207 - } else { 228 + } else if (resolvable instanceof YangIfFeature) {
208 errorInfo = FEATURE_LINKER_ERROR; 229 errorInfo = FEATURE_LINKER_ERROR;
230 + } else {
231 + errorInfo = LEAFREF_LINKER_ERROR;
209 } 232 }
210 DataModelException dataModelException = 233 DataModelException dataModelException =
211 new DataModelException(errorInfo); 234 new DataModelException(errorInfo);
...@@ -222,11 +245,75 @@ public class YangResolutionInfoImpl<T> ...@@ -222,11 +245,75 @@ public class YangResolutionInfoImpl<T>
222 } 245 }
223 246
224 } else { 247 } else {
225 - throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 248 + throw new DataModelException(
249 + "Data Model Exception: Entity to resolved is other than type/uses/if-feature/leafref");
250 + }
251 + }
252 +
253 + }
254 +
255 + /**
256 + * Adds the leafref type to the type, which has derived type referring to typedef with leafref type.
257 + */
258 + private void addDerivedRefTypeToRefTypeResolutionList() throws DataModelException {
259 +
260 + YangNode potentialAncestorWithReferredNode = getEntityToResolveInfo().getHolderOfEntityToResolve();
261 +
262 + // If holder is typedef return.
263 + if (potentialAncestorWithReferredNode instanceof YangTypeDef) {
264 + return;
265 + }
266 +
267 + // If entity is not type return.
268 + if (!(getEntityToResolveInfo().getEntityToResolve() instanceof YangType)) {
269 + return;
226 } 270 }
227 271
272 + YangType yangType = (YangType) getEntityToResolveInfo().getEntityToResolve();
273 +
274 + // If type is not resolved return.
275 + if (yangType.getResolvableStatus() != RESOLVED) {
276 + return;
228 } 277 }
229 278
279 + YangDerivedInfo derivedInfo = (YangDerivedInfo) yangType.getDataTypeExtendedInfo();
280 +
281 + /*
282 + * If the derived types referred type is not leaf ref return
283 + */
284 + if (derivedInfo.getEffectiveBuiltInType() != YangDataTypes.LEAFREF) {
285 + return;
286 + }
287 +
288 + T extendedInfo = (T) derivedInfo.getReferredTypeDef().getTypeDefBaseType().getDataTypeExtendedInfo();
289 +
290 + while (extendedInfo instanceof YangDerivedInfo) {
291 + YangDerivedInfo derivedInfoFromTypedef = (YangDerivedInfo) extendedInfo;
292 + extendedInfo = (T) derivedInfoFromTypedef.getReferredTypeDef().getTypeDefBaseType()
293 + .getDataTypeExtendedInfo();
294 + }
295 + /*
296 + * Backup the derived types leaf ref info, delete all the info in
297 + * current type, but for resolution status as resolved. Copy the backed
298 + * up leaf ref to types extended info, create a leaf ref resolution info
299 + * using the current resolution info and add to leaf ref resolution
300 + * list.
301 + */
302 + YangLeafRef leafRefInTypeDef = (YangLeafRef) extendedInfo;
303 + yangType.resetYangType();
304 +
305 + yangType.setResolvableStatus(RESOLVED);
306 + yangType.setDataType(YangDataTypes.LEAFREF);
307 + yangType.setDataTypeName(LEAFREF);
308 + yangType.setDataTypeExtendedInfo(leafRefInTypeDef);
309 + leafRefInTypeDef.setResolvableStatus(UNRESOLVED);
310 +
311 + // Add resolution information to the list.
312 + YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<>(leafRefInTypeDef,
313 + potentialAncestorWithReferredNode, getLineNumber(), getCharPosition());
314 + getCurReferenceResolver().addToResolutionList(resolutionInfoImpl,
315 + ResolvableType.YANG_LEAFREF);
316 + getCurReferenceResolver().resolveSelfFileLinking(ResolvableType.YANG_LEAFREF);
230 } 317 }
231 318
232 /** 319 /**
...@@ -237,7 +324,7 @@ public class YangResolutionInfoImpl<T> ...@@ -237,7 +324,7 @@ public class YangResolutionInfoImpl<T>
237 ((Resolvable) getCurrentEntityToResolveFromStack()).resolve(); 324 ((Resolvable) getCurrentEntityToResolveFromStack()).resolve();
238 if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != INTRA_FILE_RESOLVED 325 if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != INTRA_FILE_RESOLVED
239 && ((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != UNDEFINED) { 326 && ((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != UNDEFINED) {
240 - // Sets the resolution status in inside the type/uses/if-feature. 327 + // Sets the resolution status in inside the type/uses/if-feature/leafref.
241 ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(RESOLVED); 328 ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(RESOLVED);
242 } 329 }
243 } 330 }
...@@ -270,6 +357,9 @@ public class YangResolutionInfoImpl<T> ...@@ -270,6 +357,9 @@ public class YangResolutionInfoImpl<T>
270 if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) { 357 if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
271 resolveSelfFileLinkingForIfFeature(potentialAncestorWithReferredNode); 358 resolveSelfFileLinkingForIfFeature(potentialAncestorWithReferredNode);
272 return; 359 return;
360 + } else if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
361 + resolveSelfFileLinkingForLeafref(potentialAncestorWithReferredNode);
362 + return;
273 } else { 363 } else {
274 364
275 /** 365 /**
...@@ -300,6 +390,91 @@ public class YangResolutionInfoImpl<T> ...@@ -300,6 +390,91 @@ public class YangResolutionInfoImpl<T>
300 } 390 }
301 391
302 /** 392 /**
393 + * Resolves self file linking for leafref.
394 + *
395 + * @param potentialAncestorWithReferredNode leafref holder node
396 + * @throws DataModelException a violation of data model rules
397 + */
398 + private void resolveSelfFileLinkingForLeafref(YangNode potentialAncestorWithReferredNode)
399 + throws DataModelException {
400 +
401 + YangNode ancestorWithTheReferredNode = potentialAncestorWithReferredNode;
402 + YangLeafRef leafref = (YangLeafRef) getCurrentEntityToResolveFromStack();
403 + boolean referredLeafFound = false;
404 +
405 + /*
406 + * Takes absolute path and takes the root node as module/sub-module,
407 + * then sends the list of nodes for finding the target leaf.
408 + */
409 + if (leafref.getPathType() == YangPathArgType.ABSOLUTE_PATH) {
410 + List<YangAtomicPath> atomicPathList = leafref.getAtomicPath();
411 + if (atomicPathList != null && !atomicPathList.isEmpty()) {
412 + Iterator<YangAtomicPath> listOfYangAtomicPath = atomicPathList.listIterator();
413 + if (getCurReferenceResolver() instanceof YangModule) {
414 + YangModule rootNode = (YangModule) getCurReferenceResolver();
415 + // Sends list of nodes for finding the target leaf.
416 + referredLeafFound = isLeafReferenceFound(listOfYangAtomicPath, rootNode,
417 + referredLeafFound, potentialAncestorWithReferredNode);
418 + } else if (getCurReferenceResolver() instanceof YangSubModule) {
419 + YangSubModule rootNode = (YangSubModule) getCurReferenceResolver();
420 + // Sends list of nodes for finding the target leaf.
421 + referredLeafFound = isLeafReferenceFound(listOfYangAtomicPath, rootNode,
422 + referredLeafFound, potentialAncestorWithReferredNode);
423 + }
424 + }
425 + /*
426 + * Takes relative path, goes to the parent node by using the
427 + * ancestor count and sends the list of nodes for finding the target
428 + * leaf.
429 + */
430 + } else if (leafref.getPathType() == YangPathArgType.RELATIVE_PATH) {
431 + YangRelativePath yangRelativePath = leafref.getRelativePath();
432 + int parentNodes = yangRelativePath.getAncestorNodeCount();
433 + List<YangAtomicPath> atomicPathList = yangRelativePath.getAtomicPathList();
434 + if (atomicPathList != null && !atomicPathList.isEmpty()) {
435 + Iterator<YangAtomicPath> listOfAtomicPath = atomicPathList.listIterator();
436 + // Gets the root node from ancestor count.
437 + YangNode rootparentNode = getRootNodeWithAncestorCount(parentNodes, ancestorWithTheReferredNode);
438 + // Sends list of nodes for finding the target leaf.
439 + referredLeafFound = isLeafReferenceFound(listOfAtomicPath, rootparentNode,
440 + referredLeafFound, potentialAncestorWithReferredNode);
441 + }
442 + }
443 + if (referredLeafFound) {
444 + return;
445 + }
446 + /*
447 + * In case prefix is not present it's a candidate for inter-file
448 + * resolution via include list.
449 + */
450 + if (getRefPrefix() == null) {
451 + ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTRA_FILE_RESOLVED);
452 + }
453 + }
454 +
455 + /**
456 + * Returns the root parent with respect to the ancestor count from leafref.
457 + *
458 + * @param ancestorCount count of node where parent node can be reached
459 + * @param currentParent current parent node
460 + * @return root node
461 + * @throws DataModelException a violation of data model rules
462 + */
463 + private YangNode getRootNodeWithAncestorCount(int ancestorCount, YangNode currentParent)
464 + throws DataModelException {
465 +
466 + int currentParentCount = 1;
467 + while (currentParentCount < ancestorCount) {
468 + if (currentParent.getParent() == null) {
469 + throw new DataModelException("YANG file error: The target node of leafref is invalid.");
470 + }
471 + currentParent = currentParent.getParent();
472 + currentParentCount = currentParentCount + 1;
473 + }
474 + return currentParent;
475 + }
476 +
477 + /**
303 * Resolves self file linking for if-feature. 478 * Resolves self file linking for if-feature.
304 * 479 *
305 * @param potentialAncestorWithReferredNode if-feature holder node 480 * @param potentialAncestorWithReferredNode if-feature holder node
...@@ -333,6 +508,289 @@ public class YangResolutionInfoImpl<T> ...@@ -333,6 +508,289 @@ public class YangResolutionInfoImpl<T>
333 } 508 }
334 } 509 }
335 510
511 + /**
512 + * Returns the status of the referred leaf/leaf-list found for leafref.
513 + *
514 + * @param listOfYangAtomicPath list of atomic paths
515 + * @param ancestorWithTheReferredNode the parent node of leafref
516 + * @param referredLeafFound status of referred leaf/leaf-list
517 + * @param potentialAncestorWithReferredNode holder of the leafref leaf
518 + * @return status of referred leaf
519 + * @throws DataModelException a violation of data model rules
520 + */
521 + private boolean isLeafReferenceFound(Iterator<YangAtomicPath> listOfYangAtomicPath,
522 + YangNode ancestorWithTheReferredNode, boolean referredLeafFound, YangNode potentialAncestorWithReferredNode)
523 + throws DataModelException {
524 +
525 + while (listOfYangAtomicPath.hasNext()) {
526 + YangAtomicPath atomicPath = listOfYangAtomicPath.next();
527 + String nodeName = atomicPath.getNodeIdentifier().getName();
528 +
529 + // When child is not present, only leaf/leaf-list is available in the node.
530 + if (ancestorWithTheReferredNode.getChild() == null) {
531 + referredLeafFound = isReferredLeafOrLeafListFound(ancestorWithTheReferredNode, nodeName, (T) LINKED);
532 + break;
533 + }
534 + ancestorWithTheReferredNode = ancestorWithTheReferredNode.getChild();
535 +
536 + // Checks all the siblings under the node and returns the matched node.
537 + YangNode nodeFound = isReferredNodeInSiblingProcessedForLeafref(ancestorWithTheReferredNode, nodeName);
538 +
539 + // When node is not found in all the siblings, leaf-list may be the node we have to find.
540 + if (nodeFound == null) {
541 + referredLeafFound = isReferredLeafOrLeafListFound(ancestorWithTheReferredNode.getParent(), nodeName,
542 + (T) LINKED);
543 + } else {
544 + ancestorWithTheReferredNode = nodeFound;
545 +
546 + // For the node check if path predicate is present and fill its values.
547 + List<YangPathPredicate> pathPredicateList = atomicPath.getPathPredicatesList();
548 + if (pathPredicateList != null && !pathPredicateList.isEmpty()) {
549 + Iterator<YangPathPredicate> listOfYangPathPredicate = pathPredicateList.listIterator();
550 + fillPathPredicatesForTheNode(ancestorWithTheReferredNode, listOfYangPathPredicate,
551 + potentialAncestorWithReferredNode);
552 + }
553 + }
554 +
555 + // If leaf is also not found and node is also not found return the status as false.
556 + if (!referredLeafFound && nodeFound == null) {
557 + break;
558 + }
559 + }
560 + return referredLeafFound;
561 + }
562 +
563 + /**
564 + * Fills the referred leaf or leaf-list inside the path predicates.
565 + *
566 + * @param ancestorWithTheReferredNode the actual node where YANG list will be present
567 + * @param listOfYangPathPredicate the path predicates present for the node
568 + * @param potentialAncestorWithReferredNode the current leaf node parent
569 + * @throws DataModelException a violation of data model rules
570 + */
571 + private void fillPathPredicatesForTheNode(YangNode ancestorWithTheReferredNode,
572 + Iterator<YangPathPredicate> listOfYangPathPredicate, YangNode potentialAncestorWithReferredNode)
573 + throws DataModelException {
574 +
575 + while (listOfYangPathPredicate.hasNext()) {
576 + if (!(ancestorWithTheReferredNode instanceof YangList)) {
577 + throw new DataModelException("YANG file error: The path predicates are applicable only for list");
578 + }
579 + YangPathPredicate pathPredicate = listOfYangPathPredicate.next();
580 + YangNodeIdentifier leftNode = pathPredicate.getNodeIdentifier();
581 + YangRelativePath relativePath = pathPredicate.getRightRelativePath();
582 +
583 + // Checks that the left axis is filled in the path predicate.
584 + boolean isLeftLeafOrLeafListSetForLeftAxis = getLeftLeafOrLeafListInPredicate(
585 + (YangList) ancestorWithTheReferredNode, pathPredicate, leftNode);
586 + if (!isLeftLeafOrLeafListSetForLeftAxis) {
587 + throw new DataModelException(
588 + "YANG file error: The path predicate is not referring to an existing leaf/leaflist");
589 + }
590 + int parentNodes = relativePath.getAncestorNodeCount();
591 +
592 + // Finds the root node for the right relative path.
593 + YangNode rootParentNode = getRootNodeWithAncestorCount(parentNodes, potentialAncestorWithReferredNode);
594 +
595 + // Finds the leaf/leaf-list from the right side relative path.
596 + resolveRightAxisNodeInPathPredicate(relativePath, rootParentNode, pathPredicate);
597 + }
598 + }
599 +
600 + /**
601 + * Resolves the right axis node in the path predicate.
602 + *
603 + * @param relativePath the relative path in the path predicate
604 + * @param rootParentNode parent node from where the node has to be found
605 + * @param pathPredicate data tree reference in YANG list
606 + * @throws DataModelException a violation of data model rules
607 + */
608 + private void resolveRightAxisNodeInPathPredicate(YangRelativePath relativePath, YangNode rootParentNode,
609 + YangPathPredicate pathPredicate) throws DataModelException {
610 +
611 + List<YangAtomicPath> absolutePathList = relativePath.getAtomicPathList();
612 + if (absolutePathList != null && !absolutePathList.isEmpty()) {
613 + Iterator<YangAtomicPath> listOfYangAtomicPathForRightRelative = absolutePathList.listIterator();
614 + while (listOfYangAtomicPathForRightRelative.hasNext()) {
615 + boolean isRightAxisNodeFound = false;
616 + YangAtomicPath absolutePathInPredicate = listOfYangAtomicPathForRightRelative.next();
617 + String nodeNameInAtomicPath = absolutePathInPredicate.getNodeIdentifier().getName();
618 +
619 + // When child is not there check the leaf/leaf-list.
620 + if (rootParentNode.getChild() == null) {
621 + isRightAxisNodeFound = isReferredLeafOrLeafListFound(rootParentNode,
622 + nodeNameInAtomicPath, (T) pathPredicate);
623 + if (!isRightAxisNodeFound) {
624 + throw new DataModelException(
625 + "YANG file error: The path predicates is not referring to an existing leaf/leaflist");
626 + }
627 + break;
628 + }
629 + rootParentNode = rootParentNode.getChild();
630 + YangNode nodeFoundInTheRelativePath = isReferredNodeInSiblingProcessedForLeafref(
631 + rootParentNode, nodeNameInAtomicPath);
632 +
633 + if (nodeFoundInTheRelativePath == null) {
634 +
635 + // When node is not found check the leaf/leaf-list.
636 + isRightAxisNodeFound = isReferredLeafOrLeafListFound(rootParentNode.getParent(),
637 + nodeNameInAtomicPath, (T) pathPredicate);
638 + } else {
639 + rootParentNode = nodeFoundInTheRelativePath;
640 + }
641 + if (!isRightAxisNodeFound && nodeFoundInTheRelativePath == null) {
642 + throw new DataModelException(
643 + "YANG file error: The path predicates is not referring to an existing leaf/leaflist");
644 + }
645 + }
646 + }
647 + }
648 +
649 + /**
650 + * Returns the status, if referred leaf/leaf-list is found.
651 + *
652 + * @param ancestorWithTheReferredNode the parent node of leaf/leaf-list
653 + * @param nodeName the name of the leaf/leaf-list
654 + * @param statusOrPathPredicate the status to be set for the leaf-ref or the path predicate
655 + * @return status of the target node is found
656 + * @throws DataModelException a violation of data model rules
657 + */
658 + private boolean isReferredLeafOrLeafListFound(YangNode ancestorWithTheReferredNode, String nodeName,
659 + T statusOrPathPredicate) throws DataModelException {
660 +
661 + if (!(ancestorWithTheReferredNode instanceof YangLeavesHolder)) {
662 + throw new DataModelException("Yang file error: The target node of leafref is invalid.");
663 + }
664 + YangLeavesHolder leavesHolder = (YangLeavesHolder) ancestorWithTheReferredNode;
665 + if (leavesHolder.getListOfLeaf() != null) {
666 + Iterator<YangLeaf> yangLeavesList = leavesHolder.getListOfLeaf().listIterator();
667 + while (yangLeavesList.hasNext()) {
668 + YangLeaf yangleaf = yangLeavesList.next();
669 + if (yangleaf.getName().contentEquals(nodeName)) {
670 + if (statusOrPathPredicate instanceof ResolvableStatus) {
671 + ResolvableStatus status = (ResolvableStatus) statusOrPathPredicate;
672 +
673 + // Sets the referred leaf to YANG leafref.
674 + ((YangLeafRef) getCurrentEntityToResolveFromStack()).setReferredLeafOrLeafList(yangleaf);
675 +
676 + // Adds reference link of entity to the node under resolution.
677 + addReferredEntityLink(ancestorWithTheReferredNode, status);
678 + addUnResolvedLeafRefTypeToStack((T) yangleaf, ancestorWithTheReferredNode);
679 + return true;
680 + } else if (statusOrPathPredicate instanceof YangPathPredicate) {
681 + YangPathPredicate pathPredicate = (YangPathPredicate) statusOrPathPredicate;
682 +
683 + // Sets the right axis node.
684 + pathPredicate.setRightAxisNode(yangleaf);
685 + return true;
686 + } else {
687 + throw new DataModelException("YANG file error: The target node of leafref is invalid.");
688 + }
689 + }
690 + }
691 + }
692 + if (leavesHolder.getListOfLeafList() != null) {
693 + Iterator<YangLeafList> yangLeafListList = leavesHolder.getListOfLeafList().listIterator();
694 + while (yangLeafListList.hasNext()) {
695 + YangLeafList yangLeaflist = yangLeafListList.next();
696 + if (yangLeaflist.getName().contentEquals(nodeName)) {
697 + if (statusOrPathPredicate instanceof ResolvableStatus) {
698 + ResolvableStatus status = (ResolvableStatus) statusOrPathPredicate;
699 +
700 + // Sets the referred leaf-list to YANG leafref.
701 + ((YangLeafRef) getCurrentEntityToResolveFromStack()).setReferredLeafOrLeafList(yangLeaflist);
702 +
703 + // Adds reference link of entity to the node under resolution.
704 + addReferredEntityLink(ancestorWithTheReferredNode, status);
705 + addUnResolvedLeafRefTypeToStack((T) yangLeaflist, ancestorWithTheReferredNode);
706 + return true;
707 + } else if (statusOrPathPredicate instanceof YangPathPredicate) {
708 + YangPathPredicate pathPredicate = (YangPathPredicate) statusOrPathPredicate;
709 + pathPredicate.setRightAxisNode(yangLeaflist);
710 + return true;
711 + } else {
712 + throw new DataModelException("YANG file error: The target node of leafref is invalid.");
713 + }
714 + }
715 + }
716 + }
717 + return false;
718 + }
719 +
720 + /**
721 + * Adds the unresolved constructs to stack which has to be resolved for leafref.
722 + *
723 + * @param yangleafOrLeafList YANG leaf or leaf list which holds the type
724 + * @param ancestorWithTheReferredNode holder of the YANG leaf or leaf list
725 + */
726 + private void addUnResolvedLeafRefTypeToStack(T yangleafOrLeafList, YangNode ancestorWithTheReferredNode) {
727 +
728 + YangType referredTypeInLeafOrLeafList;
729 + if (yangleafOrLeafList instanceof YangLeaf) {
730 + YangLeaf leaf = (YangLeaf) yangleafOrLeafList;
731 + referredTypeInLeafOrLeafList = leaf.getDataType();
732 + if (referredTypeInLeafOrLeafList.getDataType() == YangDataTypes.LEAFREF) {
733 + YangEntityToResolveInfoImpl<YangLeafRef<?>> unResolvedEntityInfo = new YangEntityToResolveInfoImpl<>();
734 + unResolvedEntityInfo.setEntityToResolve((YangLeafRef<?>) leaf.getDataType().getDataTypeExtendedInfo());
735 + unResolvedEntityInfo.setHolderOfEntityToResolve(ancestorWithTheReferredNode);
736 + addInPartialResolvedStack((YangEntityToResolveInfoImpl<T>) unResolvedEntityInfo);
737 + } else if (referredTypeInLeafOrLeafList.getDataType() == YangDataTypes.DERIVED) {
738 + YangEntityToResolveInfoImpl<YangType<?>> unResolvedEntityInfo = new YangEntityToResolveInfoImpl<>();
739 + unResolvedEntityInfo.setEntityToResolve(referredTypeInLeafOrLeafList);
740 + unResolvedEntityInfo.setHolderOfEntityToResolve(ancestorWithTheReferredNode);
741 + addInPartialResolvedStack((YangEntityToResolveInfoImpl<T>) unResolvedEntityInfo);
742 + }
743 + } else {
744 + YangLeafList leafList = (YangLeafList) yangleafOrLeafList;
745 + referredTypeInLeafOrLeafList = leafList.getDataType();
746 + if (referredTypeInLeafOrLeafList.getDataType() == YangDataTypes.LEAFREF) {
747 + YangEntityToResolveInfoImpl<YangLeafRef<?>> unResolvedEntityInfo = new YangEntityToResolveInfoImpl<>();
748 + unResolvedEntityInfo
749 + .setEntityToResolve((YangLeafRef<?>) leafList.getDataType().getDataTypeExtendedInfo());
750 + unResolvedEntityInfo.setHolderOfEntityToResolve(ancestorWithTheReferredNode);
751 + addInPartialResolvedStack((YangEntityToResolveInfoImpl<T>) unResolvedEntityInfo);
752 + } else if (referredTypeInLeafOrLeafList.getDataType() == YangDataTypes.DERIVED) {
753 + YangEntityToResolveInfoImpl<YangType<?>> unResolvedEntityInfo = new YangEntityToResolveInfoImpl<>();
754 + unResolvedEntityInfo.setEntityToResolve(referredTypeInLeafOrLeafList);
755 + unResolvedEntityInfo.setHolderOfEntityToResolve(ancestorWithTheReferredNode);
756 + addInPartialResolvedStack((YangEntityToResolveInfoImpl<T>) unResolvedEntityInfo);
757 + }
758 + }
759 + }
760 +
761 + /**
762 + * Returns true if referred leaf/leaf-list is found in a particular node. This is for path in path predicate.
763 + *
764 + * @param listForLeaf list node where referred leaf is found
765 + * @param pathPredicate path predicate instance where the value of nodes to be found are available
766 + * @param leftNode node identifier of the left side parameter in path predicate
767 + * @return status of the leaf/leaf-list found
768 + */
769 + private boolean getLeftLeafOrLeafListInPredicate(YangList listForLeaf, YangPathPredicate pathPredicate,
770 + YangNodeIdentifier leftNode) {
771 +
772 + if (listForLeaf.getListOfLeaf() != null) {
773 + Iterator<YangLeaf> yangLeavesUnderList = listForLeaf.getListOfLeaf().listIterator();
774 + while (yangLeavesUnderList.hasNext()) {
775 + YangLeaf yangleafUnderList = yangLeavesUnderList.next();
776 + if (yangleafUnderList.getName().contentEquals(leftNode.getName())) {
777 + pathPredicate.setLeftAxisNode(yangleafUnderList);
778 + return true;
779 + }
780 + }
781 + }
782 + if (listForLeaf.getListOfLeafList() != null) {
783 + Iterator<YangLeafList> yangLeavesListUnderList = listForLeaf.getListOfLeafList().listIterator();
784 + while (yangLeavesListUnderList.hasNext()) {
785 + YangLeafList yangleafListUnderList = yangLeavesListUnderList.next();
786 + if (yangleafListUnderList.getName().contentEquals(leftNode.getName())) {
787 + pathPredicate.setLeftAxisNode(yangleafListUnderList);
788 + return true;
789 + }
790 + }
791 + }
792 + return false;
793 + }
336 794
337 /** 795 /**
338 * Returns feature holder(module/sub-module node) . 796 * Returns feature holder(module/sub-module node) .
...@@ -362,12 +820,70 @@ public class YangResolutionInfoImpl<T> ...@@ -362,12 +820,70 @@ public class YangResolutionInfoImpl<T>
362 } 820 }
363 821
364 /** 822 /**
823 + * Checks for the referred parent node for the leafref path.
824 + *
825 + * @param potentialReferredNode potential referred node
826 + * @return the reffered parent node of leaf/leaf-list
827 + * @throws DataModelException data model errors
828 + */
829 + private YangNode isReferredNodeInSiblingProcessedForLeafref(YangNode potentialReferredNode, String referredNodeName)
830 + throws DataModelException {
831 +
832 + while (potentialReferredNode != null) {
833 + if (potentialReferredNode instanceof YangInput) {
834 + if (referredNodeName.equalsIgnoreCase(INPUT)) {
835 + return potentialReferredNode;
836 + }
837 + } else if (potentialReferredNode instanceof YangOutput) {
838 + if (referredNodeName.equalsIgnoreCase(OUTPUT)) {
839 + return potentialReferredNode;
840 + }
841 + }
842 + // Check if the potential referred node is the actual referred node
843 + if (isReferredNodeForLeafref(potentialReferredNode, referredNodeName)) {
844 + if (potentialReferredNode instanceof YangGrouping || potentialReferredNode instanceof YangTypeDef) {
845 + if (potentialReferredNode.getParent() instanceof YangRpc) {
846 + potentialReferredNode = potentialReferredNode.getNextSibling();
847 + } else {
848 + throw new DataModelException("YANG file error: The target node of leafref is invalid.");
849 + }
850 + }
851 + return potentialReferredNode;
852 + }
853 + potentialReferredNode = potentialReferredNode.getNextSibling();
854 + }
855 + return null;
856 + }
857 +
858 + /**
859 + * Checks if the current reference node name and the name in the path are equal.
860 + *
861 + * @param currentReferredNode the node where the reference is pointed
862 + * @param nameOfNodeinPath name of the node in the path
863 + * @return status of the match between the name
864 + * @throws DataModelException a violation of data model rules
865 + */
866 + private boolean isReferredNodeForLeafref(YangNode currentReferredNode, String nameOfNodeinPath)
867 + throws DataModelException {
868 +
869 + if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
870 + /*
871 + * Check if name of node name matches with the current reference
872 + * node.
873 + */
874 + return currentReferredNode.getName().contentEquals(nameOfNodeinPath);
875 + } else {
876 + throw new DataModelException("Data Model Exception: Entity to resolved is other than leafref");
877 + }
878 + }
879 +
880 + /**
365 * Checks for the referred node defined in a ancestor scope. 881 * Checks for the referred node defined in a ancestor scope.
366 * 882 *
367 * @param potentialReferredNode potential referred node 883 * @param potentialReferredNode potential referred node
368 * @return status of resolution and updating the partial resolved stack with 884 * @return status of resolution and updating the partial resolved stack with
369 * the any recursive references 885 * the any recursive references
370 - * @throws DataModelException data model errors 886 + * @throws DataModelException a violation of data model rules
371 */ 887 */
372 private boolean isReferredNodeInSiblingListProcessed(YangNode potentialReferredNode) 888 private boolean isReferredNodeInSiblingListProcessed(YangNode potentialReferredNode)
373 throws DataModelException { 889 throws DataModelException {
...@@ -502,6 +1018,8 @@ public class YangResolutionInfoImpl<T> ...@@ -502,6 +1018,8 @@ public class YangResolutionInfoImpl<T>
502 .setRefGroup((YangGrouping) referredNode); 1018 .setRefGroup((YangGrouping) referredNode);
503 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) { 1019 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
504 // do nothing , referred node is already set 1020 // do nothing , referred node is already set
1021 + } else if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
1022 + // do nothing , referred node is already set
505 } else { 1023 } else {
506 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 1024 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
507 } 1025 }
...@@ -541,7 +1059,8 @@ public class YangResolutionInfoImpl<T> ...@@ -541,7 +1059,8 @@ public class YangResolutionInfoImpl<T>
541 addUnResolvedUsesToStack(referredNode); 1059 addUnResolvedUsesToStack(referredNode);
542 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) { 1060 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
543 addUnResolvedIfFeatureToStack(referredNode); 1061 addUnResolvedIfFeatureToStack(referredNode);
544 - } else { 1062 + } else if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
1063 + // do nothing , referred node is already set
545 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 1064 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
546 } 1065 }
547 } 1066 }
...@@ -706,6 +1225,9 @@ public class YangResolutionInfoImpl<T> ...@@ -706,6 +1225,9 @@ public class YangResolutionInfoImpl<T>
706 1225
707 // Inter file linking and resolution. 1226 // Inter file linking and resolution.
708 linkInterFileAndResolve(); 1227 linkInterFileAndResolve();
1228 +
1229 + // Resolve the derived types having leafref.
1230 + addDerivedRefTypeToRefTypeResolutionList();
709 } 1231 }
710 1232
711 /** 1233 /**
...@@ -723,6 +1245,8 @@ public class YangResolutionInfoImpl<T> ...@@ -723,6 +1245,8 @@ public class YangResolutionInfoImpl<T>
723 refPrefix = ((YangUses) getCurrentEntityToResolveFromStack()).getPrefix(); 1245 refPrefix = ((YangUses) getCurrentEntityToResolveFromStack()).getPrefix();
724 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) { 1246 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
725 refPrefix = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getPrefix(); 1247 refPrefix = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getPrefix();
1248 + } else if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
1249 + refPrefix = refPrefixForLeafRef();
726 } else { 1250 } else {
727 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 1251 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
728 } 1252 }
...@@ -730,6 +1254,27 @@ public class YangResolutionInfoImpl<T> ...@@ -730,6 +1254,27 @@ public class YangResolutionInfoImpl<T>
730 } 1254 }
731 1255
732 /** 1256 /**
1257 + * Returns the referenced prefix for leafref under resolution.
1258 + *
1259 + * @return referenced prefix of leafref under resolution
1260 + */
1261 + private String refPrefixForLeafRef() {
1262 +
1263 + String refPrefix;
1264 + if (((YangLeafRef) getCurrentEntityToResolveFromStack()).getPathType() == YangPathArgType.ABSOLUTE_PATH) {
1265 + List<YangAtomicPath> theList = ((YangLeafRef) getCurrentEntityToResolveFromStack()).getAtomicPath();
1266 + YangAtomicPath absPath = theList.iterator().next();
1267 + refPrefix = absPath.getNodeIdentifier().getPrefix();
1268 + } else {
1269 + YangRelativePath relativePath = ((YangLeafRef) getCurrentEntityToResolveFromStack()).getRelativePath();
1270 + List<YangAtomicPath> theList = relativePath.getAtomicPathList();
1271 + YangAtomicPath absPath = theList.iterator().next();
1272 + refPrefix = absPath.getNodeIdentifier().getPrefix();
1273 + }
1274 + return refPrefix;
1275 + }
1276 +
1277 + /**
733 * Performs inter file linking and resolution. 1278 * Performs inter file linking and resolution.
734 * 1279 *
735 * @throws DataModelException a violation in data model rule 1280 * @throws DataModelException a violation in data model rule
...@@ -838,9 +1383,19 @@ public class YangResolutionInfoImpl<T> ...@@ -838,9 +1383,19 @@ public class YangResolutionInfoImpl<T>
838 ((YangIfFeature) getCurrentEntityToResolveFromStack()).setResolvableStatus(UNDEFINED); 1383 ((YangIfFeature) getCurrentEntityToResolveFromStack()).setResolvableStatus(UNDEFINED);
839 return; 1384 return;
840 } 1385 }
841 - // Exception when referred typedef/grouping is not found. 1386 + // If current entity is still not resolved, then
842 - DataModelException dataModelException = new DataModelException("YANG file error: Referred " + 1387 + // linking/resolution has failed.
843 - "typedef/grouping for a given type/uses can't be found."); 1388 + String errorInfo;
1389 + if (getCurrentEntityToResolveFromStack() instanceof YangType) {
1390 + errorInfo = TYPEDEF_LINKER_ERROR;
1391 + } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
1392 + errorInfo = GROUPING_LINKER_ERROR;
1393 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
1394 + errorInfo = FEATURE_LINKER_ERROR;
1395 + } else {
1396 + errorInfo = LEAFREF_LINKER_ERROR;
1397 + }
1398 + DataModelException dataModelException = new DataModelException(errorInfo);
844 dataModelException.setLine(getLineNumber()); 1399 dataModelException.setLine(getLineNumber());
845 dataModelException.setCharPosition(getCharPosition()); 1400 dataModelException.setCharPosition(getCharPosition());
846 throw dataModelException; 1401 throw dataModelException;
...@@ -849,10 +1404,21 @@ public class YangResolutionInfoImpl<T> ...@@ -849,10 +1404,21 @@ public class YangResolutionInfoImpl<T>
849 * If referred node is already linked, then just change the status 1404 * If referred node is already linked, then just change the status
850 * and push to the stack. 1405 * and push to the stack.
851 */ 1406 */
1407 + if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
1408 + ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTER_FILE_LINKED);
1409 + if (referredNode instanceof YangLeaf) {
1410 + YangLeaf yangleaf = (YangLeaf) referredNode;
1411 + addUnResolvedLeafRefTypeToStack((T) yangleaf, (YangNode) yangleaf.getContainedIn());
1412 + } else if (referredNode instanceof YangLeafList) {
1413 + YangLeafList yangLeafList = (YangLeafList) referredNode;
1414 + addUnResolvedLeafRefTypeToStack((T) yangLeafList, (YangNode) yangLeafList.getContainedIn());
1415 + }
1416 + } else {
852 ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTER_FILE_LINKED); 1417 ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTER_FILE_LINKED);
853 addUnresolvedRecursiveReferenceToStack((YangNode) referredNode); 1418 addUnresolvedRecursiveReferenceToStack((YangNode) referredNode);
854 } 1419 }
855 } 1420 }
1421 + }
856 1422
857 /** 1423 /**
858 * Finds and resolves with include list. 1424 * Finds and resolves with include list.
...@@ -874,6 +1440,15 @@ public class YangResolutionInfoImpl<T> ...@@ -874,6 +1440,15 @@ public class YangResolutionInfoImpl<T>
874 linkedNode = findRefGrouping(yangInclude.getIncludedNode()); 1440 linkedNode = findRefGrouping(yangInclude.getIncludedNode());
875 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) { 1441 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
876 linkedNode = findRefFeature(yangInclude.getIncludedNode()); 1442 linkedNode = findRefFeature(yangInclude.getIncludedNode());
1443 + } else if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
1444 + boolean referredNode = findRefLeaf(yangInclude.getIncludedNode());
1445 + /*
1446 + * Update the current reference resolver to external
1447 + * module/sub-module containing the referred typedef/grouping.
1448 + */
1449 + setCurReferenceResolver((YangReferenceResolver) yangInclude.getIncludedNode());
1450 +
1451 + return referredNode;
877 } 1452 }
878 if (linkedNode != null) { 1453 if (linkedNode != null) {
879 // Add the link to external entity. 1454 // Add the link to external entity.
...@@ -917,6 +1492,16 @@ public class YangResolutionInfoImpl<T> ...@@ -917,6 +1492,16 @@ public class YangResolutionInfoImpl<T>
917 linkedNode = findRefGrouping(yangImport.getImportedNode()); 1492 linkedNode = findRefGrouping(yangImport.getImportedNode());
918 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) { 1493 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
919 linkedNode = findRefFeature(yangImport.getImportedNode()); 1494 linkedNode = findRefFeature(yangImport.getImportedNode());
1495 + } else if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
1496 + boolean referredNode = findRefLeaf(yangImport.getImportedNode());
1497 + /*
1498 + * Update the current reference resolver to external
1499 + * module/sub-module containing the referred
1500 + * typedef/grouping.
1501 + */
1502 + setCurReferenceResolver((YangReferenceResolver) yangImport.getImportedNode());
1503 +
1504 + return referredNode;
920 } 1505 }
921 if (linkedNode != null) { 1506 if (linkedNode != null) {
922 // Add the link to external entity. 1507 // Add the link to external entity.
...@@ -944,6 +1529,44 @@ public class YangResolutionInfoImpl<T> ...@@ -944,6 +1529,44 @@ public class YangResolutionInfoImpl<T>
944 } 1529 }
945 1530
946 /** 1531 /**
1532 + * Returns the status of referred leaf.
1533 + *
1534 + * @param importedNode the root node from a YANG file
1535 + * @return status of the referred leaf
1536 + * @throws DataModelException
1537 + */
1538 + private boolean findRefLeaf(YangNode importedNode) throws DataModelException {
1539 +
1540 + boolean isReferredNodeFound = false;
1541 + List<YangAtomicPath> absolutePathList = ((YangLeafRef) getCurrentEntityToResolveFromStack())
1542 + .getAtomicPath();
1543 + if (absolutePathList != null && !absolutePathList.isEmpty()) {
1544 + Iterator<YangAtomicPath> listOfYangAtomicPath = absolutePathList.listIterator();
1545 +
1546 + while (listOfYangAtomicPath.hasNext()) {
1547 + YangAtomicPath absolutePath = listOfYangAtomicPath.next();
1548 + String nodeName = absolutePath.getNodeIdentifier().getName();
1549 +
1550 + if (importedNode.getChild() == null) {
1551 + isReferredNodeFound = isReferredLeafOrLeafListFound(importedNode, nodeName, (T) INTER_FILE_LINKED);
1552 + break;
1553 + }
1554 + importedNode = importedNode.getChild();
1555 +
1556 + YangNode nodeFound = isReferredNodeInSiblingProcessedForLeafref(importedNode, nodeName);
1557 + if (nodeFound == null) {
1558 + isReferredNodeFound = isReferredLeafOrLeafListFound(importedNode.getParent(), nodeName,
1559 + (T) INTER_FILE_LINKED);
1560 + } else {
1561 + importedNode = nodeFound;
1562 + }
1563 + }
1564 + }
1565 + // TODO: Path predicates filling for inter file has to be done.
1566 + return isReferredNodeFound;
1567 + }
1568 +
1569 + /**
947 * Returns referred typedef/grouping node. 1570 * Returns referred typedef/grouping node.
948 * 1571 *
949 * @return referred typedef/grouping node 1572 * @return referred typedef/grouping node
...@@ -959,6 +1582,8 @@ public class YangResolutionInfoImpl<T> ...@@ -959,6 +1582,8 @@ public class YangResolutionInfoImpl<T>
959 return (T) ((YangUses) getCurrentEntityToResolveFromStack()).getRefGroup(); 1582 return (T) ((YangUses) getCurrentEntityToResolveFromStack()).getRefGroup();
960 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) { 1583 } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
961 return (T) ((YangIfFeature) getCurrentEntityToResolveFromStack()).getReferredFeatureHolder(); 1584 return (T) ((YangIfFeature) getCurrentEntityToResolveFromStack()).getReferredFeatureHolder();
1585 + } else if (getCurrentEntityToResolveFromStack() instanceof YangLeafRef) {
1586 + return (T) ((YangLeafRef) getCurrentEntityToResolveFromStack()).getReferredLeafOrLeafList();
962 } else { 1587 } else {
963 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 1588 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
964 } 1589 }
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
16 16
17 // Generated from GeneratedYang.g4 by ANTLR 4.5 17 // Generated from GeneratedYang.g4 by ANTLR 4.5
18 18
19 -
20 package org.onosproject.yangutils.parser.antlrgencode; 19 package org.onosproject.yangutils.parser.antlrgencode;
21 20
22 import org.antlr.v4.runtime.tree.ParseTreeListener; 21 import org.antlr.v4.runtime.tree.ParseTreeListener;
...@@ -1950,4 +1949,18 @@ public interface GeneratedYangListener extends ParseTreeListener { ...@@ -1950,4 +1949,18 @@ public interface GeneratedYangListener extends ParseTreeListener {
1950 */ 1949 */
1951 void exitAnnotationIdentifier(GeneratedYangParser.AnnotationIdentifierContext 1950 void exitAnnotationIdentifier(GeneratedYangParser.AnnotationIdentifierContext
1952 currentContext); 1951 currentContext);
1952 +
1953 + /**
1954 + * Enters a parse tree produced by GeneratedYangParser for grammar rule require instance.
1955 + *
1956 + * @param currentContext current context in the parsed tree
1957 + */
1958 + void enterRequireInstance(GeneratedYangParser.RequireInstanceContext currentContext);
1959 +
1960 + /**
1961 + * Exits a parse tree produced by GeneratedYangParser for grammar require instance.
1962 + *
1963 + * @param currentContext current context in the parsed tree
1964 + */
1965 + void exitRequireInstance(GeneratedYangParser.RequireInstanceContext currentContext);
1953 } 1966 }
......
...@@ -49,6 +49,7 @@ import org.onosproject.yangutils.parser.impl.listeners.InputListener; ...@@ -49,6 +49,7 @@ import org.onosproject.yangutils.parser.impl.listeners.InputListener;
49 import org.onosproject.yangutils.parser.impl.listeners.KeyListener; 49 import org.onosproject.yangutils.parser.impl.listeners.KeyListener;
50 import org.onosproject.yangutils.parser.impl.listeners.LeafListListener; 50 import org.onosproject.yangutils.parser.impl.listeners.LeafListListener;
51 import org.onosproject.yangutils.parser.impl.listeners.LeafListener; 51 import org.onosproject.yangutils.parser.impl.listeners.LeafListener;
52 +import org.onosproject.yangutils.parser.impl.listeners.LeafrefListener;
52 import org.onosproject.yangutils.parser.impl.listeners.LengthRestrictionListener; 53 import org.onosproject.yangutils.parser.impl.listeners.LengthRestrictionListener;
53 import org.onosproject.yangutils.parser.impl.listeners.ListListener; 54 import org.onosproject.yangutils.parser.impl.listeners.ListListener;
54 import org.onosproject.yangutils.parser.impl.listeners.MandatoryListener; 55 import org.onosproject.yangutils.parser.impl.listeners.MandatoryListener;
...@@ -56,16 +57,18 @@ import org.onosproject.yangutils.parser.impl.listeners.MaxElementsListener; ...@@ -56,16 +57,18 @@ import org.onosproject.yangutils.parser.impl.listeners.MaxElementsListener;
56 import org.onosproject.yangutils.parser.impl.listeners.MinElementsListener; 57 import org.onosproject.yangutils.parser.impl.listeners.MinElementsListener;
57 import org.onosproject.yangutils.parser.impl.listeners.ModuleListener; 58 import org.onosproject.yangutils.parser.impl.listeners.ModuleListener;
58 import org.onosproject.yangutils.parser.impl.listeners.MustListener; 59 import org.onosproject.yangutils.parser.impl.listeners.MustListener;
59 -import org.onosproject.yangutils.parser.impl.listeners.NotificationListener;
60 import org.onosproject.yangutils.parser.impl.listeners.NamespaceListener; 60 import org.onosproject.yangutils.parser.impl.listeners.NamespaceListener;
61 +import org.onosproject.yangutils.parser.impl.listeners.NotificationListener;
61 import org.onosproject.yangutils.parser.impl.listeners.OrganizationListener; 62 import org.onosproject.yangutils.parser.impl.listeners.OrganizationListener;
62 import org.onosproject.yangutils.parser.impl.listeners.OutputListener; 63 import org.onosproject.yangutils.parser.impl.listeners.OutputListener;
64 +import org.onosproject.yangutils.parser.impl.listeners.PathListener;
63 import org.onosproject.yangutils.parser.impl.listeners.PatternRestrictionListener; 65 import org.onosproject.yangutils.parser.impl.listeners.PatternRestrictionListener;
64 import org.onosproject.yangutils.parser.impl.listeners.PositionListener; 66 import org.onosproject.yangutils.parser.impl.listeners.PositionListener;
65 import org.onosproject.yangutils.parser.impl.listeners.PrefixListener; 67 import org.onosproject.yangutils.parser.impl.listeners.PrefixListener;
66 import org.onosproject.yangutils.parser.impl.listeners.PresenceListener; 68 import org.onosproject.yangutils.parser.impl.listeners.PresenceListener;
67 import org.onosproject.yangutils.parser.impl.listeners.RangeRestrictionListener; 69 import org.onosproject.yangutils.parser.impl.listeners.RangeRestrictionListener;
68 import org.onosproject.yangutils.parser.impl.listeners.ReferenceListener; 70 import org.onosproject.yangutils.parser.impl.listeners.ReferenceListener;
71 +import org.onosproject.yangutils.parser.impl.listeners.RequireInstanceListener;
69 import org.onosproject.yangutils.parser.impl.listeners.RevisionDateListener; 72 import org.onosproject.yangutils.parser.impl.listeners.RevisionDateListener;
70 import org.onosproject.yangutils.parser.impl.listeners.RevisionListener; 73 import org.onosproject.yangutils.parser.impl.listeners.RevisionListener;
71 import org.onosproject.yangutils.parser.impl.listeners.RpcListener; 74 import org.onosproject.yangutils.parser.impl.listeners.RpcListener;
...@@ -81,9 +84,9 @@ import org.onosproject.yangutils.parser.impl.listeners.ValueListener; ...@@ -81,9 +84,9 @@ import org.onosproject.yangutils.parser.impl.listeners.ValueListener;
81 import org.onosproject.yangutils.parser.impl.listeners.VersionListener; 84 import org.onosproject.yangutils.parser.impl.listeners.VersionListener;
82 import org.onosproject.yangutils.parser.impl.listeners.WhenListener; 85 import org.onosproject.yangutils.parser.impl.listeners.WhenListener;
83 86
84 -import static org.onosproject.yangutils.utils.UtilConstants.UNSUPPORTED_YANG_CONSTRUCT;
85 -import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED;
86 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.handleUnsupportedYangConstruct; 87 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.handleUnsupportedYangConstruct;
88 +import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED;
89 +import static org.onosproject.yangutils.utils.UtilConstants.UNSUPPORTED_YANG_CONSTRUCT;
87 90
88 /** 91 /**
89 * Represents ANTLR generates parse-tree. ANTLR generates a parse-tree listener interface that responds to events 92 * Represents ANTLR generates parse-tree. ANTLR generates a parse-tree listener interface that responds to events
...@@ -667,17 +670,17 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -667,17 +670,17 @@ public class TreeWalkListener implements GeneratedYangListener {
667 670
668 @Override 671 @Override
669 public void enterLeafrefSpecification(GeneratedYangParser.LeafrefSpecificationContext ctx) { 672 public void enterLeafrefSpecification(GeneratedYangParser.LeafrefSpecificationContext ctx) {
670 - // do nothing. 673 + LeafrefListener.processLeafrefEntry(this, ctx);
671 } 674 }
672 675
673 @Override 676 @Override
674 public void exitLeafrefSpecification(GeneratedYangParser.LeafrefSpecificationContext ctx) { 677 public void exitLeafrefSpecification(GeneratedYangParser.LeafrefSpecificationContext ctx) {
675 - // do nothing. 678 + LeafrefListener.processLeafrefExit(this, ctx);
676 } 679 }
677 680
678 @Override 681 @Override
679 public void enterPathStatement(GeneratedYangParser.PathStatementContext ctx) { 682 public void enterPathStatement(GeneratedYangParser.PathStatementContext ctx) {
680 - handleUnsupportedYangConstruct(YangConstructType.PATH_DATA, ctx, CURRENTLY_UNSUPPORTED); 683 + PathListener.processPathEntry(this, ctx);
681 } 684 }
682 685
683 @Override 686 @Override
...@@ -687,7 +690,7 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -687,7 +690,7 @@ public class TreeWalkListener implements GeneratedYangListener {
687 690
688 @Override 691 @Override
689 public void enterRequireInstanceStatement(GeneratedYangParser.RequireInstanceStatementContext ctx) { 692 public void enterRequireInstanceStatement(GeneratedYangParser.RequireInstanceStatementContext ctx) {
690 - handleUnsupportedYangConstruct(YangConstructType.REQUIRE_INSTANCE_DATA, ctx, UNSUPPORTED_YANG_CONSTRUCT); 693 + RequireInstanceListener.processRequireInstanceEntry(this, ctx);
691 } 694 }
692 695
693 @Override 696 @Override
...@@ -1489,6 +1492,16 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -1489,6 +1492,16 @@ public class TreeWalkListener implements GeneratedYangListener {
1489 } 1492 }
1490 1493
1491 @Override 1494 @Override
1495 + public void enterRequireInstance(GeneratedYangParser.RequireInstanceContext ctx) {
1496 + // do nothing.
1497 + }
1498 +
1499 + @Override
1500 + public void exitRequireInstance(GeneratedYangParser.RequireInstanceContext ctx) {
1501 + // do nothing.
1502 + }
1503 +
1504 + @Override
1492 public void enterFraction(GeneratedYangParser.FractionContext ctx) { 1505 public void enterFraction(GeneratedYangParser.FractionContext ctx) {
1493 // TODO: implement the method. 1506 // TODO: implement the method.
1494 } 1507 }
......
1 +/*
2 + * Copyright 2016-present 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 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.onosproject.yangutils.datamodel.YangLeaf;
20 +import org.onosproject.yangutils.datamodel.YangLeafList;
21 +import org.onosproject.yangutils.datamodel.YangLeafRef;
22 +import org.onosproject.yangutils.datamodel.YangNode;
23 +import org.onosproject.yangutils.datamodel.YangType;
24 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
25 +import org.onosproject.yangutils.datamodel.utils.Parsable;
26 +import org.onosproject.yangutils.linker.impl.YangResolutionInfoImpl;
27 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
28 +import org.onosproject.yangutils.parser.exceptions.ParserException;
29 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
30 +
31 +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.addResolutionInfo;
32 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.UNRESOLVED;
33 +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.LEAFREF_DATA;
34 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
35 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
36 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
37 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
38 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
39 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
40 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
41 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
42 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
43 +
44 +/*
45 + * Reference: RFC6020 and YANG ANTLR Grammar
46 + *
47 + * ABNF grammar as per RFC6020
48 + * type-body-stmts = numerical-restrictions /
49 + * decimal64-specification /
50 + * string-restrictions /
51 + * enum-specification /
52 + * leafref-specification /
53 + * identityref-specification /
54 + * instance-identifier-specification /
55 + * bits-specification /
56 + * union-specification
57 + *
58 + * leafref-specification =
59 + * ;; these stmts can appear in any order
60 + * path-stmt stmtsep
61 + * [require-instance-stmt stmtsep]
62 + *
63 + * ANTLR grammar rule
64 + *
65 + * typeBodyStatements : numericalRestrictions | stringRestrictions | enumSpecification
66 + * | leafrefSpecification | identityrefSpecification | instanceIdentifierSpecification
67 + * | bitsSpecification | unionSpecification;
68 + *
69 + * leafrefSpecification : (pathStatement (requireInstanceStatement)?) | ((requireInstanceStatement)? pathStatement);
70 + */
71 +
72 +/**
73 + * Represents listener based call back function corresponding to the
74 + * "leafref" rule defined in ANTLR grammar file for corresponding ABNF rule
75 + * in RFC 6020.
76 + */
77 +public final class LeafrefListener {
78 +
79 + /**
80 + * Creates a new leafref listener.
81 + */
82 + private LeafrefListener() {
83 + }
84 +
85 + /**
86 + * It is called when parser receives an input matching the grammar rule
87 + * (leafref), perform validations and updates the data model tree.
88 + *
89 + * @param listener listener's object
90 + * @param ctx context object of the grammar rule
91 + */
92 + public static void processLeafrefEntry(TreeWalkListener listener,
93 + GeneratedYangParser.LeafrefSpecificationContext ctx) {
94 +
95 + // Check for stack to be non empty.
96 + checkStackIsNotEmpty(listener, MISSING_HOLDER, LEAFREF_DATA, "", ENTRY);
97 +
98 + int errorLine = ctx.getStart().getLine();
99 + int errorPosition = ctx.getStart().getCharPositionInLine();
100 +
101 + YangLeafRef<?> leafRef = new YangLeafRef<>();
102 +
103 + Parsable typeData = listener.getParsedDataStack().pop();
104 +
105 + if (!(typeData instanceof YangType)) {
106 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAFREF_DATA,
107 + "", ENTRY));
108 + }
109 +
110 + YangType type = (YangType) typeData;
111 + type.setDataTypeExtendedInfo(leafRef);
112 +
113 + // Setting by default the value of require-instance as true.
114 + leafRef.setRequireInstance(true);
115 + Parsable tmpData = listener.getParsedDataStack().peek();
116 +
117 + switch (tmpData.getYangConstructType()) {
118 +
119 + case LEAF_DATA:
120 +
121 + // Parent YANG node of leaf to be added in resolution information.
122 + YangLeaf leaf = (YangLeaf) listener.getParsedDataStack().pop();
123 + Parsable parentNodeOfLeaf = listener.getParsedDataStack().peek();
124 + listener.getParsedDataStack().push(leaf);
125 +
126 + // Verify parent node of leaf.
127 + if (!(parentNodeOfLeaf instanceof YangNode)) {
128 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAFREF_DATA,
129 + "", ENTRY));
130 + }
131 +
132 + leafRef.setResolvableStatus(UNRESOLVED);
133 +
134 + // Add resolution information to the list.
135 + YangResolutionInfoImpl resolutionInfo = new YangResolutionInfoImpl<YangLeafRef>(leafRef,
136 + (YangNode) parentNodeOfLeaf, errorLine, errorPosition);
137 + addToResolutionList(resolutionInfo);
138 + break;
139 +
140 + case LEAF_LIST_DATA:
141 +
142 + // Parent YANG node of leaf-list to be added in resolution information.
143 + YangLeafList leafList = (YangLeafList) listener.getParsedDataStack().pop();
144 + Parsable parentNodeOfLeafList = listener.getParsedDataStack().peek();
145 + listener.getParsedDataStack().push(leafList);
146 +
147 + // Verify parent node of leaf-list.
148 + if (!(parentNodeOfLeafList instanceof YangNode)) {
149 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAFREF_DATA,
150 + "", ENTRY));
151 + }
152 +
153 + leafRef.setResolvableStatus(UNRESOLVED);
154 +
155 + // Add resolution information to the list.
156 + YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<YangLeafRef>(leafRef,
157 + (YangNode) parentNodeOfLeafList, errorLine, errorPosition);
158 + addToResolutionList(resolutionInfoImpl);
159 + break;
160 +
161 + case TYPEDEF_DATA:
162 + /*
163 + * Do not add the leaf ref to resolution list. It needs to be
164 + * added to resolution list, when leaf/leaf list references to
165 + * this typedef. At this time that leaf/leaf-list becomes the
166 + * parent for the leafref.
167 + */
168 + break;
169 +
170 + default:
171 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAFREF_DATA,
172 + "", ENTRY));
173 + }
174 + listener.getParsedDataStack().push(typeData);
175 + listener.getParsedDataStack().push(leafRef);
176 + }
177 +
178 + /**
179 + * It is called when parser exits from grammar rule (leafref), it performs
180 + * validation and updates the data model tree.
181 + *
182 + * @param listener listener's object
183 + * @param ctx context object of the grammar rule
184 + */
185 + public static void processLeafrefExit(TreeWalkListener listener,
186 + GeneratedYangParser.LeafrefSpecificationContext ctx) {
187 +
188 + // Check for stack to be non empty.
189 + checkStackIsNotEmpty(listener, MISSING_CURRENT_HOLDER, LEAFREF_DATA, "", EXIT);
190 +
191 + Parsable parsableType = listener.getParsedDataStack().pop();
192 + if (!(parsableType instanceof YangLeafRef)) {
193 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAFREF_DATA,
194 + "", EXIT));
195 + }
196 + }
197 +
198 + /**
199 + * Adds to resolution list.
200 + *
201 + * @param resolutionInfo resolution information
202 + */
203 + private static void addToResolutionList(YangResolutionInfoImpl resolutionInfo) {
204 +
205 + try {
206 + addResolutionInfo(resolutionInfo);
207 + } catch (DataModelException e) {
208 + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
209 + LEAFREF_DATA, "", ENTRY, e.getMessage()));
210 + }
211 + }
212 +}
...@@ -128,6 +128,8 @@ public final class ModuleListener { ...@@ -128,6 +128,8 @@ public final class ModuleListener {
128 .peek()).resolveSelfFileLinking(ResolvableType.YANG_USES); 128 .peek()).resolveSelfFileLinking(ResolvableType.YANG_USES);
129 ((YangReferenceResolver) listener.getParsedDataStack() 129 ((YangReferenceResolver) listener.getParsedDataStack()
130 .peek()).resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); 130 .peek()).resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE);
131 + ((YangReferenceResolver) listener.getParsedDataStack()
132 + .peek()).resolveSelfFileLinking(ResolvableType.YANG_LEAFREF);
131 } catch (DataModelException e) { 133 } catch (DataModelException e) {
132 LinkerException linkerException = new LinkerException(e.getMessage()); 134 LinkerException linkerException = new LinkerException(e.getMessage());
133 linkerException.setLine(e.getLineNumber()); 135 linkerException.setLine(e.getLineNumber());
......
1 +/*
2 + * Copyright 2016-present 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 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.onosproject.yangutils.datamodel.YangLeafRef;
20 +import org.onosproject.yangutils.datamodel.utils.Parsable;
21 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
22 +import org.onosproject.yangutils.parser.exceptions.ParserException;
23 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
24 +
25 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
26 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.validatePathArgument;
27 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
28 +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.PATH_DATA;
29 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
30 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
31 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
32 +
33 +/*
34 + * Reference: RFC6020 and YANG ANTLR Grammar
35 + *
36 + * ABNF grammar as per RFC6020
37 + * leafref-specification =
38 + * ;; these stmts can appear in any order
39 + * path-stmt stmtsep
40 + * [require-instance-stmt stmtsep]
41 + *
42 + * path-stmt = path-keyword sep path-arg-str stmtend
43 + *
44 + * ANTLR grammar rule
45 + *
46 + * leafrefSpecification : (pathStatement (requireInstanceStatement)?) | ((requireInstanceStatement)? pathStatement);
47 + *
48 + * pathStatement : PATH_KEYWORD path STMTEND;
49 + */
50 +
51 +/**
52 + * Represents listener based call back function corresponding to the
53 + * "path" rule defined in ANTLR grammar file for corresponding ABNF rule
54 + * in RFC 6020.
55 + */
56 +public final class PathListener {
57 +
58 + /**
59 + * Creates a new path listener.
60 + */
61 + private PathListener() {
62 + }
63 +
64 + /**
65 + * It is called when parser receives an input matching the grammar rule
66 + * (path), performs validation and updates the data model tree.
67 + *
68 + * @param listener listener's object
69 + * @param ctx context object of the grammar rule
70 + */
71 + public static void processPathEntry(TreeWalkListener listener,
72 + GeneratedYangParser.PathStatementContext ctx) {
73 +
74 + // Check for stack to be non empty.
75 + checkStackIsNotEmpty(listener, MISSING_HOLDER, PATH_DATA, ctx.path().getText(), ENTRY);
76 +
77 + Parsable curData = listener.getParsedDataStack().peek();
78 +
79 + // Checks the holder of path as leafref, else throws error.
80 + if (curData instanceof YangLeafRef) {
81 +
82 + // Splitting the path argument and updating it in the datamodel tree.
83 + validatePathArgument(ctx.path().getText(), PATH_DATA, ctx, (YangLeafRef) curData);
84 + } else {
85 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, PATH_DATA,
86 + ctx.path().getText(), ENTRY));
87 + }
88 + }
89 +}
1 +/*
2 + * Copyright 2016-present 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 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.onosproject.yangutils.datamodel.YangLeafRef;
20 +import org.onosproject.yangutils.datamodel.YangType;
21 +import org.onosproject.yangutils.datamodel.utils.Parsable;
22 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
23 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
24 +import org.onosproject.yangutils.parser.exceptions.ParserException;
25 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
26 +
27 +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.REQUIRE_INSTANCE_DATA;
28 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
29 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidBooleanValue;
30 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
31 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
32 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
33 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
34 +
35 +/*
36 + * Reference: RFC6020 and YANG ANTLR Grammar
37 + *
38 + * ABNF grammar as per RFC6020
39 + * require-instance-stmt = require-instance-keyword sep
40 + * require-instance-arg-str stmtend
41 + *
42 + * require-instance-arg-str = < a string that matches the rule
43 + * require-instance-arg >
44 + *
45 + * require-instance-arg = true-keyword / false-keyword
46 + *
47 + * ANTLR grammar rule
48 + *
49 + * requireInstanceStatement : REQUIRE_INSTANCE_KEYWORD requireInstance STMTEND;
50 + *
51 + * requireInstance : string;
52 + */
53 +
54 +/**
55 + * Represents listener based call back function corresponding to the
56 + * "require-instance" rule defined in ANTLR grammar file for corresponding ABNF rule
57 + * in RFC 6020.
58 + */
59 +public final class RequireInstanceListener {
60 +
61 + /**
62 + * Creates a new require instance listener.
63 + */
64 + private RequireInstanceListener() {
65 + }
66 +
67 + /**
68 + * It is called when parser receives an input matching the grammar rule
69 + * (require-instance), performs validation and updates the data model tree.
70 + *
71 + * @param listener listener's object
72 + * @param ctx context object of the grammar rule
73 + */
74 + public static void processRequireInstanceEntry(TreeWalkListener listener,
75 + GeneratedYangParser.RequireInstanceStatementContext ctx) {
76 +
77 + // Check for stack to be non empty.
78 + checkStackIsNotEmpty(listener, MISSING_HOLDER, REQUIRE_INSTANCE_DATA, "", ENTRY);
79 +
80 + Parsable curData = listener.getParsedDataStack().peek();
81 +
82 + // Gets the status of require instance
83 + boolean isRequireInstance = getValidBooleanValue(ctx.requireInstance().getText(), REQUIRE_INSTANCE_DATA, ctx);
84 +
85 + // Checks the holder of require-instance as leafref or type, else throws error.
86 + if (curData instanceof YangLeafRef) {
87 +
88 + // Sets the require-instance status to leafref.
89 + ((YangLeafRef) curData).setRequireInstance(isRequireInstance);
90 + } else if (curData instanceof YangType) {
91 +
92 + // Checks type should be instance-identifier, else throw error.
93 + if (((YangType) curData).getDataType() == YangDataTypes.INSTANCE_IDENTIFIER) {
94 +
95 + // Sets the require-instance status to instance-identifier type.
96 + ((YangType) curData).setDataTypeExtendedInfo(isRequireInstance);
97 + } else {
98 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, REQUIRE_INSTANCE_DATA,
99 + ctx.getText(), ENTRY));
100 + }
101 + } else {
102 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, REQUIRE_INSTANCE_DATA,
103 + ctx.getText(), ENTRY));
104 + }
105 + }
106 +}
...@@ -133,6 +133,8 @@ public final class SubModuleListener { ...@@ -133,6 +133,8 @@ public final class SubModuleListener {
133 .resolveSelfFileLinking(ResolvableType.YANG_USES); 133 .resolveSelfFileLinking(ResolvableType.YANG_USES);
134 ((YangReferenceResolver) listener.getParsedDataStack().peek()) 134 ((YangReferenceResolver) listener.getParsedDataStack().peek())
135 .resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); 135 .resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE);
136 + ((YangReferenceResolver) listener.getParsedDataStack().peek())
137 + .resolveSelfFileLinking(ResolvableType.YANG_LEAFREF);
136 } catch (DataModelException e) { 138 } catch (DataModelException e) {
137 LinkerException linkerException = new LinkerException(e.getMessage()); 139 LinkerException linkerException = new LinkerException(e.getMessage());
138 linkerException.setLine(e.getLineNumber()); 140 linkerException.setLine(e.getLineNumber());
......
...@@ -101,6 +101,9 @@ public final class TypeListener { ...@@ -101,6 +101,9 @@ public final class TypeListener {
101 type.setNodeIdentifier(nodeIdentifier); 101 type.setNodeIdentifier(nodeIdentifier);
102 type.setDataType(yangDataTypes); 102 type.setDataType(yangDataTypes);
103 103
104 + // Set default require instance value as true for instance identifier.
105 + setDefaultRequireInstanceForInstanceIdentifier(type);
106 +
104 int errorLine = ctx.getStart().getLine(); 107 int errorLine = ctx.getStart().getLine();
105 int errorPosition = ctx.getStart().getCharPositionInLine(); 108 int errorPosition = ctx.getStart().getCharPositionInLine();
106 109
...@@ -233,6 +236,18 @@ public final class TypeListener { ...@@ -233,6 +236,18 @@ public final class TypeListener {
233 } 236 }
234 237
235 /** 238 /**
239 + * Sets the default require instance value as true when the type is instance identifier.
240 + *
241 + * @param type type to which the value has to be set
242 + */
243 + private static void setDefaultRequireInstanceForInstanceIdentifier(YangType<?> type) {
244 +
245 + if (type.getDataType() == YangDataTypes.INSTANCE_IDENTIFIER) {
246 + ((YangType<Boolean>) type).setDataTypeExtendedInfo(true);
247 + }
248 + }
249 +
250 + /**
236 * It is called when parser exits from grammar rule (type), it perform 251 * It is called when parser exits from grammar rule (type), it perform
237 * validations and update the data model tree. 252 * validations and update the data model tree.
238 * 253 *
...@@ -291,7 +306,11 @@ public final class TypeListener { ...@@ -291,7 +306,11 @@ public final class TypeListener {
291 parserException = new ParserException("YANG file error : a type bits" + 306 parserException = new ParserException("YANG file error : a type bits" +
292 " must have atleast one bit statement."); 307 " must have atleast one bit statement.");
293 break; 308 break;
294 - // TODO : decimal64, identity ref, leafref 309 + case LEAFREF:
310 + parserException = new ParserException("YANG file error : a type leafref" +
311 + " must have one path statement.");
312 + break;
313 + // TODO : decimal64, identity ref
295 default: 314 default:
296 return; 315 return;
297 } 316 }
......
...@@ -18,28 +18,44 @@ package org.onosproject.yangutils.parser.impl.parserutils; ...@@ -18,28 +18,44 @@ package org.onosproject.yangutils.parser.impl.parserutils;
18 18
19 import java.text.ParseException; 19 import java.text.ParseException;
20 import java.text.SimpleDateFormat; 20 import java.text.SimpleDateFormat;
21 +import java.util.ArrayList;
21 import java.util.Date; 22 import java.util.Date;
23 +import java.util.Iterator;
22 import java.util.LinkedList; 24 import java.util.LinkedList;
23 import java.util.List; 25 import java.util.List;
24 import java.util.regex.Pattern; 26 import java.util.regex.Pattern;
25 27
26 import org.antlr.v4.runtime.ParserRuleContext; 28 import org.antlr.v4.runtime.ParserRuleContext;
29 +import org.onosproject.yangutils.datamodel.YangAtomicPath;
30 +import org.onosproject.yangutils.datamodel.YangLeafRef;
27 import org.onosproject.yangutils.datamodel.YangNodeIdentifier; 31 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
32 +import org.onosproject.yangutils.datamodel.YangPathPredicate;
33 +import org.onosproject.yangutils.datamodel.YangRelativePath;
28 import org.onosproject.yangutils.datamodel.utils.YangConstructType; 34 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
29 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; 35 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
30 import org.onosproject.yangutils.parser.exceptions.ParserException; 36 import org.onosproject.yangutils.parser.exceptions.ParserException;
31 37
38 +import static org.onosproject.yangutils.datamodel.YangPathArgType.ABSOLUTE_PATH;
39 +import static org.onosproject.yangutils.datamodel.YangPathArgType.RELATIVE_PATH;
40 +import static org.onosproject.yangutils.datamodel.YangPathOperator.EQUALTO;
32 import static org.onosproject.yangutils.utils.UtilConstants.ADD; 41 import static org.onosproject.yangutils.utils.UtilConstants.ADD;
42 +import static org.onosproject.yangutils.utils.UtilConstants.ANCESTOR_ACCESSOR;
43 +import static org.onosproject.yangutils.utils.UtilConstants.ANCESTOR_ACCESSOR_IN_PATH;
33 import static org.onosproject.yangutils.utils.UtilConstants.CARET; 44 import static org.onosproject.yangutils.utils.UtilConstants.CARET;
45 +import static org.onosproject.yangutils.utils.UtilConstants.CHAR_OF_CLOSE_SQUARE_BRACKET;
46 +import static org.onosproject.yangutils.utils.UtilConstants.CHAR_OF_OPEN_SQUARE_BRACKET;
47 +import static org.onosproject.yangutils.utils.UtilConstants.CHAR_OF_SLASH;
48 +import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
34 import static org.onosproject.yangutils.utils.UtilConstants.COLON; 49 import static org.onosproject.yangutils.utils.UtilConstants.COLON;
50 +import static org.onosproject.yangutils.utils.UtilConstants.CURRENT;
35 import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED; 51 import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED;
36 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING; 52 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
37 import static org.onosproject.yangutils.utils.UtilConstants.FALSE; 53 import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
38 import static org.onosproject.yangutils.utils.UtilConstants.IDENTITYREF; 54 import static org.onosproject.yangutils.utils.UtilConstants.IDENTITYREF;
39 -import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE_IDENTIFIER; 55 +import static org.onosproject.yangutils.utils.UtilConstants.OPEN_SQUARE_BRACKET;
40 -import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
41 import static org.onosproject.yangutils.utils.UtilConstants.QUOTES; 56 import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
42 import static org.onosproject.yangutils.utils.UtilConstants.SLASH; 57 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
58 +import static org.onosproject.yangutils.utils.UtilConstants.SLASH_FOR_STRING;
43 import static org.onosproject.yangutils.utils.UtilConstants.TRUE; 59 import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
44 import static org.onosproject.yangutils.utils.UtilConstants.YANG_FILE_ERROR; 60 import static org.onosproject.yangutils.utils.UtilConstants.YANG_FILE_ERROR;
45 61
...@@ -52,6 +68,7 @@ public final class ListenerUtil { ...@@ -52,6 +68,7 @@ public final class ListenerUtil {
52 private static final String DATE_PATTERN = "[0-9]{4}-([0-9]{2}|[0-9])-([0-9]{2}|[0-9])"; 68 private static final String DATE_PATTERN = "[0-9]{4}-([0-9]{2}|[0-9])-([0-9]{2}|[0-9])";
53 private static final String NON_NEGATIVE_INTEGER_PATTERN = "[0-9]+"; 69 private static final String NON_NEGATIVE_INTEGER_PATTERN = "[0-9]+";
54 private static final Pattern INTEGER_PATTERN = Pattern.compile("[-][0-9]+|[0-9]+"); 70 private static final Pattern INTEGER_PATTERN = Pattern.compile("[-][0-9]+|[0-9]+");
71 + private static final Pattern PATH_PREDICATE_PATTERN = Pattern.compile("\\[(.*?)\\]");
55 private static final String XML = "xml"; 72 private static final String XML = "xml";
56 private static final String ONE = "1"; 73 private static final String ONE = "1";
57 private static final int IDENTIFIER_LENGTH = 64; 74 private static final int IDENTIFIER_LENGTH = 64;
...@@ -115,6 +132,42 @@ public final class ListenerUtil { ...@@ -115,6 +132,42 @@ public final class ListenerUtil {
115 } 132 }
116 133
117 /** 134 /**
135 + * Validates identifier and returns concatenated string if string contains plus symbol.
136 + *
137 + * @param identifier string from yang file
138 + * @param yangConstruct yang construct for creating error message
139 + * @param ctx yang construct's context to get the line number and character position
140 + * @param yangLeafRef instance of leafref where the path argument has to be set
141 + * @return concatenated string after removing double quotes
142 + */
143 + public static String getValidIdentifierForLeafref(String identifier, YangConstructType yangConstruct,
144 + ParserRuleContext ctx, YangLeafRef yangLeafRef) {
145 +
146 + String identifierString = removeQuotesAndHandleConcat(identifier);
147 + ParserException parserException;
148 +
149 + if (identifierString.length() > IDENTIFIER_LENGTH) {
150 + parserException = new ParserException("YANG file error : " + " identifier " + identifierString + " in " +
151 + YangConstructType.getYangConstructType(yangConstruct) + " " + yangLeafRef.getPath() + " is " +
152 + "greater than 64 characters.");
153 + } else if (!IDENTIFIER_PATTERN.matcher(identifierString).matches()) {
154 + parserException = new ParserException("YANG file error : " + " identifier " + identifierString + " in " +
155 + YangConstructType.getYangConstructType(yangConstruct) + " " + yangLeafRef.getPath() + " is not " +
156 + "valid.");
157 + } else if (identifierString.toLowerCase().startsWith(XML)) {
158 + parserException = new ParserException("YANG file error : " + " identifier " + identifierString + " in " +
159 + YangConstructType.getYangConstructType(yangConstruct) + " " + yangLeafRef.getPath() +
160 + " must not start with (('X'|'x') ('M'|'m') ('L'|'l')).");
161 + } else {
162 + return identifierString;
163 + }
164 +
165 + parserException.setLine(ctx.getStart().getLine());
166 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
167 + throw parserException;
168 + }
169 +
170 + /**
118 * Validates the revision date. 171 * Validates the revision date.
119 * 172 *
120 * @param dateToValidate input revision date 173 * @param dateToValidate input revision date
...@@ -307,6 +360,352 @@ public final class ListenerUtil { ...@@ -307,6 +360,352 @@ public final class ListenerUtil {
307 } 360 }
308 361
309 /** 362 /**
363 + * Checks and return valid node identifier specific to nodes in leafref path.
364 + *
365 + * @param nodeIdentifierString string from yang file
366 + * @param yangConstruct yang construct for creating error message
367 + * @param ctx yang construct's context to get the line number and character position
368 + * @param yangLeafRef instance of leafref where the path argument has to be set
369 + * @return valid node identifier
370 + */
371 + public static YangNodeIdentifier getValidNodeIdentifierForLeafref(String nodeIdentifierString,
372 + YangConstructType yangConstruct, ParserRuleContext ctx, YangLeafRef yangLeafRef) {
373 +
374 + String tmpIdentifierString = removeQuotesAndHandleConcat(nodeIdentifierString);
375 + String[] tmpData = tmpIdentifierString.split(Pattern.quote(COLON));
376 + if (tmpData.length == 1) {
377 + YangNodeIdentifier nodeIdentifier = new YangNodeIdentifier();
378 + checkForUnsupportedTypes(tmpData[0], yangConstruct, ctx);
379 + nodeIdentifier.setName(getValidIdentifierForLeafref(tmpData[0], yangConstruct, ctx, yangLeafRef));
380 + return nodeIdentifier;
381 + } else if (tmpData.length == 2) {
382 + YangNodeIdentifier nodeIdentifier = new YangNodeIdentifier();
383 + nodeIdentifier.setPrefix(getValidIdentifierForLeafref(tmpData[0], yangConstruct, ctx, yangLeafRef));
384 + nodeIdentifier.setName(getValidIdentifierForLeafref(tmpData[1], yangConstruct, ctx, yangLeafRef));
385 + return nodeIdentifier;
386 + } else {
387 + ParserException parserException = new ParserException("YANG file error : " +
388 + YangConstructType.getYangConstructType(yangConstruct) + yangLeafRef.getPath() +
389 + " is not valid.");
390 + parserException.setLine(ctx.getStart().getLine());
391 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
392 + throw parserException;
393 + }
394 + }
395 +
396 + /**
397 + * Validates the path argument. It can be either absolute or relative path.
398 + *
399 + * @param pathString the path string from the path type
400 + * @param yangConstruct yang construct for creating error message
401 + * @param ctx yang construct's context to get the line number and character position
402 + * @param yangLeafRef instance of leafref where the path argument has to be set
403 + */
404 + public static void validatePathArgument(String pathString, YangConstructType yangConstruct,
405 + ParserRuleContext ctx, YangLeafRef yangLeafRef) {
406 +
407 + String completePathString = removeQuotesAndHandleConcat(pathString);
408 + yangLeafRef.setPath(completePathString);
409 + if (completePathString.startsWith(SLASH)) {
410 + yangLeafRef.setPathType(ABSOLUTE_PATH);
411 + List<YangAtomicPath> yangAtomicPathListList = validateAbsolutePath(completePathString, yangConstruct, ctx,
412 + yangLeafRef);
413 + yangLeafRef.setAtomicPath(yangAtomicPathListList);
414 + } else if (completePathString.startsWith(ANCESTOR_ACCESSOR)) {
415 + yangLeafRef.setPathType(RELATIVE_PATH);
416 + validateRelativePath(completePathString, yangConstruct, ctx, yangLeafRef);
417 + } else {
418 + ParserException parserException = new ParserException("YANG file error : " +
419 + YangConstructType.getYangConstructType(yangConstruct) + yangLeafRef.getPath() +
420 + " does not follow valid path syntax");
421 + parserException.setLine(ctx.getStart().getLine());
422 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
423 + throw parserException;
424 + }
425 + }
426 +
427 + /**
428 + * Validates the relative path.
429 + *
430 + * @param completePathString the path string of relative path
431 + * @param yangConstruct yang construct for creating error message
432 + * @param ctx yang construct's context to get the line number and character position
433 + * @param yangLeafRef instance of leafref where the path argument has to be set
434 + */
435 + private static void validateRelativePath(String completePathString, YangConstructType yangConstruct,
436 + ParserRuleContext ctx, YangLeafRef yangLeafRef) {
437 +
438 + YangRelativePath relativePath = new YangRelativePath();
439 + int numberOfAncestors = 0;
440 + while (completePathString.startsWith(ANCESTOR_ACCESSOR_IN_PATH)) {
441 + completePathString = completePathString.replaceFirst(ANCESTOR_ACCESSOR_IN_PATH, EMPTY_STRING);
442 + numberOfAncestors = numberOfAncestors + 1;
443 + }
444 + if (completePathString == null || completePathString.length() == 0) {
445 + ParserException parserException = new ParserException("YANG file error : "
446 + + YangConstructType.getYangConstructType(yangConstruct) + yangLeafRef.getPath() +
447 + " does not follow valid path syntax");
448 + parserException.setLine(ctx.getStart().getLine());
449 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
450 + throw parserException;
451 + }
452 + relativePath.setAncestorNodeCount(numberOfAncestors);
453 + List<YangAtomicPath> atomicPath = validateAbsolutePath(SLASH_FOR_STRING + completePathString,
454 + yangConstruct,
455 + ctx, yangLeafRef);
456 + relativePath.setAtomicPathList(atomicPath);
457 + yangLeafRef.setRelativePath(relativePath);
458 + }
459 +
460 + /**
461 + * Validates the absolute path.
462 + *
463 + * @param completePathString the path string of absolute path
464 + * @param yangConstruct yang construct for creating error message
465 + * @param ctx yang construct's context to get the line number and character position
466 + * @param yangLeafRef instance of leafref where the path argument has to be set
467 + * @return list of object of node in absolute path
468 + */
469 + private static List<YangAtomicPath> validateAbsolutePath(String completePathString,
470 + YangConstructType yangConstruct, ParserRuleContext ctx, YangLeafRef yangLeafRef) {
471 +
472 + List<YangAtomicPath> absolutePathList = new LinkedList<>();
473 + YangPathPredicate yangPathPredicate = new YangPathPredicate();
474 + YangNodeIdentifier yangNodeIdentifier;
475 +
476 + while (completePathString != null) {
477 + String path = completePathString.replaceFirst(SLASH_FOR_STRING, EMPTY_STRING);
478 + if (path == null || path.length() == 0) {
479 + ParserException parserException = new ParserException("YANG file error : "
480 + + YangConstructType.getYangConstructType(yangConstruct) + " " + yangLeafRef.getPath() +
481 + " does not follow valid path syntax");
482 + parserException.setLine(ctx.getStart().getLine());
483 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
484 + throw parserException;
485 + }
486 + String matchedPathPredicate;
487 + String nodeIdentifier;
488 + String[] differentiate = new String[2];
489 + int forNodeIdentifier = path.indexOf(CHAR_OF_SLASH);
490 + int forPathPredicate = path.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
491 +
492 + // Checks if path predicate is present for the node.
493 + if ((forPathPredicate < forNodeIdentifier) && (forPathPredicate != -1)) {
494 + List<String> pathPredicate = new ArrayList<>();
495 + matchedPathPredicate = matchForPathPredicate(path);
496 +
497 + if (matchedPathPredicate == null || matchedPathPredicate.length() == 0) {
498 + ParserException parserException = new ParserException("YANG file error : "
499 + + YangConstructType.getYangConstructType(yangConstruct) + " " + yangLeafRef.getPath() +
500 + " does not follow valid path syntax");
501 + parserException.setLine(ctx.getStart().getLine());
502 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
503 + throw parserException;
504 + }
505 + int indexOfMatchedFirstOpenBrace = path.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
506 + differentiate[0] = path.substring(0, indexOfMatchedFirstOpenBrace);
507 + differentiate[1] = path.substring(indexOfMatchedFirstOpenBrace);
508 + pathPredicate.add(matchedPathPredicate);
509 + nodeIdentifier = differentiate[0];
510 + // Starts adding all path predicates of a node into the list.
511 + if (!differentiate[1].isEmpty()) {
512 + while (differentiate[1].startsWith(OPEN_SQUARE_BRACKET)) {
513 + matchedPathPredicate = matchForPathPredicate(differentiate[1]);
514 + if (matchedPathPredicate == null || matchedPathPredicate.length() == 0) {
515 + ParserException parserException = new ParserException(
516 + "YANG file error : " + YangConstructType.getYangConstructType(yangConstruct) + " "
517 + + yangLeafRef.getPath() +
518 + " does not follow valid path syntax");
519 + parserException.setLine(ctx.getStart().getLine());
520 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
521 + throw parserException;
522 + }
523 + pathPredicate.add(matchedPathPredicate);
524 + differentiate[1] = differentiate[1].substring(matchedPathPredicate.length());
525 + }
526 + }
527 +
528 + List<YangPathPredicate> pathPredicateList = validatePathPredicate(pathPredicate, yangConstruct, ctx,
529 + yangPathPredicate, yangLeafRef);
530 + YangAtomicPath atomicPath = new YangAtomicPath();
531 + yangNodeIdentifier = getValidNodeIdentifierForLeafref(nodeIdentifier, yangConstruct, ctx, yangLeafRef);
532 + atomicPath.setNodeIdentifier(yangNodeIdentifier);
533 + atomicPath.setPathPredicatesList(pathPredicateList);
534 + absolutePathList.add(atomicPath);
535 + } else {
536 + if (path.contains(SLASH_FOR_STRING)) {
537 + nodeIdentifier = path.substring(0, path.indexOf(CHAR_OF_SLASH));
538 + differentiate[1] = path.substring(path.indexOf(CHAR_OF_SLASH));
539 + } else {
540 + nodeIdentifier = path;
541 + differentiate[1] = null;
542 + }
543 + yangNodeIdentifier = getValidNodeIdentifierForLeafref(nodeIdentifier, yangConstruct, ctx, yangLeafRef);
544 +
545 + YangAtomicPath atomicPath = new YangAtomicPath();
546 + atomicPath.setNodeIdentifier(yangNodeIdentifier);
547 + atomicPath.setPathPredicatesList(null);
548 + absolutePathList.add(atomicPath);
549 + }
550 + if (differentiate[1] == null || differentiate[1].length() == 0) {
551 + completePathString = null;
552 + } else {
553 + completePathString = differentiate[1];
554 + }
555 + }
556 + return absolutePathList;
557 + }
558 +
559 + /**
560 + * Validates path predicate in the absolute path's node.
561 + *
562 + * @param pathPredicate list of path predicates in the node of absolute path
563 + * @param yangConstruct yang construct for creating error message
564 + * @param ctx yang construct's context to get the line number and character position
565 + * @param yangPathPredicate instance of path predicate where it has to be set
566 + * @param yangLeafRef instance of leafref where the path argument has to be set
567 + * @return list of object of path predicates in absolute path's node
568 + */
569 + private static List<YangPathPredicate> validatePathPredicate(List<String> pathPredicate,
570 + YangConstructType yangConstruct, ParserRuleContext ctx, YangPathPredicate yangPathPredicate,
571 + YangLeafRef yangLeafRef) {
572 +
573 + Iterator<String> pathPredicateString = pathPredicate.iterator();
574 + List<String> pathEqualityExpression = new ArrayList<>();
575 +
576 + while (pathPredicateString.hasNext()) {
577 + String pathPredicateForNode = pathPredicateString.next();
578 + pathPredicateForNode = (pathPredicateForNode.substring(1)).trim();
579 + pathPredicateForNode = pathPredicateForNode.substring(0,
580 + pathPredicateForNode.indexOf(CHAR_OF_CLOSE_SQUARE_BRACKET));
581 + pathEqualityExpression.add(pathPredicateForNode);
582 + }
583 + List<YangPathPredicate> validatedPathPredicateList = validatePathEqualityExpression(pathEqualityExpression,
584 + yangConstruct, ctx, yangPathPredicate, yangLeafRef);
585 + return validatedPathPredicateList;
586 + }
587 +
588 + /**
589 + * Validates the path equality expression.
590 + *
591 + * @param pathEqualityExpression list of path equality expression in the path predicates of the node
592 + * @param yangConstruct yang construct for creating error message
593 + * @param ctx yang construct's context to get the line number and character position
594 + * @param yangPathPredicate instance of path predicate where it has to be set
595 + * @param yangLeafRef instance of leafref where the path argument has to be set
596 + * @return list of object of path predicates in absolute path's node
597 + */
598 + private static List<YangPathPredicate> validatePathEqualityExpression(List<String> pathEqualityExpression,
599 + YangConstructType yangConstruct, ParserRuleContext ctx, YangPathPredicate yangPathPredicate,
600 + YangLeafRef yangLeafRef) {
601 +
602 + Iterator<String> pathEqualityExpressionString = pathEqualityExpression.iterator();
603 + List<YangPathPredicate> yangPathPredicateList = new ArrayList<>();
604 +
605 + while (pathEqualityExpressionString.hasNext()) {
606 + String pathEqualityExpressionForNode = pathEqualityExpressionString.next();
607 + String[] pathEqualityExpressionArray = pathEqualityExpressionForNode.split("[=]");
608 +
609 + YangNodeIdentifier yangNodeIdentifierForPredicate;
610 + YangRelativePath yangRelativePath;
611 + yangNodeIdentifierForPredicate = getValidNodeIdentifierForLeafref(pathEqualityExpressionArray[0].trim(),
612 + yangConstruct, ctx, yangLeafRef);
613 + yangRelativePath = validatePathKeyExpression(pathEqualityExpressionArray[1].trim(), yangConstruct, ctx,
614 + yangLeafRef);
615 + yangPathPredicate.setNodeIdentifier(yangNodeIdentifierForPredicate);
616 + yangPathPredicate.setPathOperator(EQUALTO);
617 + yangPathPredicate.setRightRelativePath(yangRelativePath);
618 + yangPathPredicateList.add(yangPathPredicate);
619 + }
620 + return yangPathPredicateList;
621 + }
622 +
623 + /**
624 + * Validate the path key expression.
625 + *
626 + * @param rightRelativePath relative path in the path predicate
627 + * @param yangConstruct yang construct for creating error message
628 + * @param ctx yang construct's context to get the line number and character position
629 + * @param yangLeafRef instance of leafref where the path argument has to be set
630 + * @return object of right relative path in path predicate
631 + */
632 + private static YangRelativePath validatePathKeyExpression(String rightRelativePath,
633 + YangConstructType yangConstruct, ParserRuleContext ctx, YangLeafRef yangLeafRef) {
634 +
635 + YangRelativePath yangRelativePath = new YangRelativePath();
636 + String[] relativePath = rightRelativePath.split(SLASH_FOR_STRING);
637 + List<String> rightAbsolutePath = new ArrayList<>();
638 + int accessAncestor = 0;
639 + for (String path : relativePath) {
640 + if (path.trim().equals(ANCESTOR_ACCESSOR)) {
641 + accessAncestor = accessAncestor + 1;
642 + } else {
643 + rightAbsolutePath.add(path);
644 + }
645 + }
646 + List<YangAtomicPath> atomicPathInRelativePath = validateRelativePathKeyExpression(rightAbsolutePath,
647 + yangConstruct, ctx, yangLeafRef);
648 + yangRelativePath.setAtomicPathList(atomicPathInRelativePath);
649 + yangRelativePath.setAncestorNodeCount(accessAncestor);
650 + return yangRelativePath;
651 + }
652 +
653 + /**
654 + * Validates the relative path key expression.
655 + *
656 + * @param rightAbsolutePath absolute path nodes present in the relative path
657 + * @param yangConstruct yang construct for creating error message
658 + * @param ctx yang construct's context to get the line number and character position
659 + * @param yangLeafRef instance of leafref where the path argument has to be set
660 + * @return list of object of absolute path nodes present in the relative path
661 + */
662 + private static List<YangAtomicPath> validateRelativePathKeyExpression(List<String> rightAbsolutePath,
663 + YangConstructType yangConstruct, ParserRuleContext ctx, YangLeafRef yangLeafRef) {
664 +
665 + List<YangAtomicPath> atomicPathList = new ArrayList<>();
666 + YangNodeIdentifier yangNodeIdentifier;
667 +
668 + Iterator<String> nodes = rightAbsolutePath.iterator();
669 + String currentInvocationFunction = nodes.next();
670 + currentInvocationFunction = currentInvocationFunction.trim();
671 + String[] currentFunction = currentInvocationFunction.split("[(]");
672 +
673 + if (!(currentFunction[0].trim().equals(CURRENT)) || !(currentFunction[1].trim().equals(CLOSE_PARENTHESIS))) {
674 + ParserException parserException = new ParserException("YANG file error : "
675 + + YangConstructType.getYangConstructType(yangConstruct) + " " + yangLeafRef.getPath() +
676 + " does not follow valid path syntax");
677 + parserException.setLine(ctx.getStart().getLine());
678 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
679 + throw parserException;
680 + }
681 +
682 + while (nodes.hasNext()) {
683 + YangAtomicPath atomicPath = new YangAtomicPath();
684 + String node = nodes.next();
685 + yangNodeIdentifier = getValidNodeIdentifierForLeafref(node.trim(), yangConstruct, ctx, yangLeafRef);
686 + atomicPath.setNodeIdentifier(yangNodeIdentifier);
687 + atomicPathList.add(atomicPath);
688 + }
689 + return atomicPathList;
690 + }
691 +
692 + /**
693 + * Validates the match for first path predicate in a given string.
694 + *
695 + * @param matchRequiredString string for which match has to be done
696 + * @return the matched string
697 + */
698 + private static String matchForPathPredicate(String matchRequiredString) {
699 +
700 + String matchedString = null;
701 + java.util.regex.Matcher matcher = PATH_PREDICATE_PATTERN.matcher(matchRequiredString);
702 + if (matcher.find()) {
703 + matchedString = matcher.group(0);
704 + }
705 + return matchedString;
706 + }
707 +
708 + /**
310 * Checks whether the type is an unsupported type. 709 * Checks whether the type is an unsupported type.
311 * 710 *
312 * @param typeName name of the type 711 * @param typeName name of the type
...@@ -317,15 +716,9 @@ public final class ListenerUtil { ...@@ -317,15 +716,9 @@ public final class ListenerUtil {
317 YangConstructType yangConstruct, ParserRuleContext ctx) { 716 YangConstructType yangConstruct, ParserRuleContext ctx) {
318 717
319 if (yangConstruct == YangConstructType.TYPE_DATA) { 718 if (yangConstruct == YangConstructType.TYPE_DATA) {
320 - if (typeName.equalsIgnoreCase(LEAFREF)) { 719 + if (typeName.equalsIgnoreCase(IDENTITYREF)) {
321 - handleUnsupportedYangConstruct(YangConstructType.LEAFREF_DATA,
322 - ctx, CURRENTLY_UNSUPPORTED);
323 - } else if (typeName.equalsIgnoreCase(IDENTITYREF)) {
324 handleUnsupportedYangConstruct(YangConstructType.IDENTITYREF_DATA, 720 handleUnsupportedYangConstruct(YangConstructType.IDENTITYREF_DATA,
325 ctx, CURRENTLY_UNSUPPORTED); 721 ctx, CURRENTLY_UNSUPPORTED);
326 - } else if (typeName.equalsIgnoreCase(INSTANCE_IDENTIFIER)) {
327 - handleUnsupportedYangConstruct(YangConstructType.INSTANCE_IDENTIFIER_DATA,
328 - ctx, CURRENTLY_UNSUPPORTED);
329 } 722 }
330 } 723 }
331 } 724 }
......
...@@ -19,6 +19,8 @@ package org.onosproject.yangutils.translator.tojava; ...@@ -19,6 +19,8 @@ package org.onosproject.yangutils.translator.tojava;
19 import java.io.IOException; 19 import java.io.IOException;
20 20
21 import org.onosproject.yangutils.datamodel.YangNode; 21 import org.onosproject.yangutils.datamodel.YangNode;
22 +import org.onosproject.yangutils.datamodel.YangTypeDef;
23 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
22 import org.onosproject.yangutils.translator.exception.TranslatorException; 24 import org.onosproject.yangutils.translator.exception.TranslatorException;
23 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig; 25 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
24 26
...@@ -80,7 +82,20 @@ public final class JavaCodeGeneratorUtil { ...@@ -80,7 +82,20 @@ public final class JavaCodeGeneratorUtil {
80 if (!(codeGenNode instanceof JavaCodeGenerator)) { 82 if (!(codeGenNode instanceof JavaCodeGenerator)) {
81 throw new TranslatorException("Unsupported node to generate code"); 83 throw new TranslatorException("Unsupported node to generate code");
82 } 84 }
83 - 85 + if (codeGenNode instanceof YangTypeDef) {
86 + YangTypeDef typeDef = (YangTypeDef) codeGenNode;
87 + if (typeDef.getTypeDefBaseType().getDataType() == YangDataTypes.LEAFREF
88 + || typeDef.getTypeDefBaseType().getDataType() == YangDataTypes.IDENTITYREF) {
89 + if (codeGenNode.getNextSibling() != null) {
90 + curTraversal = SIBILING;
91 + codeGenNode = codeGenNode.getNextSibling();
92 + } else {
93 + curTraversal = PARENT;
94 + codeGenNode = codeGenNode.getParent();
95 + }
96 + continue;
97 + }
98 + }
84 setCurNode(codeGenNode); 99 setCurNode(codeGenNode);
85 try { 100 try {
86 generateCodeEntry(codeGenNode, yangPlugin); 101 generateCodeEntry(codeGenNode, yangPlugin);
......
...@@ -17,13 +17,15 @@ ...@@ -17,13 +17,15 @@
17 package org.onosproject.yangutils.translator.tojava.javamodel; 17 package org.onosproject.yangutils.translator.tojava.javamodel;
18 18
19 import java.util.Stack; 19 import java.util.Stack;
20 -import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; 20 +
21 import org.onosproject.yangutils.datamodel.YangDerivedInfo; 21 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
22 import org.onosproject.yangutils.datamodel.YangEnumeration; 22 import org.onosproject.yangutils.datamodel.YangEnumeration;
23 +import org.onosproject.yangutils.datamodel.YangLeafRef;
23 import org.onosproject.yangutils.datamodel.YangNode; 24 import org.onosproject.yangutils.datamodel.YangNode;
24 import org.onosproject.yangutils.datamodel.YangType; 25 import org.onosproject.yangutils.datamodel.YangType;
25 import org.onosproject.yangutils.datamodel.YangTypeDef; 26 import org.onosproject.yangutils.datamodel.YangTypeDef;
26 import org.onosproject.yangutils.datamodel.YangUnion; 27 import org.onosproject.yangutils.datamodel.YangUnion;
28 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
27 import org.onosproject.yangutils.translator.exception.TranslatorException; 29 import org.onosproject.yangutils.translator.exception.TranslatorException;
28 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo; 30 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
29 import org.onosproject.yangutils.translator.tojava.JavaFileInfo; 31 import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
...@@ -101,6 +103,10 @@ public final class AttributesJavaDataType { ...@@ -101,6 +103,10 @@ public final class AttributesJavaDataType {
101 return STRING_DATA_TYPE; 103 return STRING_DATA_TYPE;
102 case BOOLEAN: 104 case BOOLEAN:
103 return BOOLEAN_DATA_TYPE; 105 return BOOLEAN_DATA_TYPE;
106 + case INSTANCE_IDENTIFIER:
107 + return STRING_DATA_TYPE;
108 + case LEAFREF:
109 + return getJavaDataType(getReferredTypeFromLeafref(yangType));
104 default: 110 default:
105 throw new TranslatorException("given data type is not supported."); 111 throw new TranslatorException("given data type is not supported.");
106 } 112 }
...@@ -152,8 +158,8 @@ public final class AttributesJavaDataType { ...@@ -152,8 +158,8 @@ public final class AttributesJavaDataType {
152 case BINARY: 158 case BINARY:
153 return YANG_BINARY_CLASS; 159 return YANG_BINARY_CLASS;
154 case LEAFREF: 160 case LEAFREF:
155 - //TODO:LEAFREF 161 + YangType<?> referredType = getReferredTypeFromLeafref(yangType);
156 - break; 162 + return getJavaImportClass(referredType, isListAttr, pluginConfig);
157 case IDENTITYREF: 163 case IDENTITYREF:
158 //TODO:IDENTITYREF 164 //TODO:IDENTITYREF
159 break; 165 break;
...@@ -163,8 +169,7 @@ public final class AttributesJavaDataType { ...@@ -163,8 +169,7 @@ public final class AttributesJavaDataType {
163 return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(), 169 return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(),
164 pluginConfig)); 170 pluginConfig));
165 case INSTANCE_IDENTIFIER: 171 case INSTANCE_IDENTIFIER:
166 - //TODO:INSTANCE_IDENTIFIER 172 + return STRING_DATA_TYPE;
167 - break;
168 case DERIVED: 173 case DERIVED:
169 return getCapitalCase( 174 return getCapitalCase(
170 getCamelCase(yangType.getDataTypeName(), pluginConfig)); 175 getCamelCase(yangType.getDataTypeName(), pluginConfig));
...@@ -188,8 +193,8 @@ public final class AttributesJavaDataType { ...@@ -188,8 +193,8 @@ public final class AttributesJavaDataType {
188 case BINARY: 193 case BINARY:
189 return YANG_BINARY_CLASS; 194 return YANG_BINARY_CLASS;
190 case LEAFREF: 195 case LEAFREF:
191 - //TODO:LEAFREF 196 + YangType<?> referredType = getReferredTypeFromLeafref(yangType);
192 - break; 197 + return getJavaImportClass(referredType, isListAttr, pluginConfig);
193 case IDENTITYREF: 198 case IDENTITYREF:
194 //TODO:IDENTITYREF 199 //TODO:IDENTITYREF
195 break; 200 break;
...@@ -199,8 +204,7 @@ public final class AttributesJavaDataType { ...@@ -199,8 +204,7 @@ public final class AttributesJavaDataType {
199 return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(), 204 return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(),
200 pluginConfig)); 205 pluginConfig));
201 case INSTANCE_IDENTIFIER: 206 case INSTANCE_IDENTIFIER:
202 - //TODO:INSTANCE_IDENTIFIER 207 + return STRING_DATA_TYPE;
203 - break;
204 case DERIVED: 208 case DERIVED:
205 return getCapitalCase( 209 return getCapitalCase(
206 getCamelCase(yangType.getDataTypeName(), pluginConfig)); 210 getCamelCase(yangType.getDataTypeName(), pluginConfig));
...@@ -246,16 +250,15 @@ public final class AttributesJavaDataType { ...@@ -246,16 +250,15 @@ public final class AttributesJavaDataType {
246 case BINARY: 250 case BINARY:
247 return YANG_TYPES_PKG; 251 return YANG_TYPES_PKG;
248 case LEAFREF: 252 case LEAFREF:
249 - //TODO:LEAFREF 253 + YangType<?> referredType = getReferredTypeFromLeafref(yangType);
250 - break; 254 + return getJavaImportPackage(referredType, isListAttr, conflictResolver);
251 case IDENTITYREF: 255 case IDENTITYREF:
252 //TODO:IDENTITYREF 256 //TODO:IDENTITYREF
253 break; 257 break;
254 case UNION: 258 case UNION:
255 return getUnionPackage(yangType, conflictResolver); 259 return getUnionPackage(yangType, conflictResolver);
256 case INSTANCE_IDENTIFIER: 260 case INSTANCE_IDENTIFIER:
257 - //TODO:INSTANCE_IDENTIFIER 261 + return JAVA_LANG;
258 - break;
259 case DERIVED: 262 case DERIVED:
260 return getTypDefsPackage(yangType, conflictResolver); 263 return getTypDefsPackage(yangType, conflictResolver);
261 default: 264 default:
...@@ -274,8 +277,8 @@ public final class AttributesJavaDataType { ...@@ -274,8 +277,8 @@ public final class AttributesJavaDataType {
274 case BINARY: 277 case BINARY:
275 return YANG_TYPES_PKG; 278 return YANG_TYPES_PKG;
276 case LEAFREF: 279 case LEAFREF:
277 - //TODO:LEAFREF 280 + YangType<?> referredType = getReferredTypeFromLeafref(yangType);
278 - break; 281 + return getJavaImportPackage(referredType, isListAttr, conflictResolver);
279 case IDENTITYREF: 282 case IDENTITYREF:
280 //TODO:IDENTITYREF 283 //TODO:IDENTITYREF
281 break; 284 break;
...@@ -284,8 +287,7 @@ public final class AttributesJavaDataType { ...@@ -284,8 +287,7 @@ public final class AttributesJavaDataType {
284 case UNION: 287 case UNION:
285 return getUnionPackage(yangType, conflictResolver); 288 return getUnionPackage(yangType, conflictResolver);
286 case INSTANCE_IDENTIFIER: 289 case INSTANCE_IDENTIFIER:
287 - //TODO:INSTANCE_IDENTIFIER 290 + return JAVA_LANG;
288 - break;
289 case DERIVED: 291 case DERIVED:
290 return getTypDefsPackage(yangType, conflictResolver); 292 return getTypDefsPackage(yangType, conflictResolver);
291 default: 293 default:
...@@ -444,4 +446,15 @@ public final class AttributesJavaDataType { ...@@ -444,4 +446,15 @@ public final class AttributesJavaDataType {
444 .getPackage())); 446 .getPackage()));
445 } 447 }
446 } 448 }
449 +
450 + /**
451 + * Returns the referred type from leaf/leaf-list.
452 + *
453 + * @param type current type in leaf
454 + * @return type from the leafref
455 + */
456 + private static YangType<?> getReferredTypeFromLeafref(YangType type) {
457 + YangLeafRef<?> leafRefInfo = (YangLeafRef<?>) type.getDataTypeExtendedInfo();
458 + return leafRefInfo.getEffectiveDataType();
459 + }
447 } 460 }
......
...@@ -18,8 +18,9 @@ package org.onosproject.yangutils.translator.tojava.utils; ...@@ -18,8 +18,9 @@ package org.onosproject.yangutils.translator.tojava.utils;
18 18
19 import java.util.List; 19 import java.util.List;
20 import java.util.Map; 20 import java.util.Map;
21 -import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; 21 +
22 import org.onosproject.yangutils.datamodel.YangType; 22 import org.onosproject.yangutils.datamodel.YangType;
23 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
23 import org.onosproject.yangutils.translator.exception.TranslatorException; 24 import org.onosproject.yangutils.translator.exception.TranslatorException;
24 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo; 25 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
25 import org.onosproject.yangutils.utils.io.impl.JavaDocGen; 26 import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
...@@ -118,6 +119,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTA ...@@ -118,6 +119,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTA
118 import static org.onosproject.yangutils.utils.UtilConstants.VALUE; 119 import static org.onosproject.yangutils.utils.UtilConstants.VALUE;
119 import static org.onosproject.yangutils.utils.UtilConstants.VOID; 120 import static org.onosproject.yangutils.utils.UtilConstants.VOID;
120 import static org.onosproject.yangutils.utils.UtilConstants.YANG_UTILS_TODO; 121 import static org.onosproject.yangutils.utils.UtilConstants.YANG_UTILS_TODO;
122 +import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
121 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILD_METHOD; 123 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILD_METHOD;
122 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.CONSTRUCTOR; 124 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.CONSTRUCTOR;
123 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR; 125 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR;
...@@ -127,7 +129,6 @@ import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.MAN ...@@ -127,7 +129,6 @@ import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.MAN
127 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.OF_METHOD; 129 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.OF_METHOD;
128 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.SETTER_METHOD; 130 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.SETTER_METHOD;
129 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.TYPE_CONSTRUCTOR; 131 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.TYPE_CONSTRUCTOR;
130 -import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
131 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase; 132 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
132 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase; 133 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
133 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getSmallCase; 134 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getSmallCase;
......
...@@ -282,6 +282,16 @@ public final class UtilConstants { ...@@ -282,6 +282,16 @@ public final class UtilConstants {
282 public static final String INPUT = "input"; 282 public static final String INPUT = "input";
283 283
284 /** 284 /**
285 + * Static attribute for output string.
286 + */
287 + public static final String OUTPUT = "output";
288 +
289 + /**
290 + * Static attribute for current string.
291 + */
292 + public static final String CURRENT = "current";
293 +
294 + /**
285 * Static attribute for leafref string. 295 * Static attribute for leafref string.
286 */ 296 */
287 public static final String LEAFREF = "leafref"; 297 public static final String LEAFREF = "leafref";
...@@ -342,6 +352,41 @@ public final class UtilConstants { ...@@ -342,6 +352,41 @@ public final class UtilConstants {
342 public static final String COMMA = ","; 352 public static final String COMMA = ",";
343 353
344 /** 354 /**
355 + * Static attribute for slash character.
356 + */
357 + public static final char CHAR_OF_SLASH = '/';
358 +
359 + /**
360 + * Static attribute for open square bracket character.
361 + */
362 + public static final char CHAR_OF_OPEN_SQUARE_BRACKET = '[';
363 +
364 + /**
365 + * Static attribute for close square bracket character.
366 + */
367 + public static final char CHAR_OF_CLOSE_SQUARE_BRACKET = ']';
368 +
369 + /**
370 + * Static attribute for slash string.
371 + */
372 + public static final String SLASH_FOR_STRING = "/";
373 +
374 + /**
375 + * Static attribute for open square bracket.
376 + */
377 + public static final String OPEN_SQUARE_BRACKET = "[";
378 +
379 + /**
380 + * Static attribute for ancestor accessor.
381 + */
382 + public static final String ANCESTOR_ACCESSOR = "..";
383 +
384 + /**
385 + * Static attribute for ancestor accessor along with path.
386 + */
387 + public static final String ANCESTOR_ACCESSOR_IN_PATH = "../";
388 +
389 + /**
345 * Static attribute for add syntax. 390 * Static attribute for add syntax.
346 */ 391 */
347 public static final String ADD_STRING = "add"; 392 public static final String ADD_STRING = "add";
...@@ -1110,7 +1155,6 @@ public final class UtilConstants { ...@@ -1110,7 +1155,6 @@ public final class UtilConstants {
1110 */ 1155 */
1111 public static final String YANG_DECIMAL64_CLASS = "YangDecimal64"; 1156 public static final String YANG_DECIMAL64_CLASS = "YangDecimal64";
1112 1157
1113 -
1114 /** 1158 /**
1115 * Static attribute for YANG file error. 1159 * Static attribute for YANG file error.
1116 */ 1160 */
...@@ -1140,12 +1184,18 @@ public final class UtilConstants { ...@@ -1140,12 +1184,18 @@ public final class UtilConstants {
1140 + "grouping for given uses"; 1184 + "grouping for given uses";
1141 1185
1142 /** 1186 /**
1143 - * Static attribute for grouping linker error information. 1187 + * Static attribute for if-feature linker error information.
1144 */ 1188 */
1145 public static final String FEATURE_LINKER_ERROR = "YANG file error: Unable to find feature " 1189 public static final String FEATURE_LINKER_ERROR = "YANG file error: Unable to find feature "
1146 + "for given if-feature"; 1190 + "for given if-feature";
1147 1191
1148 /** 1192 /**
1193 + * Static attribute for leafref linker error information.
1194 + */
1195 + public static final String LEAFREF_LINKER_ERROR = "YANG file error: Unable to find base "
1196 + + "leaf/leaf-list for given leafref";
1197 +
1198 + /**
1149 * Static attribute for reference. 1199 * Static attribute for reference.
1150 */ 1200 */
1151 public static final String REFERENCE = "Reference"; 1201 public static final String REFERENCE = "Reference";
......
...@@ -534,7 +534,7 @@ package org.onosproject.yangutils.parser.antlrgencode; ...@@ -534,7 +534,7 @@ package org.onosproject.yangutils.parser.antlrgencode;
534 * require-instance-arg > 534 * require-instance-arg >
535 * require-instance-arg = true-keyword / false-keyword 535 * require-instance-arg = true-keyword / false-keyword
536 */ 536 */
537 - requireInstanceStatement : REQUIRE_INSTANCE_KEYWORD (TRUE_KEYWORD | FALSE_KEYWORD) STMTEND; 537 + requireInstanceStatement : REQUIRE_INSTANCE_KEYWORD requireInstance STMTEND;
538 538
539 /** 539 /**
540 * instance-identifier-specification = 540 * instance-identifier-specification =
...@@ -1279,6 +1279,8 @@ package org.onosproject.yangutils.parser.antlrgencode; ...@@ -1279,6 +1279,8 @@ package org.onosproject.yangutils.parser.antlrgencode;
1279 1279
1280 refine : string; 1280 refine : string;
1281 1281
1282 + requireInstance : string;
1283 +
1282 augment : string; 1284 augment : string;
1283 1285
1284 deviation : string; 1286 deviation : string;
......
1 +/*
2 + * Copyright 2016-present 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 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import java.io.IOException;
20 +import java.util.ListIterator;
21 +
22 +import org.junit.Rule;
23 +import org.junit.Test;
24 +import org.junit.rules.ExpectedException;
25 +
26 +import org.onosproject.yangutils.datamodel.YangContainer;
27 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
28 +import org.onosproject.yangutils.datamodel.YangLeaf;
29 +import org.onosproject.yangutils.datamodel.YangLeafRef;
30 +import org.onosproject.yangutils.datamodel.YangModule;
31 +import org.onosproject.yangutils.datamodel.YangNode;
32 +import org.onosproject.yangutils.datamodel.YangNodeType;
33 +import org.onosproject.yangutils.datamodel.YangType;
34 +import org.onosproject.yangutils.parser.exceptions.ParserException;
35 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
36 +
37 +import static org.hamcrest.MatcherAssert.assertThat;
38 +import static org.hamcrest.core.Is.is;
39 +/**
40 + * Test cases for require-instance listener.
41 + */
42 +public class RequireInstanceListenerTest {
43 +
44 + @Rule
45 + public ExpectedException thrown = ExpectedException.none();
46 +
47 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
48 +
49 + /**
50 + * Checks require-statement with true as status.
51 + */
52 + @Test
53 + public void processRequireInstanceTrue() throws IOException, ParserException {
54 +
55 + YangNode node = manager.getDataModel("src/test/resources/RequireInstanceTrue.yang");
56 +
57 + // Check whether the data model tree returned is of type module.
58 + assertThat((node instanceof YangModule), is(true));
59 +
60 + // Check whether the node type is set properly to module.
61 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
62 +
63 + // Check whether the module name is set correctly.
64 + YangModule yangNode = (YangModule) node;
65 + assertThat(yangNode.getName(), is("PathListener"));
66 +
67 + YangContainer container = (YangContainer) yangNode.getChild().getNextSibling();
68 + ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
69 + YangLeaf leafInfo = leafIterator.next();
70 +
71 + // Check whether the require-instance value is set correctly in leafref.
72 + assertThat(leafInfo.getName(), is("ifname"));
73 + YangLeafRef yangLeafRef = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
74 + assertThat(yangLeafRef.getRequireInstance(), is(true));
75 + }
76 +
77 + /**
78 + * Checks require-statement with false as status.
79 + */
80 + @Test
81 + public void processRequireInstanceFalse() throws IOException, ParserException {
82 +
83 + YangNode node = manager.getDataModel("src/test/resources/RequireInstanceFalse.yang");
84 +
85 + // Check whether the data model tree returned is of type module.
86 + assertThat((node instanceof YangModule), is(true));
87 +
88 + // Check whether the node type is set properly to module.
89 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
90 +
91 + // Check whether the module name is set correctly.
92 + YangModule yangNode = (YangModule) node;
93 + assertThat(yangNode.getName(), is("PathListener"));
94 +
95 + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
96 + YangLeaf leafInfo = leafIterator.next();
97 +
98 + // Check whether the require-instance value is set correctly in instance-identifier.
99 + assertThat(leafInfo.getName(), is("admin-status"));
100 +
101 + YangType type = leafInfo.getDataType();
102 +
103 + assertThat(type.getDataType(), is(YangDataTypes.INSTANCE_IDENTIFIER));
104 + boolean status = ((YangType<Boolean>) type).getDataTypeExtendedInfo();
105 +
106 + assertThat(status, is(false));
107 + }
108 +
109 + /**
110 + * Checks require-statement default value when its not there in YANG under instance-identifier.
111 + */
112 + @Test
113 + public void processRequireInstanceDefaultValueInInstanceIdentifier() throws IOException, ParserException {
114 +
115 + YangNode node = manager.getDataModel("src/test/resources/RequireInstanceDefaultValueInInstanceIdentifier.yang");
116 +
117 + // Check whether the data model tree returned is of type module.
118 + assertThat((node instanceof YangModule), is(true));
119 +
120 + // Check whether the node type is set properly to module.
121 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
122 +
123 + // Check whether the module name is set correctly.
124 + YangModule yangNode = (YangModule) node;
125 + assertThat(yangNode.getName(), is("PathListener"));
126 +
127 + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
128 + YangLeaf leafInfo = leafIterator.next();
129 +
130 + // Check whether the require-instance value is set correctly in instance-identifier.
131 + assertThat(leafInfo.getName(), is("admin-status"));
132 +
133 + YangType type = leafInfo.getDataType();
134 +
135 + assertThat(type.getDataType(), is(YangDataTypes.INSTANCE_IDENTIFIER));
136 +
137 + boolean status = ((YangType<Boolean>) type).getDataTypeExtendedInfo();
138 + assertThat(status, is(true));
139 + }
140 +
141 + /**
142 + * Checks require-statement default value when its not there in YANG under leafref.
143 + */
144 + @Test
145 + public void processRequireInstanceDefaultValueForLeafref() throws IOException, ParserException {
146 +
147 + YangNode node = manager.getDataModel("src/test/resources/RequireInstanceDefaultValueForLeafref.yang");
148 +
149 + // Check whether the data model tree returned is of type module.
150 + assertThat((node instanceof YangModule), is(true));
151 +
152 + // Check whether the node type is set properly to module.
153 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
154 +
155 + // Check whether the module name is set correctly.
156 + YangModule yangNode = (YangModule) node;
157 + assertThat(yangNode.getName(), is("PathListener"));
158 +
159 + YangContainer container = (YangContainer) yangNode.getChild().getNextSibling();
160 + ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
161 + YangLeaf leafInfo = leafIterator.next();
162 +
163 + // Check whether the require-instance value is set correctly in leafref.
164 + assertThat(leafInfo.getName(), is("ifname"));
165 + YangLeafRef yangLeafRef = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
166 + assertThat(yangLeafRef.getRequireInstance(), is(true));
167 + }
168 +}
...@@ -20,6 +20,7 @@ import java.util.ListIterator; ...@@ -20,6 +20,7 @@ import java.util.ListIterator;
20 import org.junit.Rule; 20 import org.junit.Rule;
21 import org.junit.Test; 21 import org.junit.Test;
22 import org.junit.rules.ExpectedException; 22 import org.junit.rules.ExpectedException;
23 +import org.onosproject.yangutils.datamodel.YangContainer;
23 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; 24 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
24 import org.onosproject.yangutils.datamodel.YangLeaf; 25 import org.onosproject.yangutils.datamodel.YangLeaf;
25 import org.onosproject.yangutils.datamodel.YangLeafList; 26 import org.onosproject.yangutils.datamodel.YangLeafList;
...@@ -121,20 +122,6 @@ public class TypeListenerTest { ...@@ -121,20 +122,6 @@ public class TypeListenerTest {
121 } 122 }
122 123
123 /** 124 /**
124 - * Checks for unsupported type leafref.
125 - */
126 - @Test
127 - public void processLeafrefType() throws IOException, ParserException {
128 -
129 - thrown.expect(ParserException.class);
130 - thrown.expectMessage("YANG file error : \"leafref\" is not supported in current version,"
131 - + " please check wiki for YANG utils road map.");
132 -
133 - YangNode node = manager
134 - .getDataModel("src/test/resources/LeafrefInvalidIdentifier.yang");
135 - }
136 -
137 - /**
138 * Checks for unsupported type identityref. 125 * Checks for unsupported type identityref.
139 */ 126 */
140 @Test 127 @Test
...@@ -149,16 +136,29 @@ public class TypeListenerTest { ...@@ -149,16 +136,29 @@ public class TypeListenerTest {
149 } 136 }
150 137
151 /** 138 /**
152 - * Checks for unsupported type instance identifier. 139 + * Checks for type instance-identifier.
153 */ 140 */
154 @Test 141 @Test
155 public void processInstanceIdentifierType() throws IOException, ParserException { 142 public void processInstanceIdentifierType() throws IOException, ParserException {
156 143
157 - thrown.expect(ParserException.class);
158 - thrown.expectMessage("YANG file error : \"instance-identifier\" is not supported in current version,"
159 - + " please check wiki for YANG utils road map.");
160 -
161 YangNode node = manager 144 YangNode node = manager
162 - .getDataModel("src/test/resources/InstanceIdentifierInvalidIdentifier.yang"); 145 + .getDataModel("src/test/resources/InstanceIdentifierListener.yang");
146 +
147 + // Check whether the data model tree returned is of type module.
148 + assertThat((node instanceof YangModule), is(true));
149 +
150 + // Check whether the node type is set properly to module.
151 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
152 +
153 + // Check whether the module name is set correctly.
154 + YangModule yangNode = (YangModule) node;
155 + assertThat(yangNode.getName(), is("Test"));
156 + YangContainer container = (YangContainer) yangNode.getChild();
157 + ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
158 + YangLeaf leafInfo = leafIterator.next();
159 +
160 + assertThat(leafInfo.getName(), is("invalid-interval"));
161 + assertThat(leafInfo.getDataType().getDataTypeName(), is("instance-identifier"));
162 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.INSTANCE_IDENTIFIER));
163 } 163 }
164 } 164 }
......
...@@ -20,27 +20,34 @@ import java.io.IOException; ...@@ -20,27 +20,34 @@ import java.io.IOException;
20 import java.util.Iterator; 20 import java.util.Iterator;
21 import java.util.ListIterator; 21 import java.util.ListIterator;
22 import org.apache.maven.plugin.MojoExecutionException; 22 import org.apache.maven.plugin.MojoExecutionException;
23 +import org.junit.Rule;
23 import org.junit.Test; 24 import org.junit.Test;
25 +import org.junit.rules.ExpectedException;
24 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; 26 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
25 import org.onosproject.yangutils.datamodel.YangDerivedInfo; 27 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
26 import org.onosproject.yangutils.datamodel.YangGrouping; 28 import org.onosproject.yangutils.datamodel.YangGrouping;
27 import org.onosproject.yangutils.datamodel.YangLeaf; 29 import org.onosproject.yangutils.datamodel.YangLeaf;
30 +import org.onosproject.yangutils.datamodel.YangLeafRef;
31 +import org.onosproject.yangutils.datamodel.YangList;
28 import org.onosproject.yangutils.datamodel.YangModule; 32 import org.onosproject.yangutils.datamodel.YangModule;
29 import org.onosproject.yangutils.datamodel.YangNode; 33 import org.onosproject.yangutils.datamodel.YangNode;
30 import org.onosproject.yangutils.datamodel.YangNodeType; 34 import org.onosproject.yangutils.datamodel.YangNodeType;
31 import org.onosproject.yangutils.datamodel.YangTypeDef; 35 import org.onosproject.yangutils.datamodel.YangTypeDef;
32 import org.onosproject.yangutils.datamodel.YangUses; 36 import org.onosproject.yangutils.datamodel.YangUses;
33 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus; 37 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
38 +import org.onosproject.yangutils.linker.exceptions.LinkerException;
34 import org.onosproject.yangutils.linker.impl.YangLinkerManager; 39 import org.onosproject.yangutils.linker.impl.YangLinkerManager;
35 import org.onosproject.yangutils.parser.exceptions.ParserException; 40 import org.onosproject.yangutils.parser.exceptions.ParserException;
41 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
36 import org.onosproject.yangutils.utils.io.impl.YangFileScanner; 42 import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
37 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig; 43 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
38 44
39 import static org.hamcrest.CoreMatchers.nullValue; 45 import static org.hamcrest.CoreMatchers.nullValue;
40 import static org.hamcrest.MatcherAssert.assertThat; 46 import static org.hamcrest.MatcherAssert.assertThat;
41 import static org.hamcrest.core.Is.is; 47 import static org.hamcrest.core.Is.is;
42 -import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
43 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.STRING; 48 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.STRING;
49 +import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
50 +import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
44 import static org.onosproject.yangutils.datamodel.YangNodeType.MODULE_NODE; 51 import static org.onosproject.yangutils.datamodel.YangNodeType.MODULE_NODE;
45 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED; 52 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED;
46 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory; 53 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory;
...@@ -50,6 +57,10 @@ import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirector ...@@ -50,6 +57,10 @@ import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirector
50 */ 57 */
51 public class InterFileLinkingTest { 58 public class InterFileLinkingTest {
52 59
60 + @Rule
61 + public ExpectedException thrown = ExpectedException.none();
62 +
63 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
53 private final YangUtilManager utilManager = new YangUtilManager(); 64 private final YangUtilManager utilManager = new YangUtilManager();
54 private final YangLinkerManager yangLinkerManager = new YangLinkerManager(); 65 private final YangLinkerManager yangLinkerManager = new YangLinkerManager();
55 66
...@@ -726,4 +737,253 @@ public class InterFileLinkingTest { ...@@ -726,4 +737,253 @@ public class InterFileLinkingTest {
726 deleteDirectory(userDir + "/target/groupingNodeSameAsModule/"); 737 deleteDirectory(userDir + "/target/groupingNodeSameAsModule/");
727 738
728 } 739 }
740 +
741 + /**
742 + * Checks inter file leafref linking.
743 + */
744 + @Test
745 + public void processInterFileLeafrefLinking()
746 + throws IOException, ParserException, MojoExecutionException {
747 +
748 + String searchDir = "src/test/resources/interfileleafref";
749 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
750 + utilManager.parseYangFileInfoSet();
751 + utilManager.createYangNodeSet();
752 + YangNode refNode = null;
753 + YangNode selfNode = null;
754 +
755 + // Create YANG node set
756 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
757 +
758 + // Add references to import list.
759 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
760 +
761 + // Carry out inter-file linking.
762 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
763 +
764 + Iterator<YangNode> yangNodeIterator = utilManager.getYangNodeSet().iterator();
765 +
766 + YangNode rootNode = yangNodeIterator.next();
767 +
768 + if (rootNode.getName().equals("module1")) {
769 + selfNode = rootNode;
770 + refNode = yangNodeIterator.next();
771 + } else {
772 + refNode = rootNode;
773 + selfNode = yangNodeIterator.next();
774 + }
775 +
776 + // Check whether the data model tree returned is of type module.
777 + assertThat(selfNode instanceof YangModule, is(true));
778 +
779 + // Check whether the node type is set properly to module.
780 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
781 +
782 + // Check whether the module name is set correctly.
783 + YangModule yangNode = (YangModule) selfNode;
784 + assertThat(yangNode.getName(), is("module1"));
785 +
786 + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
787 + YangLeaf leafInfo = leafIterator.next();
788 +
789 + assertThat(leafInfo.getName(), is("invalid-interval"));
790 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
791 + assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
792 +
793 + // Check whether the data model tree returned is of type module.
794 + assertThat(refNode instanceof YangModule, is(true));
795 +
796 + // Check whether the node type is set properly to module.
797 + assertThat(refNode.getNodeType(), is(MODULE_NODE));
798 +
799 + // Check whether the module name is set correctly.
800 + YangModule yangNode1 = (YangModule) refNode;
801 + assertThat(yangNode1.getName(), is("module2"));
802 + YangLeaf leafInfo1 = yangNode1.getListOfLeaf().listIterator().next();
803 +
804 + YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
805 +
806 + assertThat(leafref.getReferredLeafOrLeafList(), is(leafInfo1));
807 + assertThat(leafref.getResolvableStatus(), is(RESOLVED));
808 +
809 + assertThat(leafref.getEffectiveDataType().getDataType(),
810 + is(YangDataTypes.STRING));
811 + }
812 +
813 + /**
814 + * Checks error scenerio where the node is invalid.
815 + */
816 + @Test
817 + public void processSelfResolutionWhenLeafrefInModuleReferToInvalidNode()
818 + throws IOException, ParserException {
819 +
820 + thrown.expect(LinkerException.class);
821 + thrown.expectMessage(
822 + "YANG file error: Unable to find base leaf/leaf-list for given leafref");
823 + String searchDir = "src/test/resources/interFileInvalidNode";
824 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
825 + utilManager.parseYangFileInfoSet();
826 + utilManager.createYangNodeSet();
827 +
828 + YangNode selfNode = null;
829 +
830 + // Create YANG node set
831 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
832 +
833 + // Add references to import list.
834 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
835 +
836 + // Carry out inter-file linking.
837 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
838 + }
839 +
840 + /**
841 + * Checks the error scenerio when there is no referref leaf/leaf-list in any file.
842 + */
843 + @Test
844 + public void processSelfResolutionWhenLeafrefDoesNotReferToLeafOrLeafList()
845 + throws IOException, ParserException {
846 +
847 + thrown.expect(LinkerException.class);
848 + thrown.expectMessage(
849 + "YANG file error: Unable to find base leaf/leaf-list for given leafref");
850 + String searchDir = "src/test/resources/interfileleafrefwithinvaliddestinationnode";
851 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
852 + utilManager.parseYangFileInfoSet();
853 + utilManager.createYangNodeSet();
854 + YangNode selfNode = null;
855 +
856 + // Create YANG node set
857 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
858 +
859 + // Add references to import list.
860 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
861 +
862 + // Carry out inter-file linking.
863 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
864 + }
865 +
866 + /**
867 + * Checks inter file resolution when leafref from grouping refers to other file.
868 + */
869 + @Test
870 + public void processInterFileLeafrefFromGroupingRefersToOtherFile()
871 + throws IOException, ParserException {
872 +
873 + String searchDir = "src/test/resources/interfileleafreffromgroupingreferstootherfile";
874 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
875 + utilManager.parseYangFileInfoSet();
876 + utilManager.createYangNodeSet();
877 + YangNode selfNode = null;
878 + YangNode refNode = null;
879 +
880 + // Create YANG node set
881 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
882 +
883 + // Add references to import list.
884 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
885 +
886 + // Carry out inter-file linking.
887 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
888 +
889 + Iterator<YangNode> yangNodeIterator = utilManager.getYangNodeSet().iterator();
890 +
891 + YangNode rootNode = yangNodeIterator.next();
892 +
893 + if (rootNode.getName().equals("module1")) {
894 + selfNode = rootNode;
895 + refNode = yangNodeIterator.next();
896 + } else {
897 + refNode = rootNode;
898 + selfNode = yangNodeIterator.next();
899 + }
900 +
901 + // Check whether the data model tree returned is of type module.
902 + assertThat(selfNode instanceof YangModule, is(true));
903 +
904 + // Check whether the node type is set properly to module.
905 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
906 +
907 + // Check whether the module name is set correctly.
908 + YangModule yangNode = (YangModule) selfNode;
909 + assertThat(yangNode.getName(), is("module1"));
910 +
911 + YangList list = (YangList) yangNode.getChild().getChild();
912 + ListIterator<YangLeaf> leafIterator = list.getListOfLeaf().listIterator();
913 + YangLeaf leafInfo = leafIterator.next();
914 +
915 + assertThat(leafInfo.getName(), is("link-tp"));
916 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
917 + assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
918 +
919 + YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
920 +
921 + YangLeaf leafInfo2 = (YangLeaf) leafref.getReferredLeafOrLeafList();
922 + assertThat(leafref.getReferredLeafOrLeafList(), is(leafInfo2));
923 + assertThat(leafref.getResolvableStatus(), is(RESOLVED));
924 +
925 + assertThat(leafref.getEffectiveDataType().getDataType(),
926 + is(YangDataTypes.STRING));
927 + }
928 +
929 + /**
930 + * Checks inter file resolution when leafref refers to multiple leafrefs through many files.
931 + */
932 + @Test
933 + public void processInterFileLeafrefRefersToMultipleLeafrefInMultipleFiles()
934 + throws IOException, ParserException {
935 +
936 + String searchDir = "src/test/resources/interfileleafrefreferstomultipleleafrefinmultiplefiles";
937 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
938 + utilManager.parseYangFileInfoSet();
939 + utilManager.createYangNodeSet();
940 + YangNode refNode1 = null;
941 + YangNode refNode2 = null;
942 + YangNode selfNode = null;
943 +
944 + // Create YANG node set
945 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
946 +
947 + // Add references to import list.
948 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
949 +
950 + // Carry out inter-file linking.
951 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
952 +
953 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
954 + if (rootNode.getName().equals("ietf-network-topology")) {
955 + selfNode = rootNode;
956 + } else if (rootNode.getName().equals("ietf-network")) {
957 + refNode1 = rootNode;
958 + } else {
959 + refNode2 = rootNode;
960 + }
961 + }
962 + // Check whether the data model tree returned is of type module.
963 + assertThat(selfNode instanceof YangModule, is(true));
964 +
965 + // Check whether the node type is set properly to module.
966 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
967 +
968 + // Check whether the module name is set correctly.
969 + YangModule yangNode = (YangModule) selfNode;
970 + assertThat(yangNode.getName(), is("ietf-network-topology"));
971 +
972 + YangList list = (YangList) yangNode.getChild().getChild();
973 + ListIterator<YangLeaf> leafIterator = list.getListOfLeaf().listIterator();
974 + YangLeaf leafInfo = leafIterator.next();
975 +
976 + assertThat(leafInfo.getName(), is("link-tp"));
977 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
978 + assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
979 +
980 + YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
981 +
982 + YangLeaf leafInfo2 = (YangLeaf) leafref.getReferredLeafOrLeafList();
983 + assertThat(leafref.getReferredLeafOrLeafList(), is(leafInfo2));
984 + assertThat(leafref.getResolvableStatus(), is(RESOLVED));
985 +
986 + assertThat(leafref.getEffectiveDataType().getDataType(),
987 + is(YangDataTypes.STRING));
988 + }
729 } 989 }
......
...@@ -18,11 +18,15 @@ package org.onosproject.yangutils.plugin.manager; ...@@ -18,11 +18,15 @@ package org.onosproject.yangutils.plugin.manager;
18 18
19 import java.io.IOException; 19 import java.io.IOException;
20 import java.util.List; 20 import java.util.List;
21 +import java.util.ListIterator;
22 +
21 import org.junit.Test; 23 import org.junit.Test;
22 import org.onosproject.yangutils.datamodel.YangContainer; 24 import org.onosproject.yangutils.datamodel.YangContainer;
25 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
23 import org.onosproject.yangutils.datamodel.YangFeature; 26 import org.onosproject.yangutils.datamodel.YangFeature;
24 import org.onosproject.yangutils.datamodel.YangIfFeature; 27 import org.onosproject.yangutils.datamodel.YangIfFeature;
25 import org.onosproject.yangutils.datamodel.YangLeaf; 28 import org.onosproject.yangutils.datamodel.YangLeaf;
29 +import org.onosproject.yangutils.datamodel.YangLeafRef;
26 import org.onosproject.yangutils.datamodel.YangModule; 30 import org.onosproject.yangutils.datamodel.YangModule;
27 import org.onosproject.yangutils.datamodel.YangNode; 31 import org.onosproject.yangutils.datamodel.YangNode;
28 import org.onosproject.yangutils.datamodel.YangNodeType; 32 import org.onosproject.yangutils.datamodel.YangNodeType;
...@@ -217,4 +221,111 @@ public class IntraFileIfFeatureLinkingTest { ...@@ -217,4 +221,111 @@ public class IntraFileIfFeatureLinkingTest {
217 assertThat(ifFeature.getName().getName(), is("local-storage")); 221 assertThat(ifFeature.getName().getName(), is("local-storage"));
218 assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED)); 222 assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
219 } 223 }
224 +
225 + /**
226 + * Checks addition of if-feature list to leafref.
227 + */
228 + @Test
229 + public void processSelfFileLinkingWithFeatureReferredByLeafref()
230 + throws IOException, ParserException {
231 +
232 + YangNode node = manager
233 + .getDataModel("src/test/resources/SelfFileLinkingWithFeatureReferredByLeafref.yang");
234 +
235 + // Check whether the data model tree returned is of type module.
236 + assertThat((node instanceof YangModule), is(true));
237 +
238 + // Check whether the node type is set properly to module.
239 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
240 +
241 + // Check whether the module name is set correctly.
242 + YangModule yangNode = (YangModule) node;
243 + assertThat(yangNode.getName(), is("syslog"));
244 +
245 + List<YangFeature> featureList = yangNode.getFeatureList();
246 + YangFeature feature = featureList.iterator().next();
247 + assertThat(feature.getName(), is("local-storage"));
248 +
249 + YangContainer container = (YangContainer) yangNode.getChild();
250 + assertThat(container.getName(), is("speed"));
251 +
252 + List<YangLeaf> listOfLeaf = container.getListOfLeaf();
253 + YangLeaf leaf = listOfLeaf.iterator().next();
254 + assertThat(leaf.getName(), is("local-storage-limit"));
255 +
256 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
257 + YangIfFeature ifFeature = ifFeatureList.iterator().next();
258 + assertThat(ifFeature.getName().getName(), is("local-storage"));
259 + assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
260 +
261 + ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator();
262 + YangLeaf yangLeaf = listOfLeafInModule.next();
263 + assertThat(yangLeaf.getName(), is("storage-value"));
264 +
265 + YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo();
266 +
267 + assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64));
268 +
269 + List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList();
270 + YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next();
271 + assertThat(ifFeatureInLeafref.getName().getName(), is("local-storage"));
272 + assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
273 + }
274 +
275 + /**
276 + * Checks addition of if-feature list to leafref when referred leaf is again having leafref in it.
277 + */
278 + @Test
279 + public void processSelfFileLinkingWithFeatureReferredByMultiLeafref()
280 + throws IOException, ParserException {
281 +
282 + YangNode node = manager
283 + .getDataModel("src/test/resources/SelfFileLinkingWithFeatureReferredByMultiLeafref.yang");
284 +
285 + // Check whether the data model tree returned is of type module.
286 + assertThat((node instanceof YangModule), is(true));
287 +
288 + // Check whether the node type is set properly to module.
289 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
290 +
291 + // Check whether the module name is set correctly.
292 + YangModule yangNode = (YangModule) node;
293 + assertThat(yangNode.getName(), is("syslog"));
294 +
295 + List<YangFeature> featureList = yangNode.getFeatureList();
296 + YangFeature feature = featureList.iterator().next();
297 + assertThat(feature.getName(), is("local-storage"));
298 +
299 + YangContainer container = (YangContainer) yangNode.getChild();
300 + assertThat(container.getName(), is("speed"));
301 +
302 + List<YangLeaf> listOfLeaf = container.getListOfLeaf();
303 + YangLeaf leaf = listOfLeaf.iterator().next();
304 + assertThat(leaf.getName(), is("local-storage-limit"));
305 +
306 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
307 + YangIfFeature ifFeature = ifFeatureList.iterator().next();
308 + assertThat(ifFeature.getName().getName(), is("local-storage"));
309 + assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
310 +
311 + ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator();
312 + YangLeaf yangLeaf = listOfLeafInModule.next();
313 + assertThat(yangLeaf.getName(), is("storage-value"));
314 +
315 + YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo();
316 +
317 + assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64));
318 +
319 + List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList();
320 + YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next();
321 +
322 + assertThat(ifFeatureInLeafref.getName().getName(), is("main-storage"));
323 + assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
324 +
325 + YangIfFeature ifFeatureInLeafref1 = ifFeatureListInLeafref.iterator().next();
326 +
327 + assertThat(ifFeatureInLeafref1.getName().getName(), is("main-storage"));
328 + assertThat(ifFeatureInLeafref1.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
329 +
330 + }
220 } 331 }
......
1 +/*
2 + * Copyright 2016-present 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 + */
16 +
17 +package org.onosproject.yangutils.plugin.manager;
18 +
19 +import org.junit.Rule;
20 +import org.junit.Test;
21 +import org.junit.rules.ExpectedException;
22 +import org.onosproject.yangutils.datamodel.YangAtomicPath;
23 +import org.onosproject.yangutils.datamodel.YangContainer;
24 +import org.onosproject.yangutils.datamodel.YangInput;
25 +import org.onosproject.yangutils.datamodel.YangLeaf;
26 +import org.onosproject.yangutils.datamodel.YangLeafList;
27 +import org.onosproject.yangutils.datamodel.YangLeafRef;
28 +import org.onosproject.yangutils.datamodel.YangList;
29 +import org.onosproject.yangutils.datamodel.YangModule;
30 +import org.onosproject.yangutils.datamodel.YangNode;
31 +import org.onosproject.yangutils.datamodel.YangNodeType;
32 +import org.onosproject.yangutils.datamodel.YangPathArgType;
33 +import org.onosproject.yangutils.datamodel.YangPathOperator;
34 +import org.onosproject.yangutils.datamodel.YangPathPredicate;
35 +import org.onosproject.yangutils.datamodel.YangRelativePath;
36 +import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
37 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
38 +import org.onosproject.yangutils.linker.exceptions.LinkerException;
39 +import org.onosproject.yangutils.parser.exceptions.ParserException;
40 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
41 +
42 +import java.io.IOException;
43 +import java.util.Iterator;
44 +import java.util.List;
45 +import java.util.ListIterator;
46 +
47 +import static org.hamcrest.MatcherAssert.assertThat;
48 +import static org.hamcrest.core.Is.is;
49 +import static org.hamcrest.core.IsNull.nullValue;
50 +
51 +/**
52 + * Test cases for testing leafref intra file linking.
53 + */
54 +public class IntraFileLeafrefLinkingTest {
55 +
56 + @Rule
57 + public ExpectedException thrown = ExpectedException.none();
58 +
59 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
60 +
61 + /**
62 + * Checks self resolution when leafref under module refers to leaf in container.
63 + */
64 + @Test
65 + public void processSelfResolutionWhenLeafrefReferToContainerLeaf()
66 + throws IOException, ParserException {
67 +
68 + YangNode node = manager.getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToContainerLeaf.yang");
69 +
70 + // Check whether the data model tree returned is of type module.
71 + assertThat((node instanceof YangModule), is(true));
72 +
73 + // Check whether the node type is set properly to module.
74 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
75 +
76 + // Check whether the module name is set correctly.
77 + YangModule yangNode = (YangModule) node;
78 + assertThat(yangNode.getName(), is("ietf-network"));
79 +
80 + ListIterator<YangLeaf> leafIterator;
81 + YangLeaf leafInfo;
82 +
83 + leafIterator = yangNode.getListOfLeaf().listIterator();
84 + leafInfo = leafIterator.next();
85 +
86 + // Check whether the information in the leaf is correct.
87 + assertThat(leafInfo.getName(), is("network-ref"));
88 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
89 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
90 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
91 +
92 + // Check whether leafref type got resolved.
93 + assertThat(leafref.getResolvableStatus(),
94 + is(ResolvableStatus.RESOLVED));
95 +
96 + // Check the effective type for the leaf.
97 + assertThat(leafref.getEffectiveDataType().getDataType(),
98 + is(YangDataTypes.UINT8));
99 + }
100 +
101 + /**
102 + * Checks self resolution when leafref under module refers to leaf in input of rpc.
103 + */
104 + @Test
105 + public void processSelfResolutionWhenLeafrefInModuleReferToLeafInInputOfRpc()
106 + throws IOException, ParserException {
107 +
108 + YangNode node = manager
109 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInModuleReferToLeafInInputOfRpc.yang");
110 +
111 + // Check whether the data model tree returned is of type module.
112 + assertThat((node instanceof YangModule), is(true));
113 +
114 + // Check whether the node type is set properly to module.
115 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
116 +
117 + // Check whether the module name is set correctly.
118 + YangModule yangNode = (YangModule) node;
119 + assertThat(yangNode.getName(), is("ietf-network"));
120 +
121 + ListIterator<YangLeaf> leafIterator;
122 + YangLeaf leafInfo;
123 +
124 + leafIterator = yangNode.getListOfLeaf().listIterator();
125 + leafInfo = leafIterator.next();
126 +
127 + // Check whether the information in the leaf is correct.
128 + assertThat(leafInfo.getName(), is("network-ref"));
129 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
130 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
131 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
132 +
133 + // Check whether leafref type got resolved.
134 + assertThat(leafref.getResolvableStatus(),
135 + is(ResolvableStatus.RESOLVED));
136 +
137 + // Check the effective type for the leaf.
138 + assertThat(leafref.getEffectiveDataType().getDataType(),
139 + is(YangDataTypes.UINT8));
140 + }
141 +
142 + /**
143 + * Checks self resolution when leafref under module refers to grouping rpc with input as name.
144 + * Rpc has input child also. So here the node search must be done by taking input node.
145 + */
146 + @Test
147 + public void processSelfResolutionWhenLeafrefInModuleReferToGroupingWithInputInRpc()
148 + throws IOException, ParserException {
149 +
150 + YangNode node = manager
151 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInModuleReferToGroupingWithInputInRpc.yang");
152 +
153 + // Check whether the data model tree returned is of type module.
154 + assertThat((node instanceof YangModule), is(true));
155 +
156 + // Check whether the node type is set properly to module.
157 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
158 +
159 + // Check whether the module name is set correctly.
160 + YangModule yangNode = (YangModule) node;
161 + assertThat(yangNode.getName(), is("ietf-network"));
162 +
163 + ListIterator<YangLeaf> leafIterator;
164 + YangLeaf leafInfo;
165 +
166 + leafIterator = yangNode.getListOfLeaf().listIterator();
167 + leafInfo = leafIterator.next();
168 +
169 + // Check whether the information in the leaf is correct.
170 + assertThat(leafInfo.getName(), is("network-ref"));
171 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
172 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
173 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
174 +
175 + // Check whether leafref type got resolved.
176 + assertThat(leafref.getResolvableStatus(),
177 + is(ResolvableStatus.RESOLVED));
178 +
179 + // Check the effective type for the leaf.
180 + assertThat(leafref.getEffectiveDataType().getDataType(),
181 + is(YangDataTypes.UINT8));
182 + }
183 +
184 + /**
185 + * Checks self resolution when leafref under module refers to grouping under module.
186 + * Grouping/typedef cannot be referred.
187 + */
188 + @Test
189 + public void processSelfResolutionWhenLeafrefInModuleReferToGrouping()
190 + throws IOException, ParserException {
191 +
192 + thrown.expect(LinkerException.class);
193 + thrown.expectMessage(
194 + "YANG file error: The target node of leafref is invalid.");
195 + YangNode node = manager
196 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInModuleReferToGroupingInModule.yang");
197 + }
198 +
199 + /**
200 + * Checks self resolution error scenerio where leafref is without path.
201 + */
202 + @Test
203 + public void processSelfResolutionWhenLeafrefDoesntHavePath()
204 + throws IOException, ParserException {
205 +
206 + thrown.expect(ParserException.class);
207 + thrown.expectMessage(
208 + "YANG file error : a type leafref must have one path statement.");
209 + YangNode node = manager
210 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefDoesntHavePath.yang");
211 + }
212 +
213 + /**
214 + * Checks self resolution when leafref under module refers to invalid node.
215 + * Inter file linking also has to be done to know the error message.
216 + */
217 + @Test
218 + public void processSelfResolutionWhenLeafrefInModuleReferToInvalidNode()
219 + throws IOException, ParserException {
220 +
221 + YangNode node = manager
222 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInModuleReferToInvalidNode.yang");
223 + // Check whether the data model tree returned is of type module.
224 + assertThat((node instanceof YangModule), is(true));
225 +
226 + // Check whether the node type is set properly to module.
227 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
228 +
229 + // Check whether the module name is set correctly.
230 + YangModule yangNode = (YangModule) node;
231 + assertThat(yangNode.getName(), is("ietf-network"));
232 +
233 + ListIterator<YangLeaf> leafIterator;
234 + YangLeaf leafInfo;
235 +
236 + leafIterator = yangNode.getListOfLeaf().listIterator();
237 + leafInfo = leafIterator.next();
238 +
239 + // Check whether the information in the leaf is correct.
240 + assertThat(leafInfo.getName(), is("network-ref"));
241 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
242 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
243 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
244 +
245 + // Check whether leafref type got intra file resolved.
246 + assertThat(leafref.getResolvableStatus(),
247 + is(ResolvableStatus.INTRA_FILE_RESOLVED));
248 + }
249 +
250 + /**
251 + * Checks self resolution when leafref under module refers to invalid node.
252 + * Inter file linking also has to be done to know the error message.
253 + */
254 + @Test
255 + public void processSelfResolutionWhenLeafrefIsInDeepTreeAndLeafIsInModuleWithReferredTypeUnion()
256 + throws IOException, ParserException {
257 +
258 + YangNode node = manager.getDataModel(
259 + "src/test/resources/SelfResolutionWhenLeafrefIsInDeepTreeAndLeafIsInModuleWithReferredTypeUnion.yang");
260 + // Check whether the data model tree returned is of type module.
261 + assertThat((node instanceof YangModule), is(true));
262 +
263 + // Check whether the node type is set properly to module.
264 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
265 +
266 + // Check whether the module name is set correctly.
267 + YangModule yangNode = (YangModule) node;
268 + assertThat(yangNode.getName(), is("Test"));
269 +
270 + YangContainer containerParent = (YangContainer) yangNode.getChild().getChild().getChild();
271 + ListIterator<YangLeaf> leafIterator;
272 + YangLeaf leafInfo;
273 +
274 + leafIterator = containerParent.getListOfLeaf().listIterator();
275 + leafInfo = leafIterator.next();
276 +
277 + // Check whether the information in the leaf is correct.
278 + assertThat(leafInfo.getName(), is("name"));
279 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
280 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
281 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
282 +
283 + // Check whether leafref type got resolved.
284 + assertThat(leafref.getResolvableStatus(),
285 + is(ResolvableStatus.RESOLVED));
286 +
287 + // Check the effective type for the leaf.
288 + assertThat(leafref.getEffectiveDataType().getDataType(),
289 + is(YangDataTypes.UNION));
290 + }
291 +
292 + /**
293 + * Checks self resolution when leafref of leaf-list under module refers to leaf in container.
294 + */
295 + @Test
296 + public void processSelfResolutionWhenLeafrefReferToContainerLeafList()
297 + throws IOException, ParserException {
298 +
299 + YangNode node = manager
300 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToContainerLeafList.yang");
301 +
302 + // Check whether the data model tree returned is of type module.
303 + assertThat((node instanceof YangModule), is(true));
304 +
305 + // Check whether the node type is set properly to module.
306 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
307 +
308 + // Check whether the module name is set correctly.
309 + YangModule yangNode = (YangModule) node;
310 + assertThat(yangNode.getName(), is("ietf-network"));
311 +
312 + ListIterator<YangLeafList> leafListIterator;
313 + YangLeafList leafListInfo;
314 +
315 + leafListIterator = yangNode.getListOfLeafList().listIterator();
316 + leafListInfo = leafListIterator.next();
317 +
318 + // Check whether the information in the leaf is correct.
319 + assertThat(leafListInfo.getName(), is("network-ref"));
320 + assertThat(leafListInfo.getDataType().getDataTypeName(), is("leafref"));
321 + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
322 + YangLeafRef leafref = (YangLeafRef) (leafListInfo.getDataType().getDataTypeExtendedInfo());
323 +
324 + // Check whether leafref type got resolved.
325 + assertThat(leafref.getResolvableStatus(),
326 + is(ResolvableStatus.RESOLVED));
327 +
328 + // Check the effective type for the leaf.
329 + assertThat(leafref.getEffectiveDataType().getDataType(),
330 + is(YangDataTypes.UINT8));
331 + }
332 +
333 + /**
334 + * Checks self resolution when leafref of leaf-list under module refers to leaf-list in input of rpc.
335 + */
336 + @Test
337 + public void processSelfResolutionWhenLeafrefInModuleReferToLeafListInInputOfRpc()
338 + throws IOException, ParserException {
339 +
340 + YangNode node = manager
341 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInModuleReferToLeafListInInputOfRpc.yang");
342 +
343 + // Check whether the data model tree returned is of type module.
344 + assertThat((node instanceof YangModule), is(true));
345 +
346 + // Check whether the node type is set properly to module.
347 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
348 +
349 + // Check whether the module name is set correctly.
350 + YangModule yangNode = (YangModule) node;
351 + assertThat(yangNode.getName(), is("ietf-network"));
352 +
353 + ListIterator<YangLeafList> leafListIterator;
354 + YangLeafList leafListInfo;
355 +
356 + leafListIterator = yangNode.getListOfLeafList().listIterator();
357 + leafListInfo = leafListIterator.next();
358 +
359 + // Check whether the information in the leaf is correct.
360 + assertThat(leafListInfo.getName(), is("network-ref"));
361 + assertThat(leafListInfo.getDataType().getDataTypeName(), is("leafref"));
362 + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
363 + YangLeafRef leafref = (YangLeafRef) (leafListInfo.getDataType().getDataTypeExtendedInfo());
364 +
365 + // Check whether leafref type got resolved.
366 + assertThat(leafref.getResolvableStatus(),
367 + is(ResolvableStatus.RESOLVED));
368 +
369 + // Check the effective type for the leaf.
370 + assertThat(leafref.getEffectiveDataType().getDataType(),
371 + is(YangDataTypes.UINT8));
372 + }
373 +
374 + /**
375 + * Checks self resolution when leafref of leaf-list under module refers to invalid node.
376 + * Inter file linking also has to be done to know the error message.
377 + */
378 + @Test
379 + public void processSelfResolutionWhenLeafrefIsInDeepTreeAndLeafListIsInModuleWithReferredTypeEnumeration()
380 + throws IOException, ParserException {
381 +
382 + YangNode node = manager.getDataModel(
383 + "src/test/resources/" +
384 + "SelfResolutionWhenLeafrefIsInDeepTreeAndLeafListIsInModuleWithReferredTypeEnumeration.yang");
385 + // Check whether the data model tree returned is of type module.
386 + assertThat((node instanceof YangModule), is(true));
387 +
388 + // Check whether the node type is set properly to module.
389 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
390 +
391 + // Check whether the module name is set correctly.
392 + YangModule yangNode = (YangModule) node;
393 + assertThat(yangNode.getName(), is("Test"));
394 +
395 + YangContainer containerParent = (YangContainer) yangNode.getChild().getChild().getChild();
396 + ListIterator<YangLeafList> leafListListIterator;
397 + YangLeafList leafListInfo;
398 +
399 + leafListListIterator = containerParent.getListOfLeafList().listIterator();
400 + leafListInfo = leafListListIterator.next();
401 +
402 + // Check whether the information in the leaf is correct.
403 + assertThat(leafListInfo.getName(), is("name"));
404 + assertThat(leafListInfo.getDataType().getDataTypeName(), is("leafref"));
405 + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
406 + YangLeafRef leafref = (YangLeafRef) (leafListInfo.getDataType().getDataTypeExtendedInfo());
407 +
408 + // Check whether leafref type got resolved.
409 + assertThat(leafref.getResolvableStatus(),
410 + is(ResolvableStatus.RESOLVED));
411 +
412 + // Check the effective type for the leaf.
413 + assertThat(leafref.getEffectiveDataType().getDataType(),
414 + is(YangDataTypes.ENUMERATION));
415 + }
416 +
417 + /**
418 + * Checks the error scenerio when the referred node is not a leaf or leaf-list.
419 + */
420 + @Test
421 + public void processSelfResolutionWhenLeafrefDoesNotReferToLeafOrLeafList()
422 + throws IOException, ParserException {
423 +
424 + YangNode node = manager
425 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefDoesNotReferToLeafOrLeafList.yang");
426 +
427 + // Check whether the data model tree returned is of type module.
428 + assertThat((node instanceof YangModule), is(true));
429 +
430 + // Check whether the node type is set properly to module.
431 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
432 +
433 + // Check whether the module name is set correctly.
434 + YangModule yangNode = (YangModule) node;
435 + assertThat(yangNode.getName(), is("ietf-network"));
436 +
437 + ListIterator<YangLeaf> leafIterator;
438 + YangLeaf leafInfo;
439 +
440 + //YangGrouping grouping = (YangGrouping) yangNode.getChild().getNextSibling();
441 + leafIterator = yangNode.getListOfLeaf().listIterator();
442 + leafInfo = leafIterator.next();
443 +
444 + // Check whether the information in the leaf is correct under grouping.
445 + assertThat(leafInfo.getName(), is("network-ref"));
446 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
447 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
448 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
449 +
450 + assertThat(leafref.getResolvableStatus(),
451 + is(ResolvableStatus.INTRA_FILE_RESOLVED));
452 + }
453 +
454 + /**
455 + * Checks self resolution when leafref of leaf-list under module refers to leaf in container.
456 + */
457 + @Test
458 + public void processSelfResolutionWhenLeafrefInTypedefReferToContainer()
459 + throws IOException, ParserException {
460 +
461 + YangNode node = manager
462 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInTypedefReferToContainer.yang");
463 +
464 + // Check whether the data model tree returned is of type module.
465 + assertThat((node instanceof YangModule), is(true));
466 +
467 + // Check whether the node type is set properly to module.
468 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
469 +
470 + // Check whether the module name is set correctly.
471 + YangModule yangNode = (YangModule) node;
472 + assertThat(yangNode.getName(), is("ietf-network"));
473 +
474 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
475 + ListIterator<YangLeaf> leafIterator;
476 + YangLeaf leafInfo;
477 + leafIterator = yangContainer.getListOfLeaf().listIterator();
478 + leafInfo = leafIterator.next();
479 +
480 + // Check whether the information in the leaf is correct under grouping.
481 + assertThat(leafInfo.getName(), is("network-id"));
482 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
483 +
484 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
485 +
486 + // Check whether leafref type got resolved.
487 + assertThat(leafref.getResolvableStatus(),
488 + is(ResolvableStatus.RESOLVED));
489 +
490 + // Check the effective type for the leaf.
491 + assertThat(leafref.getEffectiveDataType().getDataType(),
492 + is(YangDataTypes.UINT8));
493 + }
494 +
495 + /**
496 + * Checks self resolution when leafref of leaf-list under module refers to leaf-list in input of rpc.
497 + */
498 + @Test
499 + public void processSelfResolutionWhenLeafrefInTypedefModuleReferToLeafListInInputOfRpc()
500 + throws IOException, ParserException {
501 +
502 + YangNode node = manager.getDataModel(
503 + "src/test/resources/SelfResolutionWhenLeafrefInTypedefModuleReferToLeafListInInputOfRpc.yang");
504 +
505 + // Check whether the data model tree returned is of type module.
506 + assertThat((node instanceof YangModule), is(true));
507 +
508 + // Check whether the node type is set properly to module.
509 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
510 +
511 + // Check whether the module name is set correctly.
512 + YangModule yangNode = (YangModule) node;
513 + assertThat(yangNode.getName(), is("ietf-network"));
514 +
515 + YangInput yangInput = (YangInput) yangNode.getChild().getChild();
516 +
517 + ListIterator<YangLeafList> leafListIterator;
518 + YangLeafList yangLeafListInfo;
519 + leafListIterator = yangInput.getListOfLeafList().listIterator();
520 + yangLeafListInfo = leafListIterator.next();
521 +
522 + // Check whether the information in the leaf is correct under grouping.
523 + assertThat(yangLeafListInfo.getName(), is("network-id"));
524 + assertThat(yangLeafListInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
525 +
526 + YangLeafRef leafref = (YangLeafRef) (yangLeafListInfo.getDataType().getDataTypeExtendedInfo());
527 +
528 + // Check whether leafref type got resolved.
529 + assertThat(leafref.getResolvableStatus(),
530 + is(ResolvableStatus.RESOLVED));
531 +
532 + // Check the effective type for the leaf.
533 + assertThat(leafref.getEffectiveDataType().getDataType(),
534 + is(YangDataTypes.UINT8));
535 + }
536 +
537 + /**
538 + * Checks self resolution when leafref of leaf-list under module refers to invalid node.
539 + * Inter file linking also has to be done to know the error message.
540 + */
541 + @Test
542 + public void processSelfResolutionWhenLeafrefInTypedefIsInDeepTreeAndLeafListIsInModuleWithReferredTypeEnumeration()
543 + throws IOException, ParserException {
544 +
545 + YangNode node = manager.getDataModel(
546 + "src/test/resources/" +
547 + "SelfResolutionWhenLeafrefInTypedefIs" +
548 + "InDeepTreeAndLeafListIsInModuleWithReferredTypeEnumeration.yang");
549 + // Check whether the data model tree returned is of type module.
550 + assertThat((node instanceof YangModule), is(true));
551 +
552 + // Check whether the node type is set properly to module.
553 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
554 +
555 + // Check whether the module name is set correctly.
556 + YangModule yangNode = (YangModule) node;
557 + assertThat(yangNode.getName(), is("Test"));
558 +
559 + YangContainer yangContainer = (YangContainer) yangNode.getChild().getChild().getChild().getNextSibling();
560 +
561 + ListIterator<YangLeaf> leafIterator;
562 + YangLeaf yangLeafInfo;
563 + leafIterator = yangContainer.getListOfLeaf().listIterator();
564 + yangLeafInfo = leafIterator.next();
565 +
566 + // Check whether the information in the leaf is correct under grouping.
567 + assertThat(yangLeafInfo.getName(), is("interval"));
568 + assertThat(yangLeafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
569 +
570 + YangLeafRef leafref = (YangLeafRef) (yangLeafInfo.getDataType().getDataTypeExtendedInfo());
571 +
572 + // Check whether leafref type got resolved.
573 + assertThat(leafref.getResolvableStatus(),
574 + is(ResolvableStatus.RESOLVED));
575 +
576 + // Check the effective type for the leaf.
577 + assertThat(leafref.getEffectiveDataType().getDataType(),
578 + is(YangDataTypes.ENUMERATION));
579 + }
580 +
581 + /**
582 + * Checks self resolution when grouping and uses are siblings.
583 + * Grouping followed by uses.
584 + */
585 + @Test
586 + public void processSelfResolutionWhenLeafrefRefersAnotherLeafref()
587 + throws IOException, ParserException {
588 +
589 + YangNode node = manager.getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToAnotherLeafref.yang");
590 + // Check whether the data model tree returned is of type module.
591 + assertThat((node instanceof YangModule), is(true));
592 +
593 + // Check whether the node type is set properly to module.
594 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
595 +
596 + // Check whether the module name is set correctly.
597 + YangModule yangNode = (YangModule) node;
598 + assertThat(yangNode.getName(), is("ietf-network"));
599 +
600 + ListIterator<YangLeaf> leafIterator;
601 + YangLeaf leafInfo;
602 +
603 + //YangGrouping grouping = (YangGrouping) yangNode.getChild().getNextSibling();
604 + leafIterator = yangNode.getListOfLeaf().listIterator();
605 + leafInfo = leafIterator.next();
606 +
607 + // Check whether the information in the leaf is correct under grouping.
608 + assertThat(leafInfo.getName(), is("network-ref"));
609 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
610 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
611 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
612 +
613 + assertThat(leafref.getResolvableStatus(),
614 + is(ResolvableStatus.RESOLVED));
615 +
616 + assertThat(leafref.getEffectiveDataType().getDataType(),
617 + is(YangDataTypes.UINT8));
618 + }
619 +
620 + /**
621 + * Checks self resolution when leafref refers to many other leafref.
622 + */
623 + @Test
624 + public void processSelfResolutionWhenLeafrefReferToMultipleLeafref()
625 + throws IOException, ParserException {
626 +
627 + YangNode node = manager.getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToMultipleLeafref.yang");
628 + // Check whether the data model tree returned is of type module.
629 + assertThat((node instanceof YangModule), is(true));
630 +
631 + // Check whether the node type is set properly to module.
632 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
633 +
634 + // Check whether the module name is set correctly.
635 + YangModule yangNode = (YangModule) node;
636 + assertThat(yangNode.getName(), is("Test"));
637 +
638 + YangContainer containerInModule = (YangContainer) yangNode.getChild().getNextSibling();
639 + YangContainer containerInList = (YangContainer) containerInModule.getChild().getChild();
640 +
641 + ListIterator<YangLeaf> leafIterator;
642 + YangLeaf leafInfo;
643 +
644 + leafIterator = containerInList.getListOfLeaf().listIterator();
645 + leafInfo = leafIterator.next();
646 +
647 + // Check whether the information in the leaf is correct under grouping.
648 + assertThat(leafInfo.getName(), is("remove"));
649 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
650 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
651 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
652 +
653 + assertThat(leafref.getResolvableStatus(),
654 + is(ResolvableStatus.RESOLVED));
655 +
656 + assertThat(leafref.getEffectiveDataType().getDataType(),
657 + is(YangDataTypes.ENUMERATION));
658 + }
659 +
660 + /**
661 + * Checks self resolution when grouping and uses are siblings.
662 + * Grouping followed by uses.
663 + */
664 + @Test
665 + public void processSelfResolutionWhenLeafrefRefersAnotherDerivedType()
666 + throws IOException, ParserException {
667 +
668 + YangNode node = manager
669 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToAnotherDerivedType.yang");
670 + // Check whether the data model tree returned is of type module.
671 + assertThat((node instanceof YangModule), is(true));
672 +
673 + // Check whether the node type is set properly to module.
674 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
675 +
676 + // Check whether the module name is set correctly.
677 + YangModule yangNode = (YangModule) node;
678 + assertThat(yangNode.getName(), is("ietf-network"));
679 +
680 + ListIterator<YangLeaf> leafIterator;
681 + YangLeaf leafInfo;
682 +
683 + //YangGrouping grouping = (YangGrouping) yangNode.getChild().getNextSibling();
684 + leafIterator = yangNode.getListOfLeaf().listIterator();
685 + leafInfo = leafIterator.next();
686 +
687 + // Check whether the information in the leaf is correct under grouping.
688 + assertThat(leafInfo.getName(), is("network-ref"));
689 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
690 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
691 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
692 +
693 + assertThat(leafref.getResolvableStatus(),
694 + is(ResolvableStatus.RESOLVED));
695 +
696 + assertThat(leafref.getEffectiveDataType().getDataType(),
697 + is(YangDataTypes.DERIVED));
698 + }
699 +
700 + /**
701 + * Checks self resolution when leafref refers to many other leafref.
702 + */
703 + @Test
704 + public void processSelfResolutionWhenLeafrefReferToMultipleTypedef()
705 + throws IOException, ParserException {
706 +
707 + YangNode node = manager.getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToMultipleTypedef.yang");
708 + // Check whether the data model tree returned is of type module.
709 + assertThat((node instanceof YangModule), is(true));
710 +
711 + // Check whether the node type is set properly to module.
712 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
713 +
714 + // Check whether the module name is set correctly.
715 + YangModule yangNode = (YangModule) node;
716 + assertThat(yangNode.getName(), is("Test"));
717 +
718 + YangContainer containerInModule = (YangContainer) yangNode.getChild().getNextSibling();
719 + YangContainer containerInList = (YangContainer) containerInModule.getChild().getChild();
720 +
721 + ListIterator<YangLeaf> leafIterator;
722 + YangLeaf leafInfo;
723 +
724 + leafIterator = containerInList.getListOfLeaf().listIterator();
725 + leafInfo = leafIterator.next();
726 +
727 + // Check whether the information in the leaf is correct under grouping.
728 + assertThat(leafInfo.getName(), is("remove"));
729 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
730 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
731 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
732 +
733 + assertThat(leafref.getResolvableStatus(),
734 + is(ResolvableStatus.RESOLVED));
735 +
736 + assertThat(leafref.getEffectiveDataType().getDataType(),
737 + is(YangDataTypes.DERIVED));
738 + }
739 +
740 + /**
741 + * Checks self resolution when leafref refers to many other leaf with derived type
742 + * which in turn referring to another leaf.
743 + */
744 + @Test
745 + public void processSelfResolutionWhenLeafrefReferToDerivedTypeReferringToLeafWithLeafref()
746 + throws IOException, ParserException {
747 +
748 + YangNode node = manager.getDataModel(
749 + "src/test/resources/SelfResolutionWhenLeafrefReferToDerivedTypeReferringToLeafWithLeafref.yang");
750 + // Check whether the data model tree returned is of type module.
751 + assertThat((node instanceof YangModule), is(true));
752 +
753 + // Check whether the node type is set properly to module.
754 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
755 +
756 + // Check whether the module name is set correctly.
757 + YangModule yangNode = (YangModule) node;
758 + assertThat(yangNode.getName(), is("Test"));
759 +
760 + YangContainer containerInModule = (YangContainer) yangNode.getChild().getNextSibling();
761 + YangContainer containerInList = (YangContainer) containerInModule.getChild().getChild();
762 +
763 + ListIterator<YangLeaf> leafIterator;
764 + YangLeaf leafInfo;
765 +
766 + leafIterator = containerInList.getListOfLeaf().listIterator();
767 + leafInfo = leafIterator.next();
768 +
769 + // Check whether the information in the leaf is correct under grouping.
770 + assertThat(leafInfo.getName(), is("remove"));
771 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
772 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
773 + YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
774 +
775 + assertThat(leafref.getResolvableStatus(),
776 + is(ResolvableStatus.RESOLVED));
777 +
778 + assertThat(leafref.getEffectiveDataType().getDataType(),
779 + is(YangDataTypes.ENUMERATION));
780 + }
781 +
782 + /**
783 + * Checks self resolution when leafref under module refers to leaf in container with relative path.
784 + */
785 + @Test
786 + public void processSelfResolutionWhenLeafrefReferToContainerLeafRelPath()
787 + throws IOException, ParserException {
788 +
789 + YangNode node = manager
790 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToContainerLeafRelPath.yang");
791 +
792 + // Check whether the data model tree returned is of type module.
793 + assertThat((node instanceof YangModule), is(true));
794 +
795 + // Check whether the node type is set properly to module.
796 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
797 +
798 + // Check whether the module name is set correctly.
799 + YangModule yangNode = (YangModule) node;
800 + assertThat(yangNode.getName(), is("ietf-network"));
801 +
802 + ListIterator<YangLeaf> leafIterator;
803 + YangLeaf leafInfo;
804 +
805 + leafIterator = yangNode.getListOfLeaf().listIterator();
806 + leafInfo = leafIterator.next();
807 +
808 + // Check whether the information in the leaf is correct.
809 + assertThat(leafInfo.getName(), is("network-ref"));
810 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
811 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
812 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
813 +
814 + // Check whether leafref type got resolved.
815 + assertThat(leafref.getResolvableStatus(),
816 + is(ResolvableStatus.RESOLVED));
817 +
818 + // Check the effective type for the leaf.
819 + assertThat(leafref.getEffectiveDataType().getDataType(),
820 + is(YangDataTypes.UINT8));
821 + }
822 +
823 + /**
824 + * Checks self resolution when leafref under module refers to grouping rpc with input as name.
825 + * Rpc has input child also. So here the node search must be done by taking input node using relative path.
826 + */
827 + @Test
828 + public void processSelfResolutionWhenLeafrefInModuleReferToGroupingWithInputInRpcRelPath()
829 + throws IOException, ParserException {
830 +
831 + YangNode node = manager.getDataModel(
832 + "src/test/resources/SelfResolutionWhenLeafrefInModuleReferToGroupingWithInputInRpcRelPath.yang");
833 +
834 + // Check whether the data model tree returned is of type module.
835 + assertThat((node instanceof YangModule), is(true));
836 +
837 + // Check whether the node type is set properly to module.
838 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
839 +
840 + // Check whether the module name is set correctly.
841 + YangModule yangNode = (YangModule) node;
842 + assertThat(yangNode.getName(), is("ietf-network"));
843 +
844 + ListIterator<YangLeaf> leafIterator;
845 + YangLeaf leafInfo;
846 +
847 + leafIterator = yangNode.getListOfLeaf().listIterator();
848 + leafInfo = leafIterator.next();
849 +
850 + // Check whether the information in the leaf is correct.
851 + assertThat(leafInfo.getName(), is("network-ref"));
852 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
853 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
854 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
855 +
856 + // Check whether leafref type got resolved.
857 + assertThat(leafref.getResolvableStatus(),
858 + is(ResolvableStatus.RESOLVED));
859 +
860 + // Check the effective type for the leaf.
861 + assertThat(leafref.getEffectiveDataType().getDataType(),
862 + is(YangDataTypes.UINT8));
863 + }
864 +
865 + /**
866 + * Checks self resolution when leafref under module refers to invalid root node with relative path.
867 + */
868 + @Test
869 + public void processSelfResolutionWhenLeafrefInModuleReferToInvalidRootNodeRelPath()
870 + throws IOException, ParserException {
871 +
872 + thrown.expect(LinkerException.class);
873 + thrown.expectMessage(
874 + "YANG file error: The target node of leafref is invalid.");
875 + YangNode node = manager
876 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInModuleReferToInvalidRootNodeRelPath.yang");
877 + }
878 +
879 + /**
880 + * Checks self resolution when leafref under module refers to invalid node.
881 + * Inter file linking also has to be done to know the error message with relative path.
882 + */
883 + @Test
884 + public void processSelfResolutionWhenLeafrefInModuleReferToInvalidNodeRelPath()
885 + throws IOException, ParserException {
886 +
887 + YangNode node = manager
888 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInModuleReferToInvalidNodeRelPath.yang");
889 + // Check whether the data model tree returned is of type module.
890 + assertThat((node instanceof YangModule), is(true));
891 +
892 + // Check whether the node type is set properly to module.
893 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
894 +
895 + // Check whether the module name is set correctly.
896 + YangModule yangNode = (YangModule) node;
897 + assertThat(yangNode.getName(), is("ietf-network"));
898 +
899 + ListIterator<YangLeaf> leafIterator;
900 + YangLeaf leafInfo;
901 +
902 + leafIterator = yangNode.getListOfLeaf().listIterator();
903 + leafInfo = leafIterator.next();
904 +
905 + // Check whether the information in the leaf is correct.
906 + assertThat(leafInfo.getName(), is("network-ref"));
907 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
908 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
909 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
910 +
911 + // Check whether leafref type got intra file resolved.
912 + assertThat(leafref.getResolvableStatus(),
913 + is(ResolvableStatus.INTRA_FILE_RESOLVED));
914 + }
915 +
916 + /**
917 + * Checks self resolution when leafref of leaf-list under module refers to leaf in container with relative path.
918 + */
919 + @Test
920 + public void processSelfResolutionWhenLeafrefInTypedefReferToContainerRelPath()
921 + throws IOException, ParserException {
922 +
923 + YangNode node = manager
924 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefInTypedefReferToContainerRelPath.yang");
925 +
926 + // Check whether the data model tree returned is of type module.
927 + assertThat((node instanceof YangModule), is(true));
928 +
929 + // Check whether the node type is set properly to module.
930 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
931 +
932 + // Check whether the module name is set correctly.
933 + YangModule yangNode = (YangModule) node;
934 + assertThat(yangNode.getName(), is("ietf-network"));
935 + ListIterator<YangLeaf> leafIterator;
936 + YangLeaf leafInfo;
937 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
938 + leafIterator = yangContainer.getListOfLeaf().listIterator();
939 + leafInfo = leafIterator.next();
940 +
941 + // Check whether the information in the leaf is correct under grouping.
942 + assertThat(leafInfo.getName(), is("network-id"));
943 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
944 +
945 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
946 +
947 + // Check whether leafref type got resolved.
948 + assertThat(leafref.getResolvableStatus(),
949 + is(ResolvableStatus.RESOLVED));
950 +
951 + // Check the effective type for the leaf.
952 + assertThat(leafref.getEffectiveDataType().getDataType(),
953 + is(YangDataTypes.UINT8));
954 + }
955 +
956 + /**
957 + * Checks self resolution when leafref refers to many other leafref with relative path.
958 + */
959 + @Test
960 + public void processSelfResolutionWhenLeafrefReferToMultipleLeafrefRelPath()
961 + throws IOException, ParserException {
962 +
963 + YangNode node = manager
964 + .getDataModel("src/test/resources/SelfResolutionWhenLeafrefReferToMultipleLeafrefRelPath.yang");
965 + // Check whether the data model tree returned is of type module.
966 + assertThat((node instanceof YangModule), is(true));
967 +
968 + // Check whether the node type is set properly to module.
969 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
970 +
971 + // Check whether the module name is set correctly.
972 + YangModule yangNode = (YangModule) node;
973 + assertThat(yangNode.getName(), is("Test"));
974 +
975 + YangContainer containerInModule = (YangContainer) yangNode.getChild().getNextSibling();
976 + YangContainer containerInList = (YangContainer) containerInModule.getChild().getChild();
977 +
978 + ListIterator<YangLeaf> leafIterator;
979 + YangLeaf leafInfo;
980 +
981 + leafIterator = containerInList.getListOfLeaf().listIterator();
982 + leafInfo = leafIterator.next();
983 +
984 + // Check whether the information in the leaf is correct under grouping.
985 + assertThat(leafInfo.getName(), is("remove"));
986 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
987 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
988 + YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
989 +
990 + assertThat(leafref.getResolvableStatus(),
991 + is(ResolvableStatus.RESOLVED));
992 +
993 + assertThat(leafref.getEffectiveDataType().getDataType(),
994 + is(YangDataTypes.ENUMERATION));
995 + }
996 +
997 + /**
998 + * Checks self resolution when leafref refers to many other leaf with derived type
999 + * which in turn referring to another leaf with relative type.
1000 + */
1001 + @Test
1002 + public void processSelfResolutionWhenLeafrefReferToDerivedTypeReferringToLeafWithLeafrefRelType()
1003 + throws IOException, ParserException {
1004 +
1005 + YangNode node = manager.getDataModel(
1006 + "src/test/resources/SelfResolutionWhenLeafrefReferToDerivedTypeReferringToLeafWithLeafrefRelType.yang");
1007 + // Check whether the data model tree returned is of type module.
1008 + assertThat((node instanceof YangModule), is(true));
1009 +
1010 + // Check whether the node type is set properly to module.
1011 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
1012 +
1013 + // Check whether the module name is set correctly.
1014 + YangModule yangNode = (YangModule) node;
1015 + assertThat(yangNode.getName(), is("Test"));
1016 +
1017 + YangContainer containerInModule = (YangContainer) yangNode.getChild().getNextSibling();
1018 + YangContainer containerInList = (YangContainer) containerInModule.getChild().getChild();
1019 +
1020 + ListIterator<YangLeaf> leafIterator;
1021 + YangLeaf leafInfo;
1022 +
1023 + leafIterator = containerInList.getListOfLeaf().listIterator();
1024 + leafInfo = leafIterator.next();
1025 +
1026 + // Check whether the information in the leaf is correct under grouping.
1027 + assertThat(leafInfo.getName(), is("remove"));
1028 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
1029 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
1030 + YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
1031 +
1032 + assertThat(leafref.getResolvableStatus(),
1033 + is(ResolvableStatus.RESOLVED));
1034 +
1035 + assertThat(leafref.getEffectiveDataType().getDataType(),
1036 + is(YangDataTypes.ENUMERATION));
1037 + }
1038 +
1039 + /**
1040 + * Checks the valid scenerios of path argument having proper setters.
1041 + */
1042 + @Test
1043 + public void processPathArgumentStatement()
1044 + throws IOException, ParserException {
1045 +
1046 + YangNode node = manager.getDataModel("src/test/resources/PathListener.yang");
1047 + // Check whether the data model tree returned is of type module.
1048 + assertThat((node instanceof YangModule), is(true));
1049 +
1050 + // Check whether the node type is set properly to module.
1051 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
1052 +
1053 + // Check whether the module name is set correctly.
1054 + YangModule yangNode = (YangModule) node;
1055 + assertThat(yangNode.getName(), is("PathListener"));
1056 + YangList listInModule = (YangList) yangNode.getChild();
1057 +
1058 + YangContainer containerInModule = (YangContainer) yangNode.getChild().getNextSibling();
1059 + ListIterator<YangLeaf> leafIterator;
1060 + YangLeaf leafInfo;
1061 +
1062 + YangLeaf leafNameInList = listInModule.getListOfLeaf().listIterator().next();
1063 +
1064 + leafIterator = containerInModule.getListOfLeaf().listIterator();
1065 + leafInfo = leafIterator.next();
1066 +
1067 + // Check whether the information in the leaf is correct under grouping.
1068 + assertThat(leafInfo.getName(), is("ifname"));
1069 + assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
1070 + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
1071 + YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
1072 + assertThat(leafref.getPathType(), is(YangPathArgType.RELATIVE_PATH));
1073 +
1074 + YangRelativePath relativePathForName = leafref.getRelativePath();
1075 + assertThat(relativePathForName.getAncestorNodeCount(), is(2));
1076 + List<YangAtomicPath> absPathForName = relativePathForName.getAtomicPathList();
1077 + Iterator<YangAtomicPath> absPathIteratorForName = absPathForName.listIterator();
1078 + YangAtomicPath abspathForName = absPathIteratorForName.next();
1079 + assertThat(abspathForName.getNodeIdentifier().getName(), is("interface"));
1080 + assertThat(abspathForName.getNodeIdentifier().getPrefix(), is("test"));
1081 + YangAtomicPath abspath1 = absPathIteratorForName.next();
1082 + assertThat(abspath1.getNodeIdentifier().getName(), is("name"));
1083 + assertThat(abspath1.getNodeIdentifier().getPrefix(), is("test"));
1084 +
1085 + YangLeaf leafInfo1 = leafIterator.next();
1086 + // Check whether the information in the leaf is correct under grouping.
1087 + assertThat(leafInfo1.getName(), is("status"));
1088 + assertThat(leafInfo1.getDataType().getDataTypeName(), is("leafref"));
1089 + assertThat(leafInfo1.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
1090 +
1091 + YangLeafRef leafref1 = (YangLeafRef) leafInfo1.getDataType().getDataTypeExtendedInfo();
1092 + assertThat(leafref1.getPathType(), is(YangPathArgType.ABSOLUTE_PATH));
1093 +
1094 + List<YangAtomicPath> absolutePathList = leafref1.getAtomicPath();
1095 + Iterator<YangAtomicPath> absPathIterator = absolutePathList.listIterator();
1096 + YangAtomicPath abspath = absPathIterator.next();
1097 + assertThat(abspath.getNodeIdentifier().getName(), is("interface"));
1098 + assertThat(abspath.getNodeIdentifier().getPrefix(), is("test"));
1099 +
1100 + List<YangPathPredicate> pathPredicateList = abspath.getPathPredicatesList();
1101 + Iterator<YangPathPredicate> pathPredicate = pathPredicateList.listIterator();
1102 + YangPathPredicate pathPredicate1 = pathPredicate.next();
1103 + assertThat(pathPredicate1.getNodeIdentifier().getName(), is("name"));
1104 + assertThat(pathPredicate1.getNodeIdentifier().getPrefix(), nullValue());
1105 + assertThat(pathPredicate1.getRightRelativePath().getAncestorNodeCount(), is(1));
1106 + assertThat(pathPredicate1.getPathOperator(), is(YangPathOperator.EQUALTO));
1107 + assertThat(pathPredicate1.getRightRelativePath().getAtomicPathList().listIterator().next().getNodeIdentifier()
1108 + .getName(), is("ifname"));
1109 + YangAtomicPath abspath2 = absPathIterator.next();
1110 + assertThat(abspath2.getNodeIdentifier().getName(), is("admin-status"));
1111 + assertThat(abspath2.getNodeIdentifier().getPrefix(), is("test"));
1112 +
1113 + assertThat(pathPredicate1.getLeftAxisNode(), is(leafNameInList));
1114 + assertThat(pathPredicate1.getRightAxisNode(), is(leafInfo));
1115 + }
1116 +}
1 +module PathListener {
2 + namespace "test";
3 + prefix test;
4 + list interface {
5 + key "name";
6 + leaf name {
7 + type string;
8 + }
9 + leaf admin-status {
10 + type string;
11 + }
12 + list address {
13 + key "ip";
14 + leaf ip {
15 + type string;
16 + }
17 + }
18 + }
19 + container default-address {
20 + leaf ifname {
21 + type leafref {
22 + path "../../test:interface/test:name";
23 + }
24 + }
25 + leaf status {
26 + type leafref {
27 + path "/test:interface[name = current()/../ifname]/test:admin-status";
28 + }
29 + }
30 + }
31 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module PathListener {
2 + namespace "test";
3 + prefix test;
4 + list interface {
5 + key "name";
6 + leaf name {
7 + type string;
8 + }
9 + leaf admin-status {
10 + type string;
11 + }
12 + list address {
13 + key "ip";
14 + leaf ip {
15 + type string;
16 + }
17 + }
18 + }
19 + container default-address {
20 + leaf ifname {
21 + type leafref {
22 + path "../../test:interface/test:name";
23 + }
24 + }
25 + leaf status {
26 + type leafref {
27 + path "/test:interface[name = current()/../ifname]/test:admin-status";
28 + }
29 + }
30 + }
31 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module PathListener {
2 + namespace "test";
3 + prefix test;
4 + leaf admin-status {
5 + type instance-identifier;
6 + }
7 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module PathListener {
2 + namespace "test";
3 + prefix test;
4 + leaf admin-status {
5 + type instance-identifier {
6 + require-instance "false";
7 + }
8 + }
9 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module PathListener {
2 + namespace "test";
3 + prefix test;
4 + list interface {
5 + key "name";
6 + leaf name {
7 + type string;
8 + }
9 + leaf admin-status {
10 + type string;
11 + }
12 + list address {
13 + key "ip";
14 + leaf ip {
15 + type string;
16 + }
17 + }
18 + }
19 + container default-address {
20 + leaf ifname {
21 + type leafref {
22 + path "../../test:interface/test:name";
23 + require-instance true;
24 + }
25 + }
26 + leaf status {
27 + type leafref {
28 + path "/test:interface[name = current()/../ifname]/test:admin-status";
29 + }
30 + }
31 + }
32 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module syslog {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix "sys";
5 + feature local-storage {
6 + description
7 + "This feature means the device supports local
8 + storage (memory, flash or disk) that can be used to
9 + store syslog messages.";
10 + }
11 +
12 + container speed {
13 + leaf local-storage-limit {
14 + if-feature local-storage;
15 + type uint64;
16 + units "kilobyte";
17 + config false;
18 + description
19 + "The amount of local storage that can be
20 + used to hold syslog messages.";
21 + }
22 + }
23 + leaf storage-value {
24 + type leafref {
25 + path "/speed/local-storage-limit";
26 + }
27 + }
28 +}
1 +module syslog {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix "sys";
5 + feature local-storage {
6 + description
7 + "This feature means the device supports local
8 + storage (memory, flash or disk) that can be used to
9 + store syslog messages.";
10 + }
11 + feature main-storage {
12 + description
13 + "This feature means the device supports main
14 + storage that can be used to
15 + store syslog messages.";
16 + }
17 +
18 + container speed {
19 + leaf local-storage-limit {
20 + if-feature local-storage;
21 + type leafref {
22 + path "/value";
23 + }
24 + units "kilobyte";
25 + config false;
26 + description
27 + "The amount of local storage that can be
28 + used to hold syslog messages.";
29 + }
30 + }
31 + leaf storage-value {
32 + type leafref {
33 + path "/speed/local-storage-limit";
34 + }
35 + }
36 + leaf value {
37 + if-feature main-storage;
38 + type uint64;
39 + }
40 +}
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type status;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + typedef status {
15 + type uint8;
16 + }
17 + leaf network-ref {
18 + type leafref {
19 + path "/networks";
20 + }
21 + }
22 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf-list network-ref {
15 + type leafref;
16 + }
17 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + rpc networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + grouping input {
9 + leaf network-id {
10 + type string;
11 + description
12 + "Identifies a network.";
13 + }
14 + }
15 + input {
16 + leaf network-id {
17 + type uint8;
18 + description
19 + "Identifies a network.";
20 + }
21 + }
22 + output {
23 + }
24 + }
25 + leaf network-ref {
26 + type leafref {
27 + path "/networks/input/network-id";
28 + }
29 + }
30 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + grouping networks {
6 + leaf network-id {
7 + type uint8;
8 + description
9 + "Identifies a network.";
10 + }
11 + }
12 + container current {
13 + leaf network-ref {
14 + type leafref {
15 + path "/networks/network-id";
16 + }
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + rpc networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + grouping input {
9 + leaf network-id {
10 + type string;
11 + description
12 + "Identifies a network.";
13 + }
14 + }
15 + input {
16 + leaf network-id {
17 + type uint8;
18 + description
19 + "Identifies a network.";
20 + }
21 + }
22 + }
23 + leaf network-ref {
24 + type leafref {
25 + path "/networks/input/network-id";
26 + }
27 + }
28 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + rpc networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + grouping input {
9 + leaf network-id {
10 + type string;
11 + description
12 + "Identifies a network.";
13 + }
14 + }
15 + input {
16 + leaf network-id {
17 + type uint8;
18 + description
19 + "Identifies a network.";
20 + }
21 + }
22 + }
23 + leaf network-ref {
24 + type leafref {
25 + path "../networks/input/network-id";
26 + }
27 + }
28 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf network-ref {
15 + type leafref {
16 + path "/define/network-id";
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf network-ref {
15 + type leafref {
16 + path "../define/network-id";
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf network-ref {
15 + type leafref {
16 + path "../../../define/network-id";
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + rpc networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + input {
9 + leaf network-id {
10 + type uint8;
11 + description
12 + "Identifies a network.";
13 + }
14 + }
15 + output {
16 + }
17 + }
18 + leaf network-ref {
19 + type leafref {
20 + path "/networks/input/network-id";
21 + }
22 + }
23 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + rpc networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + input {
9 + leaf-list network-id {
10 + type uint8;
11 + description
12 + "Identifies a network.";
13 + }
14 + }
15 + output {
16 + }
17 + }
18 + leaf-list network-ref {
19 + type leafref {
20 + path "/networks/input/network-id";
21 + }
22 + }
23 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + typedef node {
12 + type leafref {
13 + path "/invalid-interval";
14 + }
15 + }
16 + container present {
17 + typedef name {
18 + type node;
19 + }
20 + leaf interval {
21 + type name;
22 + }
23 + }
24 + }
25 + }
26 + leaf-list invalid-interval {
27 + type enumeration {
28 + enum 10m;
29 + enum 100m;
30 + enum auto;
31 + }
32 + }
33 +}
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + rpc networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + input {
9 + leaf-list network-id {
10 + type network-ref;
11 + description
12 + "Identifies a network.";
13 + }
14 + leaf id {
15 + type uint8;
16 + }
17 + }
18 + output {
19 + }
20 + }
21 + typedef network-ref {
22 + type leafref {
23 + path "/networks/input/id";
24 + }
25 + }
26 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type network-ref;
10 + description
11 + "Identifies a network.";
12 + }
13 + leaf id {
14 + type uint8;
15 + }
16 + }
17 + typedef network-ref {
18 + type leafref {
19 + path "/networks/id";
20 + }
21 + }
22 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type network-ref;
10 + description
11 + "Identifies a network.";
12 + }
13 + leaf id {
14 + type uint8;
15 + }
16 + }
17 + typedef network-ref {
18 + type leafref {
19 + path "../id";
20 + }
21 + }
22 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + container present {
12 + leaf name {
13 + type leafref {
14 + path "/invalid-interval";
15 + }
16 + }
17 + }
18 + }
19 + }
20 + leaf invalid-interval {
21 + type union {
22 + type int32;
23 + type enumeration {
24 + enum "unbounded";
25 + }
26 + }
27 + }
28 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + container present {
12 + leaf-list name {
13 + type leafref {
14 + path "/invalid-interval";
15 + }
16 + }
17 + }
18 + }
19 + }
20 + leaf-list invalid-interval {
21 + type enumeration {
22 + enum 10m;
23 + enum 100m;
24 + enum auto;
25 + }
26 + }
27 +}
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type status;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + typedef status {
15 + type uint8;
16 + }
17 + leaf network-ref {
18 + type leafref {
19 + path "/networks/network-id";
20 + }
21 + }
22 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type leafref {
10 + path "/status/current";
11 + }
12 + description
13 + "Identifies a network.";
14 + }
15 + }
16 + container status {
17 + leaf current {
18 + type uint8;
19 + }
20 + }
21 + leaf network-ref {
22 + type leafref {
23 + path "/networks/network-id";
24 + }
25 + }
26 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf network-ref {
15 + type leafref {
16 + path "/networks/network-id";
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf-list network-ref {
15 + type leafref {
16 + path "/networks/network-id";
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf network-ref {
15 + type leafref {
16 + path "../networks/network-id";
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + container present {
12 + leaf-list name {
13 + type transmitter;
14 + }
15 + }
16 + }
17 + }
18 + container reference {
19 + list found {
20 + key "define";
21 + leaf define {
22 + type string;
23 + }
24 + container reciever {
25 + leaf remove {
26 + type leafref {
27 + path "/valid/standard/present/name";
28 + }
29 + }
30 + }
31 + }
32 + }
33 + typedef transmitter {
34 + type leafref {
35 + path "/invalid-interval";
36 + }
37 + }
38 + leaf invalid-interval {
39 + type enumeration {
40 + enum 10m;
41 + enum 100m;
42 + enum auto;
43 + }
44 + }
45 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + container present {
12 + leaf-list name {
13 + type transmitter;
14 + }
15 + }
16 + }
17 + }
18 + container reference {
19 + list found {
20 + key "define";
21 + leaf define {
22 + type string;
23 + }
24 + container reciever {
25 + leaf remove {
26 + type leafref {
27 + path "../../../../valid/standard/present/name";
28 + }
29 + }
30 + }
31 + }
32 + }
33 + typedef transmitter {
34 + type leafref {
35 + path "../../../../invalid-interval";
36 + }
37 + }
38 + leaf invalid-interval {
39 + type enumeration {
40 + enum 10m;
41 + enum 100m;
42 + enum auto;
43 + }
44 + }
45 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + container present {
12 + leaf-list name {
13 + type leafref {
14 + path "/transmitter/send";
15 + }
16 + }
17 + }
18 + }
19 + }
20 + container reference {
21 + list found {
22 + key "define";
23 + leaf define {
24 + type string;
25 + }
26 + container reciever {
27 + leaf remove {
28 + type leafref {
29 + path "/valid/standard/present/name";
30 + }
31 + }
32 + }
33 + }
34 + }
35 + list transmitter {
36 + key "send";
37 + leaf send {
38 + type leafref {
39 + path "/invalid-interval";
40 + }
41 + }
42 + }
43 + leaf-list invalid-interval {
44 + type enumeration {
45 + enum 10m;
46 + enum 100m;
47 + enum auto;
48 + }
49 + }
50 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + container present {
12 + leaf-list name {
13 + type leafref {
14 + path "../../../../transmitter/send";
15 + }
16 + }
17 + }
18 + }
19 + }
20 + container reference {
21 + list found {
22 + key "define";
23 + leaf define {
24 + type string;
25 + }
26 + container reciever {
27 + leaf remove {
28 + type leafref {
29 + path "../../../../valid/standard/present/name";
30 + }
31 + }
32 + }
33 + }
34 + }
35 + list transmitter {
36 + key "send";
37 + leaf send {
38 + type leafref {
39 + path "../../invalid-interval";
40 + }
41 + }
42 + }
43 + leaf-list invalid-interval {
44 + type enumeration {
45 + enum 10m;
46 + enum 100m;
47 + enum auto;
48 + }
49 + }
50 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list valid {
6 + key "define";
7 + leaf define {
8 + type string;
9 + }
10 + container standard {
11 + container present {
12 + leaf-list name {
13 + type transmitter;
14 + }
15 + }
16 + }
17 + }
18 + container reference {
19 + list found {
20 + key "define";
21 + leaf define {
22 + type string;
23 + }
24 + container reciever {
25 + leaf remove {
26 + type leafref {
27 + path "/valid/standard/present/name";
28 + }
29 + }
30 + }
31 + }
32 + }
33 + typedef transmitter {
34 + type invalid-interval;
35 + }
36 + typedef invalid-interval {
37 + type enumeration {
38 + enum 10m;
39 + enum 100m;
40 + enum auto;
41 + }
42 + }
43 +}
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type uint8;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + leaf network-ref {
15 + type leafref {
16 + path "/define/network-id";
17 + }
18 + }
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module module1 {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + import module2 {
6 + prefix p;
7 + }
8 + leaf invalid-interval {
9 + type leafref {
10 + path "/p:hello";
11 + }
12 + }
13 + leaf hello {
14 + type string;
15 + }
16 +}
...\ No newline at end of file ...\ No newline at end of file
1 -module Test { 1 +module module2 {
2 yang-version 1; 2 yang-version 1;
3 namespace http://huawei.com; 3 namespace http://huawei.com;
4 - prefix Ant; 4 + prefix Ant2;
5 - leaf-list invalid-interval { 5 + leaf hello {
6 - type leafref; 6 + type string;
7 } 7 }
8 } 8 }
......
1 +module module1 {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology";
4 + prefix "tet";
5 + import module2 {
6 + prefix "nt";
7 + }
8 + grouping te-node-tunnel-termination-capability {
9 + description
10 + "Termination capability of a tunnel termination point on a
11 + TE node.";
12 + list termination-capability {
13 + key "link-tp";
14 + description
15 + "The termination capabilities between
16 + tunnel-termination-point and link termination-point.
17 + The capability information can be used to compute
18 + the tunnel path.";
19 + leaf link-tp {
20 + type leafref {
21 + path "/nt:termination-point/nt:tp-id";
22 + }
23 + description
24 + "Link termination point.";
25 + }
26 + } // termination-capability
27 + } // te-node-tunnel-termination-capability
28 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module module2 {
2 + yang-version 1;
3 + namespace
4 + "urn:ietf:params:xml:ns:yang:ietf-inet-types";
5 + prefix inet;
6 + container termination-point {
7 + leaf tp-id {
8 + type string;
9 + }
10 + }
11 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-inet-types {
2 + yang-version 1;
3 + namespace
4 + "urn:ietf:params:xml:ns:yang:ietf-inet-types";
5 + prefix inet;
6 + typedef tp-ref {
7 + type leafref {
8 + path "/nwtp:value";
9 + }
10 + }
11 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network-topology {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-te-topology";
4 + prefix "tet";
5 + import ietf-network {
6 + prefix "nt";
7 + }
8 + grouping te-node-tunnel-termination-capability {
9 + description
10 + "Termination capability of a tunnel termination point on a
11 + TE node.";
12 + list termination-capability {
13 + key "link-tp";
14 + description
15 + "The termination capabilities between
16 + tunnel-termination-point and link termination-point.
17 + The capability information can be used to compute
18 + the tunnel path.";
19 + leaf link-tp {
20 + type leafref {
21 + path "/nt:termination-point/nt:tp-id";
22 + }
23 + description
24 + "Link termination point.";
25 + }
26 + } // termination-capability
27 + } // te-node-tunnel-termination-capability
28 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace
4 + "urn:ietf:params:xml:ns:yang:ietf-inet-types";
5 + prefix nw;
6 + import ietf-inet-types {
7 + prefix inet;
8 + }
9 + container termination-point {
10 + leaf tp-id {
11 + type string;
12 + }
13 + }
14 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module ietf-network {
2 + yang-version 1;
3 + namespace "urn:ietf:params:xml:ns:yang:ietf-network";
4 + prefix nd;
5 + container networks {
6 + description
7 + "Serves as top-level container for a list of networks.";
8 + leaf network-id {
9 + type status;
10 + description
11 + "Identifies a network.";
12 + }
13 + }
14 + typedef status {
15 + type uint8;
16 + }
17 + leaf network-ref {
18 + type leafref {
19 + path "/networks";
20 + }
21 + }
22 +}
...\ No newline at end of file ...\ No newline at end of file