Vidyashree Rama
Committed by Patrick Liu

[ONOS-4839] update file priority for input files

Change-Id: I4aa0cbbfb0f168efd7c1895c9bb0c6589088eefd
...@@ -29,7 +29,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.updateClo ...@@ -29,7 +29,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.updateClo
29 * Represents base class of a node in data model tree. 29 * Represents base class of a node in data model tree.
30 */ 30 */
31 public abstract class YangNode 31 public abstract class YangNode
32 - implements Cloneable, Serializable, YangDataNode { 32 + implements Cloneable, Serializable, YangDataNode, Comparable<YangNode> {
33 33
34 private static final long serialVersionUID = 806201601L; 34 private static final long serialVersionUID = 806201601L;
35 35
...@@ -59,6 +59,29 @@ public abstract class YangNode ...@@ -59,6 +59,29 @@ public abstract class YangNode
59 private YangNode previousSibling; 59 private YangNode previousSibling;
60 60
61 /** 61 /**
62 + * Priority of the node.
63 + */
64 + private int priority;
65 +
66 + /**
67 + * Returns the priority of the node.
68 + *
69 + * @return priority of the node
70 + */
71 + public int getPriority() {
72 + return priority;
73 + }
74 +
75 + /**
76 + * Sets the priority of the node.
77 + *
78 + * @param priority of the node
79 + */
80 + public void setPriority(int priority) {
81 + this.priority = priority;
82 + }
83 +
84 + /**
62 * Returns the nodes name. 85 * Returns the nodes name.
63 * 86 *
64 * @return nodes name 87 * @return nodes name
...@@ -234,6 +257,14 @@ public abstract class YangNode ...@@ -234,6 +257,14 @@ public abstract class YangNode
234 } 257 }
235 } 258 }
236 259
260 + @Override
261 + public int compareTo(YangNode otherNode) {
262 + if (priority == otherNode.getPriority()) {
263 + return 1;
264 + }
265 + return ((Integer) otherNode.getPriority()).compareTo(priority);
266 + }
267 +
237 /** 268 /**
238 * Clones the current node contents and create a new node. 269 * Clones the current node contents and create a new node.
239 * 270 *
......
...@@ -16,9 +16,15 @@ ...@@ -16,9 +16,15 @@
16 16
17 package org.onosproject.yangutils.linker.impl; 17 package org.onosproject.yangutils.linker.impl;
18 18
19 +import java.util.Collections;
19 import java.util.HashSet; 20 import java.util.HashSet;
21 +import java.util.Iterator;
22 +import java.util.LinkedList;
23 +import java.util.List;
20 import java.util.Set; 24 import java.util.Set;
21 import org.onosproject.yangutils.datamodel.ResolvableType; 25 import org.onosproject.yangutils.datamodel.ResolvableType;
26 +import org.onosproject.yangutils.datamodel.YangImport;
27 +import org.onosproject.yangutils.datamodel.YangInclude;
22 import org.onosproject.yangutils.datamodel.YangNode; 28 import org.onosproject.yangutils.datamodel.YangNode;
23 import org.onosproject.yangutils.datamodel.YangReferenceResolver; 29 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
24 import org.onosproject.yangutils.datamodel.YangSubModule; 30 import org.onosproject.yangutils.datamodel.YangSubModule;
...@@ -73,6 +79,9 @@ public class YangLinkerManager ...@@ -73,6 +79,9 @@ public class YangLinkerManager
73 // Add reference to include list. 79 // Add reference to include list.
74 addRefToYangFilesIncludeList(yangNodeSet); 80 addRefToYangFilesIncludeList(yangNodeSet);
75 81
82 + // Update the priority for all the files.
83 + updateFilePriority(yangNodeSet);
84 +
76 // TODO check for circular import/include. 85 // TODO check for circular import/include.
77 86
78 // Carry out inter-file linking. 87 // Carry out inter-file linking.
...@@ -154,7 +163,10 @@ public class YangLinkerManager ...@@ -154,7 +163,10 @@ public class YangLinkerManager
154 */ 163 */
155 public void processInterFileLinking(Set<YangNode> yangNodeSet) 164 public void processInterFileLinking(Set<YangNode> yangNodeSet)
156 throws LinkerException { 165 throws LinkerException {
157 - for (YangNode yangNode : yangNodeSet) { 166 + List<YangNode> yangNodeSortedList = new LinkedList<>();
167 + yangNodeSortedList.addAll(yangNodeSet);
168 + Collections.sort(yangNodeSortedList);
169 + for (YangNode yangNode : yangNodeSortedList) {
158 try { 170 try {
159 ((YangReferenceResolver) yangNode) 171 ((YangReferenceResolver) yangNode)
160 .resolveInterFileLinking(ResolvableType.YANG_IF_FEATURE); 172 .resolveInterFileLinking(ResolvableType.YANG_IF_FEATURE);
...@@ -178,4 +190,53 @@ public class YangLinkerManager ...@@ -178,4 +190,53 @@ public class YangLinkerManager
178 } 190 }
179 } 191 }
180 } 192 }
193 +
194 + /**
195 + * Updates the priority for all the input files.
196 + *
197 + * @param yangNodeSet set of YANG files info
198 + */
199 + public void updateFilePriority(Set<YangNode> yangNodeSet) {
200 + for (YangNode yangNode : yangNodeSet) {
201 + updateFilePriorityOfNode(yangNode);
202 + }
203 + }
204 +
205 + /**
206 + * Updates priority of the node.
207 + *
208 + * @param yangNode YANG node information
209 + */
210 + public void updateFilePriorityOfNode(YangNode yangNode) {
211 + int curNodePriority = yangNode.getPriority();
212 + if (yangNode instanceof YangReferenceResolver) {
213 + List<YangImport> yangImportList = ((YangReferenceResolver) yangNode).getImportList();
214 + if (yangImportList != null && !yangImportList.isEmpty()) {
215 + Iterator<YangImport> importInfoIterator = yangImportList.iterator();
216 + // Run through the imported list to update priority.
217 + while (importInfoIterator.hasNext()) {
218 + YangImport yangImport = importInfoIterator.next();
219 + YangNode importedNode = yangImport.getImportedNode();
220 + if (curNodePriority >= importedNode.getPriority()) {
221 + importedNode.setPriority(curNodePriority + 1);
222 + updateFilePriorityOfNode(importedNode);
223 + }
224 + }
225 + }
226 +
227 + List<YangInclude> yangIncludeList = ((YangReferenceResolver) yangNode).getIncludeList();
228 + if (yangIncludeList != null && !yangIncludeList.isEmpty()) {
229 + Iterator<YangInclude> includeInfoIterator = yangIncludeList.iterator();
230 + // Run through the imported list to update priority.
231 + while (includeInfoIterator.hasNext()) {
232 + YangInclude yangInclude = includeInfoIterator.next();
233 + YangNode includedNode = yangInclude.getIncludedNode();
234 + if (curNodePriority >= includedNode.getPriority()) {
235 + includedNode.setPriority(curNodePriority + 1);
236 + updateFilePriorityOfNode(includedNode);
237 + }
238 + }
239 + }
240 + }
241 + }
181 } 242 }
......
...@@ -59,7 +59,7 @@ public final class YangPluginConfig { ...@@ -59,7 +59,7 @@ public final class YangPluginConfig {
59 /** 59 /**
60 * Sets the string sbi or nbi for code generation. 60 * Sets the string sbi or nbi for code generation.
61 * 61 *
62 - * @par code generation is for sbi 62 + * @param codeGenerateForsbi generation is for sbi
63 */ 63 */
64 public void setCodeGenerateForsbi(String codeGenerateForsbi) { 64 public void setCodeGenerateForsbi(String codeGenerateForsbi) {
65 this.codeGenerateForsbi = codeGenerateForsbi; 65 this.codeGenerateForsbi = codeGenerateForsbi;
......
...@@ -984,4 +984,52 @@ public class InterFileLinkingTest { ...@@ -984,4 +984,52 @@ public class InterFileLinkingTest {
984 assertThat(leafref.getEffectiveDataType().getDataType(), 984 assertThat(leafref.getEffectiveDataType().getDataType(),
985 is(YangDataTypes.STRING)); 985 is(YangDataTypes.STRING));
986 } 986 }
987 +
988 + /**
989 + * Checks priority of the file.
990 + */
991 + @Test
992 + public void interFilePriority()
993 + throws IOException, ParserException, MojoExecutionException {
994 +
995 + String searchDir = "src/test/resources/interfilepriority";
996 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
997 + utilManager.parseYangFileInfoSet();
998 + utilManager.resolveDependenciesUsingLinker();
999 +
1000 + YangNode selfNode = null;
1001 + YangNode refNode1 = null;
1002 + YangNode refNode2 = null;
1003 +
1004 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
1005 + if (rootNode.getName().equals("module1")) {
1006 + selfNode = rootNode;
1007 + } else if (rootNode.getName().equals("module2")) {
1008 + refNode1 = rootNode;
1009 + } else {
1010 + refNode2 = rootNode;
1011 + }
1012 + }
1013 +
1014 + // Check whether the data model tree returned is of type module.
1015 + assertThat(selfNode instanceof YangModule, is(true));
1016 +
1017 + // Check whether the node type is set properly to module.
1018 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
1019 +
1020 + // Check whether the module name is set correctly.
1021 + YangModule yangNode = (YangModule) selfNode;
1022 + assertThat(yangNode.getName(), is("module1"));
1023 + assertThat(yangNode.getPriority(), is(2));
1024 +
1025 + // Check whether the data model tree returned is of type module.
1026 + assertThat(refNode1 instanceof YangModule, is(true));
1027 +
1028 + // Check whether the node type is set properly to module.
1029 + assertThat(refNode1.getNodeType(), is(MODULE_NODE));
1030 +
1031 + YangModule referredNode1 = (YangModule) refNode1;
1032 + assertThat(referredNode1.getName(), is("module2"));
1033 + assertThat(referredNode1.getPriority(), is(3));
1034 + }
987 } 1035 }
......
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 p:hello;
10 + }
11 + typedef hello {
12 + type string;
13 + }
14 +}
1 +module module2 {
2 + yang-version 1;
3 + namespace "http://huawei.com";
4 + prefix Ant2;
5 + typedef hello {
6 + type string;
7 + }
8 +}
1 +module module3 {
2 + yang-version 1;
3 + namespace "http://huawei.com";
4 + prefix Ant;
5 + import module1 {
6 + prefix p;
7 + }
8 +}
1 +module module4 {
2 + yang-version 1;
3 + namespace "http://huawei.com";
4 + prefix Ant;
5 + import module3 {
6 + prefix p;
7 + }
8 +}