blob: 7f6eb84f5732502fe38347905ecbe2262e6b138c [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;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053023import org.onosproject.yangutils.datamodel.YangLeaf;
24import org.onosproject.yangutils.datamodel.YangLeafList;
25import org.onosproject.yangutils.datamodel.YangLeavesHolder;
Vidyashree Ramab3670472016-08-06 15:49:56 +053026import org.onosproject.yangutils.datamodel.YangList;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053027import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswalb41904b2016-10-20 19:22:36 +053028import org.onosproject.yangutils.datamodel.YangSchemaNode;
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 saraswal94844d62016-10-13 13:28:03 +053095import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getImportString;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053096import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOverRideString;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053097import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeaf;
98import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeafList;
99import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForNode;
100import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_LEAF_HOLDER;
101import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_NODE;
102import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_PARENT_NODE;
103import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.MISSING_PARENT_NODE;
104import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
105import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
Bharat saraswal8beac342016-08-04 02:00:03 +0530106import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_IMPORT;
Bharat saraswal94844d62016-10-13 13:28:03 +0530107import static org.onosproject.yangutils.utils.UtilConstants.AUGMENT_MAP_TYPE;
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530108import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530109import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530110import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530111import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530112import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530113import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530114import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
115import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530116import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
Bharat saraswalb41904b2016-10-20 19:22:36 +0530117import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION;
Bharat saraswal8beac342016-08-04 02:00:03 +0530118import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION_IMPORT;
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530119import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
Bharat saraswalb41904b2016-10-20 19:22:36 +0530120import static org.onosproject.yangutils.utils.UtilConstants.METHOD;
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 saraswalb41904b2016-10-20 19:22:36 +0530128import static org.onosproject.yangutils.utils.UtilConstants.REFLECT_IMPORTS;
Bharat saraswal94844d62016-10-13 13:28:03 +0530129import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530130import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530131import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530132import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
Bharat saraswal94844d62016-10-13 13:28:03 +0530133import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530134import static org.onosproject.yangutils.utils.UtilConstants.YANG;
Bharat saraswal94844d62016-10-13 13:28:03 +0530135import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530136import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530137import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile;
Bharat saraswal8beac342016-08-04 02:00:03 +0530138import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ADD_TO_LIST;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530139import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
Bharat saraswalb41904b2016-10-20 19:22:36 +0530140import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.SETTER_METHOD;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530141import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530142import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530143import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
144import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
145import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530146import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
147import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.mergeJavaFiles;
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530148import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.validateLineLength;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530149
150/**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530151 * Represents implementation of java code fragments temporary implementations.
152 * Manages the common temp file required for Java file(s) generated.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530153 */
154public class TempJavaFragmentFiles {
Bharat saraswal250a7472016-05-12 13:16:57 +0530155
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530156 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530157 * File type extension for java classes.
158 */
159 private static final String JAVA_FILE_EXTENSION = ".java";
Bharat saraswal250a7472016-05-12 13:16:57 +0530160
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530161 /**
162 * File type extension for temporary classes.
163 */
164 private static final String TEMP_FILE_EXTENSION = ".tmp";
Bharat saraswal250a7472016-05-12 13:16:57 +0530165
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530166 /**
167 * Folder suffix for temporary files folder.
168 */
Bharat saraswal64e7e232016-07-14 23:33:55 +0530169 private static final String TEMP_FOLDER_NAME_SUFFIX = "-Temp";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530170
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530171 /**
172 * File name for getter method.
173 */
174 private static final String GETTER_METHOD_FILE_NAME = "GetterMethod";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530175
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530176 /**
177 * File name for setter method.
178 */
179 private static final String SETTER_METHOD_FILE_NAME = "SetterMethod";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530180
181 /**
182 * File name for getter method implementation.
183 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530184 private static final String GETTER_METHOD_IMPL_FILE_NAME =
185 "GetterMethodImpl";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530186
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530187 /**
188 * File name for setter method implementation.
189 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530190 private static final String SETTER_METHOD_IMPL_FILE_NAME =
191 "SetterMethodImpl";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530192
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530193 /**
194 * File name for attributes.
195 */
196 private static final String ATTRIBUTE_FILE_NAME = "Attributes";
Bharat saraswal250a7472016-05-12 13:16:57 +0530197
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530198 /**
199 * File name for to string method.
200 */
201 private static final String TO_STRING_METHOD_FILE_NAME = "ToString";
Bharat saraswal250a7472016-05-12 13:16:57 +0530202
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530203 /**
204 * File name for hash code method.
205 */
206 private static final String HASH_CODE_METHOD_FILE_NAME = "HashCode";
Bharat saraswal250a7472016-05-12 13:16:57 +0530207
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530208 /**
209 * File name for equals method.
210 */
211 private static final String EQUALS_METHOD_FILE_NAME = "Equals";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530212
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530213 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530214 * File name for from string method.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530215 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530216 private static final String FROM_STRING_METHOD_FILE_NAME = "FromString";
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530217
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530218 /**
Bharat saraswal8beac342016-08-04 02:00:03 +0530219 * File name for from add to list interface method.
220 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530221 private static final String ADD_TO_LIST_INTERFACE_METHOD_FILE_NAME =
222 "addToList";
Bharat saraswal8beac342016-08-04 02:00:03 +0530223
224 /**
225 * File name for from add to list impl method.
226 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530227 private static final String ADD_TO_LIST_IMPL_METHOD_FILE_NAME =
228 "addToListImpl";
Bharat saraswal8beac342016-08-04 02:00:03 +0530229
230 /**
231 * File name for from leaf identifier attributes.
232 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530233 private static final String LEAF_IDENTIFIER_ATTRIBUTES_FILE_NAME =
234 "leafIdentifierAtr";
Bharat saraswal8beac342016-08-04 02:00:03 +0530235
236 /**
Bharat saraswale50edca2016-08-05 01:58:25 +0530237 * File name for is filter content leaf match.
238 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530239 private static final String FILTER_CONTENT_MATCH_LEAF_FILE_NAME =
240 "isFilterContentMatchLeafMask";
Bharat saraswale50edca2016-08-05 01:58:25 +0530241
242 /**
243 * File name for is filter content leaf-list match.
244 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530245 private static final String FILTER_CONTENT_MATCH_LEAF_LIST_FILE_NAME =
246 "isFilterContentMatchLeafListMask";
Bharat saraswale50edca2016-08-05 01:58:25 +0530247
248 /**
249 * File name for is filter content node match.
250 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530251 private static final String FILTER_CONTENT_MATCH_NODE_FILE_NAME =
252 "isFilterContentMatchNodeMask";
Bharat saraswale50edca2016-08-05 01:58:25 +0530253
254 /**
255 * File name for edit content file.
256 */
257 private static final String EDIT_CONTENT_FILE_NAME = "editContentFile";
258
259 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530260 * File name for interface java file name suffix.
261 */
262 private static final String INTERFACE_FILE_NAME_SUFFIX = EMPTY_STRING;
Bharat saraswal250a7472016-05-12 13:16:57 +0530263
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530264 /**
265 * File name for builder interface file name suffix.
266 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530267 private static final String BUILDER_INTERFACE_FILE_NAME_SUFFIX =
268 BUILDER + INTERFACE;
Bharat saraswal250a7472016-05-12 13:16:57 +0530269
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530270 /**
271 * File name for builder class file name suffix.
272 */
273 private static final String BUILDER_CLASS_FILE_NAME_SUFFIX = BUILDER;
Bharat saraswal250a7472016-05-12 13:16:57 +0530274
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530275 /**
Bharat saraswal0663aff2016-10-18 23:16:14 +0530276 * if type is binary.
Bharat saraswal94844d62016-10-13 13:28:03 +0530277 */
278 private boolean isBinary;
279
280 /**
Bharat saraswal0663aff2016-10-18 23:16:14 +0530281 * Current attributes YANG node
282 */
283 private YangNode attrNode;
284
285 /**
286 * Sub tree filtering requires child class imports for type cast.
287 */
288 private final List<JavaQualifiedTypeInfoTranslator> subTreeImports = new ArrayList<>();
289 /**
Bharat saraswalaf413b82016-07-14 15:18:20 +0530290 * Information about the java files being generated.
291 */
Bharat saraswale50edca2016-08-05 01:58:25 +0530292 private JavaFileInfoTranslator javaFileInfo;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530293
294 /**
295 * Imported class info.
296 */
297 private JavaImportData javaImportData;
298
299 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530300 * The variable which guides the types of temporary files generated using
301 * the temporary generated file types mask.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530302 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530303 private int tempFilesFlagSet;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530304
305 /**
306 * Absolute path where the target java file needs to be generated.
307 */
308 private String absoluteDirPath;
309
310 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530311 * Contains all the interface(s)/class name which will be extended by
312 * generated files.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530313 */
314 private JavaExtendsListHolder javaExtendsListHolder;
315
Bharat saraswald14cbe82016-07-14 13:26:18 +0530316 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530317 * Java file handle for interface file.
318 */
319 private File interfaceJavaFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530320
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530321 /**
322 * Java file handle for builder interface file.
323 */
324 private File builderInterfaceJavaFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530325
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530326 /**
327 * Java file handle for builder class file.
328 */
329 private File builderClassJavaFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530330
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530331 /**
332 * Java file handle for impl class file.
333 */
334 private File implClassJavaFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530335
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530336 /**
337 * Temporary file handle for attribute.
338 */
339 private File attributesTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530340
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530341 /**
342 * Temporary file handle for getter of interface.
343 */
344 private File getterInterfaceTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530345
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530346 /**
347 * Temporary file handle for setter of interface.
348 */
349 private File setterInterfaceTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530350
351 /**
352 * Temporary file handle for getter of class.
353 */
354 private File getterImplTempFileHandle;
355
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530356 /**
357 * Temporary file handle for setter of class.
358 */
359 private File setterImplTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530360
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530361 /**
362 * Temporary file handle for hash code method of class.
363 */
364 private File hashCodeImplTempFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530365
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530366 /**
367 * Temporary file handle for equals method of class.
368 */
369 private File equalsImplTempFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530370
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530371 /**
372 * Temporary file handle for to string method of class.
373 */
374 private File toStringImplTempFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +0530375
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530376 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530377 * Temporary file handle for from string method of class.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530378 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530379 private File fromStringImplTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530380
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530381 /**
Bharat saraswal8beac342016-08-04 02:00:03 +0530382 * Temporary file handle for add to list interface method of class.
383 */
384 private File addToListInterfaceTempFileHandle;
385
386 /**
387 * Temporary file handle for add to list impl method of class.
388 */
389 private File addToListImplTempFileHandle;
390
391 /**
392 * Temporary file handle for leaf id attributes of enum.
393 */
394 private File leafIdAttributeTempFileHandle;
395
396 /**
Bharat saraswale50edca2016-08-05 01:58:25 +0530397 * Temporary file handle for is content match method for leaf-list.
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530398 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530399 private File getSubtreeFilteringForListTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +0530400
401 /**
402 * Temporary file handle for is content match method for node.
403 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530404 private File getSubtreeFilteringForChildNodeTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +0530405
406 /**
407 * Temporary file handle for is content match method for leaf.
408 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530409 private File subtreeFilteringForLeafTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +0530410
411 /**
412 * Temporary file handle for edit content file.
413 */
414 private File editContentTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530415
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530416 /**
Bharat saraswal8beac342016-08-04 02:00:03 +0530417 * Leaf count.
418 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530419 private int leafCount;
Bharat saraswal8beac342016-08-04 02:00:03 +0530420
421 /**
422 * If current node is root node.
423 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530424 private boolean rootNode;
Bharat saraswal8beac342016-08-04 02:00:03 +0530425
426 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530427 * Is attribute added.
428 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530429 private boolean isAttributePresent;
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530430
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530431 /**
432 * Creates an instance of temp JAVA fragment files.
433 */
Bharat saraswalaf413b82016-07-14 15:18:20 +0530434 TempJavaFragmentFiles() {
435 }
436
437 /**
438 * Creates an instance of temporary java code fragment.
439 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530440 * @param fileInfo generated java file information
Bharat saraswalaf413b82016-07-14 15:18:20 +0530441 * @throws IOException when fails to create new file handle
442 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530443 protected TempJavaFragmentFiles(JavaFileInfoTranslator fileInfo)
Bharat saraswalaf413b82016-07-14 15:18:20 +0530444 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530445 javaExtendsListHolder = new JavaExtendsListHolder();
446 javaImportData = new JavaImportData();
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530447 javaFileInfo = fileInfo;
448 absoluteDirPath = getAbsolutePackagePath(fileInfo.getBaseCodeGenPath(),
449 fileInfo.getPackageFilePath());
Bharat saraswalaf413b82016-07-14 15:18:20 +0530450 /*
451 * Initialize getter when generation file type matches to interface
452 * mask.
453 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530454 if (javaFlagSet(INTERFACE_MASK)) {
455 addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK |
456 ADD_TO_LIST_INTERFACE_MASK |
457 LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530458 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530459 /*
460 * Initialize getter and setter when generation file type matches to
461 * builder interface mask.
462 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530463 if (javaFlagSet(BUILDER_INTERFACE_MASK)) {
464 addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK |
465 SETTER_FOR_INTERFACE_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530466 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530467 /*
468 * Initialize getterImpl, setterImpl and attributes when generation file
469 * type matches to builder class mask.
470 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530471 if (javaFlagSet(BUILDER_CLASS_MASK)) {
472 addGeneratedTempFile(ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
473 SETTER_FOR_CLASS_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530474 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530475 /*
476 * Initialize getterImpl, attributes, constructor, hash code, equals and
477 * to strings when generation file type matches to impl class mask.
478 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530479 if (javaFlagSet(DEFAULT_CLASS_MASK)) {
480 addGeneratedTempFile(
481 ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
482 HASH_CODE_IMPL_MASK | EQUALS_IMPL_MASK |
483 TO_STRING_IMPL_MASK | ADD_TO_LIST_IMPL_MASK |
484 FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK |
485 FILTER_CONTENT_MATCH_FOR_LEAF_MASK |
486 FILTER_CONTENT_MATCH_FOR_NODES_MASK);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530487 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530488 /*
489 * Initialize temp files to generate type class.
490 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530491 if (javaFlagSet(GENERATE_TYPE_CLASS)) {
492 addGeneratedTempFile(ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
493 HASH_CODE_IMPL_MASK | EQUALS_IMPL_MASK |
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530494 FROM_STRING_IMPL_MASK);
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530495
496 if (getGeneratedJavaFiles() != GENERATE_UNION_CLASS) {
497 addGeneratedTempFile(TO_STRING_IMPL_MASK);
498 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530499 }
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530500
Vidyashree Ramab3670472016-08-06 15:49:56 +0530501 //Set temporary file handles
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530502 if (tempFlagSet(ATTRIBUTES_MASK)) {
503 attributesTempFileHandle =
504 getTemporaryFileHandle(ATTRIBUTE_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530505 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530506 if (tempFlagSet(GETTER_FOR_INTERFACE_MASK)) {
507 getterInterfaceTempFileHandle =
508 getTemporaryFileHandle(GETTER_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530509 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530510 if (tempFlagSet(SETTER_FOR_INTERFACE_MASK)) {
511 setterInterfaceTempFileHandle =
512 getTemporaryFileHandle(SETTER_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530513 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530514 if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
515 getterImplTempFileHandle =
516 getTemporaryFileHandle(GETTER_METHOD_IMPL_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530517 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530518 if (tempFlagSet(SETTER_FOR_CLASS_MASK)) {
519 setterImplTempFileHandle =
520 getTemporaryFileHandle(SETTER_METHOD_IMPL_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530521 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530522 if (tempFlagSet(HASH_CODE_IMPL_MASK)) {
523 hashCodeImplTempFileHandle =
524 getTemporaryFileHandle(HASH_CODE_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530525 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530526 if (tempFlagSet(EQUALS_IMPL_MASK)) {
527 equalsImplTempFileHandle =
528 getTemporaryFileHandle(EQUALS_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530529 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530530 if (tempFlagSet(TO_STRING_IMPL_MASK)) {
531 toStringImplTempFileHandle =
532 getTemporaryFileHandle(TO_STRING_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530533 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530534 if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
535 fromStringImplTempFileHandle =
536 getTemporaryFileHandle(FROM_STRING_METHOD_FILE_NAME);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530537 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530538 if (tempFlagSet(ADD_TO_LIST_INTERFACE_MASK)) {
539 addToListInterfaceTempFileHandle =
540 getTemporaryFileHandle(ADD_TO_LIST_INTERFACE_METHOD_FILE_NAME);
Bharat saraswal8beac342016-08-04 02:00:03 +0530541 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530542 if (tempFlagSet(ADD_TO_LIST_IMPL_MASK)) {
543 addToListImplTempFileHandle =
544 getTemporaryFileHandle(ADD_TO_LIST_IMPL_METHOD_FILE_NAME);
Bharat saraswal8beac342016-08-04 02:00:03 +0530545 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530546 if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK)) {
547 leafIdAttributeTempFileHandle =
548 getTemporaryFileHandle(LEAF_IDENTIFIER_ATTRIBUTES_FILE_NAME);
Bharat saraswal8beac342016-08-04 02:00:03 +0530549 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530550 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK)) {
551 subtreeFilteringForLeafTempFileHandle =
552 getTemporaryFileHandle(FILTER_CONTENT_MATCH_LEAF_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530553 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530554 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK)) {
555 getSubtreeFilteringForListTempFileHandle =
556 getTemporaryFileHandle(FILTER_CONTENT_MATCH_LEAF_LIST_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530557 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530558 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK)) {
559 getSubtreeFilteringForChildNodeTempFileHandle =
560 getTemporaryFileHandle(FILTER_CONTENT_MATCH_NODE_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530561 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530562 if (tempFlagSet(EDIT_CONTENT_MASK)) {
563 editContentTempFileHandle =
564 getTemporaryFileHandle(EDIT_CONTENT_FILE_NAME);
Bharat saraswale50edca2016-08-05 01:58:25 +0530565 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530566 }
567
568 /**
569 * Adds current node info as and attribute to the parent generated file.
570 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530571 * @param curNode current node
572 * @param isList is list construct
573 * @param config plugin configurations
Bharat saraswalaf413b82016-07-14 15:18:20 +0530574 * @throws IOException IO operation exception
575 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530576 protected static void addCurNodeInfoInParentTempFile(YangNode curNode,
577 boolean isList,
578 YangPluginConfig config)
Bharat saraswalaf413b82016-07-14 15:18:20 +0530579 throws IOException {
580 YangNode parent = getParentNodeInGenCode(curNode);
581 if (!(parent instanceof JavaCodeGenerator)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530582 throw new TranslatorException(getErrorMsg(MISSING_PARENT_NODE,
583 curNode));
Bharat saraswalaf413b82016-07-14 15:18:20 +0530584 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530585 if (parent instanceof YangJavaGroupingTranslator) {
Bharat saraswalaf413b82016-07-14 15:18:20 +0530586 /*
587 * In case of grouping, there is no need to add the information, it
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530588 * will be taken care in uses.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530589 */
590 return;
591 }
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530592 addCurNodeInfoInParentTempFile(curNode, isList, config, parent);
593 }
594
595 /**
596 * Adds current node info as and attribute to a specified parent generated
597 * file. In case of grouping parent will be referred grouping node or
598 * referred node in grouping.
599 *
600 * @param curNode current node
601 * @param isList is list construct
602 * @param config plugin configurations
603 * @param parent parent node
604 * @throws IOException IO operation exception
605 */
606 protected static void addCurNodeInfoInParentTempFile(
607 YangNode curNode, boolean isList, YangPluginConfig config,
608 YangNode parent)
609 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530610 TempJavaBeanFragmentFiles tempFiles =
611 getBeanFiles((JavaCodeGeneratorInfo) parent);
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530612 tempFiles.setAttrNode(curNode);
Bharat saraswalb41904b2016-10-20 19:22:36 +0530613 if (curNode instanceof YangChoice) {
614 JavaQualifiedTypeInfoTranslator info = new
615 JavaQualifiedTypeInfoTranslator();
616 info.setClassInfo(INVOCATION_TARGET_EXCEPTION);
617 info.setPkgInfo(REFLECT_IMPORTS);
618 tempFiles.addToSubTreeImports(info);
619 info = new
620 JavaQualifiedTypeInfoTranslator();
621 info.setClassInfo(METHOD);
622 info.setPkgInfo(REFLECT_IMPORTS);
623 tempFiles.addToSubTreeImports(info);
624 }
625 JavaAttributeInfo attr = getCurNodeAsAttributeInTarget(
626 curNode, parent, isList, tempFiles);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530627 tempFiles.addJavaSnippetInfoToApplicableTempFiles(attr, config);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530628 }
629
630 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530631 * Creates an attribute info object corresponding to a data model node
632 * and return it.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530633 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530634 * @param curNode current node
635 * @param targetNode target node
636 * @param listNode flag indicating if a node is a list node
637 * @param tempFiles temp java fragment files
638 * @return java attribute info
Bharat saraswalaf413b82016-07-14 15:18:20 +0530639 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530640 public static JavaAttributeInfo
641 getCurNodeAsAttributeInTarget(YangNode curNode, YangNode targetNode,
642 boolean listNode,
643 TempJavaFragmentFiles tempFiles) {
644 JavaFileInfoTranslator translator =
645 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
646 String curNodeName = translator.getJavaName();
Bharat saraswalaf413b82016-07-14 15:18:20 +0530647 if (curNodeName == null) {
648 updateJavaFileInfo(curNode, null);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530649 curNodeName = translator.getJavaName();
Bharat saraswalaf413b82016-07-14 15:18:20 +0530650 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530651 /*
652 * Get the import info corresponding to the attribute for import in
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530653 * generated java files or qualified access.
Bharat saraswalaf413b82016-07-14 15:18:20 +0530654 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530655 JavaQualifiedTypeInfoTranslator typeInfo =
656 getQualifiedTypeInfoOfCurNode(curNode,
657 getCapitalCase(curNodeName));
Bharat saraswalaf413b82016-07-14 15:18:20 +0530658 if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530659 throw new TranslatorException(getErrorMsg(INVALID_PARENT_NODE,
660 curNode));
Bharat saraswalaf413b82016-07-14 15:18:20 +0530661 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530662 JavaImportData parentImportData = tempFiles.getJavaImportData();
663 JavaFileInfoTranslator fileInfo =
664 ((JavaFileInfoContainer) targetNode).getJavaFileInfo();
Bharat saraswalaf413b82016-07-14 15:18:20 +0530665
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530666 boolean qualified;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530667 if (tempFiles instanceof TempJavaServiceFragmentFiles &&
668 typeInfo.getClassInfo().contentEquals(SERVICE) ||
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530669 typeInfo.getClassInfo()
670 .contentEquals(getCapitalCase(fileInfo.getJavaName() +
671 SERVICE))) {
672 qualified = true;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530673 } else {
674 String className;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530675 if (tempFiles instanceof TempJavaServiceFragmentFiles) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530676 className = getCapitalCase(fileInfo.getJavaName()) + SERVICE;
Bharat saraswalaf413b82016-07-14 15:18:20 +0530677 } else {
678 className = getCapitalCase(fileInfo.getJavaName());
679 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530680 qualified = parentImportData.addImportInfo(typeInfo, className,
681 fileInfo.getPackage());
Bharat saraswal0663aff2016-10-18 23:16:14 +0530682 if (!qualified && !(curNode instanceof YangChoice)) {
683 addChildDefaultClassImportForSubTreeFilter(typeInfo.getPkgInfo(),
684 typeInfo.getClassInfo(),
685 tempFiles);
686 }
Bharat saraswalaf413b82016-07-14 15:18:20 +0530687 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530688 boolean collectionSet = false;
Vidyashree Ramab3670472016-08-06 15:49:56 +0530689 if (curNode instanceof YangList) {
690 YangList yangList = (YangList) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530691 if (yangList.getCompilerAnnotation() != null &&
692 yangList.getCompilerAnnotation()
693 .getYangAppDataStructure() != null) {
694 switch (yangList.getCompilerAnnotation()
695 .getYangAppDataStructure().getDataStructure()) {
Vidyashree Ramab3670472016-08-06 15:49:56 +0530696 case QUEUE: {
697 parentImportData.setQueueToImport(true);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530698 collectionSet = true;
Vidyashree Ramab3670472016-08-06 15:49:56 +0530699 break;
700 }
701 case SET: {
702 parentImportData.setSetToImport(true);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530703 collectionSet = true;
Vidyashree Ramab3670472016-08-06 15:49:56 +0530704 break;
705 }
706 default: {
707 // TODO : to be implemented
708 }
709 }
710 }
711 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530712 if (listNode && !collectionSet) {
Bharat saraswalaf413b82016-07-14 15:18:20 +0530713 parentImportData.setIfListImported(true);
714 }
Vidyashree Ramab3670472016-08-06 15:49:56 +0530715 if (curNode instanceof YangList) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530716 return getAttributeInfoForTheData(typeInfo, curNodeName,
717 null, qualified, listNode,
718 ((YangList) curNode)
719 .getCompilerAnnotation());
Vidyashree Ramab3670472016-08-06 15:49:56 +0530720 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530721 return getAttributeInfoForTheData(typeInfo, curNodeName, null,
722 qualified, listNode);
Bharat saraswalaf413b82016-07-14 15:18:20 +0530723 }
724
Bharat saraswal0663aff2016-10-18 23:16:14 +0530725 private static void addChildDefaultClassImportForSubTreeFilter(
726 String pkg, String className, TempJavaFragmentFiles tempFile) {
727 className = DEFAULT_CAPS + getCapitalCase(className);
728 JavaQualifiedTypeInfoTranslator info = new
729 JavaQualifiedTypeInfoTranslator();
730 info.setClassInfo(className);
731 info.setPkgInfo(pkg);
732 tempFile.subTreeImports.add(info);
733 }
734
Bharat saraswalaf413b82016-07-14 15:18:20 +0530735 /**
Bharat saraswal64e7e232016-07-14 23:33:55 +0530736 * Returns java attribute for leaf.
737 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530738 * @param tempFiles temporary generated file
739 * @param container JAVA leaf info container
740 * @param config plugin configurations
741 * @param leafList flag indicating if it's leaf list
742 * @return java attribute info
Bharat saraswal64e7e232016-07-14 23:33:55 +0530743 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530744 private static JavaAttributeInfo
745 getJavaAttributeOfLeaf(TempJavaFragmentFiles tempFiles,
746 JavaLeafInfoContainer container,
Bharat saraswal0663aff2016-10-18 23:16:14 +0530747 YangPluginConfig config, boolean leafList) throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530748 if (leafList) {
749 tempFiles.getJavaImportData().setIfListImported(true);
750 return getAttributeOfLeafInfoContainer(tempFiles, container, config,
751 true);
752 }
753 return getAttributeOfLeafInfoContainer(tempFiles, container, config,
754 false);
Bharat saraswal64e7e232016-07-14 23:33:55 +0530755 }
756
757 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530758 * Returns java attribute for leaf container.
Bharat saraswal64e7e232016-07-14 23:33:55 +0530759 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530760 * @param tempFiles temporary generated file
761 * @param container JAVA leaf info container
762 * @param config plugin configurations
763 * @param listAttribute flag indicating if list attribute
764 * @return JAVA attribute information
Bharat saraswal64e7e232016-07-14 23:33:55 +0530765 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530766 private static JavaAttributeInfo
767 getAttributeOfLeafInfoContainer(TempJavaFragmentFiles tempFiles,
768 JavaLeafInfoContainer container,
769 YangPluginConfig config,
Bharat saraswal0663aff2016-10-18 23:16:14 +0530770 boolean listAttribute) throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530771 container.setConflictResolveConfig(config.getConflictResolver());
772 container.updateJavaQualifiedInfo();
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530773 addImportForLeafInfo(tempFiles, container);
774 JavaAttributeInfo attr = getAttributeInfoForTheData(
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530775 container.getJavaQualifiedInfo(),
776 container.getJavaName(config.getConflictResolver()),
777 container.getDataType(),
778 tempFiles.getIsQualifiedAccessOrAddToImportList(
779 container.getJavaQualifiedInfo()), listAttribute);
Bharat saraswalb41904b2016-10-20 19:22:36 +0530780 boolean condition =
781 ((YangSchemaNode) container).getReferredSchema() == null &&
782 container.getDataType().getDataType() == YangDataTypes.BITS;
783 if (condition) {
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 saraswalb41904b2016-10-20 19:22:36 +05301105 String javadoc = getOverRideString();
1106 if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
1107 javadoc = getJavaDoc(SETTER_METHOD, attr.getAttributeName(),
1108 false, null);
1109 }
1110 appendToFile(setterImplTempFileHandle, javadoc + setter);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301111 }
1112
1113 /**
1114 * Adds getter method's impl for class.
1115 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301116 * @param attr attribute info
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301117 * @throws IOException when fails to append to temporary file
1118 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301119 protected void addGetterImpl(JavaAttributeInfo attr)
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301120 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301121 String getter = getGetterForClass(attr, getGeneratedJavaFiles());
Bharat saraswalb41904b2016-10-20 19:22:36 +05301122 String javadoc = getOverRideString();
1123 if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
1124 javadoc = getJavaDoc(GETTER_METHOD, attr.getAttributeName(),
1125 false, null);
1126 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301127 if (javaFlagSet(BUILDER_CLASS_MASK)) {
Bharat saraswalb41904b2016-10-20 19:22:36 +05301128 appendToFile(getterImplTempFileHandle, javadoc + getter);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301129 } else {
Vidyashree Ramab3670472016-08-06 15:49:56 +05301130 String appDataStructure = null;
1131 if (attr.getCompilerAnnotation() != null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301132 appDataStructure = attr.getCompilerAnnotation()
1133 .getYangAppDataStructure().getDataStructure().name();
Vidyashree Ramab3670472016-08-06 15:49:56 +05301134 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301135 appendToFile(getterImplTempFileHandle,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301136 getJavaDoc(GETTER_METHOD, attr.getAttributeName(),
1137 false, appDataStructure) + getter);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301138 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301139 }
1140
1141 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05301142 * Adds add to list interface method.
1143 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301144 * @param attr attribute
Bharat saraswal8beac342016-08-04 02:00:03 +05301145 * @throws IOException when fails to do IO operations
1146 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301147 private void addAddToListInterface(JavaAttributeInfo attr)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301148 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301149 appendToFile(addToListInterfaceTempFileHandle,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301150 getJavaDoc(ADD_TO_LIST, attr.getAttributeName(), false,
1151 null) + getAddToListMethodInterface(
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301152 attr, getGeneratedJavaClassName()) + NEW_LINE);
Bharat saraswal8beac342016-08-04 02:00:03 +05301153 }
1154
1155 /**
1156 * Adds add to list interface method.
1157 *
1158 * @param attr attribute
1159 * @throws IOException when fails to do IO operations
1160 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301161 private void addAddToListImpl(JavaAttributeInfo attr)
1162 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301163 appendToFile(addToListImplTempFileHandle,
Bharat saraswal94844d62016-10-13 13:28:03 +05301164 getAddToListMethodImpl(attr, getGeneratedJavaClassName()
1165 ) + NEW_LINE);
Bharat saraswal8beac342016-08-04 02:00:03 +05301166 }
1167
1168 /**
1169 * Adds leaf identifier enum attributes.
1170 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301171 * @param attr attribute
1172 * @param value value
Bharat saraswal8beac342016-08-04 02:00:03 +05301173 * @throws IOException when fails to do IO operations
1174 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301175 private void addLeafIdAttributes(JavaAttributeInfo attr, int value)
Bharat saraswal8beac342016-08-04 02:00:03 +05301176 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301177 appendToFile(leafIdAttributeTempFileHandle, FOUR_SPACE_INDENTATION +
1178 generateEnumAttributeString(attr.getAttributeName(), value));
Bharat saraswal8beac342016-08-04 02:00:03 +05301179 }
1180
1181 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301182 * Adds build method for interface.
1183 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301184 * @return build method for interface
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301185 * @throws IOException when fails to append to temporary file
1186 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301187 protected String addBuildMethodForInterface()
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301188 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301189 return parseBuilderInterfaceBuildMethodString(
1190 getGeneratedJavaClassName());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301191 }
1192
1193 /**
1194 * Adds build method's implementation for class.
1195 *
1196 * @return build method implementation for class
1197 * @throws IOException when fails to append to temporary file
1198 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301199 protected String addBuildMethodImpl()
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301200 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301201 return getBuildString(getGeneratedJavaClassName(), rootNode) + NEW_LINE;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301202 }
1203
1204 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301205 * Adds default constructor for class.
1206 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301207 * @param modifier modifier for constructor
1208 * @param toAppend string which need to be appended with the class name
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301209 * @param suffix is value need to be appended as suffix
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301210 * @return default constructor for class
1211 * @throws IOException when fails to append to file
1212 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301213 protected String addDefaultConstructor(String modifier, String toAppend,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301214 boolean suffix)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301215 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301216 StringBuilder name = new StringBuilder();
1217 name.append(getGeneratedJavaClassName());
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301218 if (rootNode && !toAppend.equals(BUILDER)) {
1219 name.append(OP_PARAM);
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301220 return getDefaultConstructorString(name.toString(), modifier);
Bharat saraswal8beac342016-08-04 02:00:03 +05301221 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301222 if (suffix) {
1223 name.append(toAppend);
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301224 return getDefaultConstructorString(name.toString(), modifier);
Bharat saraswal8beac342016-08-04 02:00:03 +05301225 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301226 StringBuilder appended = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +05301227 if (toAppend.equals(DEFAULT)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301228 appended.append(getCapitalCase(toAppend));
Bharat saraswal8beac342016-08-04 02:00:03 +05301229 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301230 appended.append(toAppend);
Bharat saraswal8beac342016-08-04 02:00:03 +05301231 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301232 return NEW_LINE + getDefaultConstructorString(appended.append(
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301233 name).toString(), modifier);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301234 // TODO getDefaultConstructorString to handle new line.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301235 }
1236
1237 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301238 * Adds hash code method for class.
1239 *
1240 * @param attr attribute info
1241 * @throws IOException when fails to append to temporary file
1242 */
1243 private void addHashCodeMethod(JavaAttributeInfo attr)
1244 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301245 appendToFile(hashCodeImplTempFileHandle,
1246 getHashCodeMethod(attr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301247 }
1248
1249 /**
1250 * Adds equals method for class.
1251 *
1252 * @param attr attribute info
1253 * @throws IOException when fails to append to temporary file
1254 */
1255 private void addEqualsMethod(JavaAttributeInfo attr)
1256 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301257 appendToFile(equalsImplTempFileHandle,
1258 getEqualsMethod(attr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301259 }
1260
1261 /**
1262 * Adds ToString method for class.
1263 *
1264 * @param attr attribute info
1265 * @throws IOException when fails to append to temporary file
1266 */
1267 private void addToStringMethod(JavaAttributeInfo attr)
1268 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301269 appendToFile(toStringImplTempFileHandle,
1270 getToStringMethod(attr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301271 }
1272
1273 /**
Bharat saraswal250a7472016-05-12 13:16:57 +05301274 * Adds from string method for union class.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301275 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301276 * @param attr type attribute info
1277 * @param fromStringAttr from string attribute info
Bharat saraswal250a7472016-05-12 13:16:57 +05301278 * @throws IOException when fails to append to temporary file
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301279 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301280 void addFromStringMethod(JavaAttributeInfo attr,
Bharat saraswal0663aff2016-10-18 23:16:14 +05301281 JavaAttributeInfo fromStringAttr)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301282 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301283 appendToFile(fromStringImplTempFileHandle,
Bharat saraswal0663aff2016-10-18 23:16:14 +05301284 getFromStringMethod(attr, fromStringAttr) + NEW_LINE);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301285 }
1286
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301287 /**
1288 * Returns a temporary file handle for the specific file type.
1289 *
1290 * @param fileName file name
1291 * @return temporary file handle
1292 * @throws IOException when fails to create new file handle
1293 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301294 protected File getTemporaryFileHandle(String fileName)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301295 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301296 String path = getTempDirPath(absoluteDirPath);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301297 File dir = new File(path);
Bharat saraswal8beac342016-08-04 02:00:03 +05301298 boolean isCreated;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301299 if (!dir.exists()) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301300 isCreated = dir.mkdirs();
Shankara-Huaweib7564772016-08-02 18:13:13 +05301301 if (!isCreated) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301302 throw new IOException("failed to create temporary directory " +
1303 "for " + fileName);
Shankara-Huaweib7564772016-08-02 18:13:13 +05301304 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301305 }
1306 File file = new File(path + fileName + TEMP_FILE_EXTENSION);
1307 if (!file.exists()) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301308 isCreated = file.createNewFile();
Shankara-Huaweib7564772016-08-02 18:13:13 +05301309 if (!isCreated) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301310 throw new IOException("failed to create temporary file for " +
1311 fileName);
Shankara-Huaweib7564772016-08-02 18:13:13 +05301312 }
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301313 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301314 throw new IOException(fileName + " is reused due to YANG naming. " +
1315 "probably your previous build " +
1316 "would have failed");
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301317 }
1318 return file;
1319 }
1320
1321 /**
1322 * Returns a temporary file handle for the specific file type.
1323 *
1324 * @param fileName file name
1325 * @return temporary file handle
1326 * @throws IOException when fails to create new file handle
1327 */
Bharat saraswal94844d62016-10-13 13:28:03 +05301328 public File getJavaFileHandle(String fileName)
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301329 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301330 return getFileObject(getDirPath(), fileName, JAVA_FILE_EXTENSION,
1331 javaFileInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301332 }
1333
1334 /**
1335 * Returns data from the temporary files.
1336 *
Bharat saraswalaf413b82016-07-14 15:18:20 +05301337 * @param file temporary file handle
Bharat saraswald14cbe82016-07-14 13:26:18 +05301338 * @param absolutePath absolute path
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301339 * @return stored data from temporary files
1340 * @throws IOException when failed to get data from the given file
1341 */
Bharat saraswald14cbe82016-07-14 13:26:18 +05301342 public String getTemporaryDataFromFileHandle(File file, String absolutePath)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301343 throws IOException {
Bharat saraswald14cbe82016-07-14 13:26:18 +05301344 String path = getTempDirPath(absolutePath);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301345 if (new File(path + file.getName()).exists()) {
1346 return readAppendFile(path + file.getName(), EMPTY_STRING);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301347 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301348 throw new IOException("Unable to get data from the given " +
1349 file.getName() + " file for " +
1350 getGeneratedJavaClassName() + PERIOD);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301351 }
1352
1353 /**
1354 * Returns temporary directory path.
1355 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301356 * @param path absolute path
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301357 * @return directory path
1358 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301359 private String getTempDirPath(String path) {
1360 return getPackageDirPathFromJavaJPackage(path) + SLASH +
1361 getGeneratedJavaClassName() + TEMP_FOLDER_NAME_SUFFIX + SLASH;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301362 }
1363
1364 /**
1365 * Parses attribute to get the attribute string.
1366 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301367 * @param attr attribute info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301368 * @return attribute string
1369 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301370 protected String parseAttribute(JavaAttributeInfo attr) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301371 /*
1372 * TODO: check if this utility needs to be called or move to the caller
1373 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301374 String attrName = attr.getAttributeName();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301375 String attrAccessType = PRIVATE;
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301376 if ((getGeneratedJavaFiles() & GENERATE_INTERFACE_WITH_BUILDER) != 0) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301377 attrAccessType = PROTECTED;
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301378 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301379 String pkg = null;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301380 if (attr.isQualifiedName()) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301381 pkg = attr.getImportInfo().getPkgInfo();
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301382 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301383 return getJavaAttributeDefinition(
1384 pkg, attr.getImportInfo().getClassInfo(), attrName,
1385 attr.isListAttr(), attrAccessType, attr.getCompilerAnnotation());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301386 }
1387
1388 /**
1389 * Appends content to temporary file.
1390 *
1391 * @param file temporary file
1392 * @param data data to be appended
1393 * @throws IOException when fails to append to file
1394 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301395 protected void appendToFile(File file, String data)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301396 throws IOException {
1397 try {
1398 insertDataIntoJavaFile(file, data);
1399 } catch (IOException ex) {
1400 throw new IOException("failed to write in temp file.");
1401 }
1402 }
1403
1404 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301405 * Adds parent's info to current node import list.
1406 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301407 * @param curNode current node
1408 * @param config plugin configurations
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301409 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301410 protected void addParentInfoInCurNodeTempFile(YangNode curNode,
1411 YangPluginConfig config) {
1412 JavaQualifiedTypeInfoTranslator caseImportInfo =
1413 new JavaQualifiedTypeInfoTranslator();
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301414 YangNode parent = getParentNodeInGenCode(curNode);
Bharat saraswale50edca2016-08-05 01:58:25 +05301415 if (curNode instanceof YangCase && parent instanceof YangAugment) {
1416 return;
1417 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301418 if (!(parent instanceof JavaCodeGenerator)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301419 throw new TranslatorException(getErrorMsg(INVALID_PARENT_NODE, curNode));
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301420 }
1421 if (!(curNode instanceof JavaFileInfoContainer)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301422 throw new TranslatorException(getErrorMsg(INVALID_NODE, curNode));
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301423 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301424 caseImportInfo.setClassInfo(
1425 getCapitalCase(getCamelCase(parent.getName(),
1426 config.getConflictResolver())));
1427 caseImportInfo.setPkgInfo(((JavaFileInfoContainer) parent).getJavaFileInfo()
1428 .getPackage());
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301429
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301430 JavaFileInfoTranslator fileInfo =
1431 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301432
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301433 getBeanFiles(curNode).getJavaImportData().addImportInfo(
1434 caseImportInfo, getCapitalCase(fileInfo.getJavaName()),
1435 fileInfo.getPackage());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301436 }
1437
1438 /**
1439 * Adds leaf attributes in generated files.
1440 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301441 * @param entry JAVA leaf info container
1442 * @param config plugin config
1443 * @param curNode current node
1444 * @param leafList flag indicating whether leaf container is leafList
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301445 * @throws IOException IO operation fail
1446 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301447 private void addLeafInfoToTempFiles(JavaLeafInfoContainer entry,
1448 YangPluginConfig config,
1449 YangNode curNode,
1450 boolean leafList)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301451 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301452 if (entry != null) {
1453 if (curNode instanceof RpcNotificationContainer) {
1454 TempJavaBeanFragmentFiles tempFiles = getBeanFiles(curNode);
1455 addJavaSnippetInfoToApplicableTempFiles(
1456 getJavaAttributeOfLeaf(tempFiles, entry,
1457 config, leafList), config);
1458 } else {
1459 addJavaSnippetInfoToApplicableTempFiles(
1460 getJavaAttributeOfLeaf(this, entry,
1461 config, leafList), config);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301462 }
1463 }
1464 }
1465
1466 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301467 * Adds all the leaves in the current data model node as part of the
1468 * generated temporary file.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301469 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301470 * @param curNode current node
1471 * @param config plugin config
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301472 * @throws IOException IO operation fail
1473 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301474 protected void addCurNodeLeavesInfoToTempFiles(YangNode curNode,
1475 YangPluginConfig config)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301476 throws IOException {
1477 if (!(curNode instanceof YangLeavesHolder)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301478 throw new TranslatorException(getErrorMsg(INVALID_LEAF_HOLDER,
1479 curNode));
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301480 }
1481 YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301482
1483 for (YangLeaf leaf : leavesHolder.getListOfLeaf()) {
1484 addLeafInfoToTempFiles((JavaLeafInfoContainer) leaf, config,
1485 curNode, false);
1486 }
1487
1488 for (YangLeafList leafList : leavesHolder.getListOfLeafList()) {
1489 addLeafInfoToTempFiles((JavaLeafInfoContainer) leafList, config,
1490 curNode, true);
1491 }
1492 }
1493
1494 /**
1495 * Adds operation type to temp files.
1496 *
1497 * @param curNode current YANG node
1498 * @param config YANG plugin config
1499 * @throws IOException IO exception
1500 */
1501 protected void addOperationTypeToTempFiles(YangNode curNode,
1502 YangPluginConfig config)
1503 throws IOException {
1504 JavaQualifiedTypeInfoTranslator typeInfo =
1505 new JavaQualifiedTypeInfoTranslator();
1506 typeInfo.setClassInfo(OPERATION_TYPE_CLASS);
Bharat saraswal94844d62016-10-13 13:28:03 +05301507 JavaFileInfo curInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
1508 JavaFileInfo info;
1509 if (curNode instanceof RpcNotificationContainer) {
1510 info = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
1511 } else {
1512 info = ((JavaFileInfoContainer) getModuleNode(curNode))
1513 .getJavaFileInfo();
1514 }
1515
1516 typeInfo.setPkgInfo(info.getPackage().toLowerCase() + PERIOD +
1517 getCapitalCase(info.getJavaName()));
1518 String curNodeName = getCapitalCase(curInfo.getJavaName());
1519 if (!(curNode instanceof RpcNotificationContainer)) {
1520 javaImportData.addImportInfo(typeInfo, curNodeName, curInfo
1521 .getPackage());
1522 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301523 JavaAttributeInfo attributeInfo =
Bharat saraswal94844d62016-10-13 13:28:03 +05301524 getAttributeInfoForTheData(typeInfo, YANG + curNodeName +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301525 OPERATION_TYPE_ATTRIBUTE, null, false, false);
1526 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301527 }
1528
Bharat saraswal94844d62016-10-13 13:28:03 +05301529 private YangNode getModuleNode(YangNode curNode) {
1530 YangNode tempNode = curNode.getParent();
1531 while (!(tempNode instanceof RpcNotificationContainer)) {
1532 tempNode = tempNode.getParent();
1533 }
1534 return tempNode;
1535 }
1536
1537 /**
1538 * Adds value leaf flag to temp files.
1539 *
1540 * @param config YANG plugin config
1541 * @param node YANG node
1542 * @throws IOException IO exception
1543 */
1544 protected void addValueLeafFlag(YangPluginConfig config, YangNode node)
1545 throws IOException {
1546 JavaFileInfo info = ((JavaFileInfoContainer) node).getJavaFileInfo();
1547 JavaQualifiedTypeInfoTranslator typeInfo =
1548 new JavaQualifiedTypeInfoTranslator();
1549 typeInfo.setClassInfo(BIT_SET);
1550 typeInfo.setPkgInfo(JAVA_UTIL_PKG);
Bharat saraswalb41904b2016-10-20 19:22:36 +05301551 getJavaImportData().addImportInfo(typeInfo, info.getJavaName(),
1552 info.getPackage());
Bharat saraswal94844d62016-10-13 13:28:03 +05301553 JavaAttributeInfo attributeInfo =
1554 getAttributeInfoForTheData(typeInfo, VALUE_LEAF, null, false, false);
1555 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1556 }
1557
1558 /**
1559 * Adds value leaf flag to temp files.
1560 *
1561 * @param config YANG plugin config
1562 * @throws IOException IO exception
1563 */
1564 protected void addSelectLeafFlag(YangPluginConfig config)
1565 throws IOException {
1566 JavaQualifiedTypeInfoTranslator typeInfo =
1567 new JavaQualifiedTypeInfoTranslator();
1568 typeInfo.setClassInfo(BIT_SET);
1569 typeInfo.setPkgInfo(JAVA_UTIL_PKG);
1570 JavaAttributeInfo attributeInfo =
1571 getAttributeInfoForTheData(typeInfo, SELECT_LEAF, null, false, false);
1572 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1573 }
1574
1575 /**
Bharat saraswal0663aff2016-10-18 23:16:14 +05301576 * Adds sub tree filtering to temp files.
1577 *
1578 * @param config YANG plugin config
1579 * @throws IOException IO exception
1580 */
1581 protected void addIsSubTreeFilteredFlag(YangPluginConfig config)
1582 throws IOException {
1583 JavaQualifiedTypeInfoTranslator typeInfo =
1584 new JavaQualifiedTypeInfoTranslator();
1585 typeInfo.setClassInfo(BOOLEAN_DATA_TYPE);
1586 typeInfo.setPkgInfo(null);
1587 JavaAttributeInfo attributeInfo =
1588 getAttributeInfoForTheData(typeInfo, SUBTREE_FILTERED, null, false, false);
1589 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1590 }
1591
1592 /**
Bharat saraswal94844d62016-10-13 13:28:03 +05301593 * Adds value leaf flag to temp files.
1594 *
1595 * @param config YANG plugin config
1596 * @throws IOException IO exception
1597 */
1598 protected void addYangAugmentedMap(YangPluginConfig config)
1599 throws IOException {
1600 JavaQualifiedTypeInfoTranslator typeInfo =
1601 new JavaQualifiedTypeInfoTranslator();
1602 typeInfo.setClassInfo(AUGMENT_MAP_TYPE);
1603 //Fix for add yangAugmentedInfo in equals/hashcode/and to string method.
1604 typeInfo.setPkgInfo(null);
1605 JavaAttributeInfo attributeInfo =
1606 getAttributeInfoForTheData(typeInfo, YANG_AUGMENTED_INFO_MAP,
1607 null, false, false);
1608 addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
1609 }
1610
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301611 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301612 * Adds the new attribute info to the target generated temporary files.
1613 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301614 * @param newAttrInfo new attribute info
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301615 * @param pluginConfig plugin configurations
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301616 * @throws IOException IO operation fail
1617 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301618 void addJavaSnippetInfoToApplicableTempFiles(JavaAttributeInfo newAttrInfo,
1619 YangPluginConfig pluginConfig)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301620 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301621 isAttributePresent = true;
Bharat saraswal94844d62016-10-13 13:28:03 +05301622 String attrName = newAttrInfo.getAttributeName();
Bharat saraswal0663aff2016-10-18 23:16:14 +05301623 //Boolean flag for operation type attr info generation control.
Bharat saraswal94844d62016-10-13 13:28:03 +05301624 boolean required = !attrName.equals(VALUE_LEAF) &&
1625 !attrName.equals(SELECT_LEAF) &&
1626 !attrName.equals(YANG_AUGMENTED_INFO_MAP);
Bharat saraswal0663aff2016-10-18 23:16:14 +05301627 //Boolean flag for subtree for nodes info generation control.
1628 boolean subTreeForChild =
1629 tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK) &&
1630 newAttrInfo.getAttributeType() == null &&
1631 !attrName.contains(OPERATION_TYPE_ATTRIBUTE) &&
1632 required && !attrName.equals(SUBTREE_FILTERED);
1633 ;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301634 if (tempFlagSet(ATTRIBUTES_MASK)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301635 addAttribute(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301636 }
Bharat saraswalb41904b2016-10-20 19:22:36 +05301637 if (tempFlagSet(GETTER_FOR_INTERFACE_MASK) &&
1638 !attrName.equals(SUBTREE_FILTERED)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301639 addGetterForInterface(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301640 }
Bharat saraswalb41904b2016-10-20 19:22:36 +05301641 if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required &&
1642 !attrName.equals(SUBTREE_FILTERED)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301643 addSetterForInterface(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301644 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301645 if (tempFlagSet(SETTER_FOR_CLASS_MASK) && required) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301646 addSetterImpl(newAttrInfo);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301647 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301648 if (tempFlagSet(HASH_CODE_IMPL_MASK)) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301649 addHashCodeMethod(newAttrInfo);
1650 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301651 if (tempFlagSet(EQUALS_IMPL_MASK)) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301652 addEqualsMethod(newAttrInfo);
1653 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301654 if (tempFlagSet(TO_STRING_IMPL_MASK)) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301655 addToStringMethod(newAttrInfo);
1656 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301657 if (tempFlagSet(EDIT_CONTENT_MASK)) {
Bharat saraswale50edca2016-08-05 01:58:25 +05301658 //TODO: add implementation for edit content match.
1659 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301660 boolean listAttr = newAttrInfo.isListAttr();
1661 if (tempFlagSet(ADD_TO_LIST_IMPL_MASK) && listAttr) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301662 addAddToListImpl(newAttrInfo);
1663 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301664 if (tempFlagSet(ADD_TO_LIST_INTERFACE_MASK) && listAttr) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301665 addAddToListInterface(newAttrInfo);
Bharat saraswal8beac342016-08-04 02:00:03 +05301666 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301667 YangType attrType = newAttrInfo.getAttributeType();
Bharat saraswal0663aff2016-10-18 23:16:14 +05301668 if (subTreeForChild) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301669 addSubtreeFilteringForChildNode(newAttrInfo);
Bharat saraswale50edca2016-08-05 01:58:25 +05301670 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301671 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK) &&
1672 !listAttr && attrType != null) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301673 addSubTreeFilteringForLeaf(newAttrInfo);
Bharat saraswale50edca2016-08-05 01:58:25 +05301674 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301675 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK) &&
1676 listAttr && attrType != null) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301677 addSubtreeFilteringForLeafList(newAttrInfo);
Bharat saraswale50edca2016-08-05 01:58:25 +05301678 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301679 if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK) &&
1680 !listAttr && attrType != null) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301681 leafCount++;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301682 addLeafIdAttributes(newAttrInfo, leafCount);
Bharat saraswal8beac342016-08-04 02:00:03 +05301683 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301684 if (!newAttrInfo.isIntConflict() && !newAttrInfo.isLongConflict() &&
1685 !newAttrInfo.isShortConflict()) {
1686 if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301687 addGetterImpl(newAttrInfo);
Bharat saraswal64e7e232016-07-14 23:33:55 +05301688 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301689 if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
1690 JavaQualifiedTypeInfoTranslator typeInfo =
1691 getQualifiedInfoOfFromString(newAttrInfo,
1692 pluginConfig.getConflictResolver());
Bharat saraswal250a7472016-05-12 13:16:57 +05301693 /*
1694 * Create a new java attribute info with qualified information of
1695 * wrapper classes.
1696 */
Bharat saraswal748fc3c2016-09-06 16:38:20 +05301697 JavaAttributeInfo fromStringAttributeInfo =
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301698 getAttributeInfoForTheData(
1699 typeInfo, newAttrInfo.getAttributeName(),
1700 attrType, getIsQualifiedAccessOrAddToImportList(
1701 typeInfo), false);
Bharat saraswal0663aff2016-10-18 23:16:14 +05301702 addFromStringMethod(newAttrInfo, fromStringAttributeInfo);
Bharat saraswal64e7e232016-07-14 23:33:55 +05301703 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301704 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301705 }
1706
1707 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301708 * Returns JAVA class name for non implementation classes.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301709 *
1710 * @param suffix for the class name based on the file type
1711 * @return java class name
1712 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301713 protected String getJavaClassName(String suffix) {
1714 return getCapitalCase(javaFileInfo.getJavaName()) + suffix;
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301715 }
1716
1717 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301718 * Returns class name for implementation classes.
Bharat saraswald14cbe82016-07-14 13:26:18 +05301719 *
Bharat saraswal8beac342016-08-04 02:00:03 +05301720 * @param node YANG node
Bharat saraswald14cbe82016-07-14 13:26:18 +05301721 * @return java class name
1722 */
Bharat saraswal8beac342016-08-04 02:00:03 +05301723 private String getImplClassName(YangNode node) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301724 if (node instanceof RpcNotificationContainer) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301725 return getGeneratedJavaClassName() + OP_PARAM;
Bharat saraswal8beac342016-08-04 02:00:03 +05301726 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301727 return DEFAULT_CAPS + getGeneratedJavaClassName();
Bharat saraswald14cbe82016-07-14 13:26:18 +05301728 }
1729
1730 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301731 * Returns the directory path.
1732 *
1733 * @return directory path
1734 */
1735 private String getDirPath() {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301736 return javaFileInfo.getPackageFilePath();
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301737 }
1738
1739 /**
1740 * Constructs java code exit.
1741 *
1742 * @param fileType generated file type
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +05301743 * @param curNode current YANG node
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301744 * @throws IOException when fails to generate java files
1745 */
1746 public void generateJavaFile(int fileType, YangNode curNode)
1747 throws IOException {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301748 List<String> imports =
1749 getBeanFiles(curNode).getJavaImportData().getImports();
Bharat saraswal8beac342016-08-04 02:00:03 +05301750 if (curNode instanceof YangAugmentableNode) {
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301751 addImportsForAugmentableClass(imports, true, true, curNode);
Bharat saraswal8beac342016-08-04 02:00:03 +05301752 }
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301753 createPackage(curNode);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301754
1755 //Generate java code.
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301756 if ((fileType & INTERFACE_MASK) != 0 ||
1757 (fileType & BUILDER_INTERFACE_MASK) != 0) {
Vidyashree Ramab3670472016-08-06 15:49:56 +05301758
1759 //Create interface file.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301760 interfaceJavaFileHandle =
1761 getJavaFileHandle(getJavaClassName(INTERFACE_FILE_NAME_SUFFIX));
1762 interfaceJavaFileHandle =
1763 generateInterfaceFile(interfaceJavaFileHandle, imports,
1764 curNode, isAttributePresent);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301765
Bharat saraswal94844d62016-10-13 13:28:03 +05301766 //Create builder interface file.
1767 if ((fileType & BUILDER_INTERFACE_MASK) != 0) {
1768 builderInterfaceJavaFileHandle =
1769 getJavaFileHandle(getJavaClassName(
1770 BUILDER_INTERFACE_FILE_NAME_SUFFIX));
1771 builderInterfaceJavaFileHandle =
1772 generateBuilderInterfaceFile(
1773 builderInterfaceJavaFileHandle,
1774 curNode, isAttributePresent);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301775 /*
1776 * Append builder interface file to interface file and
1777 * close it.
1778 */
Bharat saraswal94844d62016-10-13 13:28:03 +05301779 mergeJavaFiles(builderInterfaceJavaFileHandle,
1780 interfaceJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301781 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301782
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301783 insertDataIntoJavaFile(interfaceJavaFileHandle, CLOSE_CURLY_BRACKET);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301784 validateLineLength(interfaceJavaFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301785 if (curNode instanceof YangAugmentableNode) {
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301786 addImportsForAugmentableClass(imports, false, true, curNode);
Bharat saraswald14cbe82016-07-14 13:26:18 +05301787 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301788 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301789
Bharat saraswal0663aff2016-10-18 23:16:14 +05301790 if (curNode.isOpTypeReq()) {
1791 addSubTreeImportStrings(imports);
1792 }
Bharat saraswal94844d62016-10-13 13:28:03 +05301793
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301794 if ((fileType & BUILDER_CLASS_MASK) != 0 ||
1795 (fileType & DEFAULT_CLASS_MASK) != 0) {
1796 if (isAttributePresent) {
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301797 addImportsToStringAndHasCodeMethods(imports, true);
Bharat saraswal8beac342016-08-04 02:00:03 +05301798 addArrayListImport(imports);
Bharat saraswalaf413b82016-07-14 15:18:20 +05301799 }
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301800
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301801 addBitsAndBase64Imports(curNode, imports);
Bharat saraswalaf413b82016-07-14 15:18:20 +05301802 if (curNode instanceof YangAugmentableNode) {
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301803 addImportsForAugmentableClass(imports, true, false, curNode);
Bharat saraswal94844d62016-10-13 13:28:03 +05301804 if (curNode.isOpTypeReq()) {
1805 addInvocationExceptionImport(imports);
1806 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301807 }
Bharat saraswal250a7472016-05-12 13:16:57 +05301808 sortImports(imports);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301809
1810 //Create impl class file.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301811 implClassJavaFileHandle =
1812 getJavaFileHandle(getImplClassName(curNode));
1813 implClassJavaFileHandle =
1814 generateDefaultClassFile(implClassJavaFileHandle,
1815 curNode, isAttributePresent,
1816 imports);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301817
1818 //Create builder class file.
Bharat saraswald14cbe82016-07-14 13:26:18 +05301819 if ((fileType & BUILDER_CLASS_MASK) != 0) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301820 builderClassJavaFileHandle =
1821 getJavaFileHandle(getJavaClassName(
1822 BUILDER_CLASS_FILE_NAME_SUFFIX));
1823 builderClassJavaFileHandle =
1824 generateBuilderClassFile(builderClassJavaFileHandle,
1825 curNode,
1826 isAttributePresent);
Vidyashree Ramab3670472016-08-06 15:49:56 +05301827
1828 //Append impl class to builder class and close it.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301829 mergeJavaFiles(builderClassJavaFileHandle,
1830 implClassJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301831 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301832 insertDataIntoJavaFile(implClassJavaFileHandle, CLOSE_CURLY_BRACKET);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301833 validateLineLength(implClassJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301834 }
Vidyashree Ramab3670472016-08-06 15:49:56 +05301835 //Close all the file handles.
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301836 freeTemporaryResources(false);
1837 }
1838
Vidyashree Ramab3670472016-08-06 15:49:56 +05301839 //Adds import for array list.
Bharat saraswal8beac342016-08-04 02:00:03 +05301840 private void addArrayListImport(List<String> imports) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301841 if (imports.contains(javaImportData.getImportForList())) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301842 imports.add(ARRAY_LIST_IMPORT);
1843 }
1844 }
1845
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301846 //Adds import for bitset and base64 list.
1847 private void addBitsAndBase64Imports(YangNode curNode, List<String> imports) {
Bharat saraswalb41904b2016-10-20 19:22:36 +05301848 if (curNode.isOpTypeReq()) {
1849 String impt = getJavaImportData().getImportForToBitSet();
1850 if (!imports.contains(impt)) {
1851 imports.add(getJavaImportData().getImportForToBitSet());
Bharat saraswal54e4bab2016-10-05 23:32:14 +05301852 }
1853 }
Bharat saraswald14cbe82016-07-14 13:26:18 +05301854 }
1855
1856 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301857 * Adds imports for ToString and HashCodeMethod.
1858 *
Bharat saraswal039f59c2016-07-14 21:57:13 +05301859 * @param imports import list
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301860 * @param operation add or remove
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301861 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301862 protected void addImportsToStringAndHasCodeMethods(List<String> imports,
1863 boolean operation) {
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301864 if (operation) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301865 imports.add(javaImportData.getImportForHashAndEquals());
1866 imports.add(javaImportData.getImportForToString());
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301867 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301868 imports.remove(javaImportData.getImportForHashAndEquals());
1869 imports.remove(javaImportData.getImportForToString());
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301870 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301871 // TODO change boolean to OPERATION, in all related places.
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301872 }
1873
1874 /**
Bharat saraswalaf413b82016-07-14 15:18:20 +05301875 * Adds import for map and hash map.
1876 *
Bharat saraswal8beac342016-08-04 02:00:03 +05301877 * @param imports import list
1878 * @param operations true for adding and false for deletion
1879 * @param isInterfaceFile if need to add in interface file
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301880 * @param curNode current node
Bharat saraswalaf413b82016-07-14 15:18:20 +05301881 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301882 private void addImportsForAugmentableClass(List<String> imports,
1883 boolean operations,
1884 boolean isInterfaceFile,
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301885 YangNode curNode) {
Bharat saraswal039f59c2016-07-14 21:57:13 +05301886 if (operations) {
Bharat saraswal8beac342016-08-04 02:00:03 +05301887 if (!isInterfaceFile) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301888 imports.add(javaImportData.getHashMapImport());
Bharat saraswal8beac342016-08-04 02:00:03 +05301889 }
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301890 // Add import for hash map only if node is not a YANG choice.
1891 if (!(curNode instanceof YangChoice)) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301892 imports.add(javaImportData.getMapImport());
Gaurav Agrawal8a147522016-08-10 13:43:01 +05301893 }
Bharat saraswal039f59c2016-07-14 21:57:13 +05301894 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +05301895 if (!isInterfaceFile) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301896 imports.remove(javaImportData.getHashMapImport());
Bharat saraswal8beac342016-08-04 02:00:03 +05301897 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301898 imports.remove(javaImportData.getMapImport());
Bharat saraswald14cbe82016-07-14 13:26:18 +05301899 }
Bharat saraswal8beac342016-08-04 02:00:03 +05301900 sortImports(imports);
Bharat saraswald14cbe82016-07-14 13:26:18 +05301901 }
1902
1903 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05301904 * Adds invocation exception import.
Bharat saraswal039f59c2016-07-14 21:57:13 +05301905 *
1906 * @param imports list of imports
Bharat saraswal039f59c2016-07-14 21:57:13 +05301907 */
Bharat saraswal8beac342016-08-04 02:00:03 +05301908 private void addInvocationExceptionImport(List<String> imports) {
Bharat saraswalb41904b2016-10-20 19:22:36 +05301909 if (!imports.contains(INVOCATION_TARGET_EXCEPTION_IMPORT)) {
1910 imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
1911 }
Bharat saraswal039f59c2016-07-14 21:57:13 +05301912 }
1913
1914 /**
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301915 * Removes all temporary file handles.
1916 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301917 * @param errorOccurred flag indicating if error occurred
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301918 * @throws IOException when failed to delete the temporary files
1919 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301920 public void freeTemporaryResources(boolean errorOccurred)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301921 throws IOException {
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301922 /*
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301923 * Close all java file handles and when error occurs delete the files.
1924 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301925 if (javaFlagSet(INTERFACE_MASK)) {
1926 closeFile(interfaceJavaFileHandle, errorOccurred);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301927 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301928 if (javaFlagSet(BUILDER_CLASS_MASK)) {
1929 closeFile(builderClassJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301930 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301931 if (javaFlagSet(BUILDER_INTERFACE_MASK)) {
1932 closeFile(builderInterfaceJavaFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301933 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301934 if (javaFlagSet(DEFAULT_CLASS_MASK)) {
1935 closeFile(implClassJavaFileHandle, errorOccurred);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301936 }
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301937 /*
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301938 * Close all temporary file handles and delete the files.
1939 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301940 if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
1941 closeFile(getterImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301942 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301943 if (tempFlagSet(ATTRIBUTES_MASK)) {
1944 closeFile(attributesTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301945 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301946 if (tempFlagSet(HASH_CODE_IMPL_MASK)) {
1947 closeFile(hashCodeImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301948 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301949 if (tempFlagSet(TO_STRING_IMPL_MASK)) {
1950 closeFile(toStringImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301951 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301952 if (tempFlagSet(EQUALS_IMPL_MASK)) {
1953 closeFile(equalsImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301954 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301955 if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
1956 closeFile(fromStringImplTempFileHandle);
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301957 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301958 if (tempFlagSet(ADD_TO_LIST_IMPL_MASK)) {
1959 closeFile(addToListImplTempFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301960 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301961 if (tempFlagSet(ADD_TO_LIST_INTERFACE_MASK)) {
1962 closeFile(addToListInterfaceTempFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301963 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301964 if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK)) {
1965 closeFile(leafIdAttributeTempFileHandle);
Bharat saraswal8beac342016-08-04 02:00:03 +05301966 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301967 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK)) {
1968 closeFile(subtreeFilteringForLeafTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301969 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301970 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK)) {
1971 closeFile(getSubtreeFilteringForListTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301972 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301973 if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK)) {
1974 closeFile(getSubtreeFilteringForChildNodeTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301975 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301976 if (tempFlagSet(EDIT_CONTENT_MASK)) {
1977 closeFile(editContentTempFileHandle);
Bharat saraswale50edca2016-08-05 01:58:25 +05301978 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301979 }
1980
1981 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301982 * Returns if the attribute needs to be accessed in a qualified manner or
1983 * not, if it needs to be imported, then the same needs to be done.
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301984 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301985 * @param importInfo import info
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301986 * @return status of the qualified access to the attribute
1987 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301988 protected boolean getIsQualifiedAccessOrAddToImportList(
1989 JavaQualifiedTypeInfo importInfo) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301990 return javaImportData
1991 .addImportInfo((JavaQualifiedTypeInfoTranslator) importInfo,
1992 getGeneratedJavaClassName(),
1993 javaFileInfo.getPackage());
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301994 }
1995
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301996 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05301997 * Returns temp file handle for add to list interface.
Shankara-Huaweia1039e52016-07-14 16:53:09 +05301998 *
Bharat saraswal8beac342016-08-04 02:00:03 +05301999 * @return temp file handle for add to list interface
Shankara-Huaweia1039e52016-07-14 16:53:09 +05302000 */
Bharat saraswal8beac342016-08-04 02:00:03 +05302001 public File getAddToListInterfaceTempFileHandle() {
2002 return addToListInterfaceTempFileHandle;
Shankara-Huaweia1039e52016-07-14 16:53:09 +05302003 }
2004
2005 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05302006 * Returns temp file handle for add to list impl.
2007 *
2008 * @return temp file handle for add to list impl
2009 */
2010 public File getAddToListImplTempFileHandle() {
2011 return addToListImplTempFileHandle;
2012 }
2013
2014 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05302015 * Returns temp file handle for leaf identifier attributes.
2016 *
2017 * @return temp file handle for leaf identifier attributes
2018 */
2019 public File getLeafIdAttributeTempFileHandle() {
2020 return leafIdAttributeTempFileHandle;
2021 }
2022
2023 /**
Bharat saraswal8beac342016-08-04 02:00:03 +05302024 * Sets true if root node.
2025 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302026 * @param rootNode true if root node
Bharat saraswal8beac342016-08-04 02:00:03 +05302027 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302028 void setRootNode(boolean rootNode) {
2029 this.rootNode = rootNode;
Shankara-Huaweia1039e52016-07-14 16:53:09 +05302030 }
Bharat saraswale50edca2016-08-05 01:58:25 +05302031
2032 /**
2033 * Returns temp file for is content match.
2034 *
2035 * @return temp file for is content match
2036 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05302037 public File getSubtreeFilteringForLeafTempFileHandle() {
2038 return subtreeFilteringForLeafTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +05302039 }
2040
2041 /**
Bharat saraswale50edca2016-08-05 01:58:25 +05302042 * Returns temp file for edit content file.
2043 *
2044 * @return temp file for edit content file
2045 */
2046 public File getEditContentTempFileHandle() {
2047 return editContentTempFileHandle;
2048 }
2049
2050 /**
Bharat saraswale50edca2016-08-05 01:58:25 +05302051 * Returns temp file for is content match.
2052 *
2053 * @return temp file for is content match
2054 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05302055 public File getGetSubtreeFilteringForListTempFileHandle() {
2056 return getSubtreeFilteringForListTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +05302057 }
2058
2059 /**
Bharat saraswale50edca2016-08-05 01:58:25 +05302060 * Returns temp file for is content match.
2061 *
2062 * @return temp file for is content match
2063 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05302064 public File getGetSubtreeFilteringForChildNodeTempFileHandle() {
2065 return getSubtreeFilteringForChildNodeTempFileHandle;
Bharat saraswale50edca2016-08-05 01:58:25 +05302066 }
2067
2068 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302069 * Checks if a given flag is set in generated java files.
2070 * Returns true if ANY flag is set in a bitwise-ORed argument, e.g.
2071 * <pre>
2072 * javaFlagSet(FOO | BAR)
2073 * </pre>
2074 * returns true if either FOO flag or BAR flag is set.
Bharat saraswale50edca2016-08-05 01:58:25 +05302075 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302076 * @param flag input flag mask value
2077 * @return true if set, else false
Bharat saraswale50edca2016-08-05 01:58:25 +05302078 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05302079 private boolean javaFlagSet(int flag) {
2080 return (getGeneratedJavaFiles() & flag) != 0;
2081 }
2082
2083 /**
2084 * Checks if a given flag is set in temp files.
2085 *
2086 * @param flag input flag mask value
2087 * @return true if set, else false
2088 */
2089 private boolean tempFlagSet(int flag) {
2090 return (tempFilesFlagSet & flag) != 0;
Bharat saraswale50edca2016-08-05 01:58:25 +05302091 }
Bharat saraswal54e4bab2016-10-05 23:32:14 +05302092
2093 /**
Bharat saraswal94844d62016-10-13 13:28:03 +05302094 * Sets true if binary type is there for leaf/leaf-list.
2095 *
2096 * @param binary true if binary type is there for leaf/leaf-list
2097 */
2098 public void setBinary(boolean binary) {
2099 isBinary = binary;
2100 }
2101
2102 /**
2103 * Returns true if binary type is there for leaf/leaf-list.
2104 *
2105 * @return true if binary type is there for leaf/leaf-list
2106 */
2107 public boolean isBinary() {
2108 return isBinary;
2109 }
2110
Bharat saraswal0663aff2016-10-18 23:16:14 +05302111 /**
2112 * Sets attribute's node.
2113 *
2114 * @param attrNode attribute's node
2115 */
2116 public void setAttrNode(YangNode attrNode) {
2117 this.attrNode = attrNode;
2118 }
2119
2120 /**
2121 * Adds info to sub tree import list.
2122 *
2123 * @param info import info
2124 */
2125 public void addToSubTreeImports(JavaQualifiedTypeInfoTranslator
2126 info) {
2127 boolean isAdded = false;
2128 for (JavaQualifiedTypeInfoTranslator imports : subTreeImports) {
2129 if (imports.getClassInfo().equals(info.getClassInfo())) {
2130 isAdded = true;
2131 }
2132 }
2133 if (!isAdded) {
2134 subTreeImports.add(info);
2135 }
2136 }
2137
2138 private void addSubTreeImportStrings(List<String> imports) {
2139 for (JavaQualifiedTypeInfoTranslator impt : subTreeImports) {
2140 imports.add(getImportString(impt.getPkgInfo(), impt.getClassInfo()));
2141 }
2142 sortImports(imports);
2143 }
Bharat saraswalc2fd3222016-10-19 16:10:27 +05302144
Vinod Kumar S79a374b2016-04-30 21:09:15 +05302145}