[ONOS-5633][ONOS-5702] ONOS YANG tools to support multi-threaded execution + defect fix
Change-Id: I20733f0350ea7e4e6558bd895a3c7c18477af6cf
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
index f8ebda1..5fc301d 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
@@ -125,7 +125,7 @@
/**
* YANG Node in which the leaf is contained.
*/
- private transient YangLeavesHolder containedIn;
+ private YangLeavesHolder containedIn;
/**
* List of must statement constraints.
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index 724c9cf..bde310d 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -39,40 +39,12 @@
public final class JavaCodeGeneratorUtil {
/**
- * Current YANG node.
- */
- private static YangNode curNode;
-
- /**
- * Root node.
- */
- private static YangNode rootNode;
-
- /**
* Creates a java code generator utility object.
*/
private JavaCodeGeneratorUtil() {
}
/**
- * Returns current YANG node.
- *
- * @return current YANG node
- */
- public static YangNode getCurNode() {
- return curNode;
- }
-
- /**
- * Sets current YANG node.
- *
- * @param node current YANG node
- */
- public static void setCurNode(YangNode node) {
- curNode = node;
- }
-
- /**
* Generates Java code files corresponding to the YANG schema.
*
* @param rootNode root node of the data model tree
@@ -84,7 +56,6 @@
throws TranslatorException, IOException {
YangNode codeGenNode = rootNode;
- setRootNode(rootNode);
TraversalType curTraversal = ROOT;
while (codeGenNode != null) {
@@ -94,9 +65,8 @@
codeGenNode.getName() + " in " + codeGenNode.getLineNumber() + " at "
+ codeGenNode.getCharPosition() + " in " + codeGenNode.getFileName());
}
- setCurNode(codeGenNode);
try {
- generateCodeEntry(codeGenNode, yangPlugin);
+ generateCodeEntry(codeGenNode, yangPlugin, rootNode);
codeGenNode.setNameSpaceAndAddToParentSchemaMap();
} catch (InvalidNodeForTranslatorException e) {
if (codeGenNode.getNextSibling() != null) {
@@ -109,7 +79,7 @@
continue;
} catch (Exception e) {
e.printStackTrace();
- close(codeGenNode, yangPlugin);
+ close(codeGenNode, yangPlugin, rootNode);
throw new TranslatorException(e.getMessage());
}
@@ -119,20 +89,20 @@
codeGenNode = codeGenNode.getChild();
} else if (codeGenNode.getNextSibling() != null) {
try {
- generateCodeExit(codeGenNode, yangPlugin);
+ generateCodeExit(codeGenNode, yangPlugin, rootNode);
} catch (Exception e) {
e.printStackTrace();
- close(codeGenNode, yangPlugin);
+ close(codeGenNode, yangPlugin, rootNode);
throw new TranslatorException(e.getMessage());
}
curTraversal = SIBILING;
codeGenNode = codeGenNode.getNextSibling();
} else {
try {
- generateCodeExit(codeGenNode, yangPlugin);
+ generateCodeExit(codeGenNode, yangPlugin, rootNode);
} catch (Exception e) {
e.printStackTrace();
- close(codeGenNode, yangPlugin);
+ close(codeGenNode, yangPlugin, rootNode);
throw new TranslatorException(e.getMessage());
}
curTraversal = PARENT;
@@ -146,16 +116,19 @@
*
* @param codeGenNode current data model node for which the code needs to be generated
* @param yangPlugin YANG plugin config
+ * @param rootNode YANG root node
* @throws TranslatorException when fails to generate java code file the current node
* @throws IOException when fails to do IO operations
*/
- private static void generateCodeEntry(YangNode codeGenNode, YangPluginConfig yangPlugin)
+ private static void generateCodeEntry(YangNode codeGenNode,
+ YangPluginConfig yangPlugin,
+ YangNode rootNode)
throws TranslatorException, IOException {
if (codeGenNode instanceof JavaCodeGenerator) {
((JavaCodeGenerator) codeGenNode).generateCodeEntry(yangPlugin);
} else {
- close(codeGenNode, yangPlugin);
+ close(codeGenNode, yangPlugin, rootNode);
throw new TranslatorException(
"Generated data model node cannot be translated to target language code for " +
codeGenNode.getName() + " in " + codeGenNode.getLineNumber()
@@ -168,16 +141,19 @@
*
* @param codeGenNode current data model node for which the code needs to be generated
* @param pluginConfig plugin configurations
+ * @param rootNode YANG root node
* @throws TranslatorException when fails to generate java code file the current node
* @throws IOException when fails to do IO operations
*/
- private static void generateCodeExit(YangNode codeGenNode, YangPluginConfig pluginConfig)
+ private static void generateCodeExit(YangNode codeGenNode,
+ YangPluginConfig pluginConfig,
+ YangNode rootNode)
throws TranslatorException, IOException {
if (codeGenNode instanceof JavaCodeGenerator) {
((JavaCodeGenerator) codeGenNode).generateCodeExit();
} else {
- close(codeGenNode, pluginConfig);
+ close(codeGenNode, pluginConfig, rootNode);
throw new TranslatorException(
"Generated data model node cannot be translated to target language code for " +
codeGenNode.getName() + " in " + codeGenNode.getLineNumber()
@@ -187,11 +163,12 @@
/**
* Free other YANG nodes of data-model tree when error occurs while file generation of current node.
+ *
+ * @param freedNode current data model node
*/
- private static void freeRestResources() {
+ private static void freeRestResources(YangNode freedNode) {
- YangNode freedNode = getCurNode();
- if (getCurNode() != null) {
+ if (freedNode != null) {
YangNode tempNode = freedNode;
TraversalType curTraversal = ROOT;
@@ -246,18 +223,16 @@
throws IOException {
if (rootNode != null) {
- //Free other resources where translator has failed.
- freeRestResources();
// Start removing all open files.
YangNode tempNode = rootNode;
- setCurNode(tempNode.getChild());
+ YangNode curNode = tempNode.getChild();
TraversalType curTraversal = ROOT;
while (tempNode != null) {
if (curTraversal != PARENT) {
- close(tempNode, yangPluginConfig);
+ close(tempNode, yangPluginConfig, rootNode);
}
if (curTraversal != PARENT && tempNode.getChild() != null) {
curTraversal = CHILD;
@@ -271,7 +246,7 @@
}
}
- freeRestResources();
+ freeRestResources(curNode);
}
}
@@ -280,19 +255,21 @@
*
* @param node current YANG node
* @param yangPlugin plugin configurations
+ * @param rootNode YANG root node
* @throws IOException when fails to do IO operations
*/
- private static void close(YangNode node, YangPluginConfig yangPlugin)
+ private static void close(YangNode node, YangPluginConfig yangPlugin,
+ YangNode rootNode)
throws IOException {
if (node instanceof JavaCodeGenerator && ((TempJavaCodeFragmentFilesContainer) node)
.getTempJavaCodeFragmentFiles() != null) {
((TempJavaCodeFragmentFilesContainer) node).getTempJavaCodeFragmentFiles().freeTemporaryResources(true);
}
- if (getRootNode() != null) {
- JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) getRootNode()).getJavaFileInfo();
+ if (rootNode != null) {
+ JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) rootNode).getJavaFileInfo();
if (javaFileInfo.getPackage() != null) {
searchAndDeleteTempDir(javaFileInfo.getBaseCodeGenPath() +
- javaFileInfo.getPackageFilePath());
+ javaFileInfo.getPackageFilePath());
} else {
searchAndDeleteTempDir(yangPlugin.getCodeGenDir());
}
@@ -301,24 +278,6 @@
}
/**
- * Returns root node.
- *
- * @return root node
- */
- private static YangNode getRootNode() {
- return rootNode;
- }
-
- /**
- * Sets root node.
- *
- * @param rootNode root node
- */
- private static void setRootNode(YangNode rootNode) {
- JavaCodeGeneratorUtil.rootNode = rootNode;
- }
-
- /**
* Searches child node in data model tree.
*
* @param parentNode parent node
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
index fe6a40b..221f414 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -562,7 +562,7 @@
List<String> importsList)
throws IOException {
- insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
+ insertDataIntoJavaFile(file, CopyrightHeader.parseCopyrightHeader());
insertDataIntoJavaFile(file, pkg);
/*
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
index 3e60817..d4904ae 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
@@ -1204,21 +1204,38 @@
return " Class<?>[] classArray = " + call + "" +
".getClass()" +
".getInterfaces();\n" +
- " Class<?> caseClass = classArray[0];\n" +
+ " Class<?> caseIntf = classArray[0];\n" +
" try {\n" +
- " Object obj1 = caseClass.newInstance();\n" +
+ " ClassLoader classLoader = this" +
+ ".getClass().getClassLoader();\n" +
+ " String className = \"Default\" + " +
+ "caseIntf.getSimpleName();\n" +
+ " className = caseIntf.getPackage()" +
+ ".getName() + \".\" + className;\n" +
+ " Class<?> caseClass = classLoader" +
+ ".loadClass(className);\n" +
+ " java.lang.reflect.Constructor<?> " +
+ "constructor = caseClass.getDeclaredConstructor();\n" +
+ " constructor.setAccessible(true);\n" +
+ " Object obj1 = constructor" +
+ ".newInstance();\n" +
" java.lang.reflect.Method method =" +
- " caseClass.getMethod(\"builder\", caseClass);\n" +
- " Object obj = method.invoke(obj1," +
- " (Object) null);\n" +
- " method = caseClass.getMethod(\"build\", caseClass);\n" +
- " Object obj2 = method.invoke(obj, " +
- "(Object) null);\n" +
- " method = caseClass.getMethod(\"processSubtreeFiltering\", caseClass);\n" +
+ " caseClass.getMethod(\"builder\");\n" +
+ " Object obj = method.invoke(obj1);\n" +
+ " Class<?> builderClass = obj.getClass();\n" +
+ " method = builderClass.getMethod(\"build\");\n" +
+ " Object obj2 = method.invoke(obj);\n" +
+ " Class<?> input = this.getClass()" +
+ ".getMethod(" + "\"" + name + "\").getReturnType();\n" +
+ " method = caseClass.getMethod" +
+ "(\"processSubtreeFiltering\", input,\n" +
+ " boolean.class);\n" +
" result = (" + returnType + ") method.invoke" +
"(obj2, " + call + ", true);\n" +
" } catch (NoSuchMethodException | InstantiationException |\n" +
- " IllegalAccessException | InvocationTargetException e) {\n" +
+ " IllegalAccessException | " +
+ "InvocationTargetException |\n" +
+ " ClassNotFoundException e) {\n" +
" e.printStackTrace();\n" +
" }\n";
}
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
index 5833de2..8b55768 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
@@ -37,9 +37,6 @@
private static final String COPYRIGHTS_FIRST_LINE = "/*\n * Copyright " + Calendar.getInstance().get(Calendar.YEAR)
+ "-present Open Networking Laboratory\n";
private static final String TEMP_FILE = "temp.txt";
- private static ClassLoader classLoader = CopyrightHeader.class.getClassLoader();
-
- private static String copyrightHeader;
/**
* Creates an instance of copyright header.
@@ -48,40 +45,18 @@
}
/**
- * Returns copyright file header.
- *
- * @return copyright file header
- * @throws IOException when fails to parse copyright header
- */
- public static String getCopyrightHeader() throws IOException {
-
- if (copyrightHeader == null) {
- parseCopyrightHeader();
- }
- return copyrightHeader;
- }
-
- /**
- * Sets the copyright header.
- *
- * @param header copyright header
- */
- private static void setCopyrightHeader(String header) {
-
- copyrightHeader = header;
- }
-
- /**
* parses Copyright to the temporary file.
*
+ * @return string of file.
* @throws IOException when fails to get the copyright header
*/
- private static void parseCopyrightHeader() throws IOException {
+ public static String parseCopyrightHeader() throws IOException {
File temp = new File(TEMP_FILE);
try {
- InputStream stream = classLoader.getResourceAsStream(COPYRIGHT_HEADER_FILE);
+ InputStream stream = CopyrightHeader.class.getClassLoader()
+ .getResourceAsStream(COPYRIGHT_HEADER_FILE);
OutputStream out = new FileOutputStream(temp);
int index;
@@ -91,8 +66,7 @@
}
out.close();
stream.close();
- getStringFileContent(temp);
- setCopyrightHeader(getStringFileContent(temp));
+ return getStringFileContent(temp);
} catch (IOException e) {
throw new IOException("failed to parse the Copyright header");
} finally {
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
index a03ebb4..15051cb 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -68,7 +68,7 @@
import static org.onosproject.yangutils.utils.UtilConstants.UNDER_SCORE;
import static org.onosproject.yangutils.utils.UtilConstants.UNUSED;
import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUTO_PREFIX;
-import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
+import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.parseCopyrightHeader;
import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.appendFileContents;
import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.PACKAGE_INFO;
@@ -134,7 +134,7 @@
FileWriter fileWriter = new FileWriter(packageInfo);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
- bufferedWriter.write(getCopyrightHeader());
+ bufferedWriter.write(parseCopyrightHeader());
//TODO: get the compiler annotations and pass the info
bufferedWriter.write(getJavaDoc(PACKAGE_INFO, classInfo, isChildNode,
null));
@@ -688,7 +688,8 @@
* @param conflictResolver object of YANG to java naming conflict util
* @return camel case rule checked string
*/
- private static String applyCamelCaseRule(String[] stringArray, YangToJavaNamingConflictUtil conflictResolver) {
+ private static String applyCamelCaseRule(String[] stringArray,
+ YangToJavaNamingConflictUtil conflictResolver) {
String ruleChecker = stringArray[0].toLowerCase();
int i;
diff --git a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
index 493ec09..17ec860 100644
--- a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
+++ b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
@@ -91,10 +91,6 @@
private static final String REGEX_EQUAL = "[=]";
private static final String REGEX_OPEN_BRACE = "[(]";
- private static YangConstructType pathType;
- private static PathStatementContext pathCtx;
- private static YangLeafRef yangLeafRef;
-
// No instantiation.
private ListenerUtil() {
}
@@ -124,7 +120,9 @@
* @param ctx yang construct's context to get the line number and character position
* @return concatenated string after removing double quotes
*/
- public static String getValidIdentifier(String identifier, YangConstructType yangConstruct, ParserRuleContext ctx) {
+ public static String getValidIdentifier(String identifier,
+ YangConstructType yangConstruct,
+ ParserRuleContext ctx) {
String identifierString = removeQuotesAndHandleConcat(identifier);
ParserException parserException;
@@ -713,33 +711,33 @@
YangLeafRef leafRef) {
String concatPath = removeQuotesAndHandleConcat(path);
- pathType = type;
- pathCtx = ctx;
- yangLeafRef = leafRef;
if (!concatPath.startsWith(SLASH_FOR_STRING) &&
!concatPath.startsWith(ANCESTOR)) {
- throw getPathException();
+ throw getPathException(ctx, leafRef);
}
leafRef.setPath(concatPath);
if (concatPath.startsWith(SLASH_FOR_STRING)) {
List<YangAtomicPath> atomicList = new LinkedList<>();
- valAbsPath(concatPath, atomicList);
+ valAbsPath(concatPath, atomicList, ctx, leafRef, type);
leafRef.setPathType(ABSOLUTE_PATH);
valPrefix(atomicList, leafRef);
leafRef.setAtomicPath(atomicList);
return;
}
leafRef.setPathType(RELATIVE_PATH);
- valRelPath(concatPath, leafRef);
+ valRelPath(concatPath, leafRef, ctx, type);
}
/**
* Validates relative path, parses the string and stores it in the leaf-ref.
*
- * @param path leaf-ref path
- * @param leafRef YANG leaf-ref
+ * @param path leaf-ref path
+ * @param leafRef YANG leaf-ref data model information
+ * @param pathType yang construct for creating error message
*/
- private static void valRelPath(String path, YangLeafRef leafRef) {
+ private static void valRelPath(String path, YangLeafRef leafRef,
+ PathStatementContext pathCtx,
+ YangConstructType pathType) {
YangRelativePath relPath = new YangRelativePath();
int count = 0;
@@ -748,12 +746,13 @@
count = count + 1;
}
if (path.isEmpty()) {
- throw getPathException();
+ throw getPathException(pathCtx, leafRef);
}
List<YangAtomicPath> atomicList = new ArrayList<>();
relPath.setAncestorNodeCount(count);
- valAbsPath(SLASH_FOR_STRING + path, atomicList);
+ valAbsPath(SLASH_FOR_STRING + path, atomicList, pathCtx, leafRef,
+ pathType);
valPrefix(atomicList, leafRef);
relPath.setAtomicPathList(atomicList);
leafRef.setRelativePath(relPath);
@@ -762,23 +761,30 @@
/**
* Validates absolute path, parses the string and stores it in leaf-ref.
*
- * @param path leaf-ref path
- * @param atomics atomic content list
+ * @param path leaf-ref path
+ * @param atomics atomic content list
+ * @param pathCtx path statement context
+ * @param yangLeafRef YANG leaf ref
+ * @param pathType yang construct for creating error message
*/
- private static void valAbsPath(String path, List<YangAtomicPath> atomics) {
+ private static void valAbsPath(String path, List<YangAtomicPath> atomics,
+ PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef,
+ YangConstructType pathType) {
String comPath = path;
while (comPath != null) {
comPath = comPath.substring(1);
if (comPath.isEmpty()) {
- throw getPathException();
+ throw getPathException(pathCtx, yangLeafRef);
}
int nodeId = comPath.indexOf(CHAR_OF_SLASH);
int predicate = comPath.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
if (predicate < nodeId && predicate != -1) {
- comPath = getPathWithPredicate(comPath, atomics);
+ comPath = getPathWithPredicate(comPath, atomics,
+ pathCtx, yangLeafRef, pathType);
} else {
- comPath = getPath(comPath, atomics);
+ comPath = getPath(comPath, atomics, pathType, pathCtx);
}
}
}
@@ -787,38 +793,53 @@
* Returns the remaining path after parsing and the predicates of an atomic
* content.
*
- * @param path leaf-ref path
- * @param atomics atomic content list
+ * @param path leaf-ref path
+ * @param atomics atomic content list
+ * @param pathCtx yang construct's context to get the line number and
+ * character position
+ * @param yangLeafRef YANG leaf-ref data model information
+ * @param pathType yang construct for creating error message
* @return parsed path after removing one atomic content.
*/
private static String getPathWithPredicate(String path,
- List<YangAtomicPath> atomics) {
+ List<YangAtomicPath> atomics,
+ PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef,
+ YangConstructType pathType) {
String[] node = new String[2];
int bracket = path.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
node[0] = path.substring(0, bracket);
node[1] = path.substring(bracket);
- return getParsedPath(node[0], node[1], atomics);
+ return getParsedPath(node[0], node[1], atomics, pathCtx, yangLeafRef,
+ pathType);
}
/**
* Returns the path after taking all the path predicates of an atomic
* content.
*
- * @param nodeId atomic content nodeId
- * @param path leaf-ref path
- * @param atomics atomic content list
+ * @param nodeId atomic content nodeId
+ * @param path leaf-ref path
+ * @param atomics atomic content list
+ * @param pathCtx yang construct's context to get the line number
+ * and character position
+ * @param yangLeafRef YANG leaf-ref data model information
+ * @param pathType yang construct for creating error message
* @return parsed path after removing one atomic content.
*/
public static String getParsedPath(String nodeId, String path,
- List<YangAtomicPath> atomics) {
+ List<YangAtomicPath> atomics,
+ PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef,
+ YangConstructType pathType) {
String comPath = path;
List<String> predicateList = new ArrayList<>();
while (comPath.startsWith(OPEN_SQUARE_BRACKET)) {
String matchedVal = getMatchedPredicate(comPath);
if (matchedVal == null || matchedVal.isEmpty()) {
- throw getPathException();
+ throw getPathException(pathCtx, yangLeafRef);
}
predicateList.add(matchedVal);
comPath = comPath.substring(matchedVal.length());
@@ -828,7 +849,9 @@
YangNodeIdentifier validId =
getValidNodeIdentifier(nodeId, pathType, pathCtx);
- List<YangPathPredicate> predicates = valPathPredicates(predicateList);
+ List<YangPathPredicate> predicates = valPathPredicates(predicateList,
+ pathType,
+ pathCtx, yangLeafRef);
atomicPath.setNodeIdentifier(validId);
atomicPath.setPathPredicatesList(predicates);
atomics.add(atomicPath);
@@ -839,15 +862,22 @@
* Validates the path predicates of an atomic content after parsing the
* predicates and storing it in the leaf-ref.
*
- * @param predicates list of predicates
+ * @param predicates list of predicates
+ * @param pathType yang construct for creating error message
+ * @param pathCtx yang construct's context to get the line number
+ * and character position
+ * @param yangLeafRef YANG leaf-ref data model information
* @return list of path predicates of an atomic content
*/
- private static List<YangPathPredicate> valPathPredicates(List<String> predicates) {
+ private static List<YangPathPredicate> valPathPredicates(List<String> predicates,
+ YangConstructType pathType,
+ PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef) {
List<YangPathPredicate> result = new ArrayList<>();
for (String p : predicates) {
p = p.substring(1, p.length() - 1);
- result.add(valPathEqualityExp(p.trim()));
+ result.add(valPathEqualityExp(p.trim(), pathType, pathCtx, yangLeafRef));
}
return result;
}
@@ -856,15 +886,23 @@
* Validates the path equality expression of a path predicate and after
* parsing the string assigns it to the YANG path predicate.
*
- * @param predicate path predicate
+ * @param predicate path predicate
+ * @param pathType yang construct for creating error message
+ * @param pathCtx yang construct's context to get the line number
+ * and character position
+ * @param yangLeafRef YANG leaf-ref data model information
* @return YANG path predicate
*/
- private static YangPathPredicate valPathEqualityExp(String predicate) {
+ private static YangPathPredicate valPathEqualityExp(String predicate,
+ YangConstructType pathType,
+ PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef) {
String[] exp = predicate.split(REGEX_EQUAL);
YangNodeIdentifier nodeId =
getValidNodeIdentifier(exp[0].trim(), pathType, pathCtx);
- YangRelativePath relPath = valPathKeyExp(exp[1].trim());
+ YangRelativePath relPath = valPathKeyExp(exp[1].trim(), pathType,
+ pathCtx, yangLeafRef);
YangPathPredicate pathPredicate = new YangPathPredicate();
pathPredicate.setNodeId(nodeId);
@@ -877,10 +915,17 @@
* Validates the path key expression of the path-predicate and stores it
* in the relative path of the leaf-ref.
*
- * @param relPath relative path
+ * @param relPath relative path
+ * @param pathType yang construct for creating error message
+ * @param pathCtx yang construct's context to get the line number
+ * and character position
+ * @param yangLeafRef YANG leaf-ref data model information
* @return YANG relative path
*/
- private static YangRelativePath valPathKeyExp(String relPath) {
+ private static YangRelativePath valPathKeyExp(String relPath,
+ YangConstructType pathType,
+ PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef) {
String[] relative = relPath.split(SLASH_FOR_STRING);
int count = 0;
@@ -895,7 +940,9 @@
YangRelativePath relativePath = new YangRelativePath();
relativePath.setAncestorNodeCount(count);
- relativePath.setAtomicPathList(valRelPathKeyExp(atomicContent));
+ relativePath.setAtomicPathList(valRelPathKeyExp(atomicContent,
+ pathType,
+ pathCtx, yangLeafRef));
return relativePath;
}
@@ -903,16 +950,23 @@
* Validates relative path key expression in the right relative path of
* the path predicate, by taking every atomic content in it.
*
- * @param content atomic content list
+ * @param content atomic content list
+ * @param pathType yang construct for creating error message
+ * @param pathCtx yang construct's context to get the line number
+ * and character position
+ * @param yangLeafRef YANG leaf-ref data model information
* @return YANG atomic content list
*/
- private static List<YangAtomicPath> valRelPathKeyExp(List<String> content) {
+ private static List<YangAtomicPath> valRelPathKeyExp(List<String> content,
+ YangConstructType pathType,
+ PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef) {
String current = content.get(0);
String[] curStr = (current.trim()).split(REGEX_OPEN_BRACE);
if (!(curStr[0].trim().equals(CURRENT)) ||
!(curStr[1].trim().equals(CLOSE_PARENTHESIS))) {
- throw getPathException();
+ throw getPathException(pathCtx, yangLeafRef);
}
content.remove(0);
@@ -933,9 +987,14 @@
*
* @param path leaf-ref path
* @param atomicList atomic content list
+ * @param pathType yang construct for creating error message
+ * @param pathCtx yang construct's context to get the line number
+ * and character position
* @return remaining path after parsing one atomic content
*/
- public static String getPath(String path, List<YangAtomicPath> atomicList) {
+ public static String getPath(String path, List<YangAtomicPath> atomicList,
+ YangConstructType pathType,
+ PathStatementContext pathCtx) {
String comPath = path;
String nodeId;
@@ -958,9 +1017,13 @@
/**
* Returns the path syntax parser exception.
*
+ * @param pathCtx yang construct's context to get the line number
+ * and character position
+ * @param yangLeafRef YANG leaf-ref data model information
* @return parser exception
*/
- private static ParserException getPathException() {
+ private static ParserException getPathException(PathStatementContext pathCtx,
+ YangLeafRef yangLeafRef) {
ParserException exception = new ParserException(
"YANG file error : Path " + yangLeafRef.getPath() +
" does not follow valid path syntax");
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
index 40ac92c..d7da436 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
@@ -33,7 +33,7 @@
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThat;
-import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
+import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.parseCopyrightHeader;
/**
* Unit Tests for the CopyrightHeader contents.
@@ -89,7 +89,7 @@
out.write(c);
}
- String licenseHeader = getCopyrightHeader();
+ String licenseHeader = parseCopyrightHeader();
File test = new File("target/TestCopyrightHeader.txt");
FileWriter writer = new FileWriter(test);