blob: 5828e0379689f9c10f00f29d8aec75440c98d09d [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;
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;
41import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
42import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
43import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053044import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.OF_STRING_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053045import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
46import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
47import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053048import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.UNION_FROM_STRING_IMPL_MASK;
Bharat saraswale2d51d62016-03-23 19:40:35 +053049import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefStart;
Bharat saraswal2f11f652016-03-25 18:19:46 +053050import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getJavaPackageFromPackagePath;
Bharat saraswald72411a2016-04-19 01:00:16 +053051import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase;
52import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
53import static org.onosproject.yangutils.utils.UtilConstants.INT;
Bharat saraswale2d51d62016-03-23 19:40:35 +053054import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
55import static org.onosproject.yangutils.utils.UtilConstants.ORG;
56import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
Bharat saraswald72411a2016-04-19 01:00:16 +053057import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053058import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
59import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
60import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswald72411a2016-04-19 01:00:16 +053061import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
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;
Bharat saraswale2d51d62016-03-23 19:40:35 +053067import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
68
69/**
Bharat saraswald9822e92016-04-05 15:13:44 +053070 * Represents utilities for java file generator.
Bharat saraswale2d51d62016-03-23 19:40:35 +053071 */
72public final class JavaFileGeneratorUtils {
73
74 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053075 * Creates an instance of java file generator util.
Bharat saraswale2d51d62016-03-23 19:40:35 +053076 */
77 private JavaFileGeneratorUtils() {
78 }
79
80 /**
81 * Returns a file object for generated file.
82 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +053083 * @param fileName file name
84 * @param filePath file package path
Bharat saraswale2d51d62016-03-23 19:40:35 +053085 * @param extension file extension
Gaurav Agrawal338735b2016-04-18 18:53:11 +053086 * @param handle cached file handle
Bharat saraswale2d51d62016-03-23 19:40:35 +053087 * @return file object
88 */
89 public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) {
90
91 return new File(handle.getBaseCodeGenPath() + filePath + SLASH + fileName + extension);
92 }
93
94 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053095 * Returns data stored in temporary files.
Bharat saraswale2d51d62016-03-23 19:40:35 +053096 *
97 * @param generatedTempFiles temporary file types
Gaurav Agrawal338735b2016-04-18 18:53:11 +053098 * @param curNode current YANG node
Bharat saraswale2d51d62016-03-23 19:40:35 +053099 * @return data stored in temporary files
100 * @throws IOException when failed to get the data from temporary file handle
101 */
102 public static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
103
104 TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
105 .getTempJavaCodeFragmentFiles();
106
107 if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
108 return tempJavaCodeFragmentFiles
109 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getAttributesTempFileHandle());
110 } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
111 return tempJavaCodeFragmentFiles
112 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterInterfaceTempFileHandle());
113 } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
114 return tempJavaCodeFragmentFiles
115 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterInterfaceTempFileHandle());
116 } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
117 return tempJavaCodeFragmentFiles
118 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterImplTempFileHandle());
119 } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
120 return tempJavaCodeFragmentFiles
121 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterImplTempFileHandle());
122 } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
123 return tempJavaCodeFragmentFiles
124 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getConstructorImplTempFileHandle());
125 } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
126 return tempJavaCodeFragmentFiles
127 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getHashCodeImplTempFileHandle());
128 } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
129 return tempJavaCodeFragmentFiles
130 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEqualsImplTempFileHandle());
131 } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
132 return tempJavaCodeFragmentFiles
133 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getToStringImplTempFileHandle());
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530134 } else if ((generatedTempFiles & CONSTRUCTOR_FOR_TYPE_MASK) != 0) {
135 return tempJavaCodeFragmentFiles
136 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles
137 .getConstructorForTypeTempFileHandle());
138 } else if ((generatedTempFiles & OF_STRING_IMPL_MASK) != 0) {
139 return tempJavaCodeFragmentFiles
140 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getOfStringImplTempFileHandle());
141 } else if ((generatedTempFiles & UNION_FROM_STRING_IMPL_MASK) != 0) {
142 return tempJavaCodeFragmentFiles
143 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getUnionFromStringImplTempFileHandle());
Bharat saraswald72411a2016-04-19 01:00:16 +0530144 } else if ((generatedTempFiles & ENUM_IMPL_MASK) != 0) {
145 return tempJavaCodeFragmentFiles
146 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEnumClassTempFileHandle());
Bharat saraswale2d51d62016-03-23 19:40:35 +0530147 }
148 return null;
149 }
150
151 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530152 * Initiates generation of file based on generated file type.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530153 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530154 * @param file generated file
Bharat saraswale2d51d62016-03-23 19:40:35 +0530155 * @param className generated file class name
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530156 * @param type generated file type
157 * @param imports imports for the file
158 * @param pkg generated file package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530159 * @throws IOException when fails to generate a file
160 */
161 public static void initiateJavaFileGeneration(File file, String className, int type, List<String> imports,
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530162 String pkg) throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530163
164 try {
165 file.createNewFile();
166 appendContents(file, className, type, imports, pkg);
167 } catch (IOException e) {
168 throw new IOException("Failed to create " + file.getName() + " class file.");
169 }
170 }
171
172 /**
173 * Appends all the contents into a generated java file.
174 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530175 * @param file generated file
176 * @param fileName generated file name
177 * @param type generated file type
178 * @param pkg generated file package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530179 * @param importsList list of java imports.
180 * @throws IOException when fails to append contents
181 */
182 private static void appendContents(File file, String fileName, int type, List<String> importsList,
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530183 String pkg) throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530184
185 String pkgString = parsePackageString(pkg, importsList);
186
187 if ((type & IMPL_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530188 write(file, fileName, type, IMPL_CLASS);
189 } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530190 write(file, fileName, type, BUILDER_INTERFACE);
191 } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
192 appendHeaderContents(file, pkgString, importsList);
193 write(file, fileName, type, IMPL_CLASS);
194 } else if ((type & INTERFACE_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530195 appendHeaderContents(file, pkgString, importsList);
196 write(file, fileName, type, INTERFACE);
197 } else if ((type & BUILDER_CLASS_MASK) != 0) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530198 appendHeaderContents(file, pkgString, importsList);
199 write(file, fileName, type, BUILDER_CLASS);
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530200 } else if ((type & GENERATE_UNION_CLASS) != 0) {
201 appendHeaderContents(file, pkgString, importsList);
202 write(file, fileName, type, IMPL_CLASS);
Bharat saraswald72411a2016-04-19 01:00:16 +0530203 } else if ((type & GENERATE_ENUM_CLASS) != 0) {
204 appendHeaderContents(file, pkgString, importsList);
205 write(file, fileName, type, ENUM_CLASS);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530206 }
207 }
208
209 /**
210 * Removes base directory path from package and generates package string for file.
211 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530212 * @param javaPkg generated java package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530213 * @param importsList list of imports
214 * @return package string
215 */
216 private static String parsePackageString(String javaPkg, List<String> importsList) {
217
218 if (javaPkg.contains(ORG)) {
219 String[] strArray = javaPkg.split(ORG);
Bharat saraswal2f11f652016-03-25 18:19:46 +0530220 javaPkg = ORG + getJavaPackageFromPackagePath(strArray[1]);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530221 }
222 if (importsList != null) {
223 if (!importsList.isEmpty()) {
224 return PACKAGE + SPACE + javaPkg + SEMI_COLAN + NEW_LINE;
225 } else {
226 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
227 }
228 } else {
229 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
230 }
231 }
232
233 /**
234 * Appends other contents to interface, builder and typedef classes.
235 * for example : ONOS copyright, imports and package.
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530236 *
237 * @param file generated file
238 * @param pkg generated package
Bharat saraswale2d51d62016-03-23 19:40:35 +0530239 * @param importsList list of imports
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530240 * @throws IOException when fails to append contents
Bharat saraswale2d51d62016-03-23 19:40:35 +0530241 */
242 private static void appendHeaderContents(File file, String pkg, List<String> importsList) throws IOException {
243
244 insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
245 insertDataIntoJavaFile(file, pkg);
246
247 /*
248 * TODO: add the file header using
249 * JavaCodeSnippetGen.getFileHeaderComment
250 */
251
252 if (importsList != null) {
253 insertDataIntoJavaFile(file, NEW_LINE);
254 for (String imports : importsList) {
255 insertDataIntoJavaFile(file, imports);
256 }
257 }
258 }
259
260 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530261 * Writes data to the specific generated file.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530262 *
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530263 * @param file generated file
264 * @param fileName file name
265 * @param genType generated file type
Bharat saraswale2d51d62016-03-23 19:40:35 +0530266 * @param javaDocType java doc type
267 * @throws IOException when fails to write into a file
268 */
269 private static void write(File file, String fileName, int genType, JavaDocType javaDocType)
270 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530271 insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false));
272 insertDataIntoJavaFile(file, getJavaClassDefStart(genType, fileName));
273 }
274
Bharat saraswald72411a2016-04-19 01:00:16 +0530275 /**
276 * Returns integer attribute for enum's class to get the values.
277 *
278 * @param className enum's class name
279 * @return enum's attribute
280 */
281 public static String getEnumsValueAttribute(String className) {
282 return NEW_LINE + FOUR_SPACE_INDENTATION + PRIVATE + SPACE + INT + SPACE + getSmallCase(className) + SEMI_COLAN
283 + NEW_LINE;
284 }
285
Bharat saraswale2d51d62016-03-23 19:40:35 +0530286}