blob: 6aa3ead36fe158a8833b51a896af2bbff5c286d4 [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;
31import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053032import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053033import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
34import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
35import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053036import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053037import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
38import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
39import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
40import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
41import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053042import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.OF_STRING_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053043import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
44import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
45import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053046import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.UNION_FROM_STRING_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053047import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefStart;
Bharat saraswal2f11f652016-03-25 18:19:46 +053048import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getJavaPackageFromPackagePath;
Bharat saraswale2d51d62016-03-23 19:40:35 +053049import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
50import static org.onosproject.yangutils.utils.UtilConstants.ORG;
51import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
52import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
53import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
54import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053055import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS;
56import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE;
57import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMPL_CLASS;
58import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053059import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Bharat saraswale2d51d62016-03-23 19:40:35 +053060import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
61
62/**
Bharat saraswald9822e92016-04-05 15:13:44 +053063 * Represents utilities for java file generator.
Bharat saraswale2d51d62016-03-23 19:40:35 +053064 */
65public final class JavaFileGeneratorUtils {
66
67 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053068 * Creates an instance of java file generator util.
Bharat saraswale2d51d62016-03-23 19:40:35 +053069 */
70 private JavaFileGeneratorUtils() {
71 }
72
73 /**
74 * Returns a file object for generated file.
75 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +053076 * @param fileName file name
77 * @param filePath file package path
Bharat saraswale2d51d62016-03-23 19:40:35 +053078 * @param extension file extension
Gaurav Agrawal338735b2016-04-18 18:53:11 +053079 * @param handle cached file handle
Bharat saraswale2d51d62016-03-23 19:40:35 +053080 * @return file object
81 */
82 public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) {
83
84 return new File(handle.getBaseCodeGenPath() + filePath + SLASH + fileName + extension);
85 }
86
87 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053088 * Returns data stored in temporary files.
Bharat saraswale2d51d62016-03-23 19:40:35 +053089 *
90 * @param generatedTempFiles temporary file types
Gaurav Agrawal338735b2016-04-18 18:53:11 +053091 * @param curNode current YANG node
Bharat saraswale2d51d62016-03-23 19:40:35 +053092 * @return data stored in temporary files
93 * @throws IOException when failed to get the data from temporary file handle
94 */
95 public static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
96
97 TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
98 .getTempJavaCodeFragmentFiles();
99
100 if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
101 return tempJavaCodeFragmentFiles
102 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getAttributesTempFileHandle());
103 } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
104 return tempJavaCodeFragmentFiles
105 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterInterfaceTempFileHandle());
106 } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
107 return tempJavaCodeFragmentFiles
108 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterInterfaceTempFileHandle());
109 } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
110 return tempJavaCodeFragmentFiles
111 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterImplTempFileHandle());
112 } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
113 return tempJavaCodeFragmentFiles
114 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterImplTempFileHandle());
115 } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
116 return tempJavaCodeFragmentFiles
117 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getConstructorImplTempFileHandle());
118 } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
119 return tempJavaCodeFragmentFiles
120 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getHashCodeImplTempFileHandle());
121 } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
122 return tempJavaCodeFragmentFiles
123 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEqualsImplTempFileHandle());
124 } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
125 return tempJavaCodeFragmentFiles
126 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getToStringImplTempFileHandle());
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530127 } else if ((generatedTempFiles & CONSTRUCTOR_FOR_TYPE_MASK) != 0) {
128 return tempJavaCodeFragmentFiles
129 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles
130 .getConstructorForTypeTempFileHandle());
131 } else if ((generatedTempFiles & OF_STRING_IMPL_MASK) != 0) {
132 return tempJavaCodeFragmentFiles
133 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getOfStringImplTempFileHandle());
134 } else if ((generatedTempFiles & UNION_FROM_STRING_IMPL_MASK) != 0) {
135 return tempJavaCodeFragmentFiles
136 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getUnionFromStringImplTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530137 }
138 return null;
139 }
140
141 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530142 * Initiates generation of file based on generated file type.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530143 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530144 * @param file generated file
Bharat saraswale2d51d62016-03-23 19:40:35 +0530145 * @param className generated file class name
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530146 * @param type generated file type
147 * @param imports imports for the file
148 * @param pkg generated file package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530149 * @throws IOException when fails to generate a file
150 */
151 public static void initiateJavaFileGeneration(File file, String className, int type, List<String> imports,
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530152 String pkg) throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530153
154 try {
155 file.createNewFile();
156 appendContents(file, className, type, imports, pkg);
157 } catch (IOException e) {
158 throw new IOException("Failed to create " + file.getName() + " class file.");
159 }
160 }
161
162 /**
163 * Appends all the contents into a generated java file.
164 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530165 * @param file generated file
166 * @param fileName generated file name
167 * @param type generated file type
168 * @param pkg generated file package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530169 * @param importsList list of java imports.
170 * @throws IOException when fails to append contents
171 */
172 private static void appendContents(File file, String fileName, int type, List<String> importsList,
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530173 String pkg) throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530174
175 String pkgString = parsePackageString(pkg, importsList);
176
177 if ((type & IMPL_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530178 write(file, fileName, type, IMPL_CLASS);
179 } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530180 write(file, fileName, type, BUILDER_INTERFACE);
181 } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
182 appendHeaderContents(file, pkgString, importsList);
183 write(file, fileName, type, IMPL_CLASS);
184 } else if ((type & INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530185 appendHeaderContents(file, pkgString, importsList);
186 write(file, fileName, type, INTERFACE);
187 } else if ((type & BUILDER_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530188 appendHeaderContents(file, pkgString, importsList);
189 write(file, fileName, type, BUILDER_CLASS);
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530190 } else if ((type & GENERATE_UNION_CLASS) != 0) {
191 appendHeaderContents(file, pkgString, importsList);
192 write(file, fileName, type, IMPL_CLASS);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530193 }
194 }
195
196 /**
197 * Removes base directory path from package and generates package string for file.
198 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530199 * @param javaPkg generated java package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530200 * @param importsList list of imports
201 * @return package string
202 */
203 private static String parsePackageString(String javaPkg, List<String> importsList) {
204
205 if (javaPkg.contains(ORG)) {
206 String[] strArray = javaPkg.split(ORG);
Bharat saraswal2f11f652016-03-25 18:19:46 +0530207 javaPkg = ORG + getJavaPackageFromPackagePath(strArray[1]);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530208 }
209 if (importsList != null) {
210 if (!importsList.isEmpty()) {
211 return PACKAGE + SPACE + javaPkg + SEMI_COLAN + NEW_LINE;
212 } else {
213 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
214 }
215 } else {
216 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
217 }
218 }
219
220 /**
221 * Appends other contents to interface, builder and typedef classes.
222 * for example : ONOS copyright, imports and package.
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530223 *
224 * @param file generated file
225 * @param pkg generated package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530226 * @param importsList list of imports
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530227 * @throws IOException when fails to append contents
Bharat saraswale2d51d62016-03-23 19:40:35 +0530228 */
229 private static void appendHeaderContents(File file, String pkg, List<String> importsList) throws IOException {
230
231 insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
232 insertDataIntoJavaFile(file, pkg);
233
234 /*
235 * TODO: add the file header using
236 * JavaCodeSnippetGen.getFileHeaderComment
237 */
238
239 if (importsList != null) {
240 insertDataIntoJavaFile(file, NEW_LINE);
241 for (String imports : importsList) {
242 insertDataIntoJavaFile(file, imports);
243 }
244 }
245 }
246
247 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530248 * Writes data to the specific generated file.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530249 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530250 * @param file generated file
251 * @param fileName file name
252 * @param genType generated file type
Bharat saraswale2d51d62016-03-23 19:40:35 +0530253 * @param javaDocType java doc type
254 * @throws IOException when fails to write into a file
255 */
256 private static void write(File file, String fileName, int genType, JavaDocType javaDocType)
257 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530258 insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false));
259 insertDataIntoJavaFile(file, getJavaClassDefStart(genType, fileName));
260 }
261
262}