blob: c43346aaadb157de453934181dd683f64f317cdf [file] [log] [blame]
Bharat saraswale2d51d62016-03-23 19:40:35 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Bharat saraswale2d51d62016-03-23 19:40:35 +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
19import java.io.File;
20import java.io.IOException;
21import java.util.List;
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053022
Bharat saraswale2d51d62016-03-23 19:40:35 +053023import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053024import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
Bharat saraswale2d51d62016-03-23 19:40:35 +053025import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
26import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
27
28import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
29import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
Bharat saraswald72411a2016-04-19 01:00:16 +053030import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
Gaurav Agrawal56527662016-04-20 15:49:17 +053031import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_RPC_INTERFACE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053032import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053033import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053034import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
35import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
36import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053037import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053038import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
Bharat saraswald72411a2016-04-19 01:00:16 +053039import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053040import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053041import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053042import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
43import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
44import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053045import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.OF_STRING_IMPL_MASK;
Gaurav Agrawal56527662016-04-20 15:49:17 +053046import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.RPC_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053047import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
48import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
49import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
50import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefStart;
Bharat saraswal2f11f652016-03-25 18:19:46 +053051import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getJavaPackageFromPackagePath;
Bharat saraswald72411a2016-04-19 01:00:16 +053052import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase;
53import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
54import static org.onosproject.yangutils.utils.UtilConstants.INT;
Bharat saraswale2d51d62016-03-23 19:40:35 +053055import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
56import static org.onosproject.yangutils.utils.UtilConstants.ORG;
57import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
Bharat saraswald72411a2016-04-19 01:00:16 +053058import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053059import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
60import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
61import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053062import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS;
63import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE;
Bharat saraswald72411a2016-04-19 01:00:16 +053064import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ENUM_CLASS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053065import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMPL_CLASS;
66import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
Gaurav Agrawal56527662016-04-20 15:49:17 +053067import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.RPC_INTERFACE;
68import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Bharat saraswale2d51d62016-03-23 19:40:35 +053069import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
70
71/**
Bharat saraswald9822e92016-04-05 15:13:44 +053072 * Represents utilities for java file generator.
Bharat saraswale2d51d62016-03-23 19:40:35 +053073 */
74public final class JavaFileGeneratorUtils {
75
76 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053077 * Creates an instance of java file generator util.
Bharat saraswale2d51d62016-03-23 19:40:35 +053078 */
79 private JavaFileGeneratorUtils() {
80 }
81
82 /**
83 * Returns a file object for generated file.
84 *
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053085 * @param fileName file name
86 * @param filePath file package path
Bharat saraswale2d51d62016-03-23 19:40:35 +053087 * @param extension file extension
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +053088 * @param handle cached file handle
Bharat saraswale2d51d62016-03-23 19:40:35 +053089 * @return file object
90 */
91 public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) {
92
93 return new File(handle.getBaseCodeGenPath() + filePath + SLASH + fileName + extension);
94 }
95
96 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053097 * Returns data stored in temporary files.
Bharat saraswale2d51d62016-03-23 19:40:35 +053098 *
99 * @param generatedTempFiles temporary file types
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530100 * @param generatedTempFiles temporary file types
101 * @param tempJavaFragmentFiles temp java fragment files
Bharat saraswale2d51d62016-03-23 19:40:35 +0530102 * @return data stored in temporary files
103 * @throws IOException when failed to get the data from temporary file handle
104 */
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530105 public static String getDataFromTempFileHandle(int generatedTempFiles,
106 TempJavaFragmentFiles tempJavaFragmentFiles)
107 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530108
Bharat saraswale2d51d62016-03-23 19:40:35 +0530109
110 if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530111 return tempJavaFragmentFiles
112 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getAttributesTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530113 } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530114 return tempJavaFragmentFiles
115 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getGetterInterfaceTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530116 } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530117 return tempJavaFragmentFiles
118 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getSetterInterfaceTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530119 } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530120 return tempJavaFragmentFiles
121 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getGetterImplTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530122 } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530123 return tempJavaFragmentFiles
124 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getSetterImplTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530125 } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530126 return tempJavaFragmentFiles
127 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getConstructorImplTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530128 } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530129 return tempJavaFragmentFiles
130 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getHashCodeImplTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530131 } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530132 return tempJavaFragmentFiles
133 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getEqualsImplTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530134 } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530135 return tempJavaFragmentFiles
136 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getToStringImplTempFileHandle());
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530137 } else if ((generatedTempFiles & CONSTRUCTOR_FOR_TYPE_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530138 return tempJavaFragmentFiles
139 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530140 .getConstructorForTypeTempFileHandle());
141 } else if ((generatedTempFiles & OF_STRING_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530142 return tempJavaFragmentFiles
143 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getOfStringImplTempFileHandle());
Gaurav Agrawal56527662016-04-20 15:49:17 +0530144 } else if ((generatedTempFiles & FROM_STRING_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530145 return tempJavaFragmentFiles
146 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getFromStringImplTempFileHandle());
Bharat saraswald72411a2016-04-19 01:00:16 +0530147 } else if ((generatedTempFiles & ENUM_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530148 return tempJavaFragmentFiles
149 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getEnumClassTempFileHandle());
Gaurav Agrawal56527662016-04-20 15:49:17 +0530150 } else if ((generatedTempFiles & RPC_IMPL_MASK) != 0) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530151 return tempJavaFragmentFiles
152 .getTemporaryDataFromFileHandle(tempJavaFragmentFiles.getRpcInterfaceImplTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530153 }
154 return null;
155 }
156
157 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530158 * Initiates generation of file based on generated file type.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530159 *
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530160 * @param file generated file
Bharat saraswale2d51d62016-03-23 19:40:35 +0530161 * @param className generated file class name
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530162 * @param type generated file type
163 * @param imports imports for the file
164 * @param pkg generated file package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530165 * @throws IOException when fails to generate a file
166 */
167 public static void initiateJavaFileGeneration(File file, String className, int type, List<String> imports,
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530168 String pkg)
169 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530170
171 try {
172 file.createNewFile();
173 appendContents(file, className, type, imports, pkg);
174 } catch (IOException e) {
175 throw new IOException("Failed to create " + file.getName() + " class file.");
176 }
177 }
178
179 /**
180 * Appends all the contents into a generated java file.
181 *
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530182 * @param file generated file
183 * @param fileName generated file name
184 * @param type generated file type
185 * @param pkg generated file package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530186 * @param importsList list of java imports.
187 * @throws IOException when fails to append contents
188 */
189 private static void appendContents(File file, String fileName, int type, List<String> importsList,
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530190 String pkg)
191 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530192
193 String pkgString = parsePackageString(pkg, importsList);
194
195 if ((type & IMPL_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530196 write(file, fileName, type, IMPL_CLASS);
197 } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530198 write(file, fileName, type, BUILDER_INTERFACE);
199 } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
200 appendHeaderContents(file, pkgString, importsList);
201 write(file, fileName, type, IMPL_CLASS);
202 } else if ((type & INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530203 appendHeaderContents(file, pkgString, importsList);
204 write(file, fileName, type, INTERFACE);
205 } else if ((type & BUILDER_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530206 appendHeaderContents(file, pkgString, importsList);
207 write(file, fileName, type, BUILDER_CLASS);
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530208 } else if ((type & GENERATE_UNION_CLASS) != 0) {
209 appendHeaderContents(file, pkgString, importsList);
210 write(file, fileName, type, IMPL_CLASS);
Bharat saraswald72411a2016-04-19 01:00:16 +0530211 } else if ((type & GENERATE_ENUM_CLASS) != 0) {
212 appendHeaderContents(file, pkgString, importsList);
213 write(file, fileName, type, ENUM_CLASS);
Gaurav Agrawal56527662016-04-20 15:49:17 +0530214 } else if ((type & GENERATE_RPC_INTERFACE) != 0) {
215 appendHeaderContents(file, pkgString, importsList);
216 write(file, fileName, type, RPC_INTERFACE);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530217 }
218 }
219
220 /**
221 * Removes base directory path from package and generates package string for file.
222 *
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530223 * @param javaPkg generated java package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530224 * @param importsList list of imports
225 * @return package string
226 */
227 private static String parsePackageString(String javaPkg, List<String> importsList) {
228
229 if (javaPkg.contains(ORG)) {
230 String[] strArray = javaPkg.split(ORG);
Bharat saraswal2f11f652016-03-25 18:19:46 +0530231 javaPkg = ORG + getJavaPackageFromPackagePath(strArray[1]);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530232 }
233 if (importsList != null) {
234 if (!importsList.isEmpty()) {
235 return PACKAGE + SPACE + javaPkg + SEMI_COLAN + NEW_LINE;
236 } else {
237 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
238 }
239 } else {
240 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
241 }
242 }
243
244 /**
245 * Appends other contents to interface, builder and typedef classes.
246 * for example : ONOS copyright, imports and package.
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530247 *
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530248 * @param file generated file
249 * @param pkg generated package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530250 * @param importsList list of imports
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530251 * @throws IOException when fails to append contents
Bharat saraswale2d51d62016-03-23 19:40:35 +0530252 */
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530253 private static void appendHeaderContents(File file, String pkg, List<String> importsList)
254 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530255
256 insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
257 insertDataIntoJavaFile(file, pkg);
258
259 /*
260 * TODO: add the file header using
261 * JavaCodeSnippetGen.getFileHeaderComment
262 */
263
264 if (importsList != null) {
265 insertDataIntoJavaFile(file, NEW_LINE);
266 for (String imports : importsList) {
267 insertDataIntoJavaFile(file, imports);
268 }
269 }
270 }
271
272 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530273 * Writes data to the specific generated file.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530274 *
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530275 * @param file generated file
276 * @param fileName file name
277 * @param genType generated file type
Bharat saraswale2d51d62016-03-23 19:40:35 +0530278 * @param javaDocType java doc type
279 * @throws IOException when fails to write into a file
280 */
281 private static void write(File file, String fileName, int genType, JavaDocType javaDocType)
282 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530283 insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false));
284 insertDataIntoJavaFile(file, getJavaClassDefStart(genType, fileName));
285 }
286
Bharat saraswald72411a2016-04-19 01:00:16 +0530287 /**
288 * Returns integer attribute for enum's class to get the values.
289 *
290 * @param className enum's class name
291 * @return enum's attribute
292 */
293 public static String getEnumsValueAttribute(String className) {
294 return NEW_LINE + FOUR_SPACE_INDENTATION + PRIVATE + SPACE + INT + SPACE + getSmallCase(className) + SEMI_COLAN
295 + NEW_LINE;
296 }
297
Bharat saraswale2d51d62016-03-23 19:40:35 +0530298}