blob: cb1263f9fee7904eef9e8d90e3069dc74bcdde69 [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;
Bharat saraswale2d51d62016-03-23 19:40:35 +053022import org.onosproject.yangutils.datamodel.YangNode;
23import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
24import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
25import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
26import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
27import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
28
29import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
30import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
Bharat saraswald72411a2016-04-19 01:00:16 +053031import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
Gaurav Agrawal56527662016-04-20 15:49:17 +053032import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_RPC_INTERFACE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053033import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053034import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053035import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
36import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
37import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053038import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053039import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
Bharat saraswald72411a2016-04-19 01:00:16 +053040import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053041import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
42import 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;
Gaurav Agrawal56527662016-04-20 15:49:17 +053050import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053051import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefStart;
Bharat saraswal2f11f652016-03-25 18:19:46 +053052import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getJavaPackageFromPackagePath;
Bharat saraswald72411a2016-04-19 01:00:16 +053053import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase;
54import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
55import static org.onosproject.yangutils.utils.UtilConstants.INT;
Bharat saraswale2d51d62016-03-23 19:40:35 +053056import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
57import static org.onosproject.yangutils.utils.UtilConstants.ORG;
58import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
Bharat saraswald72411a2016-04-19 01:00:16 +053059import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053060import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
61import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
62import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053063import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS;
64import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE;
Bharat saraswald72411a2016-04-19 01:00:16 +053065import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ENUM_CLASS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053066import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMPL_CLASS;
67import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
Gaurav Agrawal56527662016-04-20 15:49:17 +053068import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.RPC_INTERFACE;
69import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Bharat saraswale2d51d62016-03-23 19:40:35 +053070import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
71
72/**
Bharat saraswald9822e92016-04-05 15:13:44 +053073 * Represents utilities for java file generator.
Bharat saraswale2d51d62016-03-23 19:40:35 +053074 */
75public final class JavaFileGeneratorUtils {
76
77 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053078 * Creates an instance of java file generator util.
Bharat saraswale2d51d62016-03-23 19:40:35 +053079 */
80 private JavaFileGeneratorUtils() {
81 }
82
83 /**
84 * Returns a file object for generated file.
85 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +053086 * @param fileName file name
87 * @param filePath file package path
Bharat saraswale2d51d62016-03-23 19:40:35 +053088 * @param extension file extension
Gaurav Agrawal338735b2016-04-18 18:53:11 +053089 * @param handle cached file handle
Bharat saraswale2d51d62016-03-23 19:40:35 +053090 * @return file object
91 */
92 public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) {
93
94 return new File(handle.getBaseCodeGenPath() + filePath + SLASH + fileName + extension);
95 }
96
97 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053098 * Returns data stored in temporary files.
Bharat saraswale2d51d62016-03-23 19:40:35 +053099 *
100 * @param generatedTempFiles temporary file types
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530101 * @param curNode current YANG node
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 */
105 public static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
106
107 TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
108 .getTempJavaCodeFragmentFiles();
109
110 if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
111 return tempJavaCodeFragmentFiles
112 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getAttributesTempFileHandle());
113 } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
114 return tempJavaCodeFragmentFiles
115 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterInterfaceTempFileHandle());
116 } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
117 return tempJavaCodeFragmentFiles
118 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterInterfaceTempFileHandle());
119 } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
120 return tempJavaCodeFragmentFiles
121 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterImplTempFileHandle());
122 } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
123 return tempJavaCodeFragmentFiles
124 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterImplTempFileHandle());
125 } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
126 return tempJavaCodeFragmentFiles
127 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getConstructorImplTempFileHandle());
128 } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
129 return tempJavaCodeFragmentFiles
130 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getHashCodeImplTempFileHandle());
131 } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
132 return tempJavaCodeFragmentFiles
133 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEqualsImplTempFileHandle());
134 } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
135 return tempJavaCodeFragmentFiles
136 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getToStringImplTempFileHandle());
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530137 } else if ((generatedTempFiles & CONSTRUCTOR_FOR_TYPE_MASK) != 0) {
138 return tempJavaCodeFragmentFiles
139 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles
140 .getConstructorForTypeTempFileHandle());
141 } else if ((generatedTempFiles & OF_STRING_IMPL_MASK) != 0) {
142 return tempJavaCodeFragmentFiles
143 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getOfStringImplTempFileHandle());
Gaurav Agrawal56527662016-04-20 15:49:17 +0530144 } else if ((generatedTempFiles & FROM_STRING_IMPL_MASK) != 0) {
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530145 return tempJavaCodeFragmentFiles
Gaurav Agrawal56527662016-04-20 15:49:17 +0530146 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getFromStringImplTempFileHandle());
Bharat saraswald72411a2016-04-19 01:00:16 +0530147 } else if ((generatedTempFiles & ENUM_IMPL_MASK) != 0) {
148 return tempJavaCodeFragmentFiles
149 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEnumClassTempFileHandle());
Gaurav Agrawal56527662016-04-20 15:49:17 +0530150 } else if ((generatedTempFiles & RPC_IMPL_MASK) != 0) {
151 return tempJavaCodeFragmentFiles
152 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.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 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530160 * @param file generated file
Bharat saraswale2d51d62016-03-23 19:40:35 +0530161 * @param className generated file class name
Gaurav Agrawal338735b2016-04-18 18:53:11 +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,
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530168 String pkg) throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530169
170 try {
171 file.createNewFile();
172 appendContents(file, className, type, imports, pkg);
173 } catch (IOException e) {
174 throw new IOException("Failed to create " + file.getName() + " class file.");
175 }
176 }
177
178 /**
179 * Appends all the contents into a generated java file.
180 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530181 * @param file generated file
182 * @param fileName generated file name
183 * @param type generated file type
184 * @param pkg generated file package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530185 * @param importsList list of java imports.
186 * @throws IOException when fails to append contents
187 */
188 private static void appendContents(File file, String fileName, int type, List<String> importsList,
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530189 String pkg) throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530190
191 String pkgString = parsePackageString(pkg, importsList);
192
193 if ((type & IMPL_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530194 write(file, fileName, type, IMPL_CLASS);
195 } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530196 write(file, fileName, type, BUILDER_INTERFACE);
197 } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
198 appendHeaderContents(file, pkgString, importsList);
199 write(file, fileName, type, IMPL_CLASS);
200 } else if ((type & INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530201 appendHeaderContents(file, pkgString, importsList);
202 write(file, fileName, type, INTERFACE);
203 } else if ((type & BUILDER_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530204 appendHeaderContents(file, pkgString, importsList);
205 write(file, fileName, type, BUILDER_CLASS);
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530206 } else if ((type & GENERATE_UNION_CLASS) != 0) {
207 appendHeaderContents(file, pkgString, importsList);
208 write(file, fileName, type, IMPL_CLASS);
Bharat saraswald72411a2016-04-19 01:00:16 +0530209 } else if ((type & GENERATE_ENUM_CLASS) != 0) {
210 appendHeaderContents(file, pkgString, importsList);
211 write(file, fileName, type, ENUM_CLASS);
Gaurav Agrawal56527662016-04-20 15:49:17 +0530212 } else if ((type & GENERATE_RPC_INTERFACE) != 0) {
213 appendHeaderContents(file, pkgString, importsList);
214 write(file, fileName, type, RPC_INTERFACE);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530215 }
216 }
217
218 /**
219 * Removes base directory path from package and generates package string for file.
220 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530221 * @param javaPkg generated java package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530222 * @param importsList list of imports
223 * @return package string
224 */
225 private static String parsePackageString(String javaPkg, List<String> importsList) {
226
227 if (javaPkg.contains(ORG)) {
228 String[] strArray = javaPkg.split(ORG);
Bharat saraswal2f11f652016-03-25 18:19:46 +0530229 javaPkg = ORG + getJavaPackageFromPackagePath(strArray[1]);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530230 }
231 if (importsList != null) {
232 if (!importsList.isEmpty()) {
233 return PACKAGE + SPACE + javaPkg + SEMI_COLAN + NEW_LINE;
234 } else {
235 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
236 }
237 } else {
238 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
239 }
240 }
241
242 /**
243 * Appends other contents to interface, builder and typedef classes.
244 * for example : ONOS copyright, imports and package.
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530245 *
246 * @param file generated file
247 * @param pkg generated package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530248 * @param importsList list of imports
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530249 * @throws IOException when fails to append contents
Bharat saraswale2d51d62016-03-23 19:40:35 +0530250 */
251 private static void appendHeaderContents(File file, String pkg, List<String> importsList) throws IOException {
252
253 insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
254 insertDataIntoJavaFile(file, pkg);
255
256 /*
257 * TODO: add the file header using
258 * JavaCodeSnippetGen.getFileHeaderComment
259 */
260
261 if (importsList != null) {
262 insertDataIntoJavaFile(file, NEW_LINE);
263 for (String imports : importsList) {
264 insertDataIntoJavaFile(file, imports);
265 }
266 }
267 }
268
269 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530270 * Writes data to the specific generated file.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530271 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530272 * @param file generated file
273 * @param fileName file name
274 * @param genType generated file type
Bharat saraswale2d51d62016-03-23 19:40:35 +0530275 * @param javaDocType java doc type
276 * @throws IOException when fails to write into a file
277 */
278 private static void write(File file, String fileName, int genType, JavaDocType javaDocType)
279 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530280 insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false));
281 insertDataIntoJavaFile(file, getJavaClassDefStart(genType, fileName));
282 }
283
Bharat saraswald72411a2016-04-19 01:00:16 +0530284 /**
285 * Returns integer attribute for enum's class to get the values.
286 *
287 * @param className enum's class name
288 * @return enum's attribute
289 */
290 public static String getEnumsValueAttribute(String className) {
291 return NEW_LINE + FOUR_SPACE_INDENTATION + PRIVATE + SPACE + INT + SPACE + getSmallCase(className) + SEMI_COLAN
292 + NEW_LINE;
293 }
294
Bharat saraswale2d51d62016-03-23 19:40:35 +0530295}