blob: 4b8ca9c7491395207803d7b74f55d09ba94303f2 [file] [log] [blame]
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301/*
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 */
16package org.onosproject.yangutils.translator.tojava;
17
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053018import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
Bharat saraswale50edca2016-08-05 01:58:25 +053019import org.onosproject.yangutils.datamodel.YangAugment;
Bharat saraswalaf413b82016-07-14 15:18:20 +053020import org.onosproject.yangutils.datamodel.YangAugmentableNode;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053021import org.onosproject.yangutils.datamodel.YangCase;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053022import org.onosproject.yangutils.datamodel.YangChoice;
Bharat saraswal0663aff2016-10-18 23:16:14 +053023import org.onosproject.yangutils.datamodel.YangGrouping;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053024import org.onosproject.yangutils.datamodel.YangLeaf;
25import org.onosproject.yangutils.datamodel.YangLeafList;
26import org.onosproject.yangutils.datamodel.YangLeavesHolder;
Vidyashree Ramab3670472016-08-06 15:49:56 +053027import org.onosproject.yangutils.datamodel.YangList;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053028import org.onosproject.yangutils.datamodel.YangNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053029import org.onosproject.yangutils.datamodel.YangType;
Bharat saraswal94844d62016-10-13 13:28:03 +053030import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
Bharat saraswal2da23bf2016-08-25 15:28:39 +053031import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
Bharat saraswal54e4bab2016-10-05 23:32:14 +053032import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053033import org.onosproject.yangutils.translator.exception.TranslatorException;
34import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
Shankara-Huaweib7564772016-08-02 18:13:13 +053035import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGroupingTranslator;
Bharat saraswal4aaab4d2016-05-17 14:19:38 +053036import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053037import org.onosproject.yangutils.utils.io.YangPluginConfig;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053038
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053039import java.io.File;
40import java.io.IOException;
Bharat saraswal54e4bab2016-10-05 23:32:14 +053041import java.util.ArrayList;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053042import java.util.List;
43
Bharat saraswalc2d3be12016-06-16 00:29:12 +053044import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053045import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
46import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
Bharat saraswal8beac342016-08-04 02:00:03 +053047import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.DEFAULT_CLASS_MASK;
Bharat saraswalaf413b82016-07-14 15:18:20 +053048import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053049import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPE_CLASS;
Bharat saraswal54e4bab2016-10-05 23:32:14 +053050import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053051import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
Bharat saraswal8beac342016-08-04 02:00:03 +053052import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_IMPL_MASK;
53import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_INTERFACE_MASK;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053054import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
Bharat saraswale50edca2016-08-05 01:58:25 +053055import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EDIT_CONTENT_MASK;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053056import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
Bharat saraswale50edca2016-08-05 01:58:25 +053057import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
58import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
59import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
Bharat saraswal250a7472016-05-12 13:16:57 +053060import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053061import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
62import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
63import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
Bharat saraswal8beac342016-08-04 02:00:03 +053064import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053065import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
66import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
67import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
68import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
Shankara-Huaweib7564772016-08-02 18:13:13 +053069import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedInfoOfFromString;
70import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
Bharat saraswal0663aff2016-10-18 23:16:14 +053071import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateBitsFile;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053072import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.updateJavaFileInfo;
Bharat saraswal8beac342016-08-04 02:00:03 +053073import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.generateEnumAttributeString;
74import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefinition;
Bharat saraswalaf413b82016-07-14 15:18:20 +053075import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.sortImports;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053076import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderClassFile;
77import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderInterfaceFile;
Bharat saraswal8beac342016-08-04 02:00:03 +053078import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateDefaultClassFile;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053079import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateInterfaceFile;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053080import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
Bharat saraswald14cbe82016-07-14 13:26:18 +053081import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
Bharat saraswal8beac342016-08-04 02:00:03 +053082import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddToListMethodImpl;
83import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddToListMethodInterface;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053084import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getBuildString;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053085import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getDefaultConstructorString;
86import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethod;
Bharat saraswal250a7472016-05-12 13:16:57 +053087import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getFromStringMethod;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053088import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterForClass;
89import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterString;
90import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethod;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053091import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForClass;
92import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterString;
93import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethod;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053094import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.parseBuilderInterfaceBuildMethodString;
Bharat saraswal0663aff2016-10-18 23:16:14 +053095import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getChoiceChildNodes;
Bharat saraswal94844d62016-10-13 13:28:03 +053096import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getImportString;
Bharat saraswal0663aff2016-10-18 23:16:14 +053097import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getNodesImports;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053098import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOverRideString;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053099import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeaf;
100import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeafList;
101import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForNode;
102import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_LEAF_HOLDER;
103import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_NODE;
104import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_PARENT_NODE;
105import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.MISSING_PARENT_NODE;
106import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
107import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
Bharat saraswal8beac342016-08-04 02:00:03 +0530108import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_IMPORT;
Bharat saraswal94844d62016-10-13 13:28:03 +0530109import static org.onosproject.yangutils.utils.UtilConstants.AUGMENT_MAP_TYPE;
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530110import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530111import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530112import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530113import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530114import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530115import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530116import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
117import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530118import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
Bharat saraswal8beac342016-08-04 02:00:03 +0530119import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION_IMPORT;
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530120import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530121import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530122import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_ATTRIBUTE;
123import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_CLASS;
Bharat saraswal8beac342016-08-04 02:00:03 +0530124import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530125import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Bharat saraswal039f59c2016-07-14 21:57:13 +0530126import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
127import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
Bharat saraswal94844d62016-10-13 13:28:03 +0530128import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530129import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530130import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530131import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
Bharat saraswal94844d62016-10-13 13:28:03 +0530132import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530133import static org.onosproject.yangutils.utils.UtilConstants.YANG;
Bharat saraswal94844d62016-10-13 13:28:03 +0530134import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530135import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530136import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile;
Bharat saraswal8beac342016-08-04 02:00:03 +0530137import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ADD_TO_LIST;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530138import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530139import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530140import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530141import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
142import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
143import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530144import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
145import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.mergeJavaFiles;
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530146import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.validateLineLength;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530147
148/**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530149 * Represents implementation of java code fragments temporary implementations.
150 * Manages the common temp file required for Java file(s) generated.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530151 */
152public class TempJavaFragmentFiles {
Bharat saraswal250a7472016-05-12 13:16:57 +0530153
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530154 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530155 * File type extension for java classes.
156 */
157 private static final String JAVA_FILE_EXTENSION = ".java";
Bharat saraswal250a7472016-05-12 13:16:57 +0530158
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530159 /**
160 * File type extension for temporary classes.
161 */
162 private static final String TEMP_FILE_EXTENSION = ".tmp";
Bharat saraswal250a7472016-05-12 13:16:57 +0530163
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530164 /**
165 * Folder suffix for temporary files folder.
166 */
Bharat saraswal64e7e232016-07-14 23:33:55 +0530167 private static final String TEMP_FOLDER_NAME_SUFFIX = "-Temp";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530168
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530169 /**
170 * File name for getter method.
171 */
172 private static final String GETTER_METHOD_FILE_NAME = "GetterMethod";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530173
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530174 /**
175 * File name for setter method.
176 */
177 private static final String SETTER_METHOD_FILE_NAME = "SetterMethod";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530178
179 /**
180 * File name for getter method implementation.
181 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530182 private static final String GETTER_METHOD_IMPL_FILE_NAME =
183 "GetterMethodImpl";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530184
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530185 /**
186 * File name for setter method implementation.
187 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530188 private static final String SETTER_METHOD_IMPL_FILE_NAME =
189 "SetterMethodImpl";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530190
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530191 /**
192 * File name for attributes.
193 */
194 private static final String ATTRIBUTE_FILE_NAME = "Attributes";
Bharat saraswal250a7472016-05-12 13:16:57 +0530195
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530196 /**
197 * File name for to string method.
198 */
199 private static final String TO_STRING_METHOD_FILE_NAME = "ToString";
Bharat saraswal250a7472016-05-12 13:16:57 +0530200
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530201 /**
202 * File name for hash code method.
203 */
204 private static final String HASH_CODE_METHOD_FILE_NAME = "HashCode";
Bharat saraswal250a7472016-05-12 13:16:57 +0530205
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530206 /**
207 * File name for equals method.
208 */
209 private static final String EQUALS_METHOD_FILE_NAME = "Equals";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530210
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530211 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530212 * File name for from string method.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530213 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530214 private static final String FROM_STRING_METHOD_FILE_NAME = "FromString";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530215
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530216 /**
Bharat saraswal8beac342016-08-04 02:00:03 +0530217 * File name for from add to list interface method.
218 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530219 private static final String ADD_TO_LIST_INTERFACE_METHOD_FILE_NAME =
220 "addToList";
Bharat saraswal8beac342016-08-04 02:00:03 +0530221
222 /**
223 * File name for from add to list impl method.
224 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530225 private static final String ADD_TO_LIST_IMPL_METHOD_FILE_NAME =
226 "addToListImpl";
Bharat saraswal8beac342016-08-04 02:00:03 +0530227
228 /**
229 * File name for from leaf identifier attributes.
230 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530231 private static final String LEAF_IDENTIFIER_ATTRIBUTES_FILE_NAME =
232 "leafIdentifierAtr";
Bharat saraswal8beac342016-08-04 02:00:03 +0530233
234 /**
Bharat saraswale50edca2016-08-05 01:58:25 +0530235 * File name for is filter content leaf match.
236 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530237 private static final String FILTER_CONTENT_MATCH_LEAF_FILE_NAME =
238 "isFilterContentMatchLeafMask";
Bharat saraswale50edca2016-08-05 01:58:25 +0530239
240 /**
241 * File name for is filter content leaf-list match.
242 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530243 private static final String FILTER_CONTENT_MATCH_LEAF_LIST_FILE_NAME =
244 "isFilterContentMatchLeafListMask";
Bharat saraswale50edca2016-08-05 01:58:25 +0530245
246 /**
247 * File name for is filter content node match.
248 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530249 private static final String FILTER_CONTENT_MATCH_NODE_FILE_NAME =
250 "isFilterContentMatchNodeMask";
Bharat saraswale50edca2016-08-05 01:58:25 +0530251
252 /**
253 * File name for edit content file.
254 */
255 private static final String EDIT_CONTENT_FILE_NAME = "editContentFile";
256
257 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530258 * File name for interface java file name suffix.
259 */
260 private static final String INTERFACE_FILE_NAME_SUFFIX = EMPTY_STRING;
Bharat saraswal250a7472016-05-12 13:16:57 +0530261
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530262 /**
263 * File name for builder interface file name suffix.
264 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530265 private static final String BUILDER_INTERFACE_FILE_NAME_SUFFIX =
266 BUILDER + INTERFACE;
Bharat saraswal250a7472016-05-12 13:16:57 +0530267
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530268 /**
269 * File name for builder class file name suffix.
270 */
271 private static final String BUILDER_CLASS_FILE_NAME_SUFFIX = BUILDER;
Bharat saraswal250a7472016-05-12 13:16:57 +0530272
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530273 /**
Bharat saraswal0663aff2016-10-18 23:16:14 +0530274 * if type is binary.
Bharat saraswal94844d62016-10-13 13:28:03 +0530275 */
276 private boolean isBinary;
277
278 /**
Bharat saraswal0663aff2016-10-18 23:16:14 +0530279 * Current attributes YANG node
280 */
281 private YangNode attrNode;
282
283 /**
284 * Sub tree filtering requires child class imports for type cast.
285 */
286 private final List<JavaQualifiedTypeInfoTranslator> subTreeImports = new ArrayList<>();
287 /**
Bharat saraswalaf413b82016-07-14 15:18:20 +0530288 * Information about the java files being generated.
289 */
Bharat saraswale50edca2016-08-05 01:58:25 +0530290 private JavaFileInfoTranslator javaFileInfo;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530291
292 /**
293 * Imported class info.
294 */
295 private JavaImportData javaImportData;
296
297 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530298 * The variable which guides the types of temporary files generated using
299 * the temporary generated file types mask.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530300 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530301 private int tempFilesFlagSet;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530302
303 /**
304 * Absolute path where the target java file needs to be generated.
305 */
306 private String absoluteDirPath;
307
308 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530309 * Contains all the interface(s)/class name which will be extended by
310 * generated files.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530311 */
312 private JavaExtendsListHolder javaExtendsListHolder;
313
Bharat saraswald14cbe82016-07-14 13:26:18 +0530314 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530315 * Java file handle for interface file.
316 */
317 private File interfaceJavaFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530318
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530319 /**
320 * Java file handle for builder interface file.
321 */
322 private File builderInterfaceJavaFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530323
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530324 /**
325 * Java file handle for builder class file.
326 */
327 private File builderClassJavaFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530328
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530329 /**
330 * Java file handle for impl class file.
331 */
332 private File implClassJavaFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530333
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530334 /**
335 * Temporary file handle for attribute.
336 */
337 private File attributesTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530338
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530339 /**
340 * Temporary file handle for getter of interface.
341 */
342 private File getterInterfaceTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530343
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530344 /**
345 * Temporary file handle for setter of interface.
346 */
347 private File setterInterfaceTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530348
349 /**
350 * Temporary file handle for getter of class.
351 */
352 private File getterImplTempFileHandle;
353
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530354 /**
355 * Temporary file handle for setter of class.
356 */
357 private File setterImplTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530358
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530359 /**
360 * Temporary file handle for hash code method of class.
361 */
362 private File hashCodeImplTempFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530363
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530364 /**
365 * Temporary file handle for equals method of class.
366 */
367 private File equalsImplTempFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530368
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530369 /**
370 * Temporary file handle for to string method of class.
371 */
372 private File toStringImplTempFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530373
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530374 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530375 * Temporary file handle for from string method of class.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530376 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530377 private File fromStringImplTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530378
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530379 /**
Bharat saraswal8beac342016-08-04 02:00:03 +0530380 * Temporary file handle for add to list interface method of class.
381 */
382 private File addToListInterfaceTempFileHandle;
383
384 /**
385 * Temporary file handle for add to list impl method of class.
386 */
387 private File addToListImplTempFileHandle;
388
389 /**
390 * Temporary file handle for leaf id attributes of enum.
391 */
392 private File leafIdAttributeTempFileHandle;
393
394 /**
Bharat saraswale50edca2016-08-05 01:58:25 +0530395 * Temporary file handle for is content match method for leaf-list.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530396 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530397 private File getSubtreeFilteringForListTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +0530398
399 /**
400 * Temporary file handle for is content match method for node.
401 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530402 private File getSubtreeFilteringForChildNodeTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +0530403
404 /**
405 * Temporary file handle for is content match method for leaf.
406 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530407 private File subtreeFilteringForLeafTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +0530408
409 /**
410 * Temporary file handle for edit content file.
411 */
412 private File editContentTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530413
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530414 /**
Bharat saraswal8beac342016-08-04 02:00:03 +0530415 * Leaf count.
416 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530417 private int leafCount;
Bharat saraswal8beac342016-08-04 02:00:03 +0530418
419 /**
420 * If current node is root node.
421 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530422 private boolean rootNode;
Bharat saraswal8beac342016-08-04 02:00:03 +0530423
424 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530425 * Is attribute added.
426 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530427 private boolean isAttributePresent;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530428
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530429 /**
430 * Creates an instance of temp JAVA fragment files.
431 */
Bharat saraswalaf413b82016-07-14 15:18:20 +0530432 TempJavaFragmentFiles() {
433 }
434
435 /**
436 * Creates an instance of temporary java code fragment.
437 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530438 * @param fileInfo generated java file information
Bharat saraswalaf413b82016-07-14 15:18:20 +0530439 * @throws IOException when fails to create new file handle
440 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530441 protected TempJavaFragmentFiles(JavaFileInfoTranslator fileInfo)
Bharat saraswalaf413b82016-07-14 15:18:20 +0530442 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530443 javaExtendsListHolder = new JavaExtendsListHolder();
444 javaImportData = new JavaImportData();
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530445 javaFileInfo = fileInfo;
446 absoluteDirPath = getAbsolutePackagePath(fileInfo.getBaseCodeGenPath(),
447 fileInfo.getPackageFilePath());
Bharat saraswalaf413b82016-07-14 15:18:20 +0530448 /*
449 * Initialize getter when generation file type matches to interface
450 * mask.
451 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530452 if (javaFlagSet(INTERFACE_MASK)) {
453 addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK |
454 ADD_TO_LIST_INTERFACE_MASK |
455 LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530456 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530457 /*
458 * Initialize getter and setter when generation file type matches to
459 * builder interface mask.
460 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530461 if (javaFlagSet(BUILDER_INTERFACE_MASK)) {
462 addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK |
463 SETTER_FOR_INTERFACE_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530464 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530465 /*
466 * Initialize getterImpl, setterImpl and attributes when generation file
467 * type matches to builder class mask.
468 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530469 if (javaFlagSet(BUILDER_CLASS_MASK)) {
470 addGeneratedTempFile(ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
471 SETTER_FOR_CLASS_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530472 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530473 /*
474 * Initialize getterImpl, attributes, constructor, hash code, equals and
475 * to strings when generation file type matches to impl class mask.
476 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530477 if (javaFlagSet(DEFAULT_CLASS_MASK)) {
478 addGeneratedTempFile(
479 ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
480 HASH_CODE_IMPL_MASK | EQUALS_IMPL_MASK |
481 TO_STRING_IMPL_MASK | ADD_TO_LIST_IMPL_MASK |
482 FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK |
483 FILTER_CONTENT_MATCH_FOR_LEAF_MASK |
484 FILTER_CONTENT_MATCH_FOR_NODES_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530485 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530486 /*
487 * Initialize temp files to generate type class.
488 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530489 if (javaFlagSet(GENERATE_TYPE_CLASS)) {
490 addGeneratedTempFile(ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
491 HASH_CODE_IMPL_MASK | EQUALS_IMPL_MASK |
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530492 FROM_STRING_IMPL_MASK);
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530493
494 if (getGeneratedJavaFiles() != GENERATE_UNION_CLASS) {
495 addGeneratedTempFile(TO_STRING_IMPL_MASK);
496 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530497 }
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530498
Vidyashree Ramab3670472016-08-06 15:49:56 +0530499 //Set temporary file handles
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530500 if (tempFlagSet(ATTRIBUTES_MASK)) {
501 attributesTempFileHandle =
502 getTemporaryFileHandle(ATTRIBUTE_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530503 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530504 if (tempFlagSet(GETTER_FOR_INTERFACE_MASK)) {
505 getterInterfaceTempFileHandle =
506 getTemporaryFileHandle(GETTER_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530507 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530508 if (tempFlagSet(SETTER_FOR_INTERFACE_MASK)) {
509 setterInterfaceTempFileHandle =
510 getTemporaryFileHandle(SETTER_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530511 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530512 if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
513 getterImplTempFileHandle =
514 getTemporaryFileHandle(GETTER_METHOD_IMPL_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530515 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530516 if (tempFlagSet(SETTER_FOR_CLASS_MASK)) {
517 setterImplTempFileHandle =
518 getTemporaryFileHandle(SETTER_METHOD_IMPL_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530519 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530520 if (tempFlagSet(HASH_CODE_IMPL_MASK)) {
521 hashCodeImplTempFileHandle =
522 getTemporaryFileHandle(HASH_CODE_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530523 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530524 if (tempFlagSet(EQUALS_IMPL_MASK)) {
525 equalsImplTempFileHandle =
526 getTemporaryFileHandle(EQUALS_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530527 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530528 if (tempFlagSet(TO_STRING_IMPL_MASK)) {
529 toStringImplTempFileHandle =
530 getTemporaryFileHandle(TO_STRING_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530531 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530532 if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
533 fromStringImplTempFileHandle =
534 getTemporaryFileHandle(FROM_STRING_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530535 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530536 if (tempFlagSet(ADD_TO_LIST_INTERFACE_MASK)) {
537 addToListInterfaceTempFileHandle =
538 getTemporaryFileHandle(ADD_TO_LIST_INTERFACE_METHOD_FILE_NAME);
Bharat saraswal8beac342016-08-04 02:00:03 +0530539 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530540 if (tempFlagSet(ADD_TO_LIST_IMPL_MASK)) {
541 addToListImplTempFileHandle =
542 getTemporaryFileHandle(ADD_TO_LIST_IMPL_METHOD_FILE_NAME);
Bharat saraswal8beac342016-08-04 02:00:03 +0530543 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530544 if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK)) {
545 leafIdAttributeTempFileHandle =
546 getTemporaryFileHandle(LEAF_IDENTIFIER_ATTRIBUTES_FILE_NAME);
Bharat saraswal8beac342016-08-04 02:00:03 +0530547 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530548 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK)) {
549 subtreeFilteringForLeafTempFileHandle =
550 getTemporaryFileHandle(FILTER_CONTENT_MATCH_LEAF_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530551 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530552 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK)) {
553 getSubtreeFilteringForListTempFileHandle =
554 getTemporaryFileHandle(FILTER_CONTENT_MATCH_LEAF_LIST_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530555 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530556 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK)) {
557 getSubtreeFilteringForChildNodeTempFileHandle =
558 getTemporaryFileHandle(FILTER_CONTENT_MATCH_NODE_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530559 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530560 if (tempFlagSet(EDIT_CONTENT_MASK)) {
561 editContentTempFileHandle =
562 getTemporaryFileHandle(EDIT_CONTENT_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530563 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530564 }
565
566 /**
567 * Adds current node info as and attribute to the parent generated file.
568 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530569 * @param curNode current node
570 * @param isList is list construct
571 * @param config plugin configurations
Bharat saraswalaf413b82016-07-14 15:18:20 +0530572 * @throws IOException IO operation exception
573 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530574 protected static void addCurNodeInfoInParentTempFile(YangNode curNode,
575 boolean isList,
576 YangPluginConfig config)
Bharat saraswalaf413b82016-07-14 15:18:20 +0530577 throws IOException {
578 YangNode parent = getParentNodeInGenCode(curNode);
579 if (!(parent instanceof JavaCodeGenerator)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530580 throw new TranslatorException(getErrorMsg(MISSING_PARENT_NODE,
581 curNode));
Bharat saraswalaf413b82016-07-14 15:18:20 +0530582 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530583 if (parent instanceof YangJavaGroupingTranslator) {
Bharat saraswalaf413b82016-07-14 15:18:20 +0530584 /*
585 * In case of grouping, there is no need to add the information, it
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530586 * will be taken care in uses.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530587 */
588 return;
589 }
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530590 addCurNodeInfoInParentTempFile(curNode, isList, config, parent);
591 }
592
593 /**
594 * Adds current node info as and attribute to a specified parent generated
595 * file. In case of grouping parent will be referred grouping node or
596 * referred node in grouping.
597 *
598 * @param curNode current node
599 * @param isList is list construct
600 * @param config plugin configurations
601 * @param parent parent node
602 * @throws IOException IO operation exception
603 */
604 protected static void addCurNodeInfoInParentTempFile(
605 YangNode curNode, boolean isList, YangPluginConfig config,
606 YangNode parent)
607 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530608 TempJavaBeanFragmentFiles tempFiles =
609 getBeanFiles((JavaCodeGeneratorInfo) parent);
Bharat saraswal0663aff2016-10-18 23:16:14 +0530610 if (curNode instanceof YangChoice) {
611 tempFiles.setAttrNode(curNode);
612 for (JavaQualifiedTypeInfoTranslator info : getNodesImports(
613 getChoiceChildNodes((YangChoice) curNode), config))
614 tempFiles.addToSubTreeImports(info);
615 } else {
616 tempFiles.setAttrNode(null);
617 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530618 JavaAttributeInfo attr =
619 getCurNodeAsAttributeInTarget(curNode, parent, isList,
620 tempFiles);
621 tempFiles.addJavaSnippetInfoToApplicableTempFiles(attr, config);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530622 }
623
624 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530625 * Creates an attribute info object corresponding to a data model node
626 * and return it.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530627 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530628 * @param curNode current node
629 * @param targetNode target node
630 * @param listNode flag indicating if a node is a list node
631 * @param tempFiles temp java fragment files
632 * @return java attribute info
Bharat saraswalaf413b82016-07-14 15:18:20 +0530633 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530634 public static JavaAttributeInfo
635 getCurNodeAsAttributeInTarget(YangNode curNode, YangNode targetNode,
636 boolean listNode,
637 TempJavaFragmentFiles tempFiles) {
638 JavaFileInfoTranslator translator =
639 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
640 String curNodeName = translator.getJavaName();
Bharat saraswalaf413b82016-07-14 15:18:20 +0530641 if (curNodeName == null) {
642 updateJavaFileInfo(curNode, null);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530643 curNodeName = translator.getJavaName();
Bharat saraswalaf413b82016-07-14 15:18:20 +0530644 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530645 /*
646 * Get the import info corresponding to the attribute for import in
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530647 * generated java files or qualified access.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530648 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530649 JavaQualifiedTypeInfoTranslator typeInfo =
650 getQualifiedTypeInfoOfCurNode(curNode,
651 getCapitalCase(curNodeName));
Bharat saraswalaf413b82016-07-14 15:18:20 +0530652 if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530653 throw new TranslatorException(getErrorMsg(INVALID_PARENT_NODE,
654 curNode));
Bharat saraswalaf413b82016-07-14 15:18:20 +0530655 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530656 JavaImportData parentImportData = tempFiles.getJavaImportData();
657 JavaFileInfoTranslator fileInfo =
658 ((JavaFileInfoContainer) targetNode).getJavaFileInfo();
Bharat saraswalaf413b82016-07-14 15:18:20 +0530659
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530660 boolean qualified;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530661 if (tempFiles instanceof TempJavaServiceFragmentFiles &&
662 typeInfo.getClassInfo().contentEquals(SERVICE) ||
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530663 typeInfo.getClassInfo()
664 .contentEquals(getCapitalCase(fileInfo.getJavaName() +
665 SERVICE))) {
666 qualified = true;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530667 } else {
668 String className;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530669 if (tempFiles instanceof TempJavaServiceFragmentFiles) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530670 className = getCapitalCase(fileInfo.getJavaName()) + SERVICE;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530671 } else {
672 className = getCapitalCase(fileInfo.getJavaName());
673 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530674 qualified = parentImportData.addImportInfo(typeInfo, className,
675 fileInfo.getPackage());
Bharat saraswal0663aff2016-10-18 23:16:14 +0530676 if (!qualified && !(curNode instanceof YangChoice)) {
677 addChildDefaultClassImportForSubTreeFilter(typeInfo.getPkgInfo(),
678 typeInfo.getClassInfo(),
679 tempFiles);
680 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530681 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530682 boolean collectionSet = false;
Vidyashree Ramab3670472016-08-06 15:49:56 +0530683 if (curNode instanceof YangList) {
684 YangList yangList = (YangList) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530685 if (yangList.getCompilerAnnotation() != null &&
686 yangList.getCompilerAnnotation()
687 .getYangAppDataStructure() != null) {
688 switch (yangList.getCompilerAnnotation()
689 .getYangAppDataStructure().getDataStructure()) {
Vidyashree Ramab3670472016-08-06 15:49:56 +0530690 case QUEUE: {
691 parentImportData.setQueueToImport(true);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530692 collectionSet = true;
Vidyashree Ramab3670472016-08-06 15:49:56 +0530693 break;
694 }
695 case SET: {
696 parentImportData.setSetToImport(true);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530697 collectionSet = true;
Vidyashree Ramab3670472016-08-06 15:49:56 +0530698 break;
699 }
700 default: {
701 // TODO : to be implemented
702 }
703 }
704 }
705 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530706 if (listNode && !collectionSet) {
Bharat saraswalaf413b82016-07-14 15:18:20 +0530707 parentImportData.setIfListImported(true);
708 }
Vidyashree Ramab3670472016-08-06 15:49:56 +0530709 if (curNode instanceof YangList) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530710 return getAttributeInfoForTheData(typeInfo, curNodeName,
711 null, qualified, listNode,
712 ((YangList) curNode)
713 .getCompilerAnnotation());
Vidyashree Ramab3670472016-08-06 15:49:56 +0530714 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530715 return getAttributeInfoForTheData(typeInfo, curNodeName, null,
716 qualified, listNode);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530717 }
718
Bharat saraswal0663aff2016-10-18 23:16:14 +0530719 private static void addChildDefaultClassImportForSubTreeFilter(
720 String pkg, String className, TempJavaFragmentFiles tempFile) {
721 className = DEFAULT_CAPS + getCapitalCase(className);
722 JavaQualifiedTypeInfoTranslator info = new
723 JavaQualifiedTypeInfoTranslator();
724 info.setClassInfo(className);
725 info.setPkgInfo(pkg);
726 tempFile.subTreeImports.add(info);
727 }
728
Bharat saraswalaf413b82016-07-14 15:18:20 +0530729 /**
Bharat saraswal64e7e232016-07-14 23:33:55 +0530730 * Returns java attribute for leaf.
731 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530732 * @param tempFiles temporary generated file
733 * @param container JAVA leaf info container
734 * @param config plugin configurations
735 * @param leafList flag indicating if it's leaf list
736 * @return java attribute info
Bharat saraswal64e7e232016-07-14 23:33:55 +0530737 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530738 private static JavaAttributeInfo
739 getJavaAttributeOfLeaf(TempJavaFragmentFiles tempFiles,
740 JavaLeafInfoContainer container,
Bharat saraswal0663aff2016-10-18 23:16:14 +0530741 YangPluginConfig config, boolean leafList) throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530742 if (leafList) {
743 tempFiles.getJavaImportData().setIfListImported(true);
744 return getAttributeOfLeafInfoContainer(tempFiles, container, config,
745 true);
746 }
747 return getAttributeOfLeafInfoContainer(tempFiles, container, config,
748 false);
Bharat saraswal64e7e232016-07-14 23:33:55 +0530749 }
750
751 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530752 * Returns java attribute for leaf container.
Bharat saraswal64e7e232016-07-14 23:33:55 +0530753 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530754 * @param tempFiles temporary generated file
755 * @param container JAVA leaf info container
756 * @param config plugin configurations
757 * @param listAttribute flag indicating if list attribute
758 * @return JAVA attribute information
Bharat saraswal64e7e232016-07-14 23:33:55 +0530759 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530760 private static JavaAttributeInfo
761 getAttributeOfLeafInfoContainer(TempJavaFragmentFiles tempFiles,
762 JavaLeafInfoContainer container,
763 YangPluginConfig config,
Bharat saraswal0663aff2016-10-18 23:16:14 +0530764 boolean listAttribute) throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530765 container.setConflictResolveConfig(config.getConflictResolver());
766 container.updateJavaQualifiedInfo();
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530767 addImportForLeafInfo(tempFiles, container);
768 JavaAttributeInfo attr = getAttributeInfoForTheData(
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530769 container.getJavaQualifiedInfo(),
770 container.getJavaName(config.getConflictResolver()),
771 container.getDataType(),
772 tempFiles.getIsQualifiedAccessOrAddToImportList(
773 container.getJavaQualifiedInfo()), listAttribute);
Bharat saraswal0663aff2016-10-18 23:16:14 +0530774 boolean isInGrouping;
775 if (container.isLeafList()) {
776 isInGrouping = !(((YangLeafList) container).getContainedIn()
777 instanceof YangGrouping);
778 } else {
779 isInGrouping = !(((YangLeaf) container).getContainedIn()
780 instanceof YangGrouping);
781 }
782 if (container.getDataType().getDataType() == YangDataTypes.BITS &&
783 isInGrouping) {
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530784 addBitsHandler(attr, container.getDataType(), tempFiles);
785 }
786 return attr;
787 }
788
789 /**
790 * Adds bits handler attribute for bits to string method.
791 *
792 * @param attr attribute
793 * @param type type
794 * @param tempFiles temp fragment file
795 */
796 static void addBitsHandler(JavaAttributeInfo attr, YangType type,
Bharat saraswal0663aff2016-10-18 23:16:14 +0530797 TempJavaFragmentFiles tempFiles)
798 throws IOException {
799 generateBitsFile(attr, type, tempFiles.getJavaFileInfo(), tempFiles);
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530800 }
801
802 /**
803 * Adds attribute types import to leaf info container's parent.
804 *
805 * @param tempFiles temp java file
806 * @param container leaf info container
807 */
808 private static void addImportForLeafInfo(TempJavaFragmentFiles tempFiles,
809 JavaLeafInfoContainer container) {
810 String containedInCls = getCapitalCase(tempFiles.getJavaFileInfo()
811 .getJavaName());
812 String containedInPkg = tempFiles.getJavaFileInfo().getPackage();
Bharat saraswal94844d62016-10-13 13:28:03 +0530813 JavaQualifiedTypeInfoTranslator info;
814 if (container.getDataType().getDataType() == YangDataTypes.BINARY) {
815 tempFiles.setBinary(true);
816 } else if (container.getDataType().getDataType() == YangDataTypes.BITS) {
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530817 //Add bitset import for type and leaf value flags.
818 info = new JavaQualifiedTypeInfoTranslator();
819 info.setClassInfo(BIT_SET);
820 info.setPkgInfo(JAVA_UTIL_PKG);
821 tempFiles.getJavaImportData().addImportInfo(info, containedInCls,
822 containedInPkg);
823 }
824 tempFiles.getJavaImportData().addImportInfo(
825 (JavaQualifiedTypeInfoTranslator) container
826 .getJavaQualifiedInfo(), containedInCls, containedInPkg);
827
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530828 }
829
830 /**
831 * Sets absolute path where the file needs to be generated.
832 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530833 * @param absoluteDirPath absolute path where the file needs to be
834 * generated
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530835 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530836 protected void setAbsoluteDirPath(String absoluteDirPath) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530837 this.absoluteDirPath = absoluteDirPath;
838 }
839
840 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530841 * Returns the generated java file information.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530842 *
843 * @return generated java file information
844 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530845 protected JavaFileInfoTranslator getJavaFileInfo() {
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530846 return javaFileInfo;
847 }
848
849 /**
Bharat saraswalaf413b82016-07-14 15:18:20 +0530850 * Sets the generated java file information.
851 *
852 * @param javaFileInfo generated java file information
853 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530854 protected void setJavaFileInfo(JavaFileInfoTranslator javaFileInfo) {
Bharat saraswalaf413b82016-07-14 15:18:20 +0530855 this.javaFileInfo = javaFileInfo;
856 }
857
858 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530859 * Returns the flag-set for generated temp files.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530860 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530861 * @return flag-set
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530862 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530863 protected int getGeneratedTempFiles() {
864 return tempFilesFlagSet;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530865 }
866
867 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530868 * Adds to the flag-set for generated temp files.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530869 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530870 * @param flags generated temp files flag-set
Bharat saraswalaf413b82016-07-14 15:18:20 +0530871 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530872 protected void addGeneratedTempFile(int flags) {
873 tempFilesFlagSet |= flags;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530874 }
875
876 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530877 * Returns the generated Java files.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530878 *
879 * @return generated Java files
880 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530881 protected int getGeneratedJavaFiles() {
882 return javaFileInfo.getGeneratedFileTypes();
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530883 }
884
885 /**
886 * Retrieves the mapped Java class name.
887 *
888 * @return mapped Java class name
889 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530890 protected String getGeneratedJavaClassName() {
891 return getCapitalCase(javaFileInfo.getJavaName());
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530892 }
893
894 /**
895 * Retrieves the import data for the generated Java file.
896 *
897 * @return import data for the generated Java file
898 */
899 public JavaImportData getJavaImportData() {
900 return javaImportData;
901 }
902
903 /**
904 * Sets import data for the generated Java file.
905 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530906 * @param data import data for the generated Java file
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530907 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530908 protected void setJavaImportData(JavaImportData data) {
909 javaImportData = data;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530910 }
911
912 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530913 * Retrieves the status of any attributes added.
914 *
915 * @return status of any attributes added
916 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530917 protected boolean isAttributePresent() {
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530918 return isAttributePresent;
919 }
920
921 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530922 * Returns getter methods's temporary file handle.
923 *
924 * @return temporary file handle
925 */
926 public File getGetterInterfaceTempFileHandle() {
927 return getterInterfaceTempFileHandle;
928 }
929
930 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530931 * Returns setter method's temporary file handle.
932 *
933 * @return temporary file handle
934 */
935 public File getSetterInterfaceTempFileHandle() {
936 return setterInterfaceTempFileHandle;
937 }
938
939 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530940 * Returns setter method's impl's temporary file handle.
941 *
942 * @return temporary file handle
943 */
944 public File getSetterImplTempFileHandle() {
945 return setterImplTempFileHandle;
946 }
947
948 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530949 * Returns from string method's temporary file handle.
950 *
951 * @return from string method's temporary file handle
952 */
953 public File getFromStringImplTempFileHandle() {
954 return fromStringImplTempFileHandle;
955 }
956
957 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530958 * Returns attribute's temporary file handle.
959 *
960 * @return temporary file handle
961 */
962 public File getAttributesTempFileHandle() {
963 return attributesTempFileHandle;
964 }
965
966 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530967 * Returns getter method's impl's temporary file handle.
968 *
969 * @return temporary file handle
970 */
971 public File getGetterImplTempFileHandle() {
972 return getterImplTempFileHandle;
973 }
974
975 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530976 * Returns hash code method's temporary file handle.
977 *
978 * @return temporary file handle
979 */
980 public File getHashCodeImplTempFileHandle() {
981 return hashCodeImplTempFileHandle;
982 }
983
984 /**
Bharat saraswal64e7e232016-07-14 23:33:55 +0530985 * Returns equals method's temporary file handle.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530986 *
987 * @return temporary file handle
988 */
989 public File getEqualsImplTempFileHandle() {
990 return equalsImplTempFileHandle;
991 }
992
993 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530994 * Returns to string method's temporary file handle.
995 *
996 * @return temporary file handle
997 */
998 public File getToStringImplTempFileHandle() {
999 return toStringImplTempFileHandle;
1000 }
1001
1002 /**
Bharat saraswal4aaab4d2016-05-17 14:19:38 +05301003 * Returns java extends list holder.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301004 *
Bharat saraswal4aaab4d2016-05-17 14:19:38 +05301005 * @return java extends list holder
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301006 */
Bharat saraswal4aaab4d2016-05-17 14:19:38 +05301007 public JavaExtendsListHolder getJavaExtendsListHolder() {
1008 return javaExtendsListHolder;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301009 }
1010
1011 /**
Bharat saraswal4aaab4d2016-05-17 14:19:38 +05301012 * Sets java extends list holder.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301013 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301014 * @param holder java extends list holder
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301015 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301016 protected void setJavaExtendsListHolder(
1017 JavaExtendsListHolder holder) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301018 javaExtendsListHolder = holder;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301019 }
1020
1021 /**
Bharat saraswale50edca2016-08-05 01:58:25 +05301022 * Adds is filter content match for leaf.
1023 *
1024 * @param attr java attribute
1025 * @throws IOException when fails to do IO operations
1026 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301027 private void addSubTreeFilteringForLeaf(JavaAttributeInfo attr)
Bharat saraswale50edca2016-08-05 01:58:25 +05301028 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301029 appendToFile(subtreeFilteringForLeafTempFileHandle,
1030 getSubtreeFilteringForLeaf(attr, attr.getAttributeType()) +
1031 NEW_LINE);
Bharat saraswale50edca2016-08-05 01:58:25 +05301032 }
1033
1034 /**
1035 * Adds is filter content match for leaf-list.
1036 *
1037 * @param attr java attribute
1038 * @throws IOException when fails to do IO operations
1039 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301040 private void addSubtreeFilteringForLeafList(JavaAttributeInfo attr)
Bharat saraswale50edca2016-08-05 01:58:25 +05301041 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301042 appendToFile(getSubtreeFilteringForListTempFileHandle,
Bharat saraswal1edde622016-09-06 10:18:04 +05301043 getSubtreeFilteringForLeafList(attr) + NEW_LINE);
Bharat saraswale50edca2016-08-05 01:58:25 +05301044 }
1045
1046 /**
1047 * Adds is filter content match for nodes.
1048 *
1049 * @param attr java attribute
1050 * @throws IOException when fails to do IO operations
1051 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301052 private void addSubtreeFilteringForChildNode(JavaAttributeInfo attr)
Bharat saraswale50edca2016-08-05 01:58:25 +05301053 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301054 appendToFile(getSubtreeFilteringForChildNodeTempFileHandle,
Bharat saraswal0663aff2016-10-18 23:16:14 +05301055 getSubtreeFilteringForNode(attr, attrNode) + NEW_LINE);
Bharat saraswale50edca2016-08-05 01:58:25 +05301056 }
1057
1058 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301059 * Adds attribute for class.
1060 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301061 * @param attr attribute info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301062 * @throws IOException when fails to append to temporary file
1063 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301064 private void addAttribute(JavaAttributeInfo attr)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301065 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301066 appendToFile(attributesTempFileHandle, parseAttribute(attr));
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301067 }
1068
1069 /**
1070 * Adds getter for interface.
1071 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301072 * @param attr attribute info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301073 * @throws IOException when fails to append to temporary file
1074 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301075 private void addGetterForInterface(JavaAttributeInfo attr)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301076 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301077 appendToFile(getterInterfaceTempFileHandle,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301078 getGetterString(attr, getGeneratedJavaFiles()) +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301079 NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301080 }
1081
1082 /**
1083 * Adds setter for interface.
1084 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301085 * @param attr attribute info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301086 * @throws IOException when fails to append to temporary file
1087 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301088 private void addSetterForInterface(JavaAttributeInfo attr)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301089 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301090 appendToFile(setterInterfaceTempFileHandle,
1091 getSetterString(attr, getGeneratedJavaClassName(),
Bharat saraswal0663aff2016-10-18 23:16:14 +05301092 getGeneratedJavaFiles()) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301093 }
1094
1095 /**
1096 * Adds setter's implementation for class.
1097 *
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301098 * @param attr attribute info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301099 * @throws IOException when fails to append to temporary file
1100 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301101 private void addSetterImpl(JavaAttributeInfo attr)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301102 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301103 String setter = getSetterForClass(attr, getGeneratedJavaClassName(),
1104 getGeneratedJavaFiles());
Bharat saraswal94844d62016-10-13 13:28:03 +05301105 appendToFile(setterImplTempFileHandle, getOverRideString() + setter);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301106 }
1107
1108 /**
1109 * Adds getter method's impl for class.
1110 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301111 * @param attr attribute info
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301112 * @throws IOException when fails to append to temporary file
1113 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301114 protected void addGetterImpl(JavaAttributeInfo attr)
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301115 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301116 String getter = getGetterForClass(attr, getGeneratedJavaFiles());
1117 if (javaFlagSet(BUILDER_CLASS_MASK)) {
Bharat saraswal94844d62016-10-13 13:28:03 +05301118 appendToFile(getterImplTempFileHandle, getOverRideString() +
1119 getter);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301120 } else {
Vidyashree Ramab3670472016-08-06 15:49:56 +05301121 String appDataStructure = null;
1122 if (attr.getCompilerAnnotation() != null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301123 appDataStructure = attr.getCompilerAnnotation()
1124 .getYangAppDataStructure().getDataStructure().name();
Vidyashree Ramab3670472016-08-06 15:49:56 +05301125 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301126 appendToFile(getterImplTempFileHandle,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301127 getJavaDoc(GETTER_METHOD, attr.getAttributeName(),
1128 false, appDataStructure) + getter);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301129 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301130 }
1131
1132 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05301133 * Adds add to list interface method.
1134 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301135 * @param attr attribute
Bharat saraswal8beac342016-08-04 02:00:03 +05301136 * @throws IOException when fails to do IO operations
1137 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301138 private void addAddToListInterface(JavaAttributeInfo attr)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301139 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301140 appendToFile(addToListInterfaceTempFileHandle,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301141 getJavaDoc(ADD_TO_LIST, attr.getAttributeName(), false,
1142 null) + getAddToListMethodInterface(
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301143 attr, getGeneratedJavaClassName()) + NEW_LINE);
Bharat saraswal8beac342016-08-04 02:00:03 +05301144 }
1145
1146 /**
1147 * Adds add to list interface method.
1148 *
1149 * @param attr attribute
1150 * @throws IOException when fails to do IO operations
1151 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301152 private void addAddToListImpl(JavaAttributeInfo attr)
1153 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301154 appendToFile(addToListImplTempFileHandle,
Bharat saraswal94844d62016-10-13 13:28:03 +05301155 getAddToListMethodImpl(attr, getGeneratedJavaClassName()
1156 ) + NEW_LINE);
Bharat saraswal8beac342016-08-04 02:00:03 +05301157 }
1158
1159 /**
1160 * Adds leaf identifier enum attributes.
1161 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301162 * @param attr attribute
1163 * @param value value
Bharat saraswal8beac342016-08-04 02:00:03 +05301164 * @throws IOException when fails to do IO operations
1165 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301166 private void addLeafIdAttributes(JavaAttributeInfo attr, int value)
Bharat saraswal8beac342016-08-04 02:00:03 +05301167 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301168 appendToFile(leafIdAttributeTempFileHandle, FOUR_SPACE_INDENTATION +
1169 generateEnumAttributeString(attr.getAttributeName(), value));
Bharat saraswal8beac342016-08-04 02:00:03 +05301170 }
1171
1172 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301173 * Adds build method for interface.
1174 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301175 * @return build method for interface
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301176 * @throws IOException when fails to append to temporary file
1177 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301178 protected String addBuildMethodForInterface()
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301179 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301180 return parseBuilderInterfaceBuildMethodString(
1181 getGeneratedJavaClassName());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301182 }
1183
1184 /**
1185 * Adds build method's implementation for class.
1186 *
1187 * @return build method implementation for class
1188 * @throws IOException when fails to append to temporary file
1189 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301190 protected String addBuildMethodImpl()
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301191 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301192 return getBuildString(getGeneratedJavaClassName(), rootNode) + NEW_LINE;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301193 }
1194
1195 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301196 * Adds default constructor for class.
1197 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301198 * @param modifier modifier for constructor
1199 * @param toAppend string which need to be appended with the class name
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301200 * @param suffix is value need to be appended as suffix
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301201 * @return default constructor for class
1202 * @throws IOException when fails to append to file
1203 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301204 protected String addDefaultConstructor(String modifier, String toAppend,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301205 boolean suffix)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301206 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301207 StringBuilder name = new StringBuilder();
1208 name.append(getGeneratedJavaClassName());
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301209 if (rootNode && !toAppend.equals(BUILDER)) {
1210 name.append(OP_PARAM);
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301211 return getDefaultConstructorString(name.toString(), modifier);
Bharat saraswal8beac342016-08-04 02:00:03 +05301212 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301213 if (suffix) {
1214 name.append(toAppend);
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301215 return getDefaultConstructorString(name.toString(), modifier);
Bharat saraswal8beac342016-08-04 02:00:03 +05301216 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301217 StringBuilder appended = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +05301218 if (toAppend.equals(DEFAULT)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301219 appended.append(getCapitalCase(toAppend));
Bharat saraswal8beac342016-08-04 02:00:03 +05301220 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301221 appended.append(toAppend);
Bharat saraswal8beac342016-08-04 02:00:03 +05301222 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301223 return NEW_LINE + getDefaultConstructorString(appended.append(
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301224 name).toString(), modifier);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301225 // TODO getDefaultConstructorString to handle new line.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301226 }
1227
1228 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301229 * Adds hash code method for class.
1230 *
1231 * @param attr attribute info
1232 * @throws IOException when fails to append to temporary file
1233 */
1234 private void addHashCodeMethod(JavaAttributeInfo attr)
1235 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301236 appendToFile(hashCodeImplTempFileHandle,
1237 getHashCodeMethod(attr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301238 }
1239
1240 /**
1241 * Adds equals method for class.
1242 *
1243 * @param attr attribute info
1244 * @throws IOException when fails to append to temporary file
1245 */
1246 private void addEqualsMethod(JavaAttributeInfo attr)
1247 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301248 appendToFile(equalsImplTempFileHandle,
1249 getEqualsMethod(attr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301250 }
1251
1252 /**
1253 * Adds ToString method for class.
1254 *
1255 * @param attr attribute info
1256 * @throws IOException when fails to append to temporary file
1257 */
1258 private void addToStringMethod(JavaAttributeInfo attr)
1259 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301260 appendToFile(toStringImplTempFileHandle,
1261 getToStringMethod(attr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301262 }
1263
1264 /**
Bharat saraswal250a7472016-05-12 13:16:57 +05301265 * Adds from string method for union class.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301266 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301267 * @param attr type attribute info
1268 * @param fromStringAttr from string attribute info
Bharat saraswal250a7472016-05-12 13:16:57 +05301269 * @throws IOException when fails to append to temporary file
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301270 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301271 void addFromStringMethod(JavaAttributeInfo attr,
Bharat saraswal0663aff2016-10-18 23:16:14 +05301272 JavaAttributeInfo fromStringAttr)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301273 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301274 appendToFile(fromStringImplTempFileHandle,
Bharat saraswal0663aff2016-10-18 23:16:14 +05301275 getFromStringMethod(attr, fromStringAttr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301276 }
1277
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301278 /**
1279 * Returns a temporary file handle for the specific file type.
1280 *
1281 * @param fileName file name
1282 * @return temporary file handle
1283 * @throws IOException when fails to create new file handle
1284 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301285 protected File getTemporaryFileHandle(String fileName)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301286 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301287 String path = getTempDirPath(absoluteDirPath);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301288 File dir = new File(path);
Bharat saraswal8beac342016-08-04 02:00:03 +05301289 boolean isCreated;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301290 if (!dir.exists()) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301291 isCreated = dir.mkdirs();
Shankara-Huaweib7564772016-08-02 18:13:13 +05301292 if (!isCreated) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301293 throw new IOException("failed to create temporary directory " +
1294 "for " + fileName);
Shankara-Huaweib7564772016-08-02 18:13:13 +05301295 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301296 }
1297 File file = new File(path + fileName + TEMP_FILE_EXTENSION);
1298 if (!file.exists()) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301299 isCreated = file.createNewFile();
Shankara-Huaweib7564772016-08-02 18:13:13 +05301300 if (!isCreated) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301301 throw new IOException("failed to create temporary file for " +
1302 fileName);
Shankara-Huaweib7564772016-08-02 18:13:13 +05301303 }
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301304 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301305 throw new IOException(fileName + " is reused due to YANG naming. " +
1306 "probably your previous build " +
1307 "would have failed");
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301308 }
1309 return file;
1310 }
1311
1312 /**
1313 * Returns a temporary file handle for the specific file type.
1314 *
1315 * @param fileName file name
1316 * @return temporary file handle
1317 * @throws IOException when fails to create new file handle
1318 */
Bharat saraswal94844d62016-10-13 13:28:03 +05301319 public File getJavaFileHandle(String fileName)
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301320 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301321 return getFileObject(getDirPath(), fileName, JAVA_FILE_EXTENSION,
1322 javaFileInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301323 }
1324
1325 /**
1326 * Returns data from the temporary files.
1327 *
Bharat saraswalaf413b82016-07-14 15:18:20 +05301328 * @param file temporary file handle
Bharat saraswald14cbe82016-07-14 13:26:18 +05301329 * @param absolutePath absolute path
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301330 * @return stored data from temporary files
1331 * @throws IOException when failed to get data from the given file
1332 */
Bharat saraswald14cbe82016-07-14 13:26:18 +05301333 public String getTemporaryDataFromFileHandle(File file, String absolutePath)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301334 throws IOException {
Bharat saraswald14cbe82016-07-14 13:26:18 +05301335 String path = getTempDirPath(absolutePath);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301336 if (new File(path + file.getName()).exists()) {
1337 return readAppendFile(path + file.getName(), EMPTY_STRING);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301338 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301339 throw new IOException("Unable to get data from the given " +
1340 file.getName() + " file for " +
1341 getGeneratedJavaClassName() + PERIOD);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301342 }
1343
1344 /**
1345 * Returns temporary directory path.
1346 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301347 * @param path absolute path
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301348 * @return directory path
1349 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301350 private String getTempDirPath(String path) {
1351 return getPackageDirPathFromJavaJPackage(path) + SLASH +
1352 getGeneratedJavaClassName() + TEMP_FOLDER_NAME_SUFFIX + SLASH;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301353 }
1354
1355 /**
1356 * Parses attribute to get the attribute string.
1357 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301358 * @param attr attribute info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301359 * @return attribute string
1360 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301361 protected String parseAttribute(JavaAttributeInfo attr) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301362 /*
1363 * TODO: check if this utility needs to be called or move to the caller
1364 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301365 String attrName = attr.getAttributeName();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301366 String attrAccessType = PRIVATE;
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301367 if ((getGeneratedJavaFiles() & GENERATE_INTERFACE_WITH_BUILDER) != 0) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301368 attrAccessType = PROTECTED;
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301369 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301370 String pkg = null;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301371 if (attr.isQualifiedName()) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301372 pkg = attr.getImportInfo().getPkgInfo();
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301373 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301374 return getJavaAttributeDefinition(
1375 pkg, attr.getImportInfo().getClassInfo(), attrName,
1376 attr.isListAttr(), attrAccessType, attr.getCompilerAnnotation());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301377 }
1378
1379 /**
1380 * Appends content to temporary file.
1381 *
1382 * @param file temporary file
1383 * @param data data to be appended
1384 * @throws IOException when fails to append to file
1385 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301386 protected void appendToFile(File file, String data)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301387 throws IOException {
1388 try {
1389 insertDataIntoJavaFile(file, data);
1390 } catch (IOException ex) {
1391 throw new IOException("failed to write in temp file.");
1392 }
1393 }
1394
1395 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301396 * Adds parent's info to current node import list.
1397 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301398 * @param curNode current node
1399 * @param config plugin configurations
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301400 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301401 protected void addParentInfoInCurNodeTempFile(YangNode curNode,
1402 YangPluginConfig config) {
1403 JavaQualifiedTypeInfoTranslator caseImportInfo =
1404 new JavaQualifiedTypeInfoTranslator();
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301405 YangNode parent = getParentNodeInGenCode(curNode);
Bharat saraswale50edca2016-08-05 01:58:25 +05301406 if (curNode instanceof YangCase && parent instanceof YangAugment) {
1407 return;
1408 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301409 if (!(parent instanceof JavaCodeGenerator)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301410 throw new TranslatorException(getErrorMsg(INVALID_PARENT_NODE, curNode));
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301411 }
1412 if (!(curNode instanceof JavaFileInfoContainer)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301413 throw new TranslatorException(getErrorMsg(INVALID_NODE, curNode));
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301414 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301415 caseImportInfo.setClassInfo(
1416 getCapitalCase(getCamelCase(parent.getName(),
1417 config.getConflictResolver())));
1418 caseImportInfo.setPkgInfo(((JavaFileInfoContainer) parent).getJavaFileInfo()
1419 .getPackage());
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301420
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301421 JavaFileInfoTranslator fileInfo =
1422 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301423
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301424 getBeanFiles(curNode).getJavaImportData().addImportInfo(
1425 caseImportInfo, getCapitalCase(fileInfo.getJavaName()),
1426 fileInfo.getPackage());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301427 }
1428
1429 /**
1430 * Adds leaf attributes in generated files.
1431 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301432 * @param entry JAVA leaf info container
1433 * @param config plugin config
1434 * @param curNode current node
1435 * @param leafList flag indicating whether leaf container is leafList
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301436 * @throws IOException IO operation fail
1437 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301438 private void addLeafInfoToTempFiles(JavaLeafInfoContainer entry,
1439 YangPluginConfig config,
1440 YangNode curNode,
1441 boolean leafList)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301442 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301443 if (entry != null) {
1444 if (curNode instanceof RpcNotificationContainer) {
1445 TempJavaBeanFragmentFiles tempFiles = getBeanFiles(curNode);
1446 addJavaSnippetInfoToApplicableTempFiles(
1447 getJavaAttributeOfLeaf(tempFiles, entry,
1448 config, leafList), config);
1449 } else {
1450 addJavaSnippetInfoToApplicableTempFiles(
1451 getJavaAttributeOfLeaf(this, entry,
1452 config, leafList), config);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301453 }
1454 }
1455 }
1456
1457 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301458 * Adds all the leaves in the current data model node as part of the
1459 * generated temporary file.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301460 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301461 * @param curNode current node
1462 * @param config plugin config
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301463 * @throws IOException IO operation fail
1464 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301465 protected void addCurNodeLeavesInfoToTempFiles(YangNode curNode,
1466 YangPluginConfig config)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301467 throws IOException {
1468 if (!(curNode instanceof YangLeavesHolder)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301469 throw new TranslatorException(getErrorMsg(INVALID_LEAF_HOLDER,
1470 curNode));
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301471 }
1472 YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301473
1474 for (YangLeaf leaf : leavesHolder.getListOfLeaf()) {
1475 addLeafInfoToTempFiles((JavaLeafInfoContainer) leaf, config,
1476 curNode, false);
1477 }
1478
1479 for (YangLeafList leafList : leavesHolder.getListOfLeafList()) {
1480 addLeafInfoToTempFiles((JavaLeafInfoContainer) leafList, config,
1481 curNode, true);
1482 }
1483 }
1484
1485 /**
1486 * Adds operation type to temp files.
1487 *
1488 * @param curNode current YANG node
1489 * @param config YANG plugin config
1490 * @throws IOException IO exception
1491 */
1492 protected void addOperationTypeToTempFiles(YangNode curNode,
1493 YangPluginConfig config)
1494 throws IOException {
1495 JavaQualifiedTypeInfoTranslator typeInfo =
1496 new JavaQualifiedTypeInfoTranslator();
1497 typeInfo.setClassInfo(OPERATION_TYPE_CLASS);
Bharat saraswal94844d62016-10-13 13:28:03 +05301498 JavaFileInfo curInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
1499 JavaFileInfo info;
1500 if (curNode instanceof RpcNotificationContainer) {
1501 info = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
1502 } else {
1503 info = ((JavaFileInfoContainer) getModuleNode(curNode))
1504 .getJavaFileInfo();
1505 }
1506
1507 typeInfo.setPkgInfo(info.getPackage().toLowerCase() + PERIOD +
1508 getCapitalCase(info.getJavaName()));
1509 String curNodeName = getCapitalCase(curInfo.getJavaName());
1510 if (!(curNode instanceof RpcNotificationContainer)) {
1511 javaImportData.addImportInfo(typeInfo, curNodeName, curInfo
1512 .getPackage());
1513 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301514 JavaAttributeInfo attributeInfo =
Bharat saraswal94844d62016-10-13 13:28:03 +05301515 getAttributeInfoForTheData(typeInfo, YANG + curNodeName +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301516 OPERATION_TYPE_ATTRIBUTE, null, false, false);
1517 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301518 }
1519
Bharat saraswal94844d62016-10-13 13:28:03 +05301520 private YangNode getModuleNode(YangNode curNode) {
1521 YangNode tempNode = curNode.getParent();
1522 while (!(tempNode instanceof RpcNotificationContainer)) {
1523 tempNode = tempNode.getParent();
1524 }
1525 return tempNode;
1526 }
1527
1528 /**
1529 * Adds value leaf flag to temp files.
1530 *
1531 * @param config YANG plugin config
1532 * @param node YANG node
1533 * @throws IOException IO exception
1534 */
1535 protected void addValueLeafFlag(YangPluginConfig config, YangNode node)
1536 throws IOException {
1537 JavaFileInfo info = ((JavaFileInfoContainer) node).getJavaFileInfo();
1538 JavaQualifiedTypeInfoTranslator typeInfo =
1539 new JavaQualifiedTypeInfoTranslator();
1540 typeInfo.setClassInfo(BIT_SET);
1541 typeInfo.setPkgInfo(JAVA_UTIL_PKG);
1542 this.getJavaImportData().addImportInfo(typeInfo, info.getJavaName(),
1543 info.getPackage());
1544 JavaAttributeInfo attributeInfo =
1545 getAttributeInfoForTheData(typeInfo, VALUE_LEAF, null, false, false);
1546 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1547 }
1548
1549 /**
1550 * Adds value leaf flag to temp files.
1551 *
1552 * @param config YANG plugin config
1553 * @throws IOException IO exception
1554 */
1555 protected void addSelectLeafFlag(YangPluginConfig config)
1556 throws IOException {
1557 JavaQualifiedTypeInfoTranslator typeInfo =
1558 new JavaQualifiedTypeInfoTranslator();
1559 typeInfo.setClassInfo(BIT_SET);
1560 typeInfo.setPkgInfo(JAVA_UTIL_PKG);
1561 JavaAttributeInfo attributeInfo =
1562 getAttributeInfoForTheData(typeInfo, SELECT_LEAF, null, false, false);
1563 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1564 }
1565
1566 /**
Bharat saraswal0663aff2016-10-18 23:16:14 +05301567 * Adds sub tree filtering to temp files.
1568 *
1569 * @param config YANG plugin config
1570 * @throws IOException IO exception
1571 */
1572 protected void addIsSubTreeFilteredFlag(YangPluginConfig config)
1573 throws IOException {
1574 JavaQualifiedTypeInfoTranslator typeInfo =
1575 new JavaQualifiedTypeInfoTranslator();
1576 typeInfo.setClassInfo(BOOLEAN_DATA_TYPE);
1577 typeInfo.setPkgInfo(null);
1578 JavaAttributeInfo attributeInfo =
1579 getAttributeInfoForTheData(typeInfo, SUBTREE_FILTERED, null, false, false);
1580 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1581 }
1582
1583 /**
Bharat saraswal94844d62016-10-13 13:28:03 +05301584 * Adds value leaf flag to temp files.
1585 *
1586 * @param config YANG plugin config
1587 * @throws IOException IO exception
1588 */
1589 protected void addYangAugmentedMap(YangPluginConfig config)
1590 throws IOException {
1591 JavaQualifiedTypeInfoTranslator typeInfo =
1592 new JavaQualifiedTypeInfoTranslator();
1593 typeInfo.setClassInfo(AUGMENT_MAP_TYPE);
1594 //Fix for add yangAugmentedInfo in equals/hashcode/and to string method.
1595 typeInfo.setPkgInfo(null);
1596 JavaAttributeInfo attributeInfo =
1597 getAttributeInfoForTheData(typeInfo, YANG_AUGMENTED_INFO_MAP,
1598 null, false, false);
1599 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1600 }
1601
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301602 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301603 * Adds the new attribute info to the target generated temporary files.
1604 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301605 * @param newAttrInfo new attribute info
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301606 * @param pluginConfig plugin configurations
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301607 * @throws IOException IO operation fail
1608 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301609 void addJavaSnippetInfoToApplicableTempFiles(JavaAttributeInfo newAttrInfo,
1610 YangPluginConfig pluginConfig)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301611 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301612 isAttributePresent = true;
Bharat saraswal94844d62016-10-13 13:28:03 +05301613 String attrName = newAttrInfo.getAttributeName();
Bharat saraswal0663aff2016-10-18 23:16:14 +05301614 //Boolean flag for operation type attr info generation control.
Bharat saraswal94844d62016-10-13 13:28:03 +05301615 boolean required = !attrName.equals(VALUE_LEAF) &&
1616 !attrName.equals(SELECT_LEAF) &&
1617 !attrName.equals(YANG_AUGMENTED_INFO_MAP);
Bharat saraswal0663aff2016-10-18 23:16:14 +05301618 //Boolean flag for subtree for nodes info generation control.
1619 boolean subTreeForChild =
1620 tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK) &&
1621 newAttrInfo.getAttributeType() == null &&
1622 !attrName.contains(OPERATION_TYPE_ATTRIBUTE) &&
1623 required && !attrName.equals(SUBTREE_FILTERED);
1624 ;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301625 if (tempFlagSet(ATTRIBUTES_MASK)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301626 addAttribute(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301627 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301628 if (tempFlagSet(GETTER_FOR_INTERFACE_MASK)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301629 addGetterForInterface(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301630 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301631 if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301632 addSetterForInterface(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301633 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301634 if (tempFlagSet(SETTER_FOR_CLASS_MASK) && required) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301635 addSetterImpl(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301636 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301637 if (tempFlagSet(HASH_CODE_IMPL_MASK)) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301638 addHashCodeMethod(newAttrInfo);
1639 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301640 if (tempFlagSet(EQUALS_IMPL_MASK)) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301641 addEqualsMethod(newAttrInfo);
1642 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301643 if (tempFlagSet(TO_STRING_IMPL_MASK)) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301644 addToStringMethod(newAttrInfo);
1645 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301646 if (tempFlagSet(EDIT_CONTENT_MASK)) {
Bharat saraswale50edca2016-08-05 01:58:25 +05301647 //TODO: add implementation for edit content match.
1648 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301649 boolean listAttr = newAttrInfo.isListAttr();
1650 if (tempFlagSet(ADD_TO_LIST_IMPL_MASK) && listAttr) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301651 addAddToListImpl(newAttrInfo);
1652 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301653 if (tempFlagSet(ADD_TO_LIST_INTERFACE_MASK) && listAttr) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301654 addAddToListInterface(newAttrInfo);
Bharat saraswal8beac342016-08-04 02:00:03 +05301655 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301656 YangType attrType = newAttrInfo.getAttributeType();
Bharat saraswal0663aff2016-10-18 23:16:14 +05301657 if (subTreeForChild) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301658 addSubtreeFilteringForChildNode(newAttrInfo);
Bharat saraswale50edca2016-08-05 01:58:25 +05301659 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301660 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK) &&
1661 !listAttr && attrType != null) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301662 addSubTreeFilteringForLeaf(newAttrInfo);
Bharat saraswale50edca2016-08-05 01:58:25 +05301663 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301664 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK) &&
1665 listAttr && attrType != null) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301666 addSubtreeFilteringForLeafList(newAttrInfo);
Bharat saraswale50edca2016-08-05 01:58:25 +05301667 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301668 if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK) &&
1669 !listAttr && attrType != null) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301670 leafCount++;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301671 addLeafIdAttributes(newAttrInfo, leafCount);
Bharat saraswal8beac342016-08-04 02:00:03 +05301672 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301673 if (!newAttrInfo.isIntConflict() && !newAttrInfo.isLongConflict() &&
1674 !newAttrInfo.isShortConflict()) {
1675 if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301676 addGetterImpl(newAttrInfo);
Bharat saraswal64e7e232016-07-14 23:33:55 +05301677 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301678 if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
1679 JavaQualifiedTypeInfoTranslator typeInfo =
1680 getQualifiedInfoOfFromString(newAttrInfo,
1681 pluginConfig.getConflictResolver());
Bharat saraswal250a7472016-05-12 13:16:57 +05301682 /*
1683 * Create a new java attribute info with qualified information of
1684 * wrapper classes.
1685 */
Bharat saraswal748fc3c2016-09-06 16:38:20 +05301686 JavaAttributeInfo fromStringAttributeInfo =
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301687 getAttributeInfoForTheData(
1688 typeInfo, newAttrInfo.getAttributeName(),
1689 attrType, getIsQualifiedAccessOrAddToImportList(
1690 typeInfo), false);
Bharat saraswal0663aff2016-10-18 23:16:14 +05301691 addFromStringMethod(newAttrInfo, fromStringAttributeInfo);
Bharat saraswal64e7e232016-07-14 23:33:55 +05301692 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301693 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301694 }
1695
1696 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301697 * Returns JAVA class name for non implementation classes.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301698 *
1699 * @param suffix for the class name based on the file type
1700 * @return java class name
1701 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301702 protected String getJavaClassName(String suffix) {
1703 return getCapitalCase(javaFileInfo.getJavaName()) + suffix;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301704 }
1705
1706 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301707 * Returns class name for implementation classes.
Bharat saraswald14cbe82016-07-14 13:26:18 +05301708 *
Bharat saraswal8beac342016-08-04 02:00:03 +05301709 * @param node YANG node
Bharat saraswald14cbe82016-07-14 13:26:18 +05301710 * @return java class name
1711 */
Bharat saraswal8beac342016-08-04 02:00:03 +05301712 private String getImplClassName(YangNode node) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301713 if (node instanceof RpcNotificationContainer) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301714 return getGeneratedJavaClassName() + OP_PARAM;
Bharat saraswal8beac342016-08-04 02:00:03 +05301715 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301716 return DEFAULT_CAPS + getGeneratedJavaClassName();
Bharat saraswald14cbe82016-07-14 13:26:18 +05301717 }
1718
1719 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301720 * Returns the directory path.
1721 *
1722 * @return directory path
1723 */
1724 private String getDirPath() {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301725 return javaFileInfo.getPackageFilePath();
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301726 }
1727
1728 /**
1729 * Constructs java code exit.
1730 *
1731 * @param fileType generated file type
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301732 * @param curNode current YANG node
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301733 * @throws IOException when fails to generate java files
1734 */
1735 public void generateJavaFile(int fileType, YangNode curNode)
1736 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301737 List<String> imports =
1738 getBeanFiles(curNode).getJavaImportData().getImports();
Bharat saraswal8beac342016-08-04 02:00:03 +05301739 if (curNode instanceof YangAugmentableNode) {
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301740 addImportsForAugmentableClass(imports, true, true, curNode);
Bharat saraswal8beac342016-08-04 02:00:03 +05301741 }
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301742 createPackage(curNode);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301743
1744 //Generate java code.
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301745 if ((fileType & INTERFACE_MASK) != 0 ||
1746 (fileType & BUILDER_INTERFACE_MASK) != 0) {
Vidyashree Ramab3670472016-08-06 15:49:56 +05301747
1748 //Create interface file.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301749 interfaceJavaFileHandle =
1750 getJavaFileHandle(getJavaClassName(INTERFACE_FILE_NAME_SUFFIX));
1751 interfaceJavaFileHandle =
1752 generateInterfaceFile(interfaceJavaFileHandle, imports,
1753 curNode, isAttributePresent);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301754
Bharat saraswal94844d62016-10-13 13:28:03 +05301755 //Create builder interface file.
1756 if ((fileType & BUILDER_INTERFACE_MASK) != 0) {
1757 builderInterfaceJavaFileHandle =
1758 getJavaFileHandle(getJavaClassName(
1759 BUILDER_INTERFACE_FILE_NAME_SUFFIX));
1760 builderInterfaceJavaFileHandle =
1761 generateBuilderInterfaceFile(
1762 builderInterfaceJavaFileHandle,
1763 curNode, isAttributePresent);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301764 /*
1765 * Append builder interface file to interface file and
1766 * close it.
1767 */
Bharat saraswal94844d62016-10-13 13:28:03 +05301768 mergeJavaFiles(builderInterfaceJavaFileHandle,
1769 interfaceJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301770 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301771
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301772 insertDataIntoJavaFile(interfaceJavaFileHandle, CLOSE_CURLY_BRACKET);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301773 validateLineLength(interfaceJavaFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301774 if (curNode instanceof YangAugmentableNode) {
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301775 addImportsForAugmentableClass(imports, false, true, curNode);
Bharat saraswald14cbe82016-07-14 13:26:18 +05301776 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301777 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301778
Bharat saraswal0663aff2016-10-18 23:16:14 +05301779 if (curNode.isOpTypeReq()) {
1780 addSubTreeImportStrings(imports);
1781 }
1782 if (curNode instanceof YangCase) {
Bharat saraswal94844d62016-10-13 13:28:03 +05301783 removeCaseParentImport(curNode, imports);
1784 }
1785
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301786 if ((fileType & BUILDER_CLASS_MASK) != 0 ||
1787 (fileType & DEFAULT_CLASS_MASK) != 0) {
1788 if (isAttributePresent) {
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301789 addImportsToStringAndHasCodeMethods(imports, true);
Bharat saraswal8beac342016-08-04 02:00:03 +05301790 addArrayListImport(imports);
Bharat saraswalaf413b82016-07-14 15:18:20 +05301791 }
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301792
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301793 addBitsAndBase64Imports(curNode, imports);
Bharat saraswalaf413b82016-07-14 15:18:20 +05301794 if (curNode instanceof YangAugmentableNode) {
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301795 addImportsForAugmentableClass(imports, true, false, curNode);
Bharat saraswal94844d62016-10-13 13:28:03 +05301796 if (curNode.isOpTypeReq()) {
1797 addInvocationExceptionImport(imports);
1798 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301799 }
Bharat saraswal250a7472016-05-12 13:16:57 +05301800 sortImports(imports);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301801
1802 //Create impl class file.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301803 implClassJavaFileHandle =
1804 getJavaFileHandle(getImplClassName(curNode));
1805 implClassJavaFileHandle =
1806 generateDefaultClassFile(implClassJavaFileHandle,
1807 curNode, isAttributePresent,
1808 imports);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301809
1810 //Create builder class file.
Bharat saraswald14cbe82016-07-14 13:26:18 +05301811 if ((fileType & BUILDER_CLASS_MASK) != 0) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301812 builderClassJavaFileHandle =
1813 getJavaFileHandle(getJavaClassName(
1814 BUILDER_CLASS_FILE_NAME_SUFFIX));
1815 builderClassJavaFileHandle =
1816 generateBuilderClassFile(builderClassJavaFileHandle,
1817 curNode,
1818 isAttributePresent);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301819
1820 //Append impl class to builder class and close it.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301821 mergeJavaFiles(builderClassJavaFileHandle,
1822 implClassJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301823 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301824 insertDataIntoJavaFile(implClassJavaFileHandle, CLOSE_CURLY_BRACKET);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301825 validateLineLength(implClassJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301826 }
Vidyashree Ramab3670472016-08-06 15:49:56 +05301827 //Close all the file handles.
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301828 freeTemporaryResources(false);
1829 }
1830
Bharat saraswal94844d62016-10-13 13:28:03 +05301831 //Removes case's parent import.
1832 private void removeCaseParentImport(YangNode node, List<String> imports) {
1833 YangNode parent = node.getParent();
1834 JavaFileInfo info = ((JavaFileInfoContainer) parent).getJavaFileInfo();
1835 String impt = getImportString(info.getPackage(),
1836 getCapitalCase(info.getJavaName()));
1837 imports.remove(impt);
1838 }
1839
Vidyashree Ramab3670472016-08-06 15:49:56 +05301840 //Adds import for array list.
Bharat saraswal8beac342016-08-04 02:00:03 +05301841 private void addArrayListImport(List<String> imports) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301842 if (imports.contains(javaImportData.getImportForList())) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301843 imports.add(ARRAY_LIST_IMPORT);
1844 }
1845 }
1846
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301847 //Adds import for bitset and base64 list.
1848 private void addBitsAndBase64Imports(YangNode curNode, List<String> imports) {
1849 if (curNode instanceof YangLeavesHolder) {
1850 YangLeavesHolder holder = (YangLeavesHolder) curNode;
Bharat saraswal94844d62016-10-13 13:28:03 +05301851 String impt = getJavaImportData()
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301852 .getImportForToBitSet();
1853 if (!holder.getListOfLeaf().isEmpty() &&
1854 !imports.contains(impt)) {
1855 imports.add(impt);
1856 }
1857 }
Bharat saraswald14cbe82016-07-14 13:26:18 +05301858 }
1859
1860 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301861 * Adds imports for ToString and HashCodeMethod.
1862 *
Bharat saraswal039f59c2016-07-14 21:57:13 +05301863 * @param imports import list
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301864 * @param operation add or remove
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301865 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301866 protected void addImportsToStringAndHasCodeMethods(List<String> imports,
1867 boolean operation) {
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301868 if (operation) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301869 imports.add(javaImportData.getImportForHashAndEquals());
1870 imports.add(javaImportData.getImportForToString());
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301871 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301872 imports.remove(javaImportData.getImportForHashAndEquals());
1873 imports.remove(javaImportData.getImportForToString());
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301874 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301875 // TODO change boolean to OPERATION, in all related places.
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301876 }
1877
1878 /**
Bharat saraswalaf413b82016-07-14 15:18:20 +05301879 * Adds import for map and hash map.
1880 *
Bharat saraswal8beac342016-08-04 02:00:03 +05301881 * @param imports import list
1882 * @param operations true for adding and false for deletion
1883 * @param isInterfaceFile if need to add in interface file
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301884 * @param curNode current node
Bharat saraswalaf413b82016-07-14 15:18:20 +05301885 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301886 private void addImportsForAugmentableClass(List<String> imports,
1887 boolean operations,
1888 boolean isInterfaceFile,
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301889 YangNode curNode) {
Bharat saraswal039f59c2016-07-14 21:57:13 +05301890 if (operations) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301891 if (!isInterfaceFile) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301892 imports.add(javaImportData.getHashMapImport());
Bharat saraswal8beac342016-08-04 02:00:03 +05301893 }
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301894 // Add import for hash map only if node is not a YANG choice.
1895 if (!(curNode instanceof YangChoice)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301896 imports.add(javaImportData.getMapImport());
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301897 }
Bharat saraswal039f59c2016-07-14 21:57:13 +05301898 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +05301899 if (!isInterfaceFile) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301900 imports.remove(javaImportData.getHashMapImport());
Bharat saraswal8beac342016-08-04 02:00:03 +05301901 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301902 imports.remove(javaImportData.getMapImport());
Bharat saraswald14cbe82016-07-14 13:26:18 +05301903 }
Bharat saraswal8beac342016-08-04 02:00:03 +05301904 sortImports(imports);
Bharat saraswald14cbe82016-07-14 13:26:18 +05301905 }
1906
1907 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05301908 * Adds invocation exception import.
Bharat saraswal039f59c2016-07-14 21:57:13 +05301909 *
1910 * @param imports list of imports
Bharat saraswal039f59c2016-07-14 21:57:13 +05301911 */
Bharat saraswal8beac342016-08-04 02:00:03 +05301912 private void addInvocationExceptionImport(List<String> imports) {
1913 imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
Bharat saraswal039f59c2016-07-14 21:57:13 +05301914 }
1915
1916 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301917 * Removes all temporary file handles.
1918 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301919 * @param errorOccurred flag indicating if error occurred
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301920 * @throws IOException when failed to delete the temporary files
1921 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301922 public void freeTemporaryResources(boolean errorOccurred)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301923 throws IOException {
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301924 /*
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301925 * Close all java file handles and when error occurs delete the files.
1926 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301927 if (javaFlagSet(INTERFACE_MASK)) {
1928 closeFile(interfaceJavaFileHandle, errorOccurred);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301929 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301930 if (javaFlagSet(BUILDER_CLASS_MASK)) {
1931 closeFile(builderClassJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301932 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301933 if (javaFlagSet(BUILDER_INTERFACE_MASK)) {
1934 closeFile(builderInterfaceJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301935 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301936 if (javaFlagSet(DEFAULT_CLASS_MASK)) {
1937 closeFile(implClassJavaFileHandle, errorOccurred);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301938 }
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301939 /*
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301940 * Close all temporary file handles and delete the files.
1941 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301942 if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
1943 closeFile(getterImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301944 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301945 if (tempFlagSet(ATTRIBUTES_MASK)) {
1946 closeFile(attributesTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301947 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301948 if (tempFlagSet(HASH_CODE_IMPL_MASK)) {
1949 closeFile(hashCodeImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301950 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301951 if (tempFlagSet(TO_STRING_IMPL_MASK)) {
1952 closeFile(toStringImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301953 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301954 if (tempFlagSet(EQUALS_IMPL_MASK)) {
1955 closeFile(equalsImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301956 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301957 if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
1958 closeFile(fromStringImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301959 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301960 if (tempFlagSet(ADD_TO_LIST_IMPL_MASK)) {
1961 closeFile(addToListImplTempFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301962 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301963 if (tempFlagSet(ADD_TO_LIST_INTERFACE_MASK)) {
1964 closeFile(addToListInterfaceTempFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301965 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301966 if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK)) {
1967 closeFile(leafIdAttributeTempFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301968 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301969 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK)) {
1970 closeFile(subtreeFilteringForLeafTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301971 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301972 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK)) {
1973 closeFile(getSubtreeFilteringForListTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301974 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301975 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK)) {
1976 closeFile(getSubtreeFilteringForChildNodeTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301977 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301978 if (tempFlagSet(EDIT_CONTENT_MASK)) {
1979 closeFile(editContentTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301980 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301981 }
1982
1983 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301984 * Returns if the attribute needs to be accessed in a qualified manner or
1985 * not, if it needs to be imported, then the same needs to be done.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301986 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301987 * @param importInfo import info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301988 * @return status of the qualified access to the attribute
1989 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301990 protected boolean getIsQualifiedAccessOrAddToImportList(
1991 JavaQualifiedTypeInfo importInfo) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301992 return javaImportData
1993 .addImportInfo((JavaQualifiedTypeInfoTranslator) importInfo,
1994 getGeneratedJavaClassName(),
1995 javaFileInfo.getPackage());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301996 }
1997
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301998 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05301999 * Returns temp file handle for add to list interface.
Shankara-Huaweia1039e52016-07-14 16:53:09 +05302000 *
Bharat saraswal8beac342016-08-04 02:00:03 +05302001 * @return temp file handle for add to list interface
Shankara-Huaweia1039e52016-07-14 16:53:09 +05302002 */
Bharat saraswal8beac342016-08-04 02:00:03 +05302003 public File getAddToListInterfaceTempFileHandle() {
2004 return addToListInterfaceTempFileHandle;
Shankara-Huaweia1039e52016-07-14 16:53:09 +05302005 }
2006
2007 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05302008 * Returns temp file handle for add to list impl.
2009 *
2010 * @return temp file handle for add to list impl
2011 */
2012 public File getAddToListImplTempFileHandle() {
2013 return addToListImplTempFileHandle;
2014 }
2015
2016 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05302017 * Returns temp file handle for leaf identifier attributes.
2018 *
2019 * @return temp file handle for leaf identifier attributes
2020 */
2021 public File getLeafIdAttributeTempFileHandle() {
2022 return leafIdAttributeTempFileHandle;
2023 }
2024
2025 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05302026 * Sets true if root node.
2027 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302028 * @param rootNode true if root node
Bharat saraswal8beac342016-08-04 02:00:03 +05302029 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302030 void setRootNode(boolean rootNode) {
2031 this.rootNode = rootNode;
Shankara-Huaweia1039e52016-07-14 16:53:09 +05302032 }
Bharat saraswale50edca2016-08-05 01:58:25 +05302033
2034 /**
2035 * Returns temp file for is content match.
2036 *
2037 * @return temp file for is content match
2038 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05302039 public File getSubtreeFilteringForLeafTempFileHandle() {
2040 return subtreeFilteringForLeafTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +05302041 }
2042
2043 /**
Bharat saraswale50edca2016-08-05 01:58:25 +05302044 * Returns temp file for edit content file.
2045 *
2046 * @return temp file for edit content file
2047 */
2048 public File getEditContentTempFileHandle() {
2049 return editContentTempFileHandle;
2050 }
2051
2052 /**
Bharat saraswale50edca2016-08-05 01:58:25 +05302053 * Returns temp file for is content match.
2054 *
2055 * @return temp file for is content match
2056 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05302057 public File getGetSubtreeFilteringForListTempFileHandle() {
2058 return getSubtreeFilteringForListTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +05302059 }
2060
2061 /**
Bharat saraswale50edca2016-08-05 01:58:25 +05302062 * Returns temp file for is content match.
2063 *
2064 * @return temp file for is content match
2065 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05302066 public File getGetSubtreeFilteringForChildNodeTempFileHandle() {
2067 return getSubtreeFilteringForChildNodeTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +05302068 }
2069
2070 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302071 * Checks if a given flag is set in generated java files.
2072 * Returns true if ANY flag is set in a bitwise-ORed argument, e.g.
2073 * <pre>
2074 * javaFlagSet(FOO | BAR)
2075 * </pre>
2076 * returns true if either FOO flag or BAR flag is set.
Bharat saraswale50edca2016-08-05 01:58:25 +05302077 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302078 * @param flag input flag mask value
2079 * @return true if set, else false
Bharat saraswale50edca2016-08-05 01:58:25 +05302080 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302081 private boolean javaFlagSet(int flag) {
2082 return (getGeneratedJavaFiles() & flag) != 0;
2083 }
2084
2085 /**
2086 * Checks if a given flag is set in temp files.
2087 *
2088 * @param flag input flag mask value
2089 * @return true if set, else false
2090 */
2091 private boolean tempFlagSet(int flag) {
2092 return (tempFilesFlagSet & flag) != 0;
Bharat saraswale50edca2016-08-05 01:58:25 +05302093 }
Bharat saraswal54e4bab2016-10-05 23:32:14 +05302094
2095 /**
Bharat saraswal94844d62016-10-13 13:28:03 +05302096 * Sets true if binary type is there for leaf/leaf-list.
2097 *
2098 * @param binary true if binary type is there for leaf/leaf-list
2099 */
2100 public void setBinary(boolean binary) {
2101 isBinary = binary;
2102 }
2103
2104 /**
2105 * Returns true if binary type is there for leaf/leaf-list.
2106 *
2107 * @return true if binary type is there for leaf/leaf-list
2108 */
2109 public boolean isBinary() {
2110 return isBinary;
2111 }
2112
Bharat saraswal0663aff2016-10-18 23:16:14 +05302113 /**
2114 * Sets attribute's node.
2115 *
2116 * @param attrNode attribute's node
2117 */
2118 public void setAttrNode(YangNode attrNode) {
2119 this.attrNode = attrNode;
2120 }
2121
2122 /**
2123 * Adds info to sub tree import list.
2124 *
2125 * @param info import info
2126 */
2127 public void addToSubTreeImports(JavaQualifiedTypeInfoTranslator
2128 info) {
2129 boolean isAdded = false;
2130 for (JavaQualifiedTypeInfoTranslator imports : subTreeImports) {
2131 if (imports.getClassInfo().equals(info.getClassInfo())) {
2132 isAdded = true;
2133 }
2134 }
2135 if (!isAdded) {
2136 subTreeImports.add(info);
2137 }
2138 }
2139
2140 private void addSubTreeImportStrings(List<String> imports) {
2141 for (JavaQualifiedTypeInfoTranslator impt : subTreeImports) {
2142 imports.add(getImportString(impt.getPkgInfo(), impt.getClassInfo()));
2143 }
2144 sortImports(imports);
2145 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05302146}