Bharat saraswal
Committed by Gerrit Code Review

YANG augment's generated file name resolver implementation and UT fixes.

Change-Id: Ib960a15398a3b9f529f9ad28402d5bac539fb525
......@@ -18,6 +18,7 @@ package org.onosproject.yangutils.parser.impl.listeners;
import java.util.List;
import org.onosproject.yangutils.datamodel.CollisionDetector;
import org.onosproject.yangutils.datamodel.YangAugment;
import org.onosproject.yangutils.datamodel.YangModule;
import org.onosproject.yangutils.datamodel.YangNode;
......@@ -32,6 +33,9 @@ import org.onosproject.yangutils.parser.impl.TreeWalkListener;
import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangAugmentNode;
import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.clearOccurrenceCount;
import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.createValidNameForAugment;
import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.updateNameWhenHasMultipleOuccrrence;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
......@@ -45,7 +49,6 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.get
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateMutuallyExclusiveChilds;
import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
import static org.onosproject.yangutils.utils.YangConstructType.AUGMENT_DATA;
import static org.onosproject.yangutils.utils.YangConstructType.CASE_DATA;
import static org.onosproject.yangutils.utils.YangConstructType.DATA_DEF_DATA;
......@@ -81,8 +84,6 @@ import static org.onosproject.yangutils.utils.YangConstructType.WHEN_DATA;
*/
public final class AugmentListener {
private static final String AUGMENTED = "Augmented";
/**
* Creates a new augment listener.
*/
......@@ -116,11 +117,11 @@ public final class AugmentListener {
Parsable curData = listener.getParsedDataStack().peek();
if (curData instanceof YangModule || curData instanceof YangSubModule || curData instanceof YangUses) {
YangNode curNode = (YangNode) curData;
YangAugment yangAugment = getYangAugmentNode(JAVA_GENERATION);
yangAugment.setTargetNode(targetNodes);
yangAugment.setName(getValidNameForAugment(targetNodes));
yangAugment.setName(detectCollisionForTargetNode(curData, targetNodes, line, charPositionInLine, listener));
try {
curNode.addChild(yangAugment);
} catch (DataModelException e) {
......@@ -161,7 +162,6 @@ public final class AugmentListener {
* @param ctx context object of the grammar rule
*/
private static void validateSubStatementsCardinality(GeneratedYangParser.AugmentStatementContext ctx) {
validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA, AUGMENT_DATA, ctx.augment().getText());
validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA, AUGMENT_DATA, ctx.augment().getText());
validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, AUGMENT_DATA, ctx.augment().getText());
......@@ -171,21 +171,52 @@ public final class AugmentListener {
}
/**
* Returns a name identifier for augment.
* Detects collision for java file generation of augment node when
* it is updating the same target node in same parent multiple times.
* Returns name for generated java file of augment node
*
* @param targetNode list of target nodes
* @return name identifier
* @param curData parsable data
* @param targetNodes list of target nodes
* @param line line in YANG file
* @param charPositionInLine char position in YANG file
* @param listener tree walk listener
* @return name for generated java file for augment node
*/
private static String getValidNameForAugment(List<YangNodeIdentifier> targetNodes) {
String name = "";
private static String detectCollisionForTargetNode(Parsable curData, List<YangNodeIdentifier> targetNodes, int line,
int charPositionInLine, TreeWalkListener listener) {
String curPrefix = null;
if (curData instanceof YangModule) {
curPrefix = ((YangModule) curData).getPrefix();
} else if (curData instanceof YangSubModule) {
curPrefix = ((YangSubModule) curData).getPrefix();
}
YangNodeIdentifier nodeId = targetNodes.get(targetNodes.size() - 1);
boolean isPrefix = isPrefixPresent(nodeId, curPrefix);
String xpath = createValidNameForAugment(nodeId, isPrefix);
if (nodeId.getPrefix() != null) {
name = AUGMENTED + getCaptialCase(nodeId.getPrefix()) + getCaptialCase(nodeId.getName());
} else {
//TODO: name = name + ((HasAugmentation)getParentNode()).getAugmentPrefix(nodeId);
if (listener.getParsedDataStack().peek() instanceof CollisionDetector) {
try {
((CollisionDetector) listener.getParsedDataStack().peek()).detectCollidingChild(xpath,
AUGMENT_DATA);
} catch (DataModelException e) {
return updateNameWhenHasMultipleOuccrrence(nodeId, isPrefix);
}
}
return name;
clearOccurrenceCount();
return xpath;
}
/**
* Returns true if a prefix is present and it is not equals to parents prefix.
*
* @param nodeId YANG node identifier
* @param parentsPrefix parent's prefix
* @return true if a prefix is present and it is not equals to parents prefix
*/
private static boolean isPrefixPresent(YangNodeIdentifier nodeId, String parentsPrefix) {
return nodeId.getPrefix() != null && nodeId.getPrefix() != parentsPrefix;
}
/**
......
/*
* Copyright 2016-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.yangutils.parser.impl.parserutils;
import java.util.ArrayList;
import java.util.List;
import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
/**
* Represents a utility which provides valid name for generated java file for augment node.
*/
public final class AugmentJavaFileNameGenUtil {
/**
* Prefix to be added to generated java file for augment node.
*/
private static final String AUGMENTED = "Augmented";
/**
* The number of time augment has updated the same target node in same module/submodule.
*/
private static int occurrenceCount = 1;
/**
* List of names for generated augment java file.
*/
private static List<String> augmentJavaFileNameList = new ArrayList<>();
private static final int ONE = 1;
private static final int TWO = 2;
private static final int ZERO = 0;
/**
* Creates an instance of augment java file name generator utility.
*/
private AugmentJavaFileNameGenUtil() {
}
/**
* Sets the augment java file name list.
*
* @param nameList name list
*/
private static void setAugmentJavaFileNameList(List<String> nameList) {
augmentJavaFileNameList = nameList;
}
/**
* Returns augment java file name list.
*
* @return augment java file name list
*/
public static List<String> getAugmentJavaFileNameList() {
return augmentJavaFileNameList;
}
/**
* Sets occurrence count.
*
* @param occurrence occurrence count
*/
private static void setOccurrenceCount(int occurrence) {
occurrenceCount = occurrence;
}
/**
* Returns occurrence count.
*
* @return occurrence count
*/
private static int getOccurrenceCount() {
return occurrenceCount;
}
/**
* Creates a name identifier for augment.
*
* @param nodeId node identifier
* @param isPrefix if prefix is present or it is not equals to parent's prefix
* @return valid name for augment
*/
public static String createValidNameForAugment(YangNodeIdentifier nodeId, boolean isPrefix) {
getAugmentJavaFileNameList().add(createName(nodeId, isPrefix));
setAugmentJavaFileNameList(getAugmentJavaFileNameList());
return getAugmentJavaFileNameList().get(getAugmentJavaFileNameList().size() - 1);
}
/**
* Creates name for the current augment file.
*
* @param nodeId node identifier
* @param isPrefix if prefix is present or it is not equals to parent's prefix
*/
private static String createName(YangNodeIdentifier nodeId, boolean isPrefix) {
if (isPrefix) {
return AUGMENTED + getCaptialCase(nodeId.getPrefix()) + getCaptialCase(nodeId.getName());
} else {
return AUGMENTED + getCaptialCase(nodeId.getName());
}
}
/**
* Updates occurrence count of augment.
*/
public static void updateOccurenceCount() {
int count = getOccurrenceCount();
count++;
setOccurrenceCount(count);
}
/**
* Updates the list of name when augment has occurred multiple times to update the same target node
* and returns a valid name for augment node's generated java file.
*
* @param nodeId YANG node identifier
* @param isPrefix true if a prefix is present and it is not equals to parents prefix
* @return valid name for augment node
*/
public static String updateNameWhenHasMultipleOuccrrence(YangNodeIdentifier nodeId, boolean isPrefix) {
String name = "";
updateOccurenceCount();
if (getOccurrenceCount() == TWO) {
String previousAugmentsName = getAugmentJavaFileNameList().get(getAugmentJavaFileNameList().size() - ONE);
getAugmentJavaFileNameList().remove(ZERO);
getAugmentJavaFileNameList().add(previousAugmentsName + ONE);
//TODO: update when already contains the name.
name = createName(nodeId, isPrefix) + TWO;
} else {
name = createName(nodeId, isPrefix) + getOccurrenceCount();
}
getAugmentJavaFileNameList().add(name);
return name;
}
/**
* Resets occurrence count to one.
*/
public static void clearOccurrenceCount() {
setOccurrenceCount(ONE);
}
}
......@@ -52,7 +52,9 @@ import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getDirectory;
/**
* Represents ONOS YANG utility maven plugin.
* Goal of plugin is yang2java Execution phase in generate-sources requiresDependencyResolution at compile time.
* Goal of plugin is yang2java.
* Execution phase is generate-sources.
* requiresDependencyResolution at compile time.
*/
@Mojo(name = "yang2java", defaultPhase = GENERATE_SOURCES, requiresDependencyResolution = COMPILE,
requiresProject = true)
......
......@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.onosproject.yangutils.parser.parseutils;
package org.onosproject.yangutils.parser.impl.parseutils;
import org.junit.Test;
......
......@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.onosproject.yangutils.parser.parseutils;
package org.onosproject.yangutils.parser.impl.parseutils;
import org.junit.Rule;
import org.junit.Test;
......
......@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.onosproject.yangutils.parser.parseutils;
package org.onosproject.yangutils.parser.impl.parseutils;
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.ANTLRInputStream;
......