blob: 783a310621fcced8f7a44f2168ed72d6e7b9d7f3 [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
Bharat saraswal250a7472016-05-12 13:16:57 +053018import org.onosproject.yangutils.datamodel.YangEnum;
19import org.onosproject.yangutils.datamodel.YangEnumeration;
20import org.onosproject.yangutils.datamodel.YangNode;
21import org.onosproject.yangutils.translator.exception.TranslatorException;
Shankara-Huaweib7564772016-08-02 18:13:13 +053022import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeTranslator;
Bharat saraswal2da23bf2016-08-25 15:28:39 +053023import org.onosproject.yangutils.utils.io.YangPluginConfig;
Bharat saraswal250a7472016-05-12 13:16:57 +053024
Bharat saraswal9fab16b2016-09-23 23:27:24 +053025import java.io.File;
26import java.io.IOException;
Bharat saraswal54e4bab2016-10-05 23:32:14 +053027import java.util.List;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053028
Bharat saraswal8beac342016-08-04 02:00:03 +053029import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32;
Bharat saraswal250a7472016-05-12 13:16:57 +053030import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
31import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053032import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.generateEnumAttributeStringWithSchemaName;
Bharat saraswal250a7472016-05-12 13:16:57 +053033import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateEnumClassFile;
Bharat saraswal8beac342016-08-04 02:00:03 +053034import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
Bharat saraswal250a7472016-05-12 13:16:57 +053035import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
Bharat saraswal8beac342016-08-04 02:00:03 +053036import static org.onosproject.yangutils.utils.UtilConstants.INT;
janani b3e357f62016-05-19 17:39:50 +053037import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_FIRST_DIGIT;
38import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUTO_PREFIX;
Bharat saraswal8beac342016-08-04 02:00:03 +053039import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
40import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPrefixForIdentifier;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053041
42/**
Bharat saraswal64e7e232016-07-14 23:33:55 +053043 * Represents implementation of java code fragments temporary implementations. Maintains the temp files required
44 * specific for enumeration java snippet generation.
Vinod Kumar S79a374b2016-04-30 21:09:15 +053045 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053046public class TempJavaEnumerationFragmentFiles
47 extends TempJavaFragmentFiles {
Bharat saraswal250a7472016-05-12 13:16:57 +053048
49 /**
50 * File name for temporary enum class.
51 */
52 private static final String ENUM_CLASS_TEMP_FILE_NAME = "EnumClass";
53
54 /**
Bharat saraswal250a7472016-05-12 13:16:57 +053055 * Temporary file handle for enum class file.
56 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +053057 private final File enumClassTempFileHandle;
Bharat saraswal250a7472016-05-12 13:16:57 +053058
59 /**
60 * Java file handle for enum class.
61 */
62 private File enumClassJavaFileHandle;
Bharat saraswal54e4bab2016-10-05 23:32:14 +053063 private boolean isEnumClass;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053064
65 /**
66 * Creates an instance of temporary java code fragment.
67 *
68 * @param javaFileInfo generated java file info
69 * @throws IOException when fails to create new file handle
70 */
Bharat saraswal54e4bab2016-10-05 23:32:14 +053071 public TempJavaEnumerationFragmentFiles(JavaFileInfoTranslator javaFileInfo)
Vinod Kumar S79a374b2016-04-30 21:09:15 +053072 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +053073
Vinod Kumar S79a374b2016-04-30 21:09:15 +053074 super(javaFileInfo);
Bharat saraswal250a7472016-05-12 13:16:57 +053075 /*
76 * Initialize enum when generation file type matches to enum class mask.
77 */
78 addGeneratedTempFile(ENUM_IMPL_MASK);
Bharat saraswal9fab16b2016-09-23 23:27:24 +053079 enumClassTempFileHandle = getTemporaryFileHandle(ENUM_CLASS_TEMP_FILE_NAME);
Bharat saraswal250a7472016-05-12 13:16:57 +053080 }
81
82 /**
Bharat saraswal250a7472016-05-12 13:16:57 +053083 * Returns temporary file handle for enum class file.
84 *
85 * @return temporary file handle for enum class file
86 */
87 public File getEnumClassTempFileHandle() {
88 return enumClassTempFileHandle;
89 }
90
91 /**
Bharat saraswal250a7472016-05-12 13:16:57 +053092 * Adds enum class attributes to temporary file.
93 *
Bharat saraswal748fc3c2016-09-06 16:38:20 +053094 * @param yangEnum YANG enum
Bharat saraswal250a7472016-05-12 13:16:57 +053095 * @throws IOException when fails to do IO operations.
96 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +053097 private void addAttributesForEnumClass(YangEnum yangEnum)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053098 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +053099 appendToFile(enumClassTempFileHandle,
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530100 generateEnumAttributeStringWithSchemaName(yangEnum.getNamedValue(),
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530101 yangEnum.getValue()));
Bharat saraswal250a7472016-05-12 13:16:57 +0530102 }
103
104 /**
105 * Adds enum attributes to temporary files.
106 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530107 * @param curNode current YANG node
108 * @param config plugin configurations
Bharat saraswal250a7472016-05-12 13:16:57 +0530109 * @throws IOException when fails to do IO operations
110 */
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530111 public void addEnumAttributeToTempFiles(YangNode curNode,
112 YangPluginConfig config)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530113 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +0530114
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530115 addJavaSnippetInfoToApplicableTempFiles(getJavaAttributeForEnum(config),
116 config);
Bharat saraswal250a7472016-05-12 13:16:57 +0530117 if (curNode instanceof YangEnumeration) {
118 YangEnumeration enumeration = (YangEnumeration) curNode;
119 for (YangEnum curEnum : enumeration.getEnumSet()) {
janani b3e357f62016-05-19 17:39:50 +0530120 String enumName = curEnum.getNamedValue();
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530121 String prefix;
janani b3e357f62016-05-19 17:39:50 +0530122 if (enumName.matches(REGEX_FOR_FIRST_DIGIT)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530123 prefix = getPrefixForIdentifier(
124 config.getConflictResolver());
125 if (prefix != null) {
126 curEnum.setNamedValue(prefix + enumName);
janani b3e357f62016-05-19 17:39:50 +0530127 } else {
128 curEnum.setNamedValue(YANG_AUTO_PREFIX + enumName);
129 }
130 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530131 addJavaSnippetInfoToApplicableTempFiles(curEnum);
Bharat saraswal250a7472016-05-12 13:16:57 +0530132 }
133 } else {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530134 throw new TranslatorException(
135 "current node should be of enumeration type. " +
136 curNode.getName() + " in " + curNode.getLineNumber() +
137 " at " + curNode.getCharPosition() + " in " + curNode
138 .getFileName());
Bharat saraswal250a7472016-05-12 13:16:57 +0530139 }
140 }
141
142 /**
Bharat saraswal64e7e232016-07-14 23:33:55 +0530143 * Returns java attribute for enum class.
144 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530145 * @param config plugin configurations
Bharat saraswal64e7e232016-07-14 23:33:55 +0530146 * @return java attribute
147 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530148 private JavaAttributeInfo getJavaAttributeForEnum(YangPluginConfig config) {
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530149 YangJavaTypeTranslator javaType = new YangJavaTypeTranslator();
Bharat saraswal8beac342016-08-04 02:00:03 +0530150 javaType.setDataType(INT32);
151 javaType.setDataTypeName(INT);
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530152 javaType.updateJavaQualifiedInfo(config.getConflictResolver());
Bharat saraswal250a7472016-05-12 13:16:57 +0530153 return getAttributeInfoForTheData(
154 javaType.getJavaQualifiedInfo(),
155 javaType.getDataTypeName(), javaType,
156 getIsQualifiedAccessOrAddToImportList(javaType.getJavaQualifiedInfo()),
157 false);
158 }
159
160 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530161 * Adds the new attribute info to the target generated temporary files.
162 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530163 * @param yangEnum @throws IOException IO operation fail
Bharat saraswal250a7472016-05-12 13:16:57 +0530164 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530165 private void addJavaSnippetInfoToApplicableTempFiles(YangEnum yangEnum)
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530166 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530167 addAttributesForEnumClass(yangEnum);
Bharat saraswal250a7472016-05-12 13:16:57 +0530168 }
169
170 /**
171 * Constructs java code exit.
172 *
173 * @param fileType generated file type
Bharat saraswal64e7e232016-07-14 23:33:55 +0530174 * @param curNode current YANG node
Bharat saraswal250a7472016-05-12 13:16:57 +0530175 * @throws IOException when fails to generate java files
176 */
177 @Override
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530178 public void generateJavaFile(int fileType, YangNode curNode)
179 throws IOException {
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530180
Bharat saraswal51c5d672016-11-13 09:03:48 +0530181 List<String> imports = this.getJavaImportData().getImports(true);
Bharat saraswal250a7472016-05-12 13:16:57 +0530182 createPackage(curNode);
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530183 enumClassJavaFileHandle = getJavaFileHandle(getJavaClassName(EMPTY_STRING));
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530184 generateEnumClassFile(enumClassJavaFileHandle, curNode, imports);
Bharat saraswal250a7472016-05-12 13:16:57 +0530185 freeTemporaryResources(false);
186 }
187
188 /**
189 * Removes all temporary file handles.
190 *
Bharat saraswal64e7e232016-07-14 23:33:55 +0530191 * @param isErrorOccurred flag to tell translator that error has occurred while file generation
Bharat saraswal250a7472016-05-12 13:16:57 +0530192 * @throws IOException when failed to delete the temporary files
193 */
194 @Override
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530195 public void freeTemporaryResources(boolean isErrorOccurred)
196 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530197 closeFile(enumClassJavaFileHandle, isErrorOccurred);
198 closeFile(enumClassTempFileHandle, true);
Bharat saraswal54e4bab2016-10-05 23:32:14 +0530199 if (isEnumClass) {
200 super.freeTemporaryResources(isErrorOccurred);
201 }
202 }
203
204 public boolean isEnumClass() {
205 return isEnumClass;
206 }
207
208 /**
209 * Sets true if free super resources is required.
210 *
211 * @param enumClass true if free super resources is required
212 */
213 public void setEnumClass(boolean enumClass) {
214 isEnumClass = enumClass;
Bharat saraswal250a7472016-05-12 13:16:57 +0530215 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530216}