blob: a9ce9b45b8dc266253adc76023e69546c0a1ff13 [file] [log] [blame]
Bharat saraswalc46ee2a2016-02-25 02:26:43 +05301/*
Brian O'Connor0f7908b2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Bharat saraswalc46ee2a2016-02-25 02:26:43 +05303 *
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 */
16
17package org.onosproject.yangutils.translator.tojava.utils;
18
Bharat saraswal9fab16b2016-09-23 23:27:24 +053019import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +053020import org.onosproject.yangutils.datamodel.YangAugmentableNode;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +053021import org.onosproject.yangutils.datamodel.YangBit;
22import org.onosproject.yangutils.datamodel.YangBits;
Bharat saraswale50edca2016-08-05 01:58:25 +053023import org.onosproject.yangutils.datamodel.YangCase;
Bharat saraswal8beac342016-08-04 02:00:03 +053024import org.onosproject.yangutils.datamodel.YangChoice;
Shankara-Huaweib7564772016-08-02 18:13:13 +053025import org.onosproject.yangutils.datamodel.YangDerivedInfo;
Bharat saraswal748fc3c2016-09-06 16:38:20 +053026import org.onosproject.yangutils.datamodel.YangEnumeration;
Shankara-Huaweia1039e52016-07-14 16:53:09 +053027import org.onosproject.yangutils.datamodel.YangLeavesHolder;
Vinod Kumar S9f26ae52016-03-23 15:30:27 +053028import org.onosproject.yangutils.datamodel.YangNode;
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +053029import org.onosproject.yangutils.datamodel.YangType;
Bharat saraswal039f59c2016-07-14 21:57:13 +053030import org.onosproject.yangutils.datamodel.YangTypeDef;
Bharat saraswale50edca2016-08-05 01:58:25 +053031import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +053032import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
Bharat saraswalaf413b82016-07-14 15:18:20 +053033import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
Bharat saraswald14cbe82016-07-14 13:26:18 +053034import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053035import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053036import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
Bharat saraswal748fc3c2016-09-06 16:38:20 +053037import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
38import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
Bharat saraswal039f59c2016-07-14 21:57:13 +053039import org.onosproject.yangutils.translator.tojava.TempJavaEventFragmentFiles;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053040import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
Bharat saraswal64e7e232016-07-14 23:33:55 +053041import org.onosproject.yangutils.translator.tojava.TempJavaTypeFragmentFiles;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053042import org.onosproject.yangutils.utils.UtilConstants;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053043import org.onosproject.yangutils.utils.io.YangPluginConfig;
Vinod Kumar S9f26ae52016-03-23 15:30:27 +053044
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053045import java.io.File;
46import java.io.IOException;
47import java.util.ArrayList;
48import java.util.List;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +053049import java.util.Map;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053050
51import static java.util.Collections.sort;
Bharat saraswal748fc3c2016-09-06 16:38:20 +053052import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY;
53import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BITS;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053054import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
55import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
Bharat saraswal748fc3c2016-09-06 16:38:20 +053056import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
57import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
58import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.DEFAULT_CLASS_MASK;
59import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
60import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_CLASS;
61import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_LISTENER_INTERFACE;
62import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_SUBJECT_CLASS;
63import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
64import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
65import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
66import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
67import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_IMPL_MASK;
68import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_INTERFACE_MASK;
69import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
70import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
71import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
72import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
73import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
74import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_ENUM_MASK;
75import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_METHOD_MASK;
76import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_ATTRIBUTE_MASK;
77import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_GETTER_MASK;
78import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_SETTER_MASK;
79import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
80import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
81import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
82import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
83import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK;
84import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.OF_STRING_IMPL_MASK;
85import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.RPC_INTERFACE_MASK;
86import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
87import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
88import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
89import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
90import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
91import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.getCurNodeAsAttributeInTarget;
92import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getQualifierInfoForCasesParent;
93import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.isGetSetOfRootNodeRequired;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053094import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET;
95import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE;
96import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
Bharat saraswal748fc3c2016-09-06 16:38:20 +053097import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.addAugmentationAttribute;
98import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getEnumsValueAttribute;
99import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getEventEnumTypeStart;
100import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getOperationAttributeForConstructor;
101import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getOperationAttributes;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530102import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getOperationTypeEnum;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530103import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getYangAugmentedMapObjectForConstruct;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530104import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
105import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.initiateJavaFileGeneration;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530106import static org.onosproject.yangutils.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_INT_VALUE;
107import static org.onosproject.yangutils.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_STRING_VALUE;
108import static org.onosproject.yangutils.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530109import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.builderMethod;
110import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodImpl;
111import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodInterface;
112import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAugmentsDataMethodForService;
113import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getConstructorStart;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530114import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEnumsConstructor;
115import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEnumsOfValueMethod;
116import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethodClose;
117import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethodOpen;
118import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getFromStringMethodClose;
119import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getFromStringMethodSignature;
120import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetter;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530121import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterString;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530122import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodClose;
123import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodOpen;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530124import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getInterfaceLeafIdEnumSignature;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530125import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getRangeValidatorMethodForUnion;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530126import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForSelectLeaf;
127import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterString;
128import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
129import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
130import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoImpl;
131import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoInterface;
132import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoMapImpl;
133import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoMapInterface;
134import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.isLeafValueSetInterface;
135import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.isSelectLeafSetInterface;
136import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.processSubtreeFilteringInterface;
137import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.setSelectLeafSetInterface;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530138import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.brackets;
139import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getGettersForValueAndSelectLeaf;
140import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getInterfaceLeafIdEnumMethods;
141import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOmitNullValueString;
142import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOperationAttributesGetters;
143import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOverRideString;
144import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getReturnString;
145import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.methodClose;
146import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.methodSignature;
147import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.signatureClose;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530148import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getAugmentableSubTreeFiltering;
149import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessChildNodeSubtreeFiltering;
150import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessLeafListSubtreeFiltering;
151import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessLeafSubtreeFiltering;
152import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessSubTreeFilteringEnd;
153import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessSubtreeFilteringStart;
154import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessSubtreeFunctionBody;
155import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.addDefaultConstructor;
156import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
157import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getTypeFiles;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530158import static org.onosproject.yangutils.utils.UtilConstants.ADD;
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +0530159import static org.onosproject.yangutils.utils.UtilConstants.BASE64;
Bharat saraswal64e7e232016-07-14 23:33:55 +0530160import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
Bharat saraswal84366c52016-03-23 19:40:35 +0530161import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530162import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_CLASS;
163import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_INTERFACE;
Bharat saraswal84366c52016-03-23 19:40:35 +0530164import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530165import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530166import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530167import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530168import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530169import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530170import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_PARAMETER_FUNCTION_CALL;
Bharat saraswal84366c52016-03-23 19:40:35 +0530171import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
Bharat saraswal039f59c2016-07-14 21:57:13 +0530172import static org.onosproject.yangutils.utils.UtilConstants.ENCODE_TO_STRING;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530173import static org.onosproject.yangutils.utils.UtilConstants.ENUM_CLASS;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530174import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530175import static org.onosproject.yangutils.utils.UtilConstants.EVENT_CLASS;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530176import static org.onosproject.yangutils.utils.UtilConstants.EVENT_LISTENER_STRING;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530177import static org.onosproject.yangutils.utils.UtilConstants.EVENT_STRING;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530178import static org.onosproject.yangutils.utils.UtilConstants.EVENT_SUBJECT_NAME_SUFFIX;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530179import static org.onosproject.yangutils.utils.UtilConstants.GET;
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +0530180import static org.onosproject.yangutils.utils.UtilConstants.GET_ENCODER;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530181import static org.onosproject.yangutils.utils.UtilConstants.IF;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530182import static org.onosproject.yangutils.utils.UtilConstants.IMPL_CLASS;
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530183import static org.onosproject.yangutils.utils.UtilConstants.INT;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530184import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
Bharat saraswal84366c52016-03-23 19:40:35 +0530185import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530186import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
187import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
Bharat saraswal8beac342016-08-04 02:00:03 +0530188import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
Bharat saraswal039f59c2016-07-14 21:57:13 +0530189import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
190import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530191import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
Bharat saraswal039f59c2016-07-14 21:57:13 +0530192import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530193import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530194import static org.onosproject.yangutils.utils.UtilConstants.RPC_CLASS;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530195import static org.onosproject.yangutils.utils.UtilConstants.SCHEMA_NAME;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530196import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLON;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530197import static org.onosproject.yangutils.utils.UtilConstants.SERVICE_METHOD_STRING;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530198import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +0530199import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530200import static org.onosproject.yangutils.utils.UtilConstants.TMP_VAL;
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +0530201import static org.onosproject.yangutils.utils.UtilConstants.TO;
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530202import static org.onosproject.yangutils.utils.UtilConstants.TRIM_STRING;
203import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530204import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_CLASS;
205import static org.onosproject.yangutils.utils.UtilConstants.UNION_CLASS;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530206import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
Bharat saraswald14cbe82016-07-14 13:26:18 +0530207import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530208import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
209import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
Gaurav Agrawal8a147522016-08-10 13:43:01 +0530210import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.replaceLast;
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530211import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.trimAtLast;
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530212import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.validateLineLength;
213
Vinod Kumar S08710982016-03-03 19:55:30 +0530214/**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530215 * Representation of java file generator.
Vinod Kumar S08710982016-03-03 19:55:30 +0530216 */
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530217public final class JavaFileGenerator {
218
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530219 // No instantiation
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530220 private JavaFileGenerator() {
221 }
222
223 /**
224 * Returns generated interface file for current node.
Vinod Kumar S08710982016-03-03 19:55:30 +0530225 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530226 * @param file file
227 * @param imports imports for the file
228 * @param curNode current YANG node
229 * @param attrPresent if any attribute is present or not
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530230 * @return interface file
Vinod Kumar S08710982016-03-03 19:55:30 +0530231 * @throws IOException when fails to write in file
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530232 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530233 public static File generateInterfaceFile(File file, List<String> imports,
234 YangNode curNode,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530235 boolean attrPresent)
Bharat saraswald532a4c2016-03-25 18:19:46 +0530236 throws IOException {
Vinod Kumar S08710982016-03-03 19:55:30 +0530237
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530238 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530239 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530240
241 String path;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530242 if (curNode instanceof RpcNotificationContainer) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530243 path = fileInfo.getPluginConfig().getCodeGenDir() +
244 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530245 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530246 path = fileInfo.getBaseCodeGenPath() +
247 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530248 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530249
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530250 String className = getCapitalCase(fileInfo.getJavaName());
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530251
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530252 boolean leavesPresent;
Bharat saraswal8beac342016-08-04 02:00:03 +0530253 YangLeavesHolder leavesHolder;
254 if (curNode instanceof YangLeavesHolder) {
255 leavesHolder = (YangLeavesHolder) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530256 leavesPresent = leavesPresent(leavesHolder);
Bharat saraswal8beac342016-08-04 02:00:03 +0530257 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530258 leavesPresent = false;
Bharat saraswal8beac342016-08-04 02:00:03 +0530259 }
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530260
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530261 initiateJavaFileGeneration(file, INTERFACE_MASK, imports, curNode,
262 className);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530263
264 // Generate ENUM interface
265 insertDataIntoJavaFile(file, getOperationTypeEnum());
266
Bharat saraswal8beac342016-08-04 02:00:03 +0530267 List<String> methods = new ArrayList<>();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530268 if (attrPresent) {
Bharat saraswal64e7e232016-07-14 23:33:55 +0530269 // Add getter methods to interface file.
Bharat saraswald532a4c2016-03-25 18:19:46 +0530270 try {
Bharat saraswal8beac342016-08-04 02:00:03 +0530271 //Leaf identifier enum.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530272 if (leavesPresent) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530273 insertDataIntoJavaFile(file, getInterfaceLeafIdEnumSignature(
274 className) + trimAtLast(replaceLast(
275 getDataFromTempFileHandle(
276 LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK,
277 getBeanFiles(curNode), path),
278 COMMA, SEMI_COLON), NEW_LINE) +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530279 getInterfaceLeafIdEnumMethods());
Bharat saraswal8beac342016-08-04 02:00:03 +0530280 }
281
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530282 insertDataIntoJavaFile(file, NEW_LINE);
Bharat saraswal64e7e232016-07-14 23:33:55 +0530283 //Getter methods.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530284 insertDataIntoJavaFile(file, getDataFromTempFileHandle(
285 GETTER_FOR_INTERFACE_MASK, getBeanFiles(curNode), path));
Bharat saraswald532a4c2016-03-25 18:19:46 +0530286 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530287 throw new IOException(getErrorMsg(className, INTERFACE));
Bharat saraswald532a4c2016-03-25 18:19:46 +0530288 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530289 }
Bharat saraswal8beac342016-08-04 02:00:03 +0530290
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530291 if (curNode instanceof YangAugmentableNode &&
292 !(curNode instanceof YangChoice)) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530293 methods.add(getYangAugmentInfoInterface());
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530294 methods.add(getYangAugmentInfoMapInterface());
Bharat saraswal8beac342016-08-04 02:00:03 +0530295 }
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530296
Bharat saraswale50edca2016-08-05 01:58:25 +0530297 if (curNode instanceof YangCase) {
298 YangNode caseParent = curNode.getParent();
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530299 JavaQualifiedTypeInfo qualifiedTypeInfo =
300 getQualifierInfoForCasesParent(caseParent,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530301 fileInfo.getPluginConfig());
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530302 methods.add(processSubtreeFilteringInterface(
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530303 qualifiedTypeInfo.getClassInfo()));
Bharat saraswale50edca2016-08-05 01:58:25 +0530304 } else {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530305 methods.add(processSubtreeFilteringInterface(className));
Bharat saraswal8beac342016-08-04 02:00:03 +0530306 }
Bharat saraswale50edca2016-08-05 01:58:25 +0530307
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530308 if (leavesPresent) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530309 methods.add(isLeafValueSetInterface());
310 methods.add(isSelectLeafSetInterface());
Bharat saraswal8beac342016-08-04 02:00:03 +0530311 }
312 for (String method : methods) {
313 insertDataIntoJavaFile(file, method);
314 }
Bharat saraswale304c252016-08-16 20:56:20 +0530315 return file;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530316 }
317
318 /**
Gaurav Agrawal02a60de2016-04-20 15:49:17 +0530319 * Returns generated builder interface file for current node.
Vinod Kumar S08710982016-03-03 19:55:30 +0530320 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530321 * @param file file
322 * @param curNode current YANG node
323 * @param attrPresent if any attribute is present or not
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530324 * @return builder interface file
Vinod Kumar S08710982016-03-03 19:55:30 +0530325 * @throws IOException when fails to write in file
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530326 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530327 public static File generateBuilderInterfaceFile(File file, YangNode curNode,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530328 boolean attrPresent)
Bharat saraswald532a4c2016-03-25 18:19:46 +0530329 throws IOException {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530330
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530331 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530332 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530333 YangPluginConfig pluginConfig = fileInfo.getPluginConfig();
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530334
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530335 boolean leavesPresent;
Bharat saraswal8beac342016-08-04 02:00:03 +0530336 YangLeavesHolder leavesHolder;
337 if (curNode instanceof YangLeavesHolder) {
338 leavesHolder = (YangLeavesHolder) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530339 leavesPresent = leavesPresent(leavesHolder);
Bharat saraswal8beac342016-08-04 02:00:03 +0530340 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530341 leavesPresent = false;
Bharat saraswal8beac342016-08-04 02:00:03 +0530342 }
343
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530344 String className = getCapitalCase(fileInfo.getJavaName());
Bharat saraswal039f59c2016-07-14 21:57:13 +0530345 String path;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530346 if (curNode instanceof RpcNotificationContainer) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530347 path = fileInfo.getPluginConfig().getCodeGenDir() +
348 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530349 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530350 path = fileInfo.getBaseCodeGenPath() +
351 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530352 }
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530353
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530354 initiateJavaFileGeneration(file, BUILDER_INTERFACE_MASK, null, curNode,
355 className);
Bharat saraswal022dae92016-03-04 20:08:09 +0530356 List<String> methods = new ArrayList<>();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530357 if (attrPresent) {
Bharat saraswald532a4c2016-03-25 18:19:46 +0530358 try {
Bharat saraswal64e7e232016-07-14 23:33:55 +0530359 //Getter methods.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530360 methods.add(getDataFromTempFileHandle(
361 GETTER_FOR_INTERFACE_MASK,
362 getBeanFiles(curNode), path));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530363
364 //Setter methods.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530365 methods.add(getDataFromTempFileHandle(
366 SETTER_FOR_INTERFACE_MASK,
367 getBeanFiles(curNode), path));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530368
369 //Add to list method.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530370 insertDataIntoJavaFile(file, getDataFromTempFileHandle(
371 ADD_TO_LIST_INTERFACE_MASK, getBeanFiles(curNode), path));
Bharat saraswald532a4c2016-03-25 18:19:46 +0530372 } catch (IOException e) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530373 throw new IOException(getErrorMsg(className, BUILDER_INTERFACE));
Bharat saraswald532a4c2016-03-25 18:19:46 +0530374 }
Bharat saraswal5600f0f2016-03-09 18:34:56 +0530375 }
Bharat saraswal64e7e232016-07-14 23:33:55 +0530376
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530377 if (curNode instanceof YangAugmentableNode &&
378 !(curNode instanceof YangChoice)) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530379 methods.add(getAddAugmentInfoMethodInterface());
380 methods.add(getYangAugmentInfoInterface());
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530381 methods.add(getYangAugmentInfoMapInterface());
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530382 }
383
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530384 if (leavesPresent) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530385 methods.add(setSelectLeafSetInterface(className));
Bharat saraswal8beac342016-08-04 02:00:03 +0530386 }
Bharat saraswal64e7e232016-07-14 23:33:55 +0530387 //Add build method to builder interface file.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530388 methods.add(((TempJavaCodeFragmentFilesContainer) curNode)
389 .getTempJavaCodeFragmentFiles()
390 .addBuildMethodForInterface(pluginConfig));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530391
392 //Add getters and setters in builder interface.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530393 for (String method : methods) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530394 insertDataIntoJavaFile(file, method);
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530395 }
396
Bharat saraswal84366c52016-03-23 19:40:35 +0530397 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
Bharat saraswale304c252016-08-16 20:56:20 +0530398 return file;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530399 }
400
401 /**
402 * Returns generated builder class file for current node.
Vinod Kumar S08710982016-03-03 19:55:30 +0530403 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530404 * @param file file
405 * @param curNode current YANG node
406 * @param attrPresent if any attribute is present or not
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530407 * @return builder class file
Vinod Kumar S08710982016-03-03 19:55:30 +0530408 * @throws IOException when fails to write in file
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530409 */
Bharat saraswald14cbe82016-07-14 13:26:18 +0530410 public static File generateBuilderClassFile(File file, YangNode curNode,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530411 boolean attrPresent)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530412 throws IOException {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530413
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530414 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530415 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530416 YangPluginConfig config = fileInfo.getPluginConfig();
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530417
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530418 boolean leavesPresent;
Bharat saraswal8beac342016-08-04 02:00:03 +0530419 YangLeavesHolder leavesHolder;
420 if (curNode instanceof YangLeavesHolder) {
421 leavesHolder = (YangLeavesHolder) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530422 leavesPresent = leavesPresent(leavesHolder);
Bharat saraswal8beac342016-08-04 02:00:03 +0530423 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530424 leavesPresent = false;
Bharat saraswal8beac342016-08-04 02:00:03 +0530425 }
Bharat saraswal039f59c2016-07-14 21:57:13 +0530426
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530427 String className = getCapitalCase(fileInfo.getJavaName());
Bharat saraswal8beac342016-08-04 02:00:03 +0530428 boolean isRootNode = false;
Bharat saraswal039f59c2016-07-14 21:57:13 +0530429 String path;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530430 if (curNode instanceof RpcNotificationContainer) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530431 isRootNode = true;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530432 path = fileInfo.getPluginConfig().getCodeGenDir() +
433 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530434 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530435 path = fileInfo.getBaseCodeGenPath() +
436 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530437 }
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530438
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530439 initiateJavaFileGeneration(file, BUILDER_CLASS_MASK, null, curNode,
440 className);
Bharat saraswal022dae92016-03-04 20:08:09 +0530441 List<String> methods = new ArrayList<>();
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530442
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530443 if (curNode instanceof YangAugmentableNode) {
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530444 insertDataIntoJavaFile(file, addAugmentationAttribute());
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530445 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530446 if (attrPresent) {
Bharat saraswal64e7e232016-07-14 23:33:55 +0530447
448 //Add attribute strings.
Bharat saraswald532a4c2016-03-25 18:19:46 +0530449 try {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530450 insertDataIntoJavaFile(file, getDataFromTempFileHandle(
451 ATTRIBUTES_MASK, getBeanFiles(curNode), path));
Bharat saraswald532a4c2016-03-25 18:19:46 +0530452 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530453 throw new IOException(getErrorMsg(className, BUILDER_CLASS));
Bharat saraswald532a4c2016-03-25 18:19:46 +0530454 }
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530455
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530456 if (leavesPresent) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530457 insertDataIntoJavaFile(file, getOperationAttributes());
458 }
Bharat saraswald532a4c2016-03-25 18:19:46 +0530459 try {
Bharat saraswal64e7e232016-07-14 23:33:55 +0530460 //Getter methods.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530461 methods.add(getDataFromTempFileHandle(
462 GETTER_FOR_CLASS_MASK, getBeanFiles(curNode), path));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530463 // Setter methods.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530464 methods.add(getDataFromTempFileHandle(
465 SETTER_FOR_CLASS_MASK, getBeanFiles(curNode), path));
Bharat saraswald14cbe82016-07-14 13:26:18 +0530466
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530467 //Add to list impl method.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530468 methods.add(getDataFromTempFileHandle(
469 ADD_TO_LIST_IMPL_MASK, getBeanFiles(curNode), path));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530470
Bharat saraswald14cbe82016-07-14 13:26:18 +0530471 insertDataIntoJavaFile(file, NEW_LINE);
Bharat saraswal8beac342016-08-04 02:00:03 +0530472
Bharat saraswal8beac342016-08-04 02:00:03 +0530473 //Add operation attribute methods.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530474 if (leavesPresent) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530475 methods.add(getOperationAttributesGetters());
476 insertDataIntoJavaFile(file, NEW_LINE);
Bharat saraswal8beac342016-08-04 02:00:03 +0530477 methods.add(getSetterForSelectLeaf(className, isRootNode));
478 }
Bharat saraswald532a4c2016-03-25 18:19:46 +0530479 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530480 throw new IOException(getErrorMsg(className, BUILDER_CLASS));
Bharat saraswald532a4c2016-03-25 18:19:46 +0530481 }
482 } else {
483 insertDataIntoJavaFile(file, NEW_LINE);
484 }
Bharat saraswal64e7e232016-07-14 23:33:55 +0530485
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530486 if (curNode instanceof YangAugmentableNode) {
487 methods.add(getAddAugmentInfoMethodImpl());
488 methods.add(getYangAugmentInfoImpl());
489 methods.add(getYangAugmentInfoMapImpl());
490 }
491
Bharat saraswal64e7e232016-07-14 23:33:55 +0530492 // Add default constructor and build method impl.
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530493 methods.add(((TempJavaCodeFragmentFilesContainer) curNode)
494 .getTempJavaCodeFragmentFiles()
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530495 .addBuildMethodImpl());
496 methods.add(addDefaultConstructor(curNode, PUBLIC, BUILDER
497 ));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530498
499 //Add methods in builder class.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530500 for (String method : methods) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530501 insertDataIntoJavaFile(file, method);
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530502 }
Bharat saraswald14cbe82016-07-14 13:26:18 +0530503 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET);
Bharat saraswale304c252016-08-16 20:56:20 +0530504 return file;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530505 }
506
507 /**
Bharat saraswal8beac342016-08-04 02:00:03 +0530508 * Returns generated default class file for current node.
Vinod Kumar S08710982016-03-03 19:55:30 +0530509 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530510 * @param file file
511 * @param curNode current YANG node
512 * @param attrPresent if any attribute is present or not
513 * @param imports list of imports
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530514 * @return impl class file
Vinod Kumar S08710982016-03-03 19:55:30 +0530515 * @throws IOException when fails to write in file
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530516 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530517 public static File generateDefaultClassFile(File file, YangNode curNode,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530518 boolean attrPresent,
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530519 List<String> imports)
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530520 throws IOException {
521
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530522 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530523 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530524 YangPluginConfig config = fileInfo.getPluginConfig();
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530525
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530526 boolean leavesPresent;
Bharat saraswal8beac342016-08-04 02:00:03 +0530527 YangLeavesHolder leavesHolder;
528 if (curNode instanceof YangLeavesHolder) {
529 leavesHolder = (YangLeavesHolder) curNode;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530530 leavesPresent = leavesPresent(leavesHolder);
Bharat saraswal8beac342016-08-04 02:00:03 +0530531 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530532 leavesPresent = false;
Bharat saraswal8beac342016-08-04 02:00:03 +0530533 }
534
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530535 boolean rootNode = false;
Bharat saraswal8beac342016-08-04 02:00:03 +0530536
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530537 String className = getCapitalCase(fileInfo.getJavaName());
Bharat saraswal8beac342016-08-04 02:00:03 +0530538 String opParamClassName = className;
Bharat saraswal039f59c2016-07-14 21:57:13 +0530539 String path;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530540 if (curNode instanceof RpcNotificationContainer) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530541 opParamClassName = className + OP_PARAM;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530542 rootNode = true;
543 path = fileInfo.getPluginConfig().getCodeGenDir() +
544 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530545 } else {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530546 path = fileInfo.getBaseCodeGenPath() +
547 fileInfo.getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +0530548 }
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530549
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530550 initiateJavaFileGeneration(file, DEFAULT_CLASS_MASK, imports, curNode,
551 className);
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530552
Bharat saraswal022dae92016-03-04 20:08:09 +0530553 List<String> methods = new ArrayList<>();
Bharat saraswalaf413b82016-07-14 15:18:20 +0530554 if (curNode instanceof YangAugmentableNode) {
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530555 insertDataIntoJavaFile(file, addAugmentationAttribute());
Bharat saraswalaf413b82016-07-14 15:18:20 +0530556 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530557 if (attrPresent) {
558 addDefaultClassAttributeInfo(file, curNode, className,
559 opParamClassName, path, methods,
560 leavesPresent, rootNode);
Bharat saraswald532a4c2016-03-25 18:19:46 +0530561 } else {
562 insertDataIntoJavaFile(file, NEW_LINE);
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530563 }
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530564
Bharat saraswal8beac342016-08-04 02:00:03 +0530565 if (curNode instanceof YangAugmentableNode) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530566 methods.add(getYangAugmentInfoImpl());
567 methods.add(getYangAugmentInfoMapImpl());
568 }
569 try {
Bharat saraswal64e7e232016-07-14 23:33:55 +0530570 //Constructor.
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530571 String constructor =
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530572 getConstructorStart(className, rootNode);
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530573 constructor = constructor +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530574 getDataFromTempFileHandle(
575 CONSTRUCTOR_IMPL_MASK, getBeanFiles(curNode), path);
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530576
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530577 if (leavesPresent) {
578 constructor = constructor +
579 getOperationAttributeForConstructor();
Bharat saraswal8beac342016-08-04 02:00:03 +0530580 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530581 String augmentableSubTreeFiltering = EMPTY_STRING;
Bharat saraswale3175d32016-08-31 17:50:11 +0530582 if (curNode instanceof YangAugmentableNode) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530583 constructor = constructor +
584 getYangAugmentedMapObjectForConstruct();
Bharat saraswale50edca2016-08-05 01:58:25 +0530585
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530586 // add is filter content match.
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530587 augmentableSubTreeFiltering = getAugmentableSubTreeFiltering();
588 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530589 methods.add(constructor + methodClose(FOUR_SPACE));
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530590
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530591 methods.add(getProcessSubtreeFilteringStart(curNode, config) +
592 getProcessSubtreeFunctionBody(curNode) +
593 augmentableSubTreeFiltering +
594 getProcessSubTreeFilteringEnd());
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530595
596 if (curNode instanceof YangLeavesHolder) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530597 if (((YangLeavesHolder) curNode).getListOfLeaf() != null &&
598 !((YangLeavesHolder) curNode).getListOfLeaf().isEmpty()) {
599 methods.add(getProcessLeafSubtreeFiltering(curNode, config,
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530600 path));
601 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530602 if (((YangLeavesHolder) curNode).getListOfLeafList() != null &&
603 !((YangLeavesHolder) curNode).getListOfLeafList().isEmpty()) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530604 methods.add(getProcessLeafListSubtreeFiltering(curNode, config,
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530605 path));
606 }
607 }
608
609 if (curNode.getChild() != null) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530610 methods.add(getProcessChildNodeSubtreeFiltering(curNode, config,
611 path));
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530612 }
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530613 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530614 throw new IOException(getErrorMsg(className, IMPL_CLASS));
Vinod Kumar S08710982016-03-03 19:55:30 +0530615 }
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530616
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530617 methods.add(addDefaultConstructor(curNode, PROTECTED, DEFAULT
618 ));
Bharat saraswalaf413b82016-07-14 15:18:20 +0530619
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530620 methods.add(builderMethod(className));
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530621 if (leavesPresent) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530622 methods.add(getOperationAttributesGetters());
623 methods.add(getGettersForValueAndSelectLeaf());
624 }
Bharat saraswal64e7e232016-07-14 23:33:55 +0530625 // Add methods in impl class.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530626 for (String method : methods) {
Bharat saraswald14cbe82016-07-14 13:26:18 +0530627 insertDataIntoJavaFile(file, method);
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530628 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530629
Bharat saraswale304c252016-08-16 20:56:20 +0530630 return file;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530631 }
632
633 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530634 * Add methods related to attributes.
635 *
636 * @param file file
637 * @param curNode current YANG node
638 * @param className name of the class
639 * @param opParamClassName op param class name
640 * @param path file path
641 * @param methods list of methods string
642 * @param leavesPresent flag indicating presence of leaves
643 * @param rootNode flag indicating whether node is root node
644 * @throws IOException a violation in IO rule
645 */
646 private static void addDefaultClassAttributeInfo(File file, YangNode curNode,
647 String className,
648 String opParamClassName,
649 String path, List<String> methods,
650 boolean leavesPresent,
651 boolean rootNode)
652 throws IOException {
653
654 //Add attribute strings.
655 try {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530656 insertDataIntoJavaFile(file, getDataFromTempFileHandle(
657 ATTRIBUTES_MASK, getBeanFiles(curNode), path));
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530658 } catch (IOException e) {
659 throw new IOException(getErrorMsg(className, IMPL_CLASS));
660 }
661
662 //Add operation attributes
663 if (leavesPresent) {
664 insertDataIntoJavaFile(file, getOperationAttributes());
665 }
666
667 try {
668 //Getter methods.
669 methods.add(getDataFromTempFileHandle(
670 GETTER_FOR_CLASS_MASK, getBeanFiles(curNode), path));
671
672 // Hash code method.
673 methods.add(getHashCodeMethodClose(
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530674 getHashCodeMethodOpen() + getDataFromTempFileHandle(
675 HASH_CODE_IMPL_MASK, getBeanFiles(curNode), path)
676 .replace(NEW_LINE, EMPTY_STRING)));
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530677
678 //Equals method.
679 if (rootNode) {
680 methods.add(getEqualsMethodClose(
681 getEqualsMethodOpen(opParamClassName) +
682 getDataFromTempFileHandle(
683 EQUALS_IMPL_MASK,
684 getBeanFiles(curNode), path)));
685 } else {
686 methods.add(getEqualsMethodClose(
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530687 getEqualsMethodOpen(DEFAULT_CAPS + className) +
688 getDataFromTempFileHandle(EQUALS_IMPL_MASK,
689 getBeanFiles(curNode),
690 path)));
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530691 }
692 // To string method.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530693 methods.add(getToStringMethodOpen() + getDataFromTempFileHandle(
694 TO_STRING_IMPL_MASK, getBeanFiles(curNode), path) +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530695 getToStringMethodClose());
696 } catch (IOException e) {
697 throw new IOException(getErrorMsg(className, IMPL_CLASS));
698 }
699 }
700
701 /**
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530702 * Generates class file for type def.
Bharat saraswal022dae92016-03-04 20:08:09 +0530703 *
Bharat saraswald14cbe82016-07-14 13:26:18 +0530704 * @param file generated file
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530705 * @param curNode current YANG node
Bharat saraswal84366c52016-03-23 19:40:35 +0530706 * @param imports imports for file
707 * @return type def class file
708 * @throws IOException when fails to generate class file
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530709 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530710 public static File generateTypeDefClassFile(File file, YangNode curNode,
711 List<String> imports)
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530712 throws IOException {
Bharat saraswal022dae92016-03-04 20:08:09 +0530713
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530714 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530715 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530716 YangPluginConfig config = fileInfo.getPluginConfig();
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530717
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +0530718 // import
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530719 String className = getCapitalCase(fileInfo.getJavaName());
720 String path = fileInfo.getBaseCodeGenPath() +
721 fileInfo.getPackageFilePath();
Mahesh Poojary Huawei41547ad2016-07-14 17:49:50 +0530722 YangTypeDef typeDef = (YangTypeDef) curNode;
723 List<YangType<?>> types = typeDef.getTypeList();
724 YangType type = types.get(0);
Shankara-Huaweib7564772016-08-02 18:13:13 +0530725 YangDataTypes yangDataTypes = type.getDataType();
Bharat saraswal022dae92016-03-04 20:08:09 +0530726
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530727 initiateJavaFileGeneration(file, className, GENERATE_TYPEDEF_CLASS,
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530728 imports, path);
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530729
Bharat saraswal84366c52016-03-23 19:40:35 +0530730 List<String> methods = new ArrayList<>();
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530731
Bharat saraswal64e7e232016-07-14 23:33:55 +0530732 //Add attribute strings.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530733 try {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530734 insertDataIntoJavaFile(file, getDataFromTempFileHandle(
735 ATTRIBUTES_MASK, getTypeFiles(curNode), path));
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530736 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530737 throw new IOException(getErrorMsg(className, TYPEDEF_CLASS));
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530738 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530739
Bharat saraswal64e7e232016-07-14 23:33:55 +0530740 //Default constructor.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530741 methods.add(addDefaultConstructor(curNode, PRIVATE, EMPTY_STRING
742 ));
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530743
Bharat saraswal022dae92016-03-04 20:08:09 +0530744 try {
Bharat saraswal84366c52016-03-23 19:40:35 +0530745
Bharat saraswal64e7e232016-07-14 23:33:55 +0530746 //Type constructor.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530747 methods.add(getDataFromTempFileHandle(
748 CONSTRUCTOR_FOR_TYPE_MASK, getTypeFiles(curNode), path));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530749
750 //Of method.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530751 methods.add(getDataFromTempFileHandle(
752 OF_STRING_IMPL_MASK, getTypeFiles(curNode), path));
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530753
Bharat saraswal64e7e232016-07-14 23:33:55 +0530754 //Getter methods.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530755 methods.add(getDataFromTempFileHandle(
756 GETTER_FOR_CLASS_MASK, getTypeFiles(curNode), path));
Bharat saraswal84366c52016-03-23 19:40:35 +0530757
Bharat saraswal64e7e232016-07-14 23:33:55 +0530758 // Hash code method.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530759 methods.add(getHashCodeMethodClose(
760 getHashCodeMethodOpen() + getDataFromTempFileHandle(
761 HASH_CODE_IMPL_MASK, getTypeFiles(curNode), path)
762 .replace(NEW_LINE, EMPTY_STRING)));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530763
764 //Equals method.
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530765 methods.add(getEqualsMethodClose(
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530766 getEqualsMethodOpen(className + EMPTY_STRING) +
767 getDataFromTempFileHandle(EQUALS_IMPL_MASK,
768 getTypeFiles(curNode), path)));
Bharat saraswal84366c52016-03-23 19:40:35 +0530769
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530770 // To string method.
771 addTypedefToString(curNode, methods, path, type);
Bharat saraswal84366c52016-03-23 19:40:35 +0530772
Bharat saraswal64e7e232016-07-14 23:33:55 +0530773 JavaCodeGeneratorInfo javaGenInfo = (JavaCodeGeneratorInfo) curNode;
774
Bharat saraswal8beac342016-08-04 02:00:03 +0530775 //From string method.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530776 if (type.getDataType() == DERIVED &&
777 ((YangDerivedInfo) type.getDataTypeExtendedInfo())
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530778 .getEffectiveBuiltInType()
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530779 == IDENTITYREF) {
780 yangDataTypes = IDENTITYREF;
Shankara-Huaweib7564772016-08-02 18:13:13 +0530781 }
782
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530783 if (type.getDataType() == IDENTITYREF) {
784 yangDataTypes = IDENTITYREF;
Shankara-Huaweib7564772016-08-02 18:13:13 +0530785 }
786
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530787 if (yangDataTypes != IDENTITYREF) {
788 methods.add(getFromStringMethodSignature(className) +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530789 getDataFromTempFileHandle(
790 FROM_STRING_IMPL_MASK,
791 javaGenInfo.getTempJavaCodeFragmentFiles()
792 .getTypeTempFiles(), path) +
793 getFromStringMethodClose());
Shankara-Huaweib7564772016-08-02 18:13:13 +0530794 }
Bharat saraswal022dae92016-03-04 20:08:09 +0530795 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530796 throw new IOException(getErrorMsg(className, TYPEDEF_CLASS));
Bharat saraswal022dae92016-03-04 20:08:09 +0530797 }
Bharat saraswal022dae92016-03-04 20:08:09 +0530798
Bharat saraswal84366c52016-03-23 19:40:35 +0530799 for (String method : methods) {
800 insertDataIntoJavaFile(file, method);
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530801 }
Bharat saraswal84366c52016-03-23 19:40:35 +0530802 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
Bharat saraswal022dae92016-03-04 20:08:09 +0530803
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530804 return validateLineLength(file);
Bharat saraswal022dae92016-03-04 20:08:09 +0530805 }
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530806
807 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530808 * Adds typedef to string method.
809 *
810 * @param curNode current node
811 * @param methods list of methods string
812 * @param path file path
813 * @param type YANG type
814 * @throws IOException a violation in IO rule
815 */
816 private static void addTypedefToString(YangNode curNode,
817 List<String> methods, String path,
818 YangType type) throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530819 String methodSig = methodSignature(TO + STRING_DATA_TYPE, EMPTY_STRING,
820 PUBLIC, null, STRING_DATA_TYPE, null,
821 CLASS_TYPE);
822 String methodClose = signatureClose() + methodClose(FOUR_SPACE);
823 String openClose = brackets(OPEN_CLOSE_BRACKET, null,
824 null);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530825 //To string method.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530826 if (type.getDataType() == BINARY) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530827 JavaQualifiedTypeInfoTranslator typeInfo =
828 getQualifiedTypeInfoOfCurNode(curNode, getCapitalCase
829 (UtilConstants.BINARY));
830
831 JavaAttributeInfo attr =
832 getAttributeInfoForTheData(typeInfo,
833 UtilConstants.BINARY,
834 null, false, false);
835 String attributeName = attr.getAttributeName();
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530836 String bitsToStringMethod = getOverRideString() + methodSig +
837 getReturnString(BASE64, EIGHT_SPACE_INDENTATION) +
838 PERIOD + GET_ENCODER + brackets(OPEN_CLOSE_BRACKET, null,
839 null) +
840 PERIOD + ENCODE_TO_STRING + brackets(
841 OPEN_CLOSE_BRACKET_WITH_VALUE, attributeName, null) +
842 methodClose;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530843 methods.add(bitsToStringMethod);
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530844 } else if (type.getDataType() == BITS) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530845 JavaQualifiedTypeInfoTranslator typeInfo =
846 getQualifiedTypeInfoOfCurNode(curNode,
847 getCapitalCase(UtilConstants.BITS));
848
849 JavaAttributeInfo attr =
850 getAttributeInfoForTheData(typeInfo,
851 UtilConstants.BITS,
852 null, false, false);
853 String attributeName = attr.getAttributeName();
854 String bitsToStringMethod =
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530855 getOverRideString() + methodSig +
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +0530856 getToStringForBits(attr.getAttributeName(),
857 (YangBits) type.getDataTypeExtendedInfo()) +
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530858 getReturnString(attributeName, EIGHT_SPACE_INDENTATION) +
859 PERIOD + TO + STRING_DATA_TYPE + openClose +
860 methodClose;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530861 methods.add(bitsToStringMethod);
862 } else {
863 methods.add(getToStringMethodOpen() +
864 getDataFromTempFileHandle(
865 TO_STRING_IMPL_MASK,
866 ((TempJavaCodeFragmentFilesContainer)
867 curNode)
868 .getTempJavaCodeFragmentFiles()
869 .getTypeTempFiles(), path) +
870 getToStringMethodClose());
871 }
872 }
873
874 /**
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530875 * Generates class file for union type.
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530876 *
Bharat saraswald14cbe82016-07-14 13:26:18 +0530877 * @param file generated file
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530878 * @param curNode current YANG node
879 * @param imports imports for file
880 * @return type def class file
881 * @throws IOException when fails to generate class file
882 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530883 public static File generateUnionClassFile(File file, YangNode curNode,
884 List<String> imports)
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530885 throws IOException {
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530886
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530887 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530888 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530889 YangPluginConfig config = fileInfo.getPluginConfig();
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530890
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530891 String className = getCapitalCase(fileInfo.getJavaName());
892 String path = fileInfo.getBaseCodeGenPath() +
893 fileInfo.getPackageFilePath();
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530894
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530895 TempJavaTypeFragmentFiles tempFiles =
896 ((JavaCodeGeneratorInfo) curNode).getTempJavaCodeFragmentFiles()
897 .getTypeTempFiles();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530898
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530899 boolean intConflict = false;
900 boolean longConflict = false;
901 boolean shortConflict = false;
902 JavaAttributeInfo intAttr = tempFiles.getIntAttribute();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530903 if (intAttr == null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530904 intAttr = tempFiles.getUIntAttribute();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530905 }
906
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530907 JavaAttributeInfo longAttr =
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530908 tempFiles.getLongAttribute();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530909 if (longAttr == null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530910 longAttr = tempFiles.getULongAttribute();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530911 }
912
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530913 JavaAttributeInfo shortAttr =
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530914 tempFiles.getShortAttribute();
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530915 if (shortAttr == null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530916 shortAttr = tempFiles.getUInt8Attribute();
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530917 }
918
Bharat saraswal64e7e232016-07-14 23:33:55 +0530919 if (intAttr != null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530920 intConflict = intAttr.isIntConflict();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530921 }
922 if (longAttr != null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530923 longConflict = longAttr.isLongConflict();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530924 }
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530925 if (shortAttr != null) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530926 shortConflict = shortAttr.isShortConflict();
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530927 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530928 if (longConflict) {
929 imports.add(tempFiles.getJavaImportData()
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530930 .getBigIntegerImport());
Bharat saraswal64e7e232016-07-14 23:33:55 +0530931 sort(imports);
932 }
933
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530934 initiateJavaFileGeneration(file, className, GENERATE_UNION_CLASS,
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530935 imports, path);
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530936
937 List<String> methods = new ArrayList<>();
938
Bharat saraswal64e7e232016-07-14 23:33:55 +0530939 // Add attribute strings.
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530940 try {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530941 addUnionClassAttributeInfo(file, curNode, intConflict,
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530942 longConflict, shortConflict, path, tempFiles);
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530943 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530944 throw new IOException(getErrorMsg(className, UNION_CLASS));
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530945 }
946
Bharat saraswal64e7e232016-07-14 23:33:55 +0530947 //Default constructor.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530948 methods.add(addDefaultConstructor(curNode, PRIVATE, EMPTY_STRING
949 ));
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530950
951 try {
952
Bharat saraswal64e7e232016-07-14 23:33:55 +0530953 //Type constructor.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530954 methods.add(getDataFromTempFileHandle(
955 CONSTRUCTOR_FOR_TYPE_MASK, getTypeFiles(curNode), path));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530956
957 // Of string method.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530958 methods.add(getDataFromTempFileHandle(
959 OF_STRING_IMPL_MASK, getTypeFiles(curNode), path));
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530960
Bharat saraswal64e7e232016-07-14 23:33:55 +0530961 //Getter methods.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530962 methods.add(getDataFromTempFileHandle(
963 GETTER_FOR_CLASS_MASK, getTypeFiles(curNode), path));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530964
965 //Hash code method.
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530966 methods.add(getHashCodeMethodClose(
967 getHashCodeMethodOpen() +
968 getDataFromTempFileHandle(
969 HASH_CODE_IMPL_MASK, getTypeFiles(curNode),
970 path).replace(NEW_LINE, EMPTY_STRING)));
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530971
Bharat saraswal64e7e232016-07-14 23:33:55 +0530972 //Equals method.
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530973 methods.add(getEqualsMethodClose(
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530974 getEqualsMethodOpen(className) +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530975 getDataFromTempFileHandle(
976 EQUALS_IMPL_MASK, getTypeFiles(curNode),
977 path)));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530978
979 //To string method.
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530980 methods.add(getToStringMethodOpen() + getOmitNullValueString() +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530981 getDataFromTempFileHandle(
982 TO_STRING_IMPL_MASK,
983 getTypeFiles(curNode), path) +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530984 getToStringMethodClose());
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530985
Bharat saraswal64e7e232016-07-14 23:33:55 +0530986 //From string method.
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530987 methods.add(getFromStringMethodSignature(className) +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530988 getDataFromTempFileHandle(
989 FROM_STRING_IMPL_MASK,
990 getTypeFiles(curNode), path) +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530991 getFromStringMethodClose());
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530992
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530993 if (intConflict) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530994 methods.add(getRangeValidatorMethodForUnion(INT));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530995 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530996 if (longConflict) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530997 methods.add(getRangeValidatorMethodForUnion(BIG_INTEGER));
Bharat saraswal64e7e232016-07-14 23:33:55 +0530998 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530999 if (shortConflict && !intConflict) {
Bharat saraswal2da23bf2016-08-25 15:28:39 +05301000 methods.add(getRangeValidatorMethodForUnion(INT));
1001 }
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +05301002 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301003 throw new IOException(getErrorMsg(className, UNION_CLASS));
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +05301004 }
1005
1006 for (String method : methods) {
1007 insertDataIntoJavaFile(file, method);
1008 }
1009 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
1010
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301011 return validateLineLength(file);
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +05301012 }
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301013
1014 /**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301015 * Adds union class attribute information.
1016 *
1017 * @param file generated file
1018 * @param curNode current YANG node
1019 * @param intConflict flag to indicate if there is a conflict in int
1020 * @param longConflict flag to indicate if there is a conflict in long
1021 * @param shortConflict flag to indicate if there is a conflict in short
1022 * @param path file path
1023 * @param tempFiles temp java type fragment files
1024 * @throws IOException a violation in IO rule
1025 */
1026 private static void addUnionClassAttributeInfo(File file,
1027 YangNode curNode,
1028 boolean intConflict,
1029 boolean longConflict,
1030 boolean shortConflict,
1031 String path,
1032 TempJavaTypeFragmentFiles tempFiles)
1033 throws IOException {
1034 if (intConflict) {
1035 insertDataIntoJavaFile(file, JavaCodeSnippetGen
1036 .addStaticAttributeIntRange(PRIVATE,
1037 tempFiles.getIntIndex() <
1038 tempFiles.getUIntIndex()));
1039 }
1040
1041 if (longConflict) {
1042 insertDataIntoJavaFile(file, JavaCodeSnippetGen
1043 .addStaticAttributeLongRange(PRIVATE,
1044 tempFiles.getLongIndex() <
1045 tempFiles.getULongIndex()));
1046 }
1047
1048 if (shortConflict) {
1049 insertDataIntoJavaFile(file, JavaCodeSnippetGen
1050 .addStaticAttributeShortRange(PRIVATE,
1051 tempFiles.getShortIndex() <
1052 tempFiles.getUInt8Index()));
1053 }
1054
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301055 insertDataIntoJavaFile(file, getDataFromTempFileHandle(
1056 ATTRIBUTES_MASK, getTypeFiles(curNode), path));
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301057 }
1058
1059 /**
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301060 * Generates class file for type enum.
1061 *
Bharat saraswald14cbe82016-07-14 13:26:18 +05301062 * @param file generated file
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301063 * @param curNode current YANG node
1064 * @return class file for type enum
1065 * @throws IOException when fails to generate class file
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301066 */
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301067 public static File generateEnumClassFile(File file, YangNode curNode)
1068 throws IOException {
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301069
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301070 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301071 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301072 YangPluginConfig config = fileInfo.getPluginConfig();
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301073
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301074 String className = fileInfo.getJavaName();
1075 String path = fileInfo.getBaseCodeGenPath() +
1076 fileInfo.getPackageFilePath();
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301077
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301078 initiateJavaFileGeneration(file, getCapitalCase(className),
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301079 GENERATE_ENUM_CLASS, null, path
1080 );
Bharat saraswal64e7e232016-07-14 23:33:55 +05301081
1082 //Add attribute strings.
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301083 try {
Bharat saraswal64e7e232016-07-14 23:33:55 +05301084 JavaCodeGeneratorInfo javaGenInfo = (JavaCodeGeneratorInfo) curNode;
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301085 String[] remove = {COMMA, NEW_LINE};
1086 insertDataIntoJavaFile(file, trimAtLast(getDataFromTempFileHandle(
1087 ENUM_IMPL_MASK, javaGenInfo.getTempJavaCodeFragmentFiles()
1088 .getEnumTempFiles(), path), remove) +
1089 signatureClose());
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301090 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301091 throw new IOException(getErrorMsg(getCapitalCase(className),
1092 ENUM_CLASS));
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301093 }
1094
Bharat saraswal64e7e232016-07-14 23:33:55 +05301095 // Add an attribute to get the enum's values.
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301096 insertDataIntoJavaFile(file, getEnumsValueAttribute(className));
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301097
Bharat saraswal64e7e232016-07-14 23:33:55 +05301098 // Add a constructor for enum.
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301099 //TODO: generate javadoc for method.
1100 insertDataIntoJavaFile(file, getEnumsConstructor(getCapitalCase(className)) +
1101 NEW_LINE);
Bharat saraswal250a7472016-05-12 13:16:57 +05301102
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301103 insertDataIntoJavaFile(file,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301104 getEnumsOfValueMethod(className,
1105 (YangEnumeration) curNode,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301106 ENUM_METHOD_INT_VALUE));
Bharat saraswal748fc3c2016-09-06 16:38:20 +05301107 insertDataIntoJavaFile(file,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301108 getEnumsOfValueMethod(className,
1109 (YangEnumeration) curNode,
1110 ENUM_METHOD_STRING_VALUE));
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301111
Bharat saraswal64e7e232016-07-14 23:33:55 +05301112 // Add a getter method for enum.
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301113 insertDataIntoJavaFile(file, getJavaDoc(GETTER_METHOD, className, false,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301114 null) +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301115 getGetter(INT, className, GENERATE_ENUM_CLASS) + NEW_LINE);
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301116 insertDataIntoJavaFile(file, getJavaDoc(GETTER_METHOD, SCHEMA_NAME, false,
1117 null) +
1118 getGetter(STRING_DATA_TYPE, SCHEMA_NAME, GENERATE_ENUM_CLASS) +
1119 NEW_LINE);
Bharat saraswal250a7472016-05-12 13:16:57 +05301120
1121 try {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301122 insertDataIntoJavaFile(file,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301123 getFromStringMethodSignature(
1124 getCapitalCase(className)) +
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301125 getDataFromTempFileHandle(
1126 FROM_STRING_IMPL_MASK,
1127 ((TempJavaCodeFragmentFilesContainer) curNode)
1128 .getTempJavaCodeFragmentFiles()
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301129 .getEnumTempFiles(),
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301130 path) + getFromStringMethodClose());
Bharat saraswal250a7472016-05-12 13:16:57 +05301131 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301132 throw new IOException(getErrorMsg(getCapitalCase(className),
1133 ENUM_CLASS));
Bharat saraswal250a7472016-05-12 13:16:57 +05301134 }
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301135
1136 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
1137
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301138 return validateLineLength(file);
Bharat saraswal68fa0d12016-04-19 01:00:16 +05301139 }
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301140
1141 /**
1142 * Generates interface file for rpc.
1143 *
Bharat saraswal64e7e232016-07-14 23:33:55 +05301144 * @param file generated file
1145 * @param curNode current YANG node
1146 * @param imports imports for file
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301147 * @return rpc class file
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301148 * @throws IOException when fails to generate class file
1149 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301150 public static File generateServiceInterfaceFile(File file, YangNode curNode,
1151 List<String> imports)
Vinod Kumar S79a374b2016-04-30 21:09:15 +05301152 throws IOException {
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301153
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301154 JavaFileInfoTranslator fileInfo =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301155 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301156
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301157 TempJavaServiceFragmentFiles tempFiles =
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301158 ((JavaCodeGeneratorInfo) curNode)
1159 .getTempJavaCodeFragmentFiles().getServiceTempFiles();
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301160 String className = getCapitalCase(fileInfo.getJavaName()) +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301161 SERVICE_METHOD_STRING;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301162 String path = fileInfo.getBaseCodeGenPath() +
1163 fileInfo.getPackageFilePath();
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301164 initiateJavaFileGeneration(file, GENERATE_SERVICE_AND_MANAGER, imports,
1165 curNode, className);
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301166
1167 List<String> methods = new ArrayList<>();
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301168 JavaAttributeInfo rootAttribute =
1169 getCurNodeAsAttributeInTarget(curNode, curNode, false,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301170 tempFiles);
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301171
1172 try {
Bharat saraswal64e7e232016-07-14 23:33:55 +05301173
Bharat saraswal1edde622016-09-06 10:18:04 +05301174 if (isGetSetOfRootNodeRequired(curNode)) {
1175 //Getter methods.
1176 methods.add(getGetterString(rootAttribute,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301177 GENERATE_SERVICE_AND_MANAGER
1178 ) +
Bharat saraswal1edde622016-09-06 10:18:04 +05301179 NEW_LINE);
1180 // Setter methods.
1181 methods.add(getSetterString(rootAttribute, className,
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301182 GENERATE_SERVICE_AND_MANAGER
1183 ) +
Bharat saraswal1edde622016-09-06 10:18:04 +05301184 NEW_LINE);
1185 }
1186
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301187 methods.add(getAugmentsDataMethodForService(curNode));
Bharat saraswalaf413b82016-07-14 15:18:20 +05301188
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301189 if (((JavaCodeGeneratorInfo) curNode).getTempJavaCodeFragmentFiles()
1190 .getServiceTempFiles() != null) {
1191 JavaCodeGeneratorInfo javaGenInfo =
1192 (JavaCodeGeneratorInfo) curNode;
Bharat saraswal64e7e232016-07-14 23:33:55 +05301193
1194 // Rpc methods
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301195 methods.add(getDataFromTempFileHandle(
1196 RPC_INTERFACE_MASK,
1197 javaGenInfo.getTempJavaCodeFragmentFiles()
1198 .getServiceTempFiles(), path));
Bharat saraswal250a7472016-05-12 13:16:57 +05301199 }
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301200 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301201 throw new IOException(getErrorMsg(className, RPC_CLASS));
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301202 }
1203
1204 for (String method : methods) {
1205 insertDataIntoJavaFile(file, method);
1206 }
1207 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
1208
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301209 return validateLineLength(file);
Gaurav Agrawal02a60de2016-04-20 15:49:17 +05301210 }
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301211
1212 /**
1213 * Generates event file.
1214 *
Bharat saraswald14cbe82016-07-14 13:26:18 +05301215 * @param file generated file
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301216 * @param curNode current YANG node
1217 * @param imports imports for file
1218 * @throws IOException when fails to generate class file
1219 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301220 public static void generateEventFile(File file, YangNode curNode,
1221 List<String> imports)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301222 throws IOException {
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301223
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301224 String className =
1225 getCapitalCase(((JavaFileInfoContainer) curNode).getJavaFileInfo()
1226 .getJavaName()) + EVENT_STRING;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301227
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301228 TempJavaEventFragmentFiles tempFiles =
1229 ((TempJavaCodeFragmentFilesContainer) curNode)
1230 .getTempJavaCodeFragmentFiles().getEventFragmentFiles();
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301231
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301232 String path = ((JavaFileInfoContainer) curNode).getJavaFileInfo()
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301233 .getBaseCodeGenPath() +
1234 ((JavaFileInfoContainer) curNode).getJavaFileInfo()
1235 .getPackageFilePath();
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301236 initiateJavaFileGeneration(file, GENERATE_EVENT_CLASS, imports, curNode,
1237 className);
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301238 try {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301239 insertDataIntoJavaFile(file, getEventEnumTypeStart() +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301240 trimAtLast(getDataFromTempFileHandle(EVENT_ENUM_MASK,
1241 tempFiles, path),
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301242 COMMA) + methodClose(FOUR_SPACE));
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301243
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301244 insertDataIntoJavaFile(file,
1245 getDataFromTempFileHandle(EVENT_METHOD_MASK,
1246 tempFiles, path));
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301247 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301248 throw new IOException(getErrorMsg(className, EVENT_CLASS));
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301249 }
1250
1251 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
1252 validateLineLength(file);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301253 }
1254
1255 /**
1256 * Generates event listener file.
1257 *
Bharat saraswald14cbe82016-07-14 13:26:18 +05301258 * @param file generated file
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301259 * @param curNode current YANG node
1260 * @param imports imports for file
1261 * @throws IOException when fails to generate class file
1262 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301263 public static void generateEventListenerFile(File file, YangNode curNode,
1264 List<String> imports)
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301265 throws IOException {
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301266
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301267 String className =
1268 getCapitalCase(((JavaFileInfoContainer) curNode).getJavaFileInfo()
1269 .getJavaName()) + EVENT_LISTENER_STRING;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301270
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301271 initiateJavaFileGeneration(file, GENERATE_EVENT_LISTENER_INTERFACE,
1272 imports, curNode, className);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301273 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301274 validateLineLength(file);
1275 }
1276
1277 /**
1278 * Generates event subject's file.
1279 *
Bharat saraswald14cbe82016-07-14 13:26:18 +05301280 * @param file file handle
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301281 * @param curNode current YANG node
1282 * @throws IOException when fails to do IO exceptions
1283 */
1284 public static void generateEventSubjectFile(File file, YangNode curNode)
1285 throws IOException {
1286
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301287 String className =
1288 getCapitalCase(((JavaFileInfoContainer) curNode).getJavaFileInfo()
1289 .getJavaName()) + EVENT_SUBJECT_NAME_SUFFIX;
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301290
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301291 initiateJavaFileGeneration(file, GENERATE_EVENT_SUBJECT_CLASS, null,
1292 curNode, className);
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301293
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301294 String path = ((JavaFileInfoContainer) curNode).getJavaFileInfo()
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301295 .getBaseCodeGenPath() +
1296 ((JavaFileInfoContainer) curNode).getJavaFileInfo()
1297 .getPackageFilePath();
Bharat saraswal039f59c2016-07-14 21:57:13 +05301298
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +05301299 TempJavaEventFragmentFiles tempFiles =
1300 ((TempJavaCodeFragmentFilesContainer) curNode)
1301 .getTempJavaCodeFragmentFiles().getEventFragmentFiles();
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301302
1303 insertDataIntoJavaFile(file, NEW_LINE);
1304 try {
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301305 insertDataIntoJavaFile(
1306 file, getDataFromTempFileHandle(EVENT_SUBJECT_ATTRIBUTE_MASK,
1307 tempFiles, path));
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301308
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301309 insertDataIntoJavaFile(
1310 file, getDataFromTempFileHandle(EVENT_SUBJECT_GETTER_MASK,
1311 tempFiles, path));
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301312
Bharat saraswal9fab16b2016-09-23 23:27:24 +05301313 insertDataIntoJavaFile(
1314 file, getDataFromTempFileHandle(EVENT_SUBJECT_SETTER_MASK,
1315 tempFiles, path));
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301316 } catch (IOException e) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301317 throw new IOException(getErrorMsg(className, EVENT_CLASS));
Bharat saraswal715d3fc2016-05-17 19:59:16 +05301318 }
1319
1320 insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
1321 validateLineLength(file);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +05301322 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +05301323
1324 /**
1325 * Returns error message string.
1326 *
1327 * @param className name of the class
1328 * @param fileType type of file
1329 * @return error message string
1330 */
1331 private static String getErrorMsg(String className, String fileType) {
1332 return "No data found in temporary java code fragment files for " +
1333 className + " while " + fileType + " file generation.";
1334 }
1335
1336 /**
1337 * Checks whether leaf is present in YANG leaves holder.
1338 *
1339 * @param holder holder of YANG leaves
1340 * @return true if leaves are present, false otherwise
1341 */
1342 private static boolean leavesPresent(YangLeavesHolder holder) {
1343 return holder.getListOfLeaf() != null &&
1344 !holder.getListOfLeaf().isEmpty() ||
1345 holder.getListOfLeafList() != null &&
1346 !holder.getListOfLeafList().isEmpty();
1347 }
Mahesh Poojary Huawei1025a172016-09-27 16:06:07 +05301348
1349 /**
1350 * Generates toString code for bits.
1351 *
1352 * @param attributeName generated variable for bits
1353 * @param yangBits parsed yang bits
1354 * @return generated toString code for bits.
1355 */
1356 private static String getToStringForBits(String attributeName, YangBits yangBits) {
1357 String lines = EIGHT_SPACE_INDENTATION + STRING_DATA_TYPE + SPACE + TMP_VAL + SPACE + EQUAL + SPACE +
1358 QUOTES + QUOTES + SEMI_COLON + NEW_LINE;
1359 Integer key;
1360 YangBit bit;
1361 String bitName;
1362 for (Map.Entry<Integer, YangBit> entry : yangBits.getBitPositionMap().entrySet()) {
1363 key = entry.getKey();
1364 bit = entry.getValue();
1365 if (bit == null) {
1366 return null;
1367 }
1368
1369 bitName = bit.getBitName();
1370 // Add if condition to check bit position
1371 lines += EIGHT_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS + attributeName +
1372 PERIOD + GET + OPEN_PARENTHESIS + key + CLOSE_PARENTHESIS + CLOSE_PARENTHESIS +
1373 SPACE + OPEN_CURLY_BRACKET + NEW_LINE + TWELVE_SPACE_INDENTATION + TMP_VAL + SPACE +
1374 ADD + EQUAL + SPACE + QUOTES + bitName + SPACE + QUOTES + SEMI_COLON + NEW_LINE +
1375 EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
1376 }
1377
1378 lines += EIGHT_SPACE_INDENTATION + TMP_VAL + PERIOD + TRIM_STRING + EMPTY_PARAMETER_FUNCTION_CALL +
1379 SEMI_COLON + NEW_LINE;
1380 return lines;
1381 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +05301382}