blob: 4228a2e6162ebb1bbda0fa2e0a4f4935fb285745 [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;
22
23import org.onosproject.yangutils.datamodel.YangNode;
24import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
25import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
26import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
27import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
28import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
29
30import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
31import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
32import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
33import 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;
36import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
37import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
38import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
39import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
40import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
41import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
42import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
43import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
44import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefStart;
Bharat saraswal2f11f652016-03-25 18:19:46 +053045import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getJavaPackageFromPackagePath;
Bharat saraswale2d51d62016-03-23 19:40:35 +053046import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
47import static org.onosproject.yangutils.utils.UtilConstants.ORG;
48import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
49import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
50import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
51import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
52import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
53import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS;
54import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE;
55import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMPL_CLASS;
56import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053057import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
58
59/**
Bharat saraswald9822e92016-04-05 15:13:44 +053060 * Represents utilities for java file generator.
Bharat saraswale2d51d62016-03-23 19:40:35 +053061 */
62public final class JavaFileGeneratorUtils {
63
64 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053065 * Creates an instance of java file generator util.
Bharat saraswale2d51d62016-03-23 19:40:35 +053066 */
67 private JavaFileGeneratorUtils() {
68 }
69
70 /**
71 * Returns a file object for generated file.
72 *
73 * @param fileName file name
74 * @param filePath file package path
75 * @param extension file extension
76 * @param handle cached file handle
77 * @return file object
78 */
79 public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) {
80
81 return new File(handle.getBaseCodeGenPath() + filePath + SLASH + fileName + extension);
82 }
83
84 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053085 * Returns data stored in temporary files.
Bharat saraswale2d51d62016-03-23 19:40:35 +053086 *
87 * @param generatedTempFiles temporary file types
88 * @param curNode current YANG node
89 * @return data stored in temporary files
90 * @throws IOException when failed to get the data from temporary file handle
91 */
92 public static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
93
94 TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
95 .getTempJavaCodeFragmentFiles();
96
97 if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
98 return tempJavaCodeFragmentFiles
99 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getAttributesTempFileHandle());
100 } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
101 return tempJavaCodeFragmentFiles
102 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterInterfaceTempFileHandle());
103 } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
104 return tempJavaCodeFragmentFiles
105 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterInterfaceTempFileHandle());
106 } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
107 return tempJavaCodeFragmentFiles
108 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterImplTempFileHandle());
109 } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
110 return tempJavaCodeFragmentFiles
111 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterImplTempFileHandle());
112 } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
113 return tempJavaCodeFragmentFiles
114 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getConstructorImplTempFileHandle());
115 } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
116 return tempJavaCodeFragmentFiles
117 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getHashCodeImplTempFileHandle());
118 } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
119 return tempJavaCodeFragmentFiles
120 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEqualsImplTempFileHandle());
121 } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
122 return tempJavaCodeFragmentFiles
123 .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getToStringImplTempFileHandle());
124 }
125 return null;
126 }
127
128 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530129 * Initiates generation of file based on generated file type.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530130 *
131 * @param file generated file
132 * @param className generated file class name
133 * @param type generated file type
134 * @param imports imports for the file
135 * @param pkg generated file package
136 * @throws IOException when fails to generate a file
137 */
138 public static void initiateJavaFileGeneration(File file, String className, int type, List<String> imports,
139 String pkg) throws IOException {
140
141 try {
142 file.createNewFile();
143 appendContents(file, className, type, imports, pkg);
144 } catch (IOException e) {
145 throw new IOException("Failed to create " + file.getName() + " class file.");
146 }
147 }
148
149 /**
150 * Appends all the contents into a generated java file.
151 *
152 * @param file generated file
153 * @param fileName generated file name
154 * @param type generated file type
155 * @param pkg generated file package
156 * @param importsList list of java imports.
157 * @throws IOException when fails to append contents
158 */
159 private static void appendContents(File file, String fileName, int type, List<String> importsList,
160 String pkg) throws IOException {
161
162 String pkgString = parsePackageString(pkg, importsList);
163
164 if ((type & IMPL_CLASS_MASK) != 0) {
165
166 write(file, fileName, type, IMPL_CLASS);
167 } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
168
169 write(file, fileName, type, BUILDER_INTERFACE);
170 } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
171 appendHeaderContents(file, pkgString, importsList);
172 write(file, fileName, type, IMPL_CLASS);
173 } else if ((type & INTERFACE_MASK) != 0) {
174
175 appendHeaderContents(file, pkgString, importsList);
176 write(file, fileName, type, INTERFACE);
177 } else if ((type & BUILDER_CLASS_MASK) != 0) {
178
179 appendHeaderContents(file, pkgString, importsList);
180 write(file, fileName, type, BUILDER_CLASS);
181 }
182 }
183
184 /**
185 * Removes base directory path from package and generates package string for file.
186 *
187 * @param javaPkg generated java package
188 * @param importsList list of imports
189 * @return package string
190 */
191 private static String parsePackageString(String javaPkg, List<String> importsList) {
192
193 if (javaPkg.contains(ORG)) {
194 String[] strArray = javaPkg.split(ORG);
Bharat saraswal2f11f652016-03-25 18:19:46 +0530195 javaPkg = ORG + getJavaPackageFromPackagePath(strArray[1]);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530196 }
197 if (importsList != null) {
198 if (!importsList.isEmpty()) {
199 return PACKAGE + SPACE + javaPkg + SEMI_COLAN + NEW_LINE;
200 } else {
201 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
202 }
203 } else {
204 return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
205 }
206 }
207
208 /**
209 * Appends other contents to interface, builder and typedef classes.
210 * for example : ONOS copyright, imports and package.
211 * @param file generated file
212 * @param pkg generated package
213 * @param importsList list of imports
214 * @throws IOException when fails to append contents.
215 */
216 private static void appendHeaderContents(File file, String pkg, List<String> importsList) throws IOException {
217
218 insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
219 insertDataIntoJavaFile(file, pkg);
220
221 /*
222 * TODO: add the file header using
223 * JavaCodeSnippetGen.getFileHeaderComment
224 */
225
226 if (importsList != null) {
227 insertDataIntoJavaFile(file, NEW_LINE);
228 for (String imports : importsList) {
229 insertDataIntoJavaFile(file, imports);
230 }
231 }
232 }
233
234 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530235 * Writes data to the specific generated file.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530236 *
237 * @param file generated file
238 * @param fileName file name
239 * @param genType generated file type
240 * @param javaDocType java doc type
241 * @throws IOException when fails to write into a file
242 */
243 private static void write(File file, String fileName, int genType, JavaDocType javaDocType)
244 throws IOException {
245
246 insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false));
247 insertDataIntoJavaFile(file, getJavaClassDefStart(genType, fileName));
248 }
249
250}