blob: 12dc41c71a4f54d31ae9c19765c276d619000904 [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 java.io.File;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053019import java.io.IOException;
Bharat saraswal250a7472016-05-12 13:16:57 +053020
Bharat saraswal250a7472016-05-12 13:16:57 +053021import org.onosproject.yangutils.datamodel.YangEnum;
22import org.onosproject.yangutils.datamodel.YangEnumeration;
23import org.onosproject.yangutils.datamodel.YangNode;
24import org.onosproject.yangutils.translator.exception.TranslatorException;
Shankara-Huaweib7564772016-08-02 18:13:13 +053025import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeTranslator;
Bharat saraswal2da23bf2016-08-25 15:28:39 +053026import org.onosproject.yangutils.utils.io.YangPluginConfig;
Bharat saraswal250a7472016-05-12 13:16:57 +053027
Bharat saraswal8beac342016-08-04 02:00:03 +053028import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32;
Bharat saraswal250a7472016-05-12 13:16:57 +053029import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
30import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
Bharat saraswal748fc3c2016-09-06 16:38:20 +053031import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen
32 .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 /**
55 * File name for enum class file name suffix.
56 */
57 private static final String ENUM_CLASS_FILE_NAME_SUFFIX = EMPTY_STRING;
58
59 /**
Bharat saraswal250a7472016-05-12 13:16:57 +053060 * Temporary file handle for enum class file.
61 */
62 private File enumClassTempFileHandle;
63
64 /**
65 * Java file handle for enum class.
66 */
67 private File enumClassJavaFileHandle;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053068
69 /**
70 * Creates an instance of temporary java code fragment.
71 *
72 * @param javaFileInfo generated java file info
73 * @throws IOException when fails to create new file handle
74 */
Bharat saraswale50edca2016-08-05 01:58:25 +053075 TempJavaEnumerationFragmentFiles(JavaFileInfoTranslator javaFileInfo)
Vinod Kumar S79a374b2016-04-30 21:09:15 +053076 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +053077
Vinod Kumar S79a374b2016-04-30 21:09:15 +053078 super(javaFileInfo);
Bharat saraswal250a7472016-05-12 13:16:57 +053079 /*
80 * Initialize enum when generation file type matches to enum class mask.
81 */
82 addGeneratedTempFile(ENUM_IMPL_MASK);
83 setEnumClassTempFileHandle(getTemporaryFileHandle(ENUM_CLASS_TEMP_FILE_NAME));
84 }
85
86 /**
87 * Returns enum class java file handle.
88 *
89 * @return enum class java file handle
90 */
Bharat saraswal64e7e232016-07-14 23:33:55 +053091 private File getEnumClassJavaFileHandle() {
Bharat saraswal250a7472016-05-12 13:16:57 +053092 return enumClassJavaFileHandle;
93 }
94
95 /**
96 * Sets enum class java file handle.
97 *
98 * @param enumClassJavaFileHandle enum class java file handle
99 */
100 private void setEnumClassJavaFileHandle(File enumClassJavaFileHandle) {
101 this.enumClassJavaFileHandle = enumClassJavaFileHandle;
102 }
103
104 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530105 * Returns temporary file handle for enum class file.
106 *
107 * @return temporary file handle for enum class file
108 */
109 public File getEnumClassTempFileHandle() {
110 return enumClassTempFileHandle;
111 }
112
113 /**
114 * Sets temporary file handle for enum class file.
115 *
116 * @param enumClassTempFileHandle temporary file handle for enum class file
117 */
118 private void setEnumClassTempFileHandle(File enumClassTempFileHandle) {
119 this.enumClassTempFileHandle = enumClassTempFileHandle;
120 }
121
122 /**
123 * Adds enum class attributes to temporary file.
124 *
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530125 * @param yangEnum YANG enum
Bharat saraswal250a7472016-05-12 13:16:57 +0530126 * @throws IOException when fails to do IO operations.
127 */
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530128 private void addAttributesForEnumClass(YangPluginConfig pluginConfig, YangEnum yangEnum)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530129 throws IOException {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530130 appendToFile(getEnumClassTempFileHandle(),
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530131 generateEnumAttributeStringWithSchemaName(yangEnum.getNamedValue(),
132 yangEnum.getValue(), pluginConfig));
Bharat saraswal250a7472016-05-12 13:16:57 +0530133 }
134
135 /**
136 * Adds enum attributes to temporary files.
137 *
Bharat saraswal64e7e232016-07-14 23:33:55 +0530138 * @param curNode current YANG node
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530139 * @param pluginConfig plugin configurations
Bharat saraswal250a7472016-05-12 13:16:57 +0530140 * @throws IOException when fails to do IO operations
141 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530142 void addEnumAttributeToTempFiles(YangNode curNode, YangPluginConfig pluginConfig)
143 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +0530144
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530145 super.addJavaSnippetInfoToApplicableTempFiles(getJavaAttributeForEnum(pluginConfig), pluginConfig);
Bharat saraswal250a7472016-05-12 13:16:57 +0530146 if (curNode instanceof YangEnumeration) {
147 YangEnumeration enumeration = (YangEnumeration) curNode;
148 for (YangEnum curEnum : enumeration.getEnumSet()) {
janani b3e357f62016-05-19 17:39:50 +0530149 String enumName = curEnum.getNamedValue();
Bharat saraswal64e7e232016-07-14 23:33:55 +0530150 String prefixForIdentifier;
janani b3e357f62016-05-19 17:39:50 +0530151 if (enumName.matches(REGEX_FOR_FIRST_DIGIT)) {
152 prefixForIdentifier = getPrefixForIdentifier(pluginConfig.getConflictResolver());
153 if (prefixForIdentifier != null) {
154 curEnum.setNamedValue(prefixForIdentifier + enumName);
155 } else {
156 curEnum.setNamedValue(YANG_AUTO_PREFIX + enumName);
157 }
158 }
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530159 addJavaSnippetInfoToApplicableTempFiles(pluginConfig, curEnum);
Bharat saraswal250a7472016-05-12 13:16:57 +0530160 }
161 } else {
Bharat saraswale3175d32016-08-31 17:50:11 +0530162 throw new TranslatorException("current node should be of enumeration type. " +
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530163 curNode.getName() + " in " + curNode.getLineNumber() + " at " +
164 curNode.getCharPosition()
165 + " in " + curNode.getFileName());
Bharat saraswal250a7472016-05-12 13:16:57 +0530166 }
167 }
168
169 /**
Bharat saraswal64e7e232016-07-14 23:33:55 +0530170 * Returns java attribute for enum class.
171 *
172 * @param pluginConfig plugin configurations
173 * @return java attribute
174 */
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530175 private JavaAttributeInfo getJavaAttributeForEnum(YangPluginConfig pluginConfig) {
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530176 YangJavaTypeTranslator javaType = new YangJavaTypeTranslator();
Bharat saraswal8beac342016-08-04 02:00:03 +0530177 javaType.setDataType(INT32);
178 javaType.setDataTypeName(INT);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530179 javaType.updateJavaQualifiedInfo(pluginConfig.getConflictResolver());
Bharat saraswal250a7472016-05-12 13:16:57 +0530180 return getAttributeInfoForTheData(
181 javaType.getJavaQualifiedInfo(),
182 javaType.getDataTypeName(), javaType,
183 getIsQualifiedAccessOrAddToImportList(javaType.getJavaQualifiedInfo()),
184 false);
185 }
186
187 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530188 * Adds the new attribute info to the target generated temporary files.
189 *
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530190 * @param yangEnum@throws IOException IO operation fail
Bharat saraswal250a7472016-05-12 13:16:57 +0530191 */
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530192 private void addJavaSnippetInfoToApplicableTempFiles(YangPluginConfig pluginConfig, YangEnum yangEnum)
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530193 throws IOException {
Bharat saraswal748fc3c2016-09-06 16:38:20 +0530194 addAttributesForEnumClass(pluginConfig, yangEnum);
Bharat saraswal250a7472016-05-12 13:16:57 +0530195 }
196
197 /**
198 * Constructs java code exit.
199 *
200 * @param fileType generated file type
Bharat saraswal64e7e232016-07-14 23:33:55 +0530201 * @param curNode current YANG node
Bharat saraswal250a7472016-05-12 13:16:57 +0530202 * @throws IOException when fails to generate java files
203 */
204 @Override
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530205 public void generateJavaFile(int fileType, YangNode curNode)
206 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +0530207 createPackage(curNode);
208 setEnumClassJavaFileHandle(getJavaFileHandle(getJavaClassName(ENUM_CLASS_FILE_NAME_SUFFIX)));
209 setEnumClassJavaFileHandle(generateEnumClassFile(getEnumClassJavaFileHandle(), curNode));
210 freeTemporaryResources(false);
211 }
212
213 /**
214 * Removes all temporary file handles.
215 *
Bharat saraswal64e7e232016-07-14 23:33:55 +0530216 * @param isErrorOccurred flag to tell translator that error has occurred while file generation
Bharat saraswal250a7472016-05-12 13:16:57 +0530217 * @throws IOException when failed to delete the temporary files
218 */
219 @Override
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530220 public void freeTemporaryResources(boolean isErrorOccurred)
221 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +0530222 closeFile(getEnumClassJavaFileHandle(), isErrorOccurred);
223 closeFile(getEnumClassTempFileHandle(), true);
224 super.freeTemporaryResources(isErrorOccurred);
225 }
226
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530227}