blob: 7b91ae919fac8a106f8509159d43724159d12e45 [file] [log] [blame]
Bharat saraswal870c56f2016-02-20 21:57:16 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Bharat saraswal870c56f2016-02-20 21:57:16 +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.utils.io.impl;
18
Bharat saraswal33dfa012016-05-17 19:59:16 +053019import java.io.BufferedReader;
Bharat saraswal870c56f2016-02-20 21:57:16 +053020import java.io.BufferedWriter;
21import java.io.File;
Bharat saraswal33dfa012016-05-17 19:59:16 +053022import java.io.FileReader;
Bharat saraswal870c56f2016-02-20 21:57:16 +053023import java.io.FileWriter;
24import java.io.IOException;
Vinod Kumar S38046502016-03-23 15:30:27 +053025import java.util.ArrayList;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053026import java.util.Arrays;
Gaurav Agrawal0d43bb52016-05-17 18:06:38 +053027import java.util.LinkedList;
Bharat saraswal33dfa012016-05-17 19:59:16 +053028import java.util.List;
Bharat saraswal33dfa012016-05-17 19:59:16 +053029import java.util.Stack;
30import java.util.regex.Pattern;
Bharat saraswalb1170bd2016-07-14 13:26:18 +053031
VinodKumarS-Huaweicb3a1f52016-05-10 17:58:57 +053032import org.apache.commons.io.FileUtils;
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +053033import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
34import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053035import org.onosproject.yangutils.translator.exception.TranslatorException;
Bharat saraswal870c56f2016-02-20 21:57:16 +053036
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053037import static org.onosproject.yangutils.utils.UtilConstants.COLAN;
Bharat saraswale2d51d62016-03-23 19:40:35 +053038import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
Bharat saraswal33dfa012016-05-17 19:59:16 +053039import static org.onosproject.yangutils.utils.UtilConstants.HASH;
Bharat saraswal96dfef02016-06-16 00:29:12 +053040import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053041import static org.onosproject.yangutils.utils.UtilConstants.JAVA_KEY_WORDS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053042import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
Bharat saraswal33dfa012016-05-17 19:59:16 +053043import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053044import static org.onosproject.yangutils.utils.UtilConstants.ORG;
45import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
Bharat saraswal33dfa012016-05-17 19:59:16 +053046import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053047import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_DIGITS_WITH_SINGLE_LETTER;
48import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_FIRST_DIGIT;
49import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_HYPHEN;
50import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_IDENTIFIER_SPECIAL_CHAR;
51import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_PERIOD;
52import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_SINGLE_LETTER;
53import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_UNDERSCORE;
54import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_ALL_SPECIAL_CHAR;
55import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_DIGITS;
56import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_SINGLE_CAPITAL_CASE;
57import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_SINGLE_CAPITAL_CASE_AND_DIGITS_SMALL_CASES;
58import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_UPPERCASE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053059import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
60import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
61import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswale2d51d62016-03-23 19:40:35 +053062import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053063import static org.onosproject.yangutils.utils.UtilConstants.UNDER_SCORE;
64import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUTO_PREFIX;
Bharat saraswal2d90b0c2016-08-04 02:00:03 +053065import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
Bharat saraswale2d51d62016-03-23 19:40:35 +053066import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.appendFileContents;
67import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
Bharat saraswal96dfef02016-06-16 00:29:12 +053068import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.PACKAGE_INFO;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053069import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Vinod Kumar S38046502016-03-23 15:30:27 +053070
Bharat saraswal870c56f2016-02-20 21:57:16 +053071/**
Bharat saraswald9822e92016-04-05 15:13:44 +053072 * Represents common utility functionalities for code generation.
Bharat saraswal870c56f2016-02-20 21:57:16 +053073 */
74public final class YangIoUtils {
75
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +053076 private static final int LINE_SIZE = 118;
Bharat saraswal33dfa012016-05-17 19:59:16 +053077 private static final int SUB_LINE_SIZE = 112;
78 private static final int ZERO = 0;
Bharat saraswal870c56f2016-02-20 21:57:16 +053079
80 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053081 * Creates an instance of YANG io utils.
Bharat saraswal870c56f2016-02-20 21:57:16 +053082 */
83 private YangIoUtils() {
84 }
85
86 /**
87 * Creates the directory structure.
88 *
89 * @param path directory path
90 * @return directory structure
Bharat saraswal2d90b0c2016-08-04 02:00:03 +053091 * @throws IOException when fails to do IO operations
Bharat saraswal870c56f2016-02-20 21:57:16 +053092 */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +053093 public static File createDirectories(String path) throws IOException {
b.janani68c55e12016-02-24 12:23:03 +053094 File generatedDir = new File(path);
Bharat saraswal2d90b0c2016-08-04 02:00:03 +053095 if (!generatedDir.exists()) {
96 boolean isGenerated = generatedDir.mkdirs();
97 if (!isGenerated) {
98 throw new IOException("failed to generated directory " + path);
99 }
100 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530101 return generatedDir;
102 }
103
104 /**
105 * Adds package info file for the created directory.
106 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530107 * @param path directory path
108 * @param classInfo class info for the package
109 * @param pack package of the directory
110 * @param isChildNode is it a child node
Bharat saraswal33dfa012016-05-17 19:59:16 +0530111 * @param pluginConfig plugin configurations
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530112 * @throws IOException when fails to create package info file
Bharat saraswal870c56f2016-02-20 21:57:16 +0530113 */
Bharat saraswal33dfa012016-05-17 19:59:16 +0530114 public static void addPackageInfo(File path, String classInfo, String pack, boolean isChildNode,
Bharat saraswalb551aae2016-07-14 15:18:20 +0530115 YangPluginConfig pluginConfig)
Bharat saraswalc0e04842016-05-12 13:16:57 +0530116 throws IOException {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530117
Bharat saraswal33dfa012016-05-17 19:59:16 +0530118 pack = parsePkg(pack);
119
Bharat saraswal870c56f2016-02-20 21:57:16 +0530120 try {
121
Bharat saraswale2d51d62016-03-23 19:40:35 +0530122 File packageInfo = new File(path + SLASH + "package-info.java");
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530123 if (!packageInfo.exists()) {
124 boolean isGenerated = packageInfo.createNewFile();
125 if (!isGenerated) {
126 throw new IOException("failed to generated package-info " + path);
127 }
128 }
Bharat saraswale2d51d62016-03-23 19:40:35 +0530129 FileWriter fileWriter = new FileWriter(packageInfo);
130 BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
131
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530132 bufferedWriter.write(getCopyrightHeader());
Bharat saraswal33dfa012016-05-17 19:59:16 +0530133 bufferedWriter.write(getJavaDoc(PACKAGE_INFO, classInfo, isChildNode, pluginConfig));
134 String pkg = PACKAGE + SPACE + pack + SEMI_COLAN;
135 if (pkg.length() > LINE_SIZE) {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530136 pkg = whenDelimiterIsPresent(pkg, LINE_SIZE);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530137 }
138 bufferedWriter.write(pkg);
b.janani68c55e12016-02-24 12:23:03 +0530139 bufferedWriter.close();
Bharat saraswale2d51d62016-03-23 19:40:35 +0530140 fileWriter.close();
Bharat saraswal870c56f2016-02-20 21:57:16 +0530141 } catch (IOException e) {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530142 throw new IOException("Exception occurred while creating package info file.");
Bharat saraswal870c56f2016-02-20 21:57:16 +0530143 }
144 }
145
146 /**
Bharat saraswal33dfa012016-05-17 19:59:16 +0530147 * Parses package and returns updated package.
148 *
149 * @param pack package needs to be updated
150 * @return updated package
151 */
152 public static String parsePkg(String pack) {
153
154 if (pack.contains(ORG)) {
155 String[] strArray = pack.split(ORG);
156 if (strArray.length >= 3) {
157 for (int i = 1; i < strArray.length; i++) {
158 if (i == 1) {
159 pack = ORG + strArray[1];
160 } else {
161 pack = pack + ORG + strArray[i];
162 }
163 }
164 } else {
165 pack = ORG + strArray[1];
166 }
167 }
168
169 return pack;
170 }
171
172 /**
Bharat saraswal870c56f2016-02-20 21:57:16 +0530173 * Cleans the generated directory if already exist in source folder.
174 *
Vinod Kumar S38046502016-03-23 15:30:27 +0530175 * @param dir generated directory in previous build
Bharat saraswale2d51d62016-03-23 19:40:35 +0530176 * @throws IOException when failed to delete directory
Bharat saraswal870c56f2016-02-20 21:57:16 +0530177 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530178 public static void deleteDirectory(String dir)
179 throws IOException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530180 File generatedDirectory = new File(dir);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530181 if (generatedDirectory.exists()) {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530182 try {
VinodKumarS-Huaweicb3a1f52016-05-10 17:58:57 +0530183 FileUtils.deleteDirectory(generatedDirectory);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530184 } catch (IOException e) {
Bharat saraswalc0e04842016-05-12 13:16:57 +0530185 throw new IOException(
186 "Failed to delete the generated files in " + generatedDirectory + " directory");
Bharat saraswal870c56f2016-02-20 21:57:16 +0530187 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530188 }
189 }
190
191 /**
Bharat saraswalc0e04842016-05-12 13:16:57 +0530192 * Searches and deletes generated temporary directories.
193 *
194 * @param root root directory
195 * @throws IOException when fails to do IO operations.
196 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530197 public static void searchAndDeleteTempDir(String root)
198 throws IOException {
Bharat saraswalc0e04842016-05-12 13:16:57 +0530199 List<File> store = new LinkedList<>();
200 Stack<String> stack = new Stack<>();
201 stack.push(root);
202
203 while (!stack.empty()) {
204 root = stack.pop();
205 File file = new File(root);
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530206 File[] fileList = file.listFiles();
207 if (fileList == null || fileList.length == 0) {
Bharat saraswalc0e04842016-05-12 13:16:57 +0530208 continue;
209 }
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530210 for (File current : fileList) {
Bharat saraswalc0e04842016-05-12 13:16:57 +0530211 if (current.isDirectory()) {
212 stack.push(current.toString());
213 if (current.getName().endsWith("-Temp")) {
214 store.add(current);
215 }
216 }
217 }
218 }
219
220 for (File dir : store) {
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530221 FileUtils.deleteDirectory(dir);
Bharat saraswalc0e04842016-05-12 13:16:57 +0530222 }
223 }
224
225 /**
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530226 * Removes extra char from the string.
227 *
Bharat saraswalb1170bd2016-07-14 13:26:18 +0530228 * @param valueString string to be trimmed
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530229 * @param removalString extra chars
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530230 * @return new string
231 */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530232 public static String trimAtLast(String valueString, String removalString) {
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530233 StringBuilder stringBuilder = new StringBuilder(valueString);
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530234 int index = valueString.lastIndexOf(removalString);
Bharat saraswalb1170bd2016-07-14 13:26:18 +0530235 if (index != -1) {
236 stringBuilder.deleteCharAt(index);
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530237 }
Bharat saraswalb1170bd2016-07-14 13:26:18 +0530238 return stringBuilder.toString();
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530239 }
240
Vinod Kumar S38046502016-03-23 15:30:27 +0530241 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530242 * Returns the directory path of the package in canonical form.
Vinod Kumar S38046502016-03-23 15:30:27 +0530243 *
244 * @param baseCodeGenPath base path where the generated files needs to be
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530245 * put
246 * @param pathOfJavaPkg java package of the file being generated
Vinod Kumar S38046502016-03-23 15:30:27 +0530247 * @return absolute path of the package in canonical form
248 */
249 public static String getDirectory(String baseCodeGenPath, String pathOfJavaPkg) {
250
251 if (pathOfJavaPkg.charAt(pathOfJavaPkg.length() - 1) == File.separatorChar) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530252 pathOfJavaPkg = trimAtLast(pathOfJavaPkg, SLASH);
Vinod Kumar S38046502016-03-23 15:30:27 +0530253 }
Bharat saraswale2d51d62016-03-23 19:40:35 +0530254 String[] strArray = pathOfJavaPkg.split(SLASH);
255 if (strArray[0].equals(EMPTY_STRING)) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530256 return pathOfJavaPkg;
257 } else {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530258 return baseCodeGenPath + SLASH + pathOfJavaPkg;
Vinod Kumar S38046502016-03-23 15:30:27 +0530259 }
260 }
261
262 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530263 * Returns the absolute path of the package in canonical form.
Vinod Kumar S38046502016-03-23 15:30:27 +0530264 *
265 * @param baseCodeGenPath base path where the generated files needs to be
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530266 * put
267 * @param pathOfJavaPkg java package of the file being generated
Vinod Kumar S38046502016-03-23 15:30:27 +0530268 * @return absolute path of the package in canonical form
269 */
270 public static String getAbsolutePackagePath(String baseCodeGenPath, String pathOfJavaPkg) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530271 return baseCodeGenPath + pathOfJavaPkg;
272 }
273
274 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530275 * Merges the temp java files to main java files.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530276 *
277 * @param appendFile temp file
Gaurav Agrawal0d43bb52016-05-17 18:06:38 +0530278 * @param srcFile main file
Bharat saraswale2d51d62016-03-23 19:40:35 +0530279 * @throws IOException when fails to append contents
280 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530281 public static void mergeJavaFiles(File appendFile, File srcFile)
282 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530283 try {
284 appendFileContents(appendFile, srcFile);
285 } catch (IOException e) {
286 throw new IOException("Failed to append " + appendFile + " in " + srcFile);
287 }
288 }
289
290 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530291 * Inserts data in the generated file.
Bharat saraswale2d51d62016-03-23 19:40:35 +0530292 *
293 * @param file file in which need to be inserted
294 * @param data data which need to be inserted
295 * @throws IOException when fails to insert into file
296 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530297 public static void insertDataIntoJavaFile(File file, String data)
298 throws IOException {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530299 try {
300 updateFileHandle(file, data, false);
301 } catch (IOException e) {
302 throw new IOException("Failed to insert in " + file + "file");
303 }
304 }
Bharat saraswal33dfa012016-05-17 19:59:16 +0530305
306 /**
307 * Validates a line size in given file whether it is having more then 120 characters.
308 * If yes it will update and give a new file.
309 *
310 * @param dataFile file in which need to verify all lines.
311 * @return updated file
312 * @throws IOException when fails to do IO operations.
313 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530314 public static File validateLineLength(File dataFile)
315 throws IOException {
Bharat saraswal33dfa012016-05-17 19:59:16 +0530316 FileReader fileReader = new FileReader(dataFile);
317 BufferedReader bufferReader = new BufferedReader(fileReader);
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530318 String append;
Bharat saraswal33dfa012016-05-17 19:59:16 +0530319 try {
320 StringBuilder stringBuilder = new StringBuilder();
321 String line = bufferReader.readLine();
322
323 while (line != null) {
324 if (line.length() > LINE_SIZE) {
325 if (line.contains(PERIOD)) {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530326 line = whenDelimiterIsPresent(line, LINE_SIZE);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530327 } else if (line.contains(SPACE)) {
328 line = whenSpaceIsPresent(line, LINE_SIZE);
329 }
330 stringBuilder.append(line);
331 } else {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530332 append = line + NEW_LINE;
333 stringBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530334 }
335 line = bufferReader.readLine();
336 }
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530337 FileWriter writer = new FileWriter(dataFile);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530338 writer.write(stringBuilder.toString());
339 writer.close();
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530340 return dataFile;
Bharat saraswal33dfa012016-05-17 19:59:16 +0530341 } finally {
342 fileReader.close();
343 bufferReader.close();
344 }
345 }
346
Bharat saraswal96dfef02016-06-16 00:29:12 +0530347 /* When delimiters are present in the given line. */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530348 private static String whenDelimiterIsPresent(String line, int lineSize) {
Bharat saraswal33dfa012016-05-17 19:59:16 +0530349 StringBuilder stringBuilder = new StringBuilder();
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530350 String append;
Bharat saraswal33dfa012016-05-17 19:59:16 +0530351 if (line.length() > lineSize) {
352 String[] strArray = line.split(Pattern.quote(PERIOD));
353 stringBuilder = updateString(strArray, stringBuilder, PERIOD, lineSize);
354 } else {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530355 append = line + NEW_LINE;
356 stringBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530357 }
358 String[] strArray = stringBuilder.toString().split(NEW_LINE);
359 StringBuilder tempBuilder = new StringBuilder();
360 for (String str : strArray) {
361 if (str.length() > SUB_LINE_SIZE) {
362 if (line.contains(PERIOD) && !line.contains(PERIOD + HASH + OPEN_PARENTHESIS)) {
363 String[] strArr = str.split(Pattern.quote(PERIOD));
364 tempBuilder = updateString(strArr, tempBuilder, PERIOD, SUB_LINE_SIZE);
365 } else if (str.contains(SPACE)) {
366 tempBuilder.append(whenSpaceIsPresent(str, SUB_LINE_SIZE));
367 }
368 } else {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530369 append = str + NEW_LINE;
370 tempBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530371 }
372 }
373 return tempBuilder.toString();
374
375 }
376
Bharat saraswal96dfef02016-06-16 00:29:12 +0530377 /* When spaces are present in the given line. */
Bharat saraswal33dfa012016-05-17 19:59:16 +0530378 private static String whenSpaceIsPresent(String line, int lineSize) {
379 StringBuilder stringBuilder = new StringBuilder();
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530380 String append;
Bharat saraswal33dfa012016-05-17 19:59:16 +0530381 if (line.length() > lineSize) {
382 String[] strArray = line.split(SPACE);
383 stringBuilder = updateString(strArray, stringBuilder, SPACE, lineSize);
384 } else {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530385 append = line + NEW_LINE;
386 stringBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530387 }
Bharat saraswalcad0e652016-05-26 23:48:38 +0530388
389 String[] strArray = stringBuilder.toString().split(NEW_LINE);
390 StringBuilder tempBuilder = new StringBuilder();
391 for (String str : strArray) {
392 if (str.length() > SUB_LINE_SIZE) {
393 if (str.contains(SPACE)) {
394 String[] strArr = str.split(SPACE);
395 tempBuilder = updateString(strArr, tempBuilder, SPACE, SUB_LINE_SIZE);
396 }
397 } else {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530398 append = str + NEW_LINE;
399 tempBuilder.append(append);
Bharat saraswalcad0e652016-05-26 23:48:38 +0530400 }
401 }
402 return tempBuilder.toString();
Bharat saraswal33dfa012016-05-17 19:59:16 +0530403 }
404
Bharat saraswal96dfef02016-06-16 00:29:12 +0530405 /* Updates the given line with the given size conditions. */
Bharat saraswal33dfa012016-05-17 19:59:16 +0530406 private static StringBuilder updateString(String[] strArray, StringBuilder stringBuilder, String string,
Bharat saraswalb551aae2016-07-14 15:18:20 +0530407 int lineSize) {
Bharat saraswal33dfa012016-05-17 19:59:16 +0530408
409 StringBuilder tempBuilder = new StringBuilder();
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530410 String append;
Bharat saraswal33dfa012016-05-17 19:59:16 +0530411 for (String str : strArray) {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530412 append = str + string;
413 tempBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530414 if (tempBuilder.length() > lineSize) {
415 String tempString = stringBuilder.toString();
416 stringBuilder.delete(ZERO, stringBuilder.length());
417 tempString = trimAtLast(tempString, string);
418 stringBuilder.append(tempString);
419 if (string.equals(PERIOD)) {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530420 append = NEW_LINE + TWELVE_SPACE_INDENTATION + PERIOD + str + string;
421 stringBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530422 } else {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530423 append = NEW_LINE + TWELVE_SPACE_INDENTATION + str + string;
424 stringBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530425 }
426 tempBuilder.delete(ZERO, tempBuilder.length());
427 tempBuilder.append(TWELVE_SPACE_INDENTATION);
428 } else {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530429 append = str + string;
430 stringBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530431 }
432 }
433 String tempString = stringBuilder.toString();
434 tempString = trimAtLast(tempString, string);
435 stringBuilder.delete(ZERO, stringBuilder.length());
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530436 append = tempString + NEW_LINE;
437 stringBuilder.append(append);
Bharat saraswal33dfa012016-05-17 19:59:16 +0530438 return stringBuilder;
439 }
Bharat saraswal96dfef02016-06-16 00:29:12 +0530440
441 /**
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530442 * Returns the java Package from package path.
Bharat saraswal96dfef02016-06-16 00:29:12 +0530443 *
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530444 * @param packagePath package path
445 * @return java package
Bharat saraswal96dfef02016-06-16 00:29:12 +0530446 */
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530447 public static String getJavaPackageFromPackagePath(String packagePath) {
448 return packagePath.replace(SLASH, PERIOD);
Bharat saraswal96dfef02016-06-16 00:29:12 +0530449 }
450
451 /**
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530452 * Returns the directory path corresponding to java package.
Bharat saraswal96dfef02016-06-16 00:29:12 +0530453 *
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530454 * @param packagePath package path
455 * @return java package
Bharat saraswal96dfef02016-06-16 00:29:12 +0530456 */
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530457 public static String getPackageDirPathFromJavaJPackage(String packagePath) {
458 return packagePath.replace(PERIOD, SLASH);
Bharat saraswal96dfef02016-06-16 00:29:12 +0530459 }
460
461 /**
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530462 * Returns the YANG identifier name as java identifier with first letter
463 * in small.
Bharat saraswal96dfef02016-06-16 00:29:12 +0530464 *
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530465 * @param yangIdentifier identifier in YANG file.
466 * @return corresponding java identifier
Bharat saraswal96dfef02016-06-16 00:29:12 +0530467 */
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530468 public static String getSmallCase(String yangIdentifier) {
469 return yangIdentifier.substring(0, 1).toLowerCase() + yangIdentifier.substring(1);
Bharat saraswal96dfef02016-06-16 00:29:12 +0530470 }
471
472 /**
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530473 * Returns the YANG identifier name as java identifier with first letter
474 * in capital.
Bharat saraswal96dfef02016-06-16 00:29:12 +0530475 *
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530476 * @param yangIdentifier identifier in YANG file
477 * @return corresponding java identifier
Bharat saraswal96dfef02016-06-16 00:29:12 +0530478 */
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530479 public static String getCapitalCase(String yangIdentifier) {
480 yangIdentifier = yangIdentifier.substring(0, 1).toUpperCase() + yangIdentifier.substring(1);
481 return restrictConsecutiveCapitalCase(yangIdentifier);
Bharat saraswal96dfef02016-06-16 00:29:12 +0530482 }
483
484 /**
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530485 * Restricts consecutive capital cased string as a rule in camel case.
Bharat saraswal96dfef02016-06-16 00:29:12 +0530486 *
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530487 * @param consecCapitalCaseRemover which requires the restriction of consecutive capital case
488 * @return string without consecutive capital case
Bharat saraswal96dfef02016-06-16 00:29:12 +0530489 */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530490 private static String restrictConsecutiveCapitalCase(String consecCapitalCaseRemover) {
Bharat saraswal96dfef02016-06-16 00:29:12 +0530491
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530492 for (int k = 0; k < consecCapitalCaseRemover.length(); k++) {
493 if (k + 1 < consecCapitalCaseRemover.length()) {
494 if (Character.isUpperCase(consecCapitalCaseRemover.charAt(k))) {
495 if (Character.isUpperCase(consecCapitalCaseRemover.charAt(k + 1))) {
496 consecCapitalCaseRemover = consecCapitalCaseRemover.substring(0, k + 1)
497 + consecCapitalCaseRemover.substring(k + 1, k + 2).toLowerCase()
498 + consecCapitalCaseRemover.substring(k + 2);
Bharat saraswal96dfef02016-06-16 00:29:12 +0530499 }
Bharat saraswal96dfef02016-06-16 00:29:12 +0530500 }
Bharat saraswal96dfef02016-06-16 00:29:12 +0530501 }
502 }
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530503 return consecCapitalCaseRemover;
Bharat saraswal96dfef02016-06-16 00:29:12 +0530504 }
505
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530506 /**
507 * Adds prefix, if the string begins with digit or is a java key word.
508 *
Bharat saraswalb551aae2016-07-14 15:18:20 +0530509 * @param camelCasePrefix string for adding prefix
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530510 * @param conflictResolver object of YANG to java naming conflict util
511 * @return prefixed camel case string
512 */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530513 private static String addPrefix(String camelCasePrefix, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530514
515 String prefix = getPrefixForIdentifier(conflictResolver);
516 if (camelCasePrefix.matches(REGEX_FOR_FIRST_DIGIT)) {
517 camelCasePrefix = prefix + camelCasePrefix;
518 }
519 if (JAVA_KEY_WORDS.contains(camelCasePrefix)) {
520 camelCasePrefix = prefix + camelCasePrefix.substring(0, 1).toUpperCase()
521 + camelCasePrefix.substring(1);
522 }
523 return camelCasePrefix;
524 }
525
526 /**
527 * Applies the rule that a string does not end with a capitalized letter and capitalizes
528 * the letter next to a number in an array.
529 *
Bharat saraswalb551aae2016-07-14 15:18:20 +0530530 * @param stringArray containing strings for camel case separation
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530531 * @param conflictResolver object of YANG to java naming conflict util
532 * @return camel case rule checked string
533 */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530534 private static String applyCamelCaseRule(String[] stringArray, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530535
536 String ruleChecker = stringArray[0].toLowerCase();
537 int i;
538 if (ruleChecker.matches(REGEX_FOR_FIRST_DIGIT)) {
539 i = 0;
540 ruleChecker = EMPTY_STRING;
541 } else {
542 i = 1;
543 }
544 for (; i < stringArray.length; i++) {
545 if (i + 1 == stringArray.length) {
546 if (stringArray[i].matches(REGEX_FOR_SINGLE_LETTER)
547 || stringArray[i].matches(REGEX_FOR_DIGITS_WITH_SINGLE_LETTER)) {
548 ruleChecker = ruleChecker + stringArray[i].toLowerCase();
549 break;
550 }
551 }
552 if (stringArray[i].matches(REGEX_FOR_FIRST_DIGIT)) {
553 for (int j = 0; j < stringArray[i].length(); j++) {
554 char letterCheck = stringArray[i].charAt(j);
555 if (Character.isLetter(letterCheck)) {
556 stringArray[i] = stringArray[i].substring(0, j)
557 + stringArray[i].substring(j, j + 1).toUpperCase() + stringArray[i].substring(j + 1);
558 break;
559 }
560 }
561 ruleChecker = ruleChecker + stringArray[i];
562 } else {
563 ruleChecker = ruleChecker + stringArray[i].substring(0, 1).toUpperCase() + stringArray[i].substring(1);
564 }
565 }
566 String ruleCheckerWithPrefix = addPrefix(ruleChecker, conflictResolver);
567 return restrictConsecutiveCapitalCase(ruleCheckerWithPrefix);
568 }
569
570 /**
571 * Resolves the conflict when input has upper case.
572 *
Bharat saraswalb551aae2016-07-14 15:18:20 +0530573 * @param stringArray containing strings for upper case conflict resolver
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530574 * @param conflictResolver object of YANG to java naming conflict util
575 * @return camel cased string
576 */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530577 private static String upperCaseConflictResolver(String[] stringArray,
578 YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530579
580 for (int l = 0; l < stringArray.length; l++) {
581 String[] upperCaseSplitArray = stringArray[l].split(REGEX_WITH_UPPERCASE);
582 for (int m = 0; m < upperCaseSplitArray.length; m++) {
583 if (upperCaseSplitArray[m].matches(REGEX_WITH_SINGLE_CAPITAL_CASE)) {
584 int check = m;
585 while (check + 1 < upperCaseSplitArray.length) {
586 if (upperCaseSplitArray[check + 1].matches(REGEX_WITH_SINGLE_CAPITAL_CASE)) {
587 upperCaseSplitArray[check + 1] = upperCaseSplitArray[check + 1].toLowerCase();
588 check = check + 1;
589 } else if (upperCaseSplitArray[check + 1]
590 .matches(REGEX_WITH_SINGLE_CAPITAL_CASE_AND_DIGITS_SMALL_CASES)) {
591 upperCaseSplitArray[check + 1] = upperCaseSplitArray[check + 1].toLowerCase();
592 break;
593 } else {
594 break;
595 }
596 }
597 }
598 }
599 StringBuilder strBuilder = new StringBuilder();
600 for (String element : upperCaseSplitArray) {
601 strBuilder.append(element);
602 }
603 stringArray[l] = strBuilder.toString();
604 }
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530605 List<String> result = new ArrayList<>();
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530606 for (String element : stringArray) {
607 String[] capitalCaseSplitArray = element.split(REGEX_WITH_UPPERCASE);
608 for (String letter : capitalCaseSplitArray) {
609 String[] arrayForAddition = letter.split(REGEX_WITH_DIGITS);
610 List<String> list = Arrays.asList(arrayForAddition);
611 for (String str : list) {
612 if (str != null && !str.isEmpty()) {
613 result.add(str);
614 }
615 }
616 }
617 }
618 stringArray = result.toArray(new String[result.size()]);
619 return applyCamelCaseRule(stringArray, conflictResolver);
620 }
621
622 /**
623 * Returns the YANG identifier name as java identifier.
624 *
Bharat saraswalb551aae2016-07-14 15:18:20 +0530625 * @param yangIdentifier identifier in YANG file
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530626 * @param conflictResolver object of YANG to java naming conflict util
627 * @return corresponding java identifier
628 */
629 public static String getCamelCase(String yangIdentifier, YangToJavaNamingConflictUtil conflictResolver) {
630
631 if (conflictResolver != null) {
632 String replacementForHyphen = conflictResolver.getReplacementForHyphen();
633 String replacementForPeriod = conflictResolver.getReplacementForPeriod();
634 String replacementForUnderscore = conflictResolver.getReplacementForUnderscore();
635 if (replacementForPeriod != null) {
636 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_PERIOD,
637 PERIOD + replacementForPeriod.toLowerCase() + PERIOD);
638 }
639 if (replacementForUnderscore != null) {
640 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_UNDERSCORE,
641 UNDER_SCORE + replacementForUnderscore.toLowerCase() + UNDER_SCORE);
642 }
643 if (replacementForHyphen != null) {
644 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_HYPHEN,
645 HYPHEN + replacementForHyphen.toLowerCase() + HYPHEN);
646 }
647 }
648 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_IDENTIFIER_SPECIAL_CHAR, COLAN);
649 String[] strArray = yangIdentifier.split(COLAN);
650 if (strArray[0].isEmpty()) {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530651 List<String> stringArrangement = new ArrayList<>();
652 stringArrangement.addAll(Arrays.asList(strArray).subList(1, strArray.length));
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530653 strArray = stringArrangement.toArray(new String[stringArrangement.size()]);
654 }
655 return upperCaseConflictResolver(strArray, conflictResolver);
656 }
657
658 /**
659 * Prefix for adding with identifier and namespace, when it is a java keyword or starting with digits.
660 *
661 * @param conflictResolver object of YANG to java naming conflict util
662 * @return prefix which needs to be added
663 */
664 public static String getPrefixForIdentifier(YangToJavaNamingConflictUtil conflictResolver) {
665
666 String prefixForIdentifier = null;
667 if (conflictResolver != null) {
668 prefixForIdentifier = conflictResolver.getPrefixForIdentifier();
669 }
670 if (prefixForIdentifier != null) {
671 prefixForIdentifier = prefixForIdentifier.replaceAll(REGEX_WITH_ALL_SPECIAL_CHAR, COLAN);
672 String[] strArray = prefixForIdentifier.split(COLAN);
673 try {
674 if (strArray[0].isEmpty()) {
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530675 List<String> stringArrangement = new ArrayList<>();
676 stringArrangement.addAll(Arrays.asList(strArray).subList(1, strArray.length));
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530677 strArray = stringArrangement.toArray(new String[stringArrangement.size()]);
678 }
679 prefixForIdentifier = strArray[0];
680 for (int j = 1; j < strArray.length; j++) {
681 prefixForIdentifier = prefixForIdentifier + strArray[j].substring(0, 1).toUpperCase() +
682 strArray[j].substring(1);
683 }
684 } catch (ArrayIndexOutOfBoundsException outOfBoundsException) {
685 throw new TranslatorException("The given prefix in pom.xml is invalid.");
686 }
687 } else {
688 prefixForIdentifier = YANG_AUTO_PREFIX;
689 }
690 return prefixForIdentifier;
691 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530692}