blob: 2d9538f8da30730bae8266c6fce9f2d89126ea13 [file] [log] [blame]
/*
* 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.translator.tojava.utils;
import org.onosproject.yangutils.datamodel.YangAtomicPath;
import org.onosproject.yangutils.datamodel.YangAugment;
import org.onosproject.yangutils.datamodel.YangLeafRef;
import org.onosproject.yangutils.datamodel.YangNode;
import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
import org.onosproject.yangutils.datamodel.YangType;
import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
import org.onosproject.yangutils.translator.exception.TranslatorException;
import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
import org.onosproject.yangutils.translator.tojava.JavaImportData;
import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
import org.onosproject.yangutils.translator.tojava.TempJavaBeanFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaEnumerationFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaEventFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
import org.onosproject.yangutils.translator.tojava.TempJavaTypeFragmentFiles;
import org.onosproject.yangutils.utils.io.YangPluginConfig;
import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.DEFAULT_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_LISTENER_INTERFACE;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_SUBJECT_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_IDENTITY_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EDIT_CONTENT_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_ENUM_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_METHOD_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_ATTRIBUTE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_GETTER_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_SETTER_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.OF_STRING_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.RPC_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getNodesPackage;
import static org.onosproject.yangutils.translator.tojava.utils.ClassDefinitionGenerator.generateClassDefinition;
import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
import static org.onosproject.yangutils.utils.UtilConstants.ERROR_MSG_FOR_GEN_CODE;
import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLON;
import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ENUM_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT_LISTENER;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT_SUBJECT_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMPL_CLASS;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.RPC_INTERFACE;
import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getJavaPackageFromPackagePath;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.parsePkg;
/**
* Represents utilities for java file generator.
*/
public final class JavaFileGeneratorUtils {
/**
* Creates an instance of java file generator util.
*/
private JavaFileGeneratorUtils() {
}
/**
* Returns a file object for generated file.
*
* @param filePath file package path
* @param fileName file name
* @param extension file extension
* @param handler cached file handle
* @return file object
*/
public static File getFileObject(String filePath, String fileName,
String extension,
JavaFileInfoTranslator handler) {
return new File(handler.getBaseCodeGenPath() + filePath + SLASH +
fileName + extension);
}
/**
* Returns data stored in temporary files.
*
* @param tempFiles temporary file types
* @param tempHandle temp java fragment files
* @param path absolute path
* @return data stored in temporary files
* @throws IOException when failed to get the data from temporary file handle
*/
static String getDataFromTempFileHandle(
int tempFiles, TempJavaFragmentFiles tempHandle, String path)
throws IOException {
TempJavaTypeFragmentFiles typeHandle = null;
if (tempHandle instanceof TempJavaTypeFragmentFiles) {
typeHandle = (TempJavaTypeFragmentFiles) tempHandle;
}
TempJavaBeanFragmentFiles beanHandle = null;
if (tempHandle instanceof TempJavaBeanFragmentFiles) {
beanHandle = (TempJavaBeanFragmentFiles) tempHandle;
}
TempJavaServiceFragmentFiles serviceHandle = null;
if (tempHandle instanceof TempJavaServiceFragmentFiles) {
serviceHandle = (TempJavaServiceFragmentFiles) tempHandle;
}
TempJavaEventFragmentFiles eventHandle = null;
if (tempHandle instanceof TempJavaEventFragmentFiles) {
eventHandle = (TempJavaEventFragmentFiles) tempHandle;
}
if ((tempFiles & ATTRIBUTES_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getAttributesTempFileHandle(),
path);
}
if ((tempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getGetterInterfaceTempFileHandle(),
path);
}
if ((tempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getSetterInterfaceTempFileHandle(),
path);
}
if ((tempFiles & GETTER_FOR_CLASS_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getGetterImplTempFileHandle(),
path);
}
if ((tempFiles & SETTER_FOR_CLASS_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getSetterImplTempFileHandle(),
path);
}
if ((tempFiles & ADD_TO_LIST_INTERFACE_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getAddToListInterfaceTempFileHandle(),
path);
}
if ((tempFiles & ADD_TO_LIST_IMPL_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getAddToListImplTempFileHandle(),
path);
}
if ((tempFiles & FILTER_CONTENT_MATCH_FOR_LEAF_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getSubtreeFilteringForLeafTempFileHandle(),
path);
}
if ((tempFiles & FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getGetSubtreeFilteringForListTempFileHandle(),
path);
}
if ((tempFiles & FILTER_CONTENT_MATCH_FOR_NODES_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getGetSubtreeFilteringForChildNodeTempFileHandle(),
path);
}
if ((tempFiles & EDIT_CONTENT_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getEditContentTempFileHandle(),
path);
}
if ((tempFiles & LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getLeafIdAttributeTempFileHandle(),
path);
}
if ((tempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
if (beanHandle == null) {
throw new TranslatorException("Required constructor info is" +
" missing.");
}
return beanHandle.getTemporaryDataFromFileHandle(
beanHandle.getConstructorImplTempFileHandle(),
path);
}
if ((tempFiles & HASH_CODE_IMPL_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getHashCodeImplTempFileHandle(),
path);
}
if ((tempFiles & EQUALS_IMPL_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getEqualsImplTempFileHandle(),
path);
}
if ((tempFiles & TO_STRING_IMPL_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getToStringImplTempFileHandle(),
path);
}
if ((tempFiles & OF_STRING_IMPL_MASK) != 0) {
if (typeHandle == null) {
throw new TranslatorException("Required of string implementation" +
" info is missing.");
}
return typeHandle.getTemporaryDataFromFileHandle(
typeHandle.getOfStringImplTempFileHandle(), path);
}
if ((tempFiles & CONSTRUCTOR_FOR_TYPE_MASK) != 0) {
if (typeHandle == null) {
throw new TranslatorException("Required constructor implementation" +
" info is missing.");
}
return typeHandle.getTemporaryDataFromFileHandle(
typeHandle.getConstructorForTypeTempFileHandle(),
path);
}
if ((tempFiles & FROM_STRING_IMPL_MASK) != 0) {
return tempHandle.getTemporaryDataFromFileHandle(
tempHandle.getFromStringImplTempFileHandle(),
path);
}
if ((tempFiles & ENUM_IMPL_MASK) != 0) {
if (!(tempHandle instanceof TempJavaEnumerationFragmentFiles)) {
throw new TranslatorException("Required enum info is missing.");
}
TempJavaEnumerationFragmentFiles enumHandle =
(TempJavaEnumerationFragmentFiles) tempHandle;
return enumHandle.getTemporaryDataFromFileHandle(
enumHandle.getEnumClassTempFileHandle(), path);
}
if ((tempFiles & RPC_INTERFACE_MASK) != 0) {
if (serviceHandle == null) {
throw new TranslatorException("Required rpc interface info is" +
" missing.");
}
return serviceHandle.getTemporaryDataFromFileHandle(
serviceHandle.getRpcInterfaceTempFileHandle(),
path);
}
if ((tempFiles & EVENT_ENUM_MASK) != 0) {
if (eventHandle == null) {
throw new TranslatorException(
"Required event enum implementation info is missing.");
}
return eventHandle.getTemporaryDataFromFileHandle(
eventHandle.getEventEnumTempFileHandle(),
path);
}
if ((tempFiles & EVENT_METHOD_MASK) != 0) {
if (eventHandle == null) {
throw new TranslatorException(
"Required event method implementation info is missing.");
}
return eventHandle.getTemporaryDataFromFileHandle(
eventHandle.getEventMethodTempFileHandle(),
path);
}
if ((tempFiles & EVENT_SUBJECT_GETTER_MASK) != 0) {
if (eventHandle == null) {
throw new TranslatorException(
"Required event subject getter implementation info is" +
" missing.");
}
return eventHandle.getTemporaryDataFromFileHandle(
eventHandle.getEventSubjectGetterTempFileHandle(),
path);
}
if ((tempFiles & EVENT_SUBJECT_SETTER_MASK) != 0) {
if (eventHandle == null) {
throw new TranslatorException(
"Required event subject setter implementation info is" +
" missing.");
}
return eventHandle.getTemporaryDataFromFileHandle(
eventHandle.getEventSubjectSetterTempFileHandle(),
path);
}
if ((tempFiles & EVENT_SUBJECT_ATTRIBUTE_MASK) != 0) {
if (eventHandle == null) {
throw new TranslatorException(
"Required event subject attribute implementation info is" +
" missing.");
}
return eventHandle.getTemporaryDataFromFileHandle(
eventHandle.getEventSubjectAttributeTempFileHandle(),
path);
}
return null;
}
/**
* Initiates generation of file based on generated file type.
*
* @param file generated file
* @param className generated file class name
* @param genType generated file type
* @param imports imports for the file
* @param pkg generated file package
* @throws IOException when fails to generate a file
*/
public static void initiateJavaFileGeneration(File file, String className,
int genType, List<String> imports,
String pkg)
throws IOException {
if (file.exists()) {
throw new IOException(" file " + file.getName() + " is already generated." +
ERROR_MSG_FOR_GEN_CODE);
}
boolean isFileCreated;
try {
isFileCreated = file.createNewFile();
if (!isFileCreated) {
throw new IOException("Failed to create " + file.getName() +
" class file.");
}
appendContents(file, className, genType, imports, pkg);
} catch (IOException e) {
throw new IOException("Failed to append contents in " + file.getName() +
" class file.");
}
}
/**
* Initiates generation of file based on generated file type.
*
* @param file generated file
* @param genType generated file type
* @param imports imports for the file
* @param curNode current YANG node
* @param name class name
* @throws IOException when fails to generate a file
*/
public static void initiateJavaFileGeneration(File file, int genType,
List<String> imports,
YangNode curNode, String name)
throws IOException {
if (file.exists()) {
throw new IOException(" file " + file.getName() + " is already generated." +
ERROR_MSG_FOR_GEN_CODE);
}
boolean isFileCreated;
try {
isFileCreated = file.createNewFile();
if (!isFileCreated) {
throw new IOException("Failed to create " + file.getName() +
" class file.");
}
appendContents(file, genType, imports, curNode, name);
} catch (IOException e) {
throw new IOException("Failed to append contents in " + file.getName() +
" class file.");
}
}
/**
* Appends all the contents into a generated java file.
*
* @param file generated file
* @param genType generated file type
* @param importsList list of java imports
* @param curNode current YANG node
* @param className class name
* @throws IOException when fails to do IO operations
*/
private static void appendContents(File file, int genType,
List<String> importsList, YangNode curNode,
String className)
throws IOException {
JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) curNode)
.getJavaFileInfo();
String name = javaFileInfo.getJavaName();
String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo
.getPackageFilePath();
String pkgString;
if (genType == GENERATE_EVENT_CLASS ||
genType == GENERATE_EVENT_LISTENER_INTERFACE ||
genType == GENERATE_EVENT_SUBJECT_CLASS) {
pkgString = parsePackageString((path + PERIOD + name)
.toLowerCase(), importsList);
} else {
pkgString = parsePackageString(path, importsList);
}
switch (genType) {
case INTERFACE_MASK:
appendHeaderContents(file, pkgString, importsList);
write(file, genType, INTERFACE, curNode, className);
break;
case DEFAULT_CLASS_MASK:
appendHeaderContents(file, pkgString, importsList);
write(file, genType, IMPL_CLASS, curNode, className);
break;
case BUILDER_CLASS_MASK:
write(file, genType, BUILDER_CLASS, curNode, className);
break;
case BUILDER_INTERFACE_MASK:
write(file, genType, BUILDER_INTERFACE, curNode, className);
break;
case GENERATE_SERVICE_AND_MANAGER:
appendHeaderContents(file, pkgString, importsList);
write(file, genType, RPC_INTERFACE, curNode, className);
break;
case GENERATE_EVENT_CLASS:
appendHeaderContents(file, pkgString, importsList);
write(file, genType, EVENT, curNode, className);
break;
case GENERATE_EVENT_LISTENER_INTERFACE:
appendHeaderContents(file, pkgString, importsList);
write(file, genType, EVENT_LISTENER, curNode, className);
break;
case GENERATE_EVENT_SUBJECT_CLASS:
appendHeaderContents(file, pkgString, importsList);
write(file, genType, EVENT_SUBJECT_CLASS, curNode, className);
break;
case GENERATE_IDENTITY_CLASS:
appendHeaderContents(file, pkgString, importsList);
write(file, genType, EVENT_SUBJECT_CLASS, curNode, className);
insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET);
break;
default:
break;
}
}
/**
* Appends all the contents into a generated java file.
*
* @param file generated file
* @param fileName generated file name
* @param genType generated file type
* @param importsList list of java imports
* @param pkg generated file package
* @throws IOException when fails to append contents
*/
private static void appendContents(File file, String fileName, int genType,
List<String> importsList, String pkg)
throws IOException {
String pkgString = parsePackageString(pkg, importsList);
switch (genType) {
case GENERATE_TYPEDEF_CLASS:
appendHeaderContents(file, pkgString, importsList);
write(file, fileName, genType, IMPL_CLASS);
break;
case GENERATE_UNION_CLASS:
appendHeaderContents(file, pkgString, importsList);
write(file, fileName, genType, IMPL_CLASS);
break;
case GENERATE_ENUM_CLASS:
appendHeaderContents(file, pkgString, importsList);
write(file, fileName, genType, ENUM_CLASS);
break;
default:
break;
}
}
/**
* Removes base directory path from package and generates package string for file.
*
* @param javaPkg generated java package
* @param importsList list of imports
* @return package string
*/
private static String parsePackageString(String javaPkg,
List<String> importsList) {
javaPkg = parsePkg(getJavaPackageFromPackagePath(javaPkg));
if (importsList != null) {
if (!importsList.isEmpty()) {
return PACKAGE + SPACE + javaPkg + SEMI_COLON + NEW_LINE;
} else {
return PACKAGE + SPACE + javaPkg + SEMI_COLON;
}
} else {
return PACKAGE + SPACE + javaPkg + SEMI_COLON;
}
}
/**
* Appends other contents to interface, impl and typedef classes.
* for example : ONOS copyright, imports and package.
*
* @param file generated file
* @param pkg generated package
* @param importsList list of imports
* @throws IOException when fails to append contents
*/
private static void appendHeaderContents(File file, String pkg,
List<String> importsList)
throws IOException {
insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
insertDataIntoJavaFile(file, pkg);
/*
* TODO: add the file header using comments for snippet of yang file.
* JavaCodeSnippetGen.getFileHeaderComment
*/
if (importsList != null) {
insertDataIntoJavaFile(file, NEW_LINE);
for (String imports : importsList) {
insertDataIntoJavaFile(file, imports);
}
}
}
/**
* Writes data to the specific generated file.
*
* @param file generated file
* @param genType generated file type
* @param javaDocType java doc type
* @param curNode current YANG node
* @param fileName file name
* @throws IOException when fails to write into a file
*/
private static void write(File file, int genType, JavaDocType javaDocType,
YangNode curNode, String fileName)
throws IOException {
insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName,
false, null));
insertDataIntoJavaFile(file, generateClassDefinition(genType,
fileName, curNode));
}
/**
* Writes data to the specific generated file.
*
* @param file generated file
* @param fileName file name
* @param genType generated file type
* @param javaDocType java doc type
* @throws IOException when fails to write into a file
*/
private static void write(File file, String fileName, int genType,
JavaDocType javaDocType) throws IOException {
insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false,
null));
insertDataIntoJavaFile(file, generateClassDefinition(genType, fileName));
}
/**
* Returns set of node identifiers.
*
* @param parent parent node
* @return set of node identifiers
*/
static List<YangAtomicPath> getSetOfNodeIdentifiers(YangNode parent) {
List<YangAtomicPath> targets = new ArrayList<>();
YangNodeIdentifier nodeId;
List<YangAugment> augments = getListOfAugments(parent);
for (YangAugment augment : augments) {
nodeId = augment.getTargetNode().get(0).getNodeIdentifier();
if (validateNodeIdentifierInSet(nodeId, targets)) {
targets.add(augment.getTargetNode().get(0));
}
}
return targets;
}
/* Returns list of augments.*/
private static List<YangAugment> getListOfAugments(YangNode parent) {
List<YangAugment> augments = new ArrayList<>();
YangNode child = parent.getChild();
while (child != null) {
if (child instanceof YangAugment) {
augments.add((YangAugment) child);
}
child = child.getNextSibling();
}
return augments;
}
/*Validates the set for duplicate names of node identifiers.*/
private static boolean validateNodeIdentifierInSet(
YangNodeIdentifier nodeId, List<YangAtomicPath> targets) {
boolean isPresent = true;
for (YangAtomicPath target : targets) {
if (target.getNodeIdentifier().getName().equals(nodeId.getName())) {
if (target.getNodeIdentifier().getPrefix() != null) {
isPresent = !target.getNodeIdentifier().getPrefix()
.equals(nodeId.getPrefix());
} else {
isPresent = nodeId.getPrefix() != null;
}
}
}
return isPresent;
}
/**
* Adds resolved augmented node imports to manager class.
*
* @param parent parent node
*/
public static void addResolvedAugmentedDataNodeImports(YangNode parent) {
List<YangAtomicPath> targets = getSetOfNodeIdentifiers(parent);
TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = (
(JavaCodeGeneratorInfo) parent)
.getTempJavaCodeFragmentFiles();
YangNode augmentedNode;
JavaQualifiedTypeInfoTranslator typeInfo;
String curNodeName;
JavaFileInfoTranslator parentInfo = ((JavaFileInfoContainer) parent)
.getJavaFileInfo();
for (YangAtomicPath nodeId : targets) {
augmentedNode = nodeId.getResolvedNode().getParent();
curNodeName = getCurNodeName(augmentedNode, parentInfo
.getPluginConfig());
typeInfo =
getQTypeInfoOfNode(
augmentedNode, curNodeName + OP_PARAM,
parentInfo.getPluginConfig());
tempJavaCodeFragmentFiles.getServiceTempFiles()
.getJavaImportData().addImportInfo(
typeInfo, parentInfo.getJavaName(),
parentInfo.getPackage());
typeInfo =
getQTypeInfoOfNode(
augmentedNode, curNodeName, parentInfo
.getPluginConfig());
tempJavaCodeFragmentFiles.getServiceTempFiles()
.getJavaImportData().addImportInfo(
typeInfo, parentInfo.getJavaName(),
parentInfo.getPackage());
}
}
/**
* Returns qualified type info of augmented node.
*
* @param augmentedNode augmented node
* @param curNodeName current node name
* @param pluginConfig plugin configurations
* @return qualified type info of augmented node
*/
private static JavaQualifiedTypeInfoTranslator getQTypeInfoOfNode(
YangNode augmentedNode, String curNodeName, YangPluginConfig pluginConfig) {
JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo =
getQualifiedTypeInfoOfCurNode(augmentedNode,
curNodeName);
if (javaQualifiedTypeInfo.getPkgInfo() == null) {
javaQualifiedTypeInfo.setPkgInfo(getNodesPackage(augmentedNode,
pluginConfig));
}
return javaQualifiedTypeInfo;
}
/**
* Validates if augmented node is imported in parent node.
*
* @param javaQualifiedTypeInfo qualified type info
* @param importData import data
* @return true if present in imports
*/
private static boolean validateQualifiedInfoOfAugmentedNode(
JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo,
JavaImportData importData) {
for (JavaQualifiedTypeInfoTranslator curImportInfo : importData
.getImportSet()) {
if (curImportInfo.getClassInfo()
.contentEquals(javaQualifiedTypeInfo.getClassInfo())) {
return curImportInfo.getPkgInfo()
.contentEquals(javaQualifiedTypeInfo.getPkgInfo());
}
}
return true;
}
/**
* Return augmented class name for data methods in manager and service.
*
* @param augmentedNode augmented node
* @param parent parent node
* @return augmented class name for data methods in manager and service
*/
static String getAugmentedClassNameForDataMethods(YangNode augmentedNode,
YangNode parent) {
String curNodeName;
JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo;
JavaFileInfoTranslator parentInfo = ((JavaFileInfoContainer) parent)
.getJavaFileInfo();
YangPluginConfig pluginConfig = parentInfo.getPluginConfig();
TempJavaServiceFragmentFiles tempJavaServiceFragmentFiles = (
(JavaCodeGeneratorInfo) parent).getTempJavaCodeFragmentFiles()
.getServiceTempFiles();
curNodeName = getCurNodeName(augmentedNode, pluginConfig);
javaQualifiedTypeInfo = getQTypeInfoOfNode(augmentedNode,
getCapitalCase(curNodeName),
parentInfo.getPluginConfig());
if (validateQualifiedInfoOfAugmentedNode(javaQualifiedTypeInfo,
tempJavaServiceFragmentFiles
.getJavaImportData())) {
return javaQualifiedTypeInfo.getClassInfo();
} else {
return javaQualifiedTypeInfo.getPkgInfo() + PERIOD +
javaQualifiedTypeInfo.getClassInfo();
}
}
//Returns class name of current node
static String getCurNodeName(YangNode node, YangPluginConfig config) {
if (((JavaFileInfoContainer) node).getJavaFileInfo()
.getJavaName() != null) {
return getCapitalCase(((JavaFileInfoContainer) node)
.getJavaFileInfo()
.getJavaName());
} else {
return getCapitalCase(getCamelCase(node.getName(), config
.getConflictResolver()));
}
}
/**
* Checks if the type name is leafref and returns the effective type name.
*
* @param attributeName name of the current type
* @param attributeType effective type
* @return name of the effective type
*/
public static String isTypeNameLeafref(String attributeName,
YangType<?> attributeType) {
if (attributeName.equalsIgnoreCase(LEAFREF)) {
return attributeType.getDataTypeName();
}
return attributeName;
}
/**
* Checks if the type is leafref and returns the effective type.
*
* @param attributeType current type
* @return effective type
*/
public static YangType isTypeLeafref(YangType<?> attributeType) {
if (attributeType.getDataType() == YangDataTypes.LEAFREF) {
YangLeafRef leafRef = (YangLeafRef) attributeType
.getDataTypeExtendedInfo();
return leafRef.getEffectiveDataType();
}
return attributeType;
}
}