blob: fe2d382c21573e0e4e813658ed9f74914e5d4d4e [file] [log] [blame]
Bharat saraswal97459962016-02-20 21:57:16 +05301/*
Brian O'Connor0f7908b2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Bharat saraswal97459962016-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 saraswal715d3fc2016-05-17 19:59:16 +053019import java.io.BufferedReader;
Bharat saraswal97459962016-02-20 21:57:16 +053020import java.io.BufferedWriter;
21import java.io.File;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053022import java.io.FileReader;
Bharat saraswal97459962016-02-20 21:57:16 +053023import java.io.FileWriter;
24import java.io.IOException;
Vinod Kumar S9f26ae52016-03-23 15:30:27 +053025import java.util.ArrayList;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053026import java.util.Arrays;
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +053027import java.util.LinkedList;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053028import java.util.List;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053029import java.util.Stack;
30import java.util.regex.Pattern;
Bharat saraswale304c252016-08-16 20:56:20 +053031
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053032import org.apache.commons.io.FileUtils;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053033import org.onosproject.yangutils.translator.exception.TranslatorException;
Bharat saraswale50edca2016-08-05 01:58:25 +053034import org.onosproject.yangutils.utils.io.YangPluginConfig;
35import org.onosproject.yangutils.utils.io.YangToJavaNamingConflictUtil;
Bharat saraswal97459962016-02-20 21:57:16 +053036
Gaurav Agrawal8a147522016-08-10 13:43:01 +053037import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053038import static org.onosproject.yangutils.utils.UtilConstants.COLAN;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053039import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
Bharat saraswal84366c52016-03-23 19:40:35 +053040import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053041import static org.onosproject.yangutils.utils.UtilConstants.HASH;
Bharat saraswalc2d3be12016-06-16 00:29:12 +053042import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053043import static org.onosproject.yangutils.utils.UtilConstants.JAVA_KEY_WORDS;
Bharat saraswal84366c52016-03-23 19:40:35 +053044import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053045import static org.onosproject.yangutils.utils.UtilConstants.ONE;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053046import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
Bharat saraswal84366c52016-03-23 19:40:35 +053047import static org.onosproject.yangutils.utils.UtilConstants.ORG;
48import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053049import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053050import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_DIGITS_WITH_SINGLE_LETTER;
51import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_FIRST_DIGIT;
52import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_HYPHEN;
53import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_IDENTIFIER_SPECIAL_CHAR;
54import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_PERIOD;
55import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_SINGLE_LETTER;
56import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_UNDERSCORE;
57import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_ALL_SPECIAL_CHAR;
58import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_DIGITS;
59import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_SINGLE_CAPITAL_CASE;
60import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_SINGLE_CAPITAL_CASE_AND_DIGITS_SMALL_CASES;
61import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_UPPERCASE;
Bharat saraswal84366c52016-03-23 19:40:35 +053062import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
63import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
64import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswal84366c52016-03-23 19:40:35 +053065import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053066import static org.onosproject.yangutils.utils.UtilConstants.UNDER_SCORE;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053067import static org.onosproject.yangutils.utils.UtilConstants.UNUSED;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053068import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUTO_PREFIX;
Bharat saraswal8beac342016-08-04 02:00:03 +053069import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
Bharat saraswal84366c52016-03-23 19:40:35 +053070import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.appendFileContents;
71import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
Bharat saraswalc2d3be12016-06-16 00:29:12 +053072import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.PACKAGE_INFO;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053073import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Vinod Kumar S9f26ae52016-03-23 15:30:27 +053074
Bharat saraswal97459962016-02-20 21:57:16 +053075/**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053076 * Represents common utility functionalities for code generation.
Bharat saraswal97459962016-02-20 21:57:16 +053077 */
78public final class YangIoUtils {
79
Bharat saraswale304c252016-08-16 20:56:20 +053080 private static final int LINE_SIZE = 116;
81 private static final int SUB_LINE_SIZE = 114;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053082 private static final int ZERO = 0;
Bharat saraswal97459962016-02-20 21:57:16 +053083
84 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053085 * Creates an instance of YANG io utils.
Bharat saraswal97459962016-02-20 21:57:16 +053086 */
87 private YangIoUtils() {
88 }
89
90 /**
91 * Creates the directory structure.
92 *
93 * @param path directory path
94 * @return directory structure
Bharat saraswal8beac342016-08-04 02:00:03 +053095 * @throws IOException when fails to do IO operations
Bharat saraswal97459962016-02-20 21:57:16 +053096 */
Bharat saraswal8beac342016-08-04 02:00:03 +053097 public static File createDirectories(String path) throws IOException {
b.janani66b749c2016-02-24 12:23:03 +053098 File generatedDir = new File(path);
Bharat saraswal8beac342016-08-04 02:00:03 +053099 if (!generatedDir.exists()) {
100 boolean isGenerated = generatedDir.mkdirs();
101 if (!isGenerated) {
102 throw new IOException("failed to generated directory " + path);
103 }
104 }
Bharat saraswal97459962016-02-20 21:57:16 +0530105 return generatedDir;
106 }
107
108 /**
109 * Adds package info file for the created directory.
110 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530111 * @param path directory path
112 * @param classInfo class info for the package
113 * @param pack package of the directory
114 * @param isChildNode is it a child node
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530115 * @param pluginConfig plugin configurations
Vinod Kumar S08710982016-03-03 19:55:30 +0530116 * @throws IOException when fails to create package info file
Bharat saraswal97459962016-02-20 21:57:16 +0530117 */
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530118 public static void addPackageInfo(File path, String classInfo, String pack, boolean isChildNode,
Bharat saraswalaf413b82016-07-14 15:18:20 +0530119 YangPluginConfig pluginConfig)
Bharat saraswal250a7472016-05-12 13:16:57 +0530120 throws IOException {
Bharat saraswal97459962016-02-20 21:57:16 +0530121
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530122 pack = parsePkg(pack);
123
Bharat saraswal97459962016-02-20 21:57:16 +0530124 try {
125
Bharat saraswal84366c52016-03-23 19:40:35 +0530126 File packageInfo = new File(path + SLASH + "package-info.java");
Bharat saraswal8beac342016-08-04 02:00:03 +0530127 if (!packageInfo.exists()) {
128 boolean isGenerated = packageInfo.createNewFile();
129 if (!isGenerated) {
130 throw new IOException("failed to generated package-info " + path);
131 }
132 }
Bharat saraswal84366c52016-03-23 19:40:35 +0530133 FileWriter fileWriter = new FileWriter(packageInfo);
134 BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
135
Bharat saraswal8beac342016-08-04 02:00:03 +0530136 bufferedWriter.write(getCopyrightHeader());
Vidyashree Ramab3670472016-08-06 15:49:56 +0530137 //TODO: get the compiler annotations and pass the info
138 bufferedWriter.write(getJavaDoc(PACKAGE_INFO, classInfo, isChildNode, pluginConfig, null));
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530139 String pkg = PACKAGE + SPACE + pack + SEMI_COLAN;
140 if (pkg.length() > LINE_SIZE) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530141 pkg = whenDelimiterIsPresent(pkg, LINE_SIZE);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530142 }
143 bufferedWriter.write(pkg);
b.janani66b749c2016-02-24 12:23:03 +0530144 bufferedWriter.close();
Bharat saraswal84366c52016-03-23 19:40:35 +0530145 fileWriter.close();
Bharat saraswal97459962016-02-20 21:57:16 +0530146 } catch (IOException e) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530147 throw new IOException("Exception occurred while creating package info file.");
Bharat saraswal97459962016-02-20 21:57:16 +0530148 }
149 }
150
151 /**
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530152 * Parses package and returns updated package.
153 *
154 * @param pack package needs to be updated
155 * @return updated package
156 */
157 public static String parsePkg(String pack) {
158
159 if (pack.contains(ORG)) {
160 String[] strArray = pack.split(ORG);
161 if (strArray.length >= 3) {
162 for (int i = 1; i < strArray.length; i++) {
163 if (i == 1) {
164 pack = ORG + strArray[1];
165 } else {
166 pack = pack + ORG + strArray[i];
167 }
168 }
169 } else {
170 pack = ORG + strArray[1];
171 }
172 }
173
174 return pack;
175 }
176
177 /**
Bharat saraswal97459962016-02-20 21:57:16 +0530178 * Cleans the generated directory if already exist in source folder.
179 *
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530180 * @param dir generated directory in previous build
Bharat saraswal84366c52016-03-23 19:40:35 +0530181 * @throws IOException when failed to delete directory
Bharat saraswal97459962016-02-20 21:57:16 +0530182 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530183 public static void deleteDirectory(String dir)
184 throws IOException {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530185 File generatedDirectory = new File(dir);
Bharat saraswal97459962016-02-20 21:57:16 +0530186 if (generatedDirectory.exists()) {
Bharat saraswal97459962016-02-20 21:57:16 +0530187 try {
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530188 FileUtils.deleteDirectory(generatedDirectory);
Bharat saraswal97459962016-02-20 21:57:16 +0530189 } catch (IOException e) {
Bharat saraswal250a7472016-05-12 13:16:57 +0530190 throw new IOException(
191 "Failed to delete the generated files in " + generatedDirectory + " directory");
Bharat saraswal97459962016-02-20 21:57:16 +0530192 }
Bharat saraswal97459962016-02-20 21:57:16 +0530193 }
194 }
195
196 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530197 * Searches and deletes generated temporary directories.
198 *
199 * @param root root directory
200 * @throws IOException when fails to do IO operations.
201 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530202 public static void searchAndDeleteTempDir(String root)
203 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +0530204 List<File> store = new LinkedList<>();
205 Stack<String> stack = new Stack<>();
206 stack.push(root);
207
208 while (!stack.empty()) {
209 root = stack.pop();
210 File file = new File(root);
Bharat saraswal8beac342016-08-04 02:00:03 +0530211 File[] fileList = file.listFiles();
212 if (fileList == null || fileList.length == 0) {
Bharat saraswal250a7472016-05-12 13:16:57 +0530213 continue;
214 }
Bharat saraswal8beac342016-08-04 02:00:03 +0530215 for (File current : fileList) {
Bharat saraswal250a7472016-05-12 13:16:57 +0530216 if (current.isDirectory()) {
217 stack.push(current.toString());
218 if (current.getName().endsWith("-Temp")) {
219 store.add(current);
220 }
221 }
222 }
223 }
224
225 for (File dir : store) {
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530226 FileUtils.deleteDirectory(dir);
Bharat saraswal250a7472016-05-12 13:16:57 +0530227 }
228 }
229
230 /**
Bharat saraswal022dae92016-03-04 20:08:09 +0530231 * Removes extra char from the string.
232 *
Bharat saraswald14cbe82016-07-14 13:26:18 +0530233 * @param valueString string to be trimmed
Bharat saraswal8beac342016-08-04 02:00:03 +0530234 * @param removalString extra chars
Bharat saraswal022dae92016-03-04 20:08:09 +0530235 * @return new string
236 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530237 public static String trimAtLast(String valueString, String removalString) {
Bharat saraswal022dae92016-03-04 20:08:09 +0530238 StringBuilder stringBuilder = new StringBuilder(valueString);
Bharat saraswal8beac342016-08-04 02:00:03 +0530239 int index = valueString.lastIndexOf(removalString);
Bharat saraswald14cbe82016-07-14 13:26:18 +0530240 if (index != -1) {
241 stringBuilder.deleteCharAt(index);
Bharat saraswal022dae92016-03-04 20:08:09 +0530242 }
Bharat saraswald14cbe82016-07-14 13:26:18 +0530243 return stringBuilder.toString();
Bharat saraswal022dae92016-03-04 20:08:09 +0530244 }
245
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530246 /**
Gaurav Agrawal8a147522016-08-10 13:43:01 +0530247 * Replaces the last occurrence of a string with a given string.
248 *
249 * @param valueString string under operation
250 * @param removalString string to be replaced
251 * @param replacingString string with which replacement is to be done
252 * @return new string
253 */
254 public static String replaceLast(String valueString, String removalString, String replacingString) {
255 StringBuilder stringBuilder = new StringBuilder(valueString);
256 int index = valueString.lastIndexOf(removalString);
257 if (index != -1) {
258 stringBuilder.replace(index, index + 1, replacingString);
259 } else {
260 stringBuilder.append(NEW_LINE + EIGHT_SPACE_INDENTATION + UNUSED + OPEN_PARENTHESIS + ONE +
261 CLOSE_PARENTHESIS + SEMI_COLAN);
262 }
263 return stringBuilder.toString();
264
265 // TODO remove generation of ENUM if there is no leaf node.
266 }
267
268
269 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530270 * Returns the directory path of the package in canonical form.
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530271 *
272 * @param baseCodeGenPath base path where the generated files needs to be
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530273 * put
274 * @param pathOfJavaPkg java package of the file being generated
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530275 * @return absolute path of the package in canonical form
276 */
277 public static String getDirectory(String baseCodeGenPath, String pathOfJavaPkg) {
278
279 if (pathOfJavaPkg.charAt(pathOfJavaPkg.length() - 1) == File.separatorChar) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530280 pathOfJavaPkg = trimAtLast(pathOfJavaPkg, SLASH);
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530281 }
Bharat saraswal84366c52016-03-23 19:40:35 +0530282 String[] strArray = pathOfJavaPkg.split(SLASH);
283 if (strArray[0].equals(EMPTY_STRING)) {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530284 return pathOfJavaPkg;
285 } else {
Bharat saraswal84366c52016-03-23 19:40:35 +0530286 return baseCodeGenPath + SLASH + pathOfJavaPkg;
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530287 }
288 }
289
290 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530291 * Returns the absolute path of the package in canonical form.
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530292 *
293 * @param baseCodeGenPath base path where the generated files needs to be
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530294 * put
295 * @param pathOfJavaPkg java package of the file being generated
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530296 * @return absolute path of the package in canonical form
297 */
298 public static String getAbsolutePackagePath(String baseCodeGenPath, String pathOfJavaPkg) {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530299 return baseCodeGenPath + pathOfJavaPkg;
300 }
301
302 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530303 * Merges the temp java files to main java files.
Bharat saraswal84366c52016-03-23 19:40:35 +0530304 *
305 * @param appendFile temp file
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +0530306 * @param srcFile main file
Bharat saraswal84366c52016-03-23 19:40:35 +0530307 * @throws IOException when fails to append contents
308 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530309 public static void mergeJavaFiles(File appendFile, File srcFile)
310 throws IOException {
Bharat saraswal84366c52016-03-23 19:40:35 +0530311 try {
312 appendFileContents(appendFile, srcFile);
313 } catch (IOException e) {
314 throw new IOException("Failed to append " + appendFile + " in " + srcFile);
315 }
316 }
317
318 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530319 * Inserts data in the generated file.
Bharat saraswal84366c52016-03-23 19:40:35 +0530320 *
321 * @param file file in which need to be inserted
322 * @param data data which need to be inserted
323 * @throws IOException when fails to insert into file
324 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530325 public static void insertDataIntoJavaFile(File file, String data)
326 throws IOException {
Bharat saraswal84366c52016-03-23 19:40:35 +0530327 try {
328 updateFileHandle(file, data, false);
329 } catch (IOException e) {
330 throw new IOException("Failed to insert in " + file + "file");
331 }
332 }
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530333
334 /**
335 * Validates a line size in given file whether it is having more then 120 characters.
336 * If yes it will update and give a new file.
337 *
338 * @param dataFile file in which need to verify all lines.
339 * @return updated file
340 * @throws IOException when fails to do IO operations.
341 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530342 public static File validateLineLength(File dataFile)
343 throws IOException {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530344 FileReader fileReader = new FileReader(dataFile);
345 BufferedReader bufferReader = new BufferedReader(fileReader);
Bharat saraswal8beac342016-08-04 02:00:03 +0530346 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530347 try {
348 StringBuilder stringBuilder = new StringBuilder();
349 String line = bufferReader.readLine();
350
351 while (line != null) {
352 if (line.length() > LINE_SIZE) {
353 if (line.contains(PERIOD)) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530354 line = whenDelimiterIsPresent(line, LINE_SIZE);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530355 } else if (line.contains(SPACE)) {
356 line = whenSpaceIsPresent(line, LINE_SIZE);
357 }
358 stringBuilder.append(line);
359 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530360 append = line + NEW_LINE;
361 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530362 }
363 line = bufferReader.readLine();
364 }
Bharat saraswal8beac342016-08-04 02:00:03 +0530365 FileWriter writer = new FileWriter(dataFile);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530366 writer.write(stringBuilder.toString());
367 writer.close();
Bharat saraswal8beac342016-08-04 02:00:03 +0530368 return dataFile;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530369 } finally {
370 fileReader.close();
371 bufferReader.close();
372 }
373 }
374
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530375 /* When delimiters are present in the given line. */
Bharat saraswal8beac342016-08-04 02:00:03 +0530376 private static String whenDelimiterIsPresent(String line, int lineSize) {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530377 StringBuilder stringBuilder = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +0530378 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530379 if (line.length() > lineSize) {
380 String[] strArray = line.split(Pattern.quote(PERIOD));
381 stringBuilder = updateString(strArray, stringBuilder, PERIOD, lineSize);
382 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530383 append = line + NEW_LINE;
384 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530385 }
386 String[] strArray = stringBuilder.toString().split(NEW_LINE);
387 StringBuilder tempBuilder = new StringBuilder();
388 for (String str : strArray) {
389 if (str.length() > SUB_LINE_SIZE) {
390 if (line.contains(PERIOD) && !line.contains(PERIOD + HASH + OPEN_PARENTHESIS)) {
391 String[] strArr = str.split(Pattern.quote(PERIOD));
392 tempBuilder = updateString(strArr, tempBuilder, PERIOD, SUB_LINE_SIZE);
393 } else if (str.contains(SPACE)) {
394 tempBuilder.append(whenSpaceIsPresent(str, SUB_LINE_SIZE));
395 }
396 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530397 append = str + NEW_LINE;
398 tempBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530399 }
400 }
401 return tempBuilder.toString();
402
403 }
404
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530405 /* When spaces are present in the given line. */
Bharat saraswale304c252016-08-16 20:56:20 +0530406 public static String whenSpaceIsPresent(String line, int lineSize) {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530407 StringBuilder stringBuilder = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +0530408 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530409 if (line.length() > lineSize) {
410 String[] strArray = line.split(SPACE);
411 stringBuilder = updateString(strArray, stringBuilder, SPACE, lineSize);
412 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530413 append = line + NEW_LINE;
414 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530415 }
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530416
417 String[] strArray = stringBuilder.toString().split(NEW_LINE);
418 StringBuilder tempBuilder = new StringBuilder();
419 for (String str : strArray) {
Bharat saraswale304c252016-08-16 20:56:20 +0530420 if (str.length() > LINE_SIZE) {
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530421 if (str.contains(SPACE)) {
422 String[] strArr = str.split(SPACE);
423 tempBuilder = updateString(strArr, tempBuilder, SPACE, SUB_LINE_SIZE);
424 }
425 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530426 append = str + NEW_LINE;
427 tempBuilder.append(append);
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530428 }
429 }
430 return tempBuilder.toString();
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530431 }
432
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530433 /* Updates the given line with the given size conditions. */
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530434 private static StringBuilder updateString(String[] strArray, StringBuilder stringBuilder, String string,
Bharat saraswalaf413b82016-07-14 15:18:20 +0530435 int lineSize) {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530436
437 StringBuilder tempBuilder = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +0530438 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530439 for (String str : strArray) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530440 append = str + string;
441 tempBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530442 if (tempBuilder.length() > lineSize) {
443 String tempString = stringBuilder.toString();
444 stringBuilder.delete(ZERO, stringBuilder.length());
445 tempString = trimAtLast(tempString, string);
446 stringBuilder.append(tempString);
447 if (string.equals(PERIOD)) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530448 append = NEW_LINE + TWELVE_SPACE_INDENTATION + PERIOD + str + string;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530449 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530450 append = NEW_LINE + TWELVE_SPACE_INDENTATION + str + string;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530451 }
Bharat saraswale304c252016-08-16 20:56:20 +0530452 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530453 tempBuilder.delete(ZERO, tempBuilder.length());
454 tempBuilder.append(TWELVE_SPACE_INDENTATION);
455 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530456 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530457 }
458 }
459 String tempString = stringBuilder.toString();
460 tempString = trimAtLast(tempString, string);
461 stringBuilder.delete(ZERO, stringBuilder.length());
Bharat saraswal8beac342016-08-04 02:00:03 +0530462 append = tempString + NEW_LINE;
463 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530464 return stringBuilder;
465 }
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530466
467 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530468 * Returns the java Package from package path.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530469 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530470 * @param packagePath package path
471 * @return java package
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530472 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530473 public static String getJavaPackageFromPackagePath(String packagePath) {
474 return packagePath.replace(SLASH, PERIOD);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530475 }
476
477 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530478 * Returns the directory path corresponding to java package.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530479 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530480 * @param packagePath package path
481 * @return java package
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530482 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530483 public static String getPackageDirPathFromJavaJPackage(String packagePath) {
484 return packagePath.replace(PERIOD, SLASH);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530485 }
486
487 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530488 * Returns the YANG identifier name as java identifier with first letter
489 * in small.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530490 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530491 * @param yangIdentifier identifier in YANG file.
492 * @return corresponding java identifier
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530493 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530494 public static String getSmallCase(String yangIdentifier) {
495 return yangIdentifier.substring(0, 1).toLowerCase() + yangIdentifier.substring(1);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530496 }
497
498 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530499 * Returns the YANG identifier name as java identifier with first letter
500 * in capital.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530501 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530502 * @param yangIdentifier identifier in YANG file
503 * @return corresponding java identifier
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530504 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530505 public static String getCapitalCase(String yangIdentifier) {
506 yangIdentifier = yangIdentifier.substring(0, 1).toUpperCase() + yangIdentifier.substring(1);
507 return restrictConsecutiveCapitalCase(yangIdentifier);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530508 }
509
510 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530511 * Restricts consecutive capital cased string as a rule in camel case.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530512 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530513 * @param consecCapitalCaseRemover which requires the restriction of consecutive capital case
514 * @return string without consecutive capital case
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530515 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530516 private static String restrictConsecutiveCapitalCase(String consecCapitalCaseRemover) {
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530517
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530518 for (int k = 0; k < consecCapitalCaseRemover.length(); k++) {
519 if (k + 1 < consecCapitalCaseRemover.length()) {
520 if (Character.isUpperCase(consecCapitalCaseRemover.charAt(k))) {
521 if (Character.isUpperCase(consecCapitalCaseRemover.charAt(k + 1))) {
522 consecCapitalCaseRemover = consecCapitalCaseRemover.substring(0, k + 1)
523 + consecCapitalCaseRemover.substring(k + 1, k + 2).toLowerCase()
524 + consecCapitalCaseRemover.substring(k + 2);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530525 }
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530526 }
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530527 }
528 }
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530529 return consecCapitalCaseRemover;
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530530 }
531
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530532 /**
533 * Adds prefix, if the string begins with digit or is a java key word.
534 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530535 * @param camelCasePrefix string for adding prefix
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530536 * @param conflictResolver object of YANG to java naming conflict util
537 * @return prefixed camel case string
538 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530539 private static String addPrefix(String camelCasePrefix, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530540
541 String prefix = getPrefixForIdentifier(conflictResolver);
542 if (camelCasePrefix.matches(REGEX_FOR_FIRST_DIGIT)) {
543 camelCasePrefix = prefix + camelCasePrefix;
544 }
545 if (JAVA_KEY_WORDS.contains(camelCasePrefix)) {
546 camelCasePrefix = prefix + camelCasePrefix.substring(0, 1).toUpperCase()
547 + camelCasePrefix.substring(1);
548 }
549 return camelCasePrefix;
550 }
551
552 /**
553 * Applies the rule that a string does not end with a capitalized letter and capitalizes
554 * the letter next to a number in an array.
555 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530556 * @param stringArray containing strings for camel case separation
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530557 * @param conflictResolver object of YANG to java naming conflict util
558 * @return camel case rule checked string
559 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530560 private static String applyCamelCaseRule(String[] stringArray, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530561
562 String ruleChecker = stringArray[0].toLowerCase();
563 int i;
564 if (ruleChecker.matches(REGEX_FOR_FIRST_DIGIT)) {
565 i = 0;
566 ruleChecker = EMPTY_STRING;
567 } else {
568 i = 1;
569 }
570 for (; i < stringArray.length; i++) {
571 if (i + 1 == stringArray.length) {
572 if (stringArray[i].matches(REGEX_FOR_SINGLE_LETTER)
573 || stringArray[i].matches(REGEX_FOR_DIGITS_WITH_SINGLE_LETTER)) {
574 ruleChecker = ruleChecker + stringArray[i].toLowerCase();
575 break;
576 }
577 }
578 if (stringArray[i].matches(REGEX_FOR_FIRST_DIGIT)) {
579 for (int j = 0; j < stringArray[i].length(); j++) {
580 char letterCheck = stringArray[i].charAt(j);
581 if (Character.isLetter(letterCheck)) {
582 stringArray[i] = stringArray[i].substring(0, j)
583 + stringArray[i].substring(j, j + 1).toUpperCase() + stringArray[i].substring(j + 1);
584 break;
585 }
586 }
587 ruleChecker = ruleChecker + stringArray[i];
588 } else {
589 ruleChecker = ruleChecker + stringArray[i].substring(0, 1).toUpperCase() + stringArray[i].substring(1);
590 }
591 }
592 String ruleCheckerWithPrefix = addPrefix(ruleChecker, conflictResolver);
593 return restrictConsecutiveCapitalCase(ruleCheckerWithPrefix);
594 }
595
596 /**
597 * Resolves the conflict when input has upper case.
598 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530599 * @param stringArray containing strings for upper case conflict resolver
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530600 * @param conflictResolver object of YANG to java naming conflict util
601 * @return camel cased string
602 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530603 private static String upperCaseConflictResolver(String[] stringArray,
604 YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530605
606 for (int l = 0; l < stringArray.length; l++) {
607 String[] upperCaseSplitArray = stringArray[l].split(REGEX_WITH_UPPERCASE);
608 for (int m = 0; m < upperCaseSplitArray.length; m++) {
609 if (upperCaseSplitArray[m].matches(REGEX_WITH_SINGLE_CAPITAL_CASE)) {
610 int check = m;
611 while (check + 1 < upperCaseSplitArray.length) {
612 if (upperCaseSplitArray[check + 1].matches(REGEX_WITH_SINGLE_CAPITAL_CASE)) {
613 upperCaseSplitArray[check + 1] = upperCaseSplitArray[check + 1].toLowerCase();
614 check = check + 1;
615 } else if (upperCaseSplitArray[check + 1]
616 .matches(REGEX_WITH_SINGLE_CAPITAL_CASE_AND_DIGITS_SMALL_CASES)) {
617 upperCaseSplitArray[check + 1] = upperCaseSplitArray[check + 1].toLowerCase();
618 break;
619 } else {
620 break;
621 }
622 }
623 }
624 }
625 StringBuilder strBuilder = new StringBuilder();
626 for (String element : upperCaseSplitArray) {
627 strBuilder.append(element);
628 }
629 stringArray[l] = strBuilder.toString();
630 }
Bharat saraswal8beac342016-08-04 02:00:03 +0530631 List<String> result = new ArrayList<>();
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530632 for (String element : stringArray) {
633 String[] capitalCaseSplitArray = element.split(REGEX_WITH_UPPERCASE);
634 for (String letter : capitalCaseSplitArray) {
635 String[] arrayForAddition = letter.split(REGEX_WITH_DIGITS);
636 List<String> list = Arrays.asList(arrayForAddition);
637 for (String str : list) {
638 if (str != null && !str.isEmpty()) {
639 result.add(str);
640 }
641 }
642 }
643 }
644 stringArray = result.toArray(new String[result.size()]);
645 return applyCamelCaseRule(stringArray, conflictResolver);
646 }
647
648 /**
649 * Returns the YANG identifier name as java identifier.
650 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530651 * @param yangIdentifier identifier in YANG file
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530652 * @param conflictResolver object of YANG to java naming conflict util
653 * @return corresponding java identifier
654 */
655 public static String getCamelCase(String yangIdentifier, YangToJavaNamingConflictUtil conflictResolver) {
656
657 if (conflictResolver != null) {
658 String replacementForHyphen = conflictResolver.getReplacementForHyphen();
659 String replacementForPeriod = conflictResolver.getReplacementForPeriod();
660 String replacementForUnderscore = conflictResolver.getReplacementForUnderscore();
661 if (replacementForPeriod != null) {
662 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_PERIOD,
663 PERIOD + replacementForPeriod.toLowerCase() + PERIOD);
664 }
665 if (replacementForUnderscore != null) {
666 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_UNDERSCORE,
667 UNDER_SCORE + replacementForUnderscore.toLowerCase() + UNDER_SCORE);
668 }
669 if (replacementForHyphen != null) {
670 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_HYPHEN,
671 HYPHEN + replacementForHyphen.toLowerCase() + HYPHEN);
672 }
673 }
674 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_IDENTIFIER_SPECIAL_CHAR, COLAN);
675 String[] strArray = yangIdentifier.split(COLAN);
676 if (strArray[0].isEmpty()) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530677 List<String> stringArrangement = new ArrayList<>();
678 stringArrangement.addAll(Arrays.asList(strArray).subList(1, strArray.length));
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530679 strArray = stringArrangement.toArray(new String[stringArrangement.size()]);
680 }
681 return upperCaseConflictResolver(strArray, conflictResolver);
682 }
683
684 /**
685 * Prefix for adding with identifier and namespace, when it is a java keyword or starting with digits.
686 *
687 * @param conflictResolver object of YANG to java naming conflict util
688 * @return prefix which needs to be added
689 */
690 public static String getPrefixForIdentifier(YangToJavaNamingConflictUtil conflictResolver) {
691
692 String prefixForIdentifier = null;
693 if (conflictResolver != null) {
694 prefixForIdentifier = conflictResolver.getPrefixForIdentifier();
695 }
696 if (prefixForIdentifier != null) {
697 prefixForIdentifier = prefixForIdentifier.replaceAll(REGEX_WITH_ALL_SPECIAL_CHAR, COLAN);
698 String[] strArray = prefixForIdentifier.split(COLAN);
699 try {
700 if (strArray[0].isEmpty()) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530701 List<String> stringArrangement = new ArrayList<>();
702 stringArrangement.addAll(Arrays.asList(strArray).subList(1, strArray.length));
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530703 strArray = stringArrangement.toArray(new String[stringArrangement.size()]);
704 }
705 prefixForIdentifier = strArray[0];
706 for (int j = 1; j < strArray.length; j++) {
707 prefixForIdentifier = prefixForIdentifier + strArray[j].substring(0, 1).toUpperCase() +
708 strArray[j].substring(1);
709 }
710 } catch (ArrayIndexOutOfBoundsException outOfBoundsException) {
711 throw new TranslatorException("The given prefix in pom.xml is invalid.");
712 }
713 } else {
714 prefixForIdentifier = YANG_AUTO_PREFIX;
715 }
716 return prefixForIdentifier;
717 }
Bharat saraswal97459962016-02-20 21:57:16 +0530718}