blob: ab537c8419d1d34350a0c39a7c2cd1e6ce8d1468 [file] [log] [blame]
Bharat saraswal4bf8b152016-02-25 02:26:43 +05301/*
2 * Copyright 2016 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 */
16
17package org.onosproject.yangutils.translator.tojava.utils;
18
19import java.io.File;
20import java.io.IOException;
Bharat saraswal2f00b4b2016-03-04 20:08:09 +053021import java.util.ArrayList;
Bharat saraswal4bf8b152016-02-25 02:26:43 +053022import java.util.List;
23
Bharat saraswal2f00b4b2016-03-04 20:08:09 +053024import org.apache.commons.io.FileUtils;
Vinod Kumar S38046502016-03-23 15:30:27 +053025import org.onosproject.yangutils.datamodel.YangNode;
26import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
27import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
28import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
29import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
Bharat saraswal4bf8b152016-02-25 02:26:43 +053030import org.onosproject.yangutils.utils.UtilConstants;
31import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
32import org.onosproject.yangutils.utils.io.impl.FileSystemUtil;
33import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
Bharat saraswal4bf8b152016-02-25 02:26:43 +053034import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
Vinod Kumar S38046502016-03-23 15:30:27 +053035
36import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
37import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
38import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
39import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
40import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
41import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
42import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
43import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
44import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
45import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
46import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
47import 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.JavaIdentifierSyntax.getCaptialCase;
51import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getBuildString;
52import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getConstructorStart;
53import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getDefaultConstructorString;
54import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethodClose;
55import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethodOpen;
56import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodClose;
57import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodOpen;
58import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
59import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
60import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.parseBuilderInterfaceBuildMethodString;
61import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.partString;
Bharat saraswal4bf8b152016-02-25 02:26:43 +053062
Vinod Kumar Sc4216002016-03-03 19:55:30 +053063/**
64 * Generates java file.
65 */
Bharat saraswal4bf8b152016-02-25 02:26:43 +053066public final class JavaFileGenerator {
67
Bharat saraswal4bf8b152016-02-25 02:26:43 +053068 /**
69 * Default constructor.
70 */
71 private JavaFileGenerator() {
72 }
73
74 /**
Vinod Kumar Sc4216002016-03-03 19:55:30 +053075 * Returns a file object for generated file.
76 *
77 * @param fileName file name
78 * @param filePath file package path
79 * @param extension file extension
Bharat saraswal2f00b4b2016-03-04 20:08:09 +053080 * @param handle cached file handle
Vinod Kumar Sc4216002016-03-03 19:55:30 +053081 * @return file object
82 */
Vinod Kumar S38046502016-03-23 15:30:27 +053083 public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) {
84
85 return new File(handle.getBaseCodeGenPath() + filePath + File.separator + fileName + extension);
Vinod Kumar Sc4216002016-03-03 19:55:30 +053086 }
87
88 /**
Bharat saraswal4bf8b152016-02-25 02:26:43 +053089 * Returns generated interface file for current node.
Vinod Kumar Sc4216002016-03-03 19:55:30 +053090 *
Bharat saraswal4bf8b152016-02-25 02:26:43 +053091 * @param file file
Bharat saraswal4bf8b152016-02-25 02:26:43 +053092 * @param imports imports for the file
Vinod Kumar S38046502016-03-23 15:30:27 +053093 * @param curNode current YANG node
Bharat saraswal4bf8b152016-02-25 02:26:43 +053094 * @return interface file
Vinod Kumar Sc4216002016-03-03 19:55:30 +053095 * @throws IOException when fails to write in file
Bharat saraswal4bf8b152016-02-25 02:26:43 +053096 */
Vinod Kumar S38046502016-03-23 15:30:27 +053097 public static File generateInterfaceFile(File file, List<String> imports, YangNode curNode) throws IOException {
Vinod Kumar Sc4216002016-03-03 19:55:30 +053098
Vinod Kumar S38046502016-03-23 15:30:27 +053099 JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530100
Vinod Kumar S38046502016-03-23 15:30:27 +0530101 String className = getCaptialCase(javaFileInfo.getJavaName());
102 String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
103
104 initiateFile(file, className, INTERFACE_MASK, imports, path);
105
106 /**
107 * Add getter methods to interface file.
108 */
109 try {
110 appendMethod(file, getDataFromTempFileHandle(GETTER_FOR_INTERFACE_MASK, curNode));
111 } catch (IOException e) {
112 throw new IOException("No data found in temporary java code fragment files for " + className
113 + " while interface file generation");
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530114 }
115 return file;
116 }
117
118 /**
119 * Return generated builder interface file for current node.
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530120 *
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530121 * @param file file
Vinod Kumar S38046502016-03-23 15:30:27 +0530122 * @param curNode current YANG node
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530123 * @return builder interface file
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530124 * @throws IOException when fails to write in file
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530125 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530126 public static File generateBuilderInterfaceFile(File file, YangNode curNode) throws IOException {
127
128 JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
129
130 String className = getCaptialCase(javaFileInfo.getJavaName());
131 String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
132
133 initiateFile(file, className, BUILDER_INTERFACE_MASK, null, path);
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530134 List<String> methods = new ArrayList<>();
135
Vinod Kumar S38046502016-03-23 15:30:27 +0530136 try {
137 methods.add(UtilConstants.FOUR_SPACE_INDENTATION
138 + getDataFromTempFileHandle(GETTER_FOR_INTERFACE_MASK, curNode));
139 methods.add(UtilConstants.NEW_LINE);
140 methods.add(UtilConstants.FOUR_SPACE_INDENTATION
141 + getDataFromTempFileHandle(SETTER_FOR_INTERFACE_MASK, curNode));
142 } catch (IOException e) {
143 throw new IOException("No data found in temporary java code fragment files for " + className
144 + " while builder interface file generation");
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530145 }
Vinod Kumar S38046502016-03-23 15:30:27 +0530146
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530147 /**
148 * Add build method to builder interface file.
149 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530150 methods.add(parseBuilderInterfaceBuildMethodString(className));
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530151
152 /**
153 * Add getters and setters in builder interface.
154 */
155 for (String method : methods) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530156 appendMethod(file, method);
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530157 }
158
159 insert(file, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
160 return file;
161 }
162
163 /**
164 * Returns generated builder class file for current node.
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530165 *
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530166 * @param file file
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530167 * @param imports imports for the file
Vinod Kumar S38046502016-03-23 15:30:27 +0530168 * @param curNode current YANG node
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530169 * @return builder class file
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530170 * @throws IOException when fails to write in file
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530171 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530172 public static File generateBuilderClassFile(File file, List<String> imports, YangNode curNode) throws IOException {
173
174 JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
175
176 String className = getCaptialCase(javaFileInfo.getJavaName());
177 String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
178
179 initiateFile(file, className, BUILDER_CLASS_MASK, imports, path);
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530180
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530181 List<String> methods = new ArrayList<>();
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530182
Vinod Kumar S38046502016-03-23 15:30:27 +0530183 /**
184 * Add attribute strings.
185 */
186 try {
187 insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
188 + getDataFromTempFileHandle(ATTRIBUTES_MASK, curNode));
189 } catch (IOException e) {
190 throw new IOException("No data found in temporary java code fragment files for " + className
191 + " while builder class file generation");
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530192 }
Vinod Kumar S38046502016-03-23 15:30:27 +0530193
194 try {
195 methods.add(getDataFromTempFileHandle(GETTER_FOR_CLASS_MASK, curNode));
196 methods.add(getDataFromTempFileHandle(SETTER_FOR_CLASS_MASK, curNode) + UtilConstants.NEW_LINE);
197 } catch (IOException e) {
198 throw new IOException("No data found in temporary java code fragment files for " + className
199 + " while builder class file generation");
200 }
201
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530202 /**
203 * Add default constructor and build method impl.
204 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530205 methods.add(getBuildString(className) + UtilConstants.NEW_LINE);
206 methods.add(UtilConstants.NEW_LINE
207 + getDefaultConstructorString(className + UtilConstants.BUILDER, UtilConstants.PUBLIC));
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530208
209 /**
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530210 * Add methods in builder class.
211 */
212 for (String method : methods) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530213 appendMethod(file, method);
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530214 }
215 return file;
216 }
217
218 /**
219 * Returns generated impl class file for current node.
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530220 *
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530221 * @param file file
Vinod Kumar S38046502016-03-23 15:30:27 +0530222 * @param curNode current YANG node
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530223 * @return impl class file
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530224 * @throws IOException when fails to write in file
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530225 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530226 public static File generateImplClassFile(File file, YangNode curNode)
227 throws IOException {
228
229 JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
230
231 String className = getCaptialCase(javaFileInfo.getJavaName());
232 String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
233
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530234 initiateFile(file, className, IMPL_CLASS_MASK, null, path);
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530235
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530236 List<String> methods = new ArrayList<>();
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530237
Vinod Kumar S38046502016-03-23 15:30:27 +0530238 /**
239 * Add attribute strings.
240 */
241 try {
242 insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
243 + getDataFromTempFileHandle(ATTRIBUTES_MASK, curNode));
244 } catch (IOException e) {
245 throw new IOException("No data found in temporary java code fragment files for " + className
246 + " while impl class file generation");
247 }
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530248
Vinod Kumar S38046502016-03-23 15:30:27 +0530249 insert(file, UtilConstants.NEW_LINE);
250 try {
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530251
Vinod Kumar S38046502016-03-23 15:30:27 +0530252 methods.add(getDataFromTempFileHandle(GETTER_FOR_CLASS_MASK, curNode));
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530253
Vinod Kumar S38046502016-03-23 15:30:27 +0530254 methods.add(getHashCodeMethodClose(getHashCodeMethodOpen() + partString(
255 getDataFromTempFileHandle(HASH_CODE_IMPL_MASK, curNode).replace(UtilConstants.NEW_LINE,
256 UtilConstants.EMPTY_STRING))));
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530257
Vinod Kumar S38046502016-03-23 15:30:27 +0530258 methods.add(getEqualsMethodClose(getEqualsMethodOpen(className + UtilConstants.IMPL)
259 + getDataFromTempFileHandle(EQUALS_IMPL_MASK, curNode)));
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530260
Vinod Kumar S38046502016-03-23 15:30:27 +0530261 methods.add(getToStringMethodOpen() + getDataFromTempFileHandle(TO_STRING_IMPL_MASK, curNode)
262 + getToStringMethodClose());
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530263
Vinod Kumar S38046502016-03-23 15:30:27 +0530264 } catch (IOException e) {
265 throw new IOException("No data found in temporary java code fragment files for " + className
266 + " while impl class file generation");
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530267 }
268
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530269 try {
Vinod Kumar S38046502016-03-23 15:30:27 +0530270 methods.add(getConstructorStart(className) + getDataFromTempFileHandle(CONSTRUCTOR_IMPL_MASK, curNode)
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530271 + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET);
Vinod Kumar S38046502016-03-23 15:30:27 +0530272 } catch (IOException e) {
273 throw new IOException("No data found in temporary java code fragment files for " + className
274 + " while impl class file generation");
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530275 }
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530276 /**
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530277 * Add methods in impl class.
278 */
279 for (String method : methods) {
280 appendMethod(file, UtilConstants.FOUR_SPACE_INDENTATION + method + UtilConstants.NEW_LINE);
281 }
282 insert(file, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
283
284 return file;
285 }
286
287 /**
Vinod Kumar S38046502016-03-23 15:30:27 +0530288 * Return data stored in temporary files.
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530289 *
Vinod Kumar S38046502016-03-23 15:30:27 +0530290 * @param curNode current YANG node
291 * @param generatedTempFiles mask for the types of files being generated
292 * @return data stored in temporary files
293 * @throws IOException when failed to get the data from temporary file
294 * handle
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530295 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530296 private static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530297
Vinod Kumar S38046502016-03-23 15:30:27 +0530298 TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
299 .getTempJavaCodeFragmentFiles();
300
301 if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
302 return tempJavaCodeFragmentFiles
303 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getAttributesTempFileHandle());
304 } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
305 return tempJavaCodeFragmentFiles
306 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterInterfaceTempFileHandle());
307 } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
308 return tempJavaCodeFragmentFiles
309 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterInterfaceTempFileHandle());
310 } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
311 return tempJavaCodeFragmentFiles
312 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterImplTempFileHandle());
313 } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
314 return tempJavaCodeFragmentFiles
315 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterImplTempFileHandle());
316 } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
317 return tempJavaCodeFragmentFiles
318 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getConstructorImplTempFileHandle());
319 } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
320 return tempJavaCodeFragmentFiles
321 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getHashCodeImplTempFileHandle());
322 } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
323 return tempJavaCodeFragmentFiles
324 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEqualsImplTempFileHandle());
325 } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
326 return tempJavaCodeFragmentFiles
327 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getToStringImplTempFileHandle());
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530328 }
Vinod Kumar S38046502016-03-23 15:30:27 +0530329 return null;
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530330 }
331
332 /**
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530333 * Initiate generation of file based on generated file type.
334 *
335 * @param file generated file
336 * @param className generated file class name
337 * @param type generated file type
338 * @param imports imports for the file
339 * @param pkg generated file package
340 * @throws IOException when fails to generate a file
341 */
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530342 private static void initiateFile(File file, String className, int type, List<String> imports,
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530343 String pkg) throws IOException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530344
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530345 try {
346 file.createNewFile();
347 appendContents(file, className, type, imports, pkg);
348 } catch (IOException e) {
349 throw new IOException("Failed to create " + file.getName() + " class file.");
350 }
351 }
352
353 /**
354 * Appends the temp files to main files.
355 *
356 * @param appendFile temp file
357 * @param srcFile main file
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530358 * @throws IOException when fails to append contents
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530359 */
360 public static void appendFileContents(File appendFile, File srcFile) throws IOException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530361
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530362 try {
363 FileSystemUtil.appendFileContents(appendFile, srcFile);
364 } catch (IOException e) {
365 throw new IOException("Failed to append " + appendFile + " in " + srcFile);
366 }
367 }
368
369 /**
370 * Append methods to the generated files.
371 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530372 * @param file file in which method needs to be appended
373 * @param method method which needs to be appended
Vinod Kumar S38046502016-03-23 15:30:27 +0530374 * @throws IOException IO operation failure
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530375 */
376 private static void appendMethod(File file, String method) throws IOException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530377
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530378 insert(file, method);
379 }
380
381 /**
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530382 * Appends all the contents into a generated java file.
383 *
384 * @param file generated file
385 * @param fileName generated file name
386 * @param type generated file type
387 * @param pkg generated file package
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530388 * @param importsList list of java imports.
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530389 * @throws IOException when fails to append contents
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530390 */
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530391 private static void appendContents(File file, String fileName, int type, List<String> importsList,
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530392 String pkg) throws IOException {
393
Vinod Kumar S38046502016-03-23 15:30:27 +0530394 String pkgString = parsePackageString(pkg, importsList);
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530395
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530396 if ((type & IMPL_CLASS_MASK) != 0) {
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530397
398 write(file, fileName, type, JavaDocType.IMPL_CLASS);
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530399 } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530400
401 write(file, fileName, type, JavaDocType.BUILDER_INTERFACE);
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530402 } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530403 appendHeaderContents(file, pkgString, importsList);
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530404 write(file, fileName, type, JavaDocType.IMPL_CLASS);
Vinod Kumar S38046502016-03-23 15:30:27 +0530405 } else if ((type & INTERFACE_MASK) != 0) {
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530406
Vinod Kumar S38046502016-03-23 15:30:27 +0530407 appendHeaderContents(file, pkgString, importsList);
408 write(file, fileName, type, JavaDocType.INTERFACE);
409 } else if ((type & BUILDER_CLASS_MASK) != 0) {
410
411 appendHeaderContents(file, pkgString, importsList);
412 write(file, fileName, type, JavaDocType.BUILDER_CLASS);
413 }
414 }
415
416 /**
417 * Removes base directory path from package and generates package string for
418 * file.
419 *
420 * @param pkg generated package
421 * @param importsList list of imports
422 * @return package string
423 */
424 private static String parsePackageString(String pkg, List<String> importsList) {
425
426 if (pkg.contains(UtilConstants.ORG)) {
427 String[] strArray = pkg.split(UtilConstants.ORG);
428 pkg = UtilConstants.ORG + strArray[1].replace(UtilConstants.SLASH, UtilConstants.PERIOD);
429 }
430 if (importsList != null) {
431 if (!importsList.isEmpty()) {
432 return UtilConstants.PACKAGE + UtilConstants.SPACE + pkg + UtilConstants.SEMI_COLAN
433 + UtilConstants.NEW_LINE;
434 } else {
435 return UtilConstants.PACKAGE + UtilConstants.SPACE + pkg + UtilConstants.SEMI_COLAN;
436 }
437 } else {
438 return UtilConstants.PACKAGE + UtilConstants.SPACE + pkg + UtilConstants.SEMI_COLAN;
439 }
440 }
441
442 /**
443 * Appends other contents to interface, builder and typedef classes. for
444 * example : ONOS copyright, imports and package.
445 *
446 * @param file generated file
447 * @param pkg generated package
448 * @param importsList list of imports
449 * @throws IOException when fails to append contents.
450 */
451 private static void appendHeaderContents(File file, String pkg, List<String> importsList) throws IOException {
452
453 insert(file, CopyrightHeader.getCopyrightHeader());
454 insert(file, pkg);
455
456 /*
457 * TODO: add the file header using
458 * JavaCodeSnippetGen.getFileHeaderComment
459 */
460
461 if (importsList != null) {
462 insert(file, UtilConstants.NEW_LINE);
463 for (String imports : importsList) {
464 insert(file, imports);
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530465 }
466 }
467 }
468
469 /**
470 * Write data to the specific generated file.
471 *
472 * @param file generated file
473 * @param fileName file name
474 * @param genType generated file type
475 * @param javaDocType java doc type
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530476 * @throws IOException when fails to write into a file
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530477 */
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530478 private static void write(File file, String fileName, int genType, JavaDocGen.JavaDocType javaDocType)
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530479 throws IOException {
480
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530481 insert(file, JavaDocGen.getJavaDoc(javaDocType, fileName, false));
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530482 insert(file, JavaCodeSnippetGen.getJavaClassDefStart(genType, fileName));
483 }
484
485 /**
486 * Insert in the generated file.
487 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530488 * @param file file in which need to be inserted
489 * @param data data which need to be inserted
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530490 * @throws IOException when fails to insert into file
491 */
492 public static void insert(File file, String data) throws IOException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530493
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530494 try {
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530495 FileSystemUtil.updateFileHandle(file, data, false);
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530496 } catch (IOException e) {
497 throw new IOException("Failed to insert in " + file + "file");
498 }
499 }
500
501 /**
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530502 * Closes the files handle for generate files.
503 *
504 * @param file generate files
505 * @throws IOException when failed to close the file handle
506 */
507 public static void closeFileHandles(File file) throws IOException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530508
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530509 try {
510 FileSystemUtil.updateFileHandle(file, null, true);
511 } catch (IOException e) {
512 throw new IOException("Failed to close file handle for " + file + "file");
513 }
514 }
515
516 /**
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530517 * Removes temp files.
518 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530519 * @param file file to be removed
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530520 */
521 public static void clean(File file) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530522
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530523 if (file.exists()) {
524 file.delete();
525 }
526 }
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530527
528 /**
529 * Removes temp files.
530 *
531 * @param tempDir temp directory
532 * @throws IOException when fails to delete the directory
533 */
534 public static void cleanTempFiles(File tempDir) throws IOException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530535
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530536 FileUtils.deleteDirectory(tempDir);
537 }
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530538}