blob: 2294b9900f4f7bd19ba8606b6d6a46cfe0a07182 [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 saraswale3175d32016-08-31 17:50:11 +053046import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053047import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
Bharat saraswal84366c52016-03-23 19:40:35 +053048import static org.onosproject.yangutils.utils.UtilConstants.ORG;
49import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053050import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053051import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_DIGITS_WITH_SINGLE_LETTER;
52import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_FIRST_DIGIT;
53import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_HYPHEN;
54import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_IDENTIFIER_SPECIAL_CHAR;
55import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_PERIOD;
56import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_SINGLE_LETTER;
57import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_UNDERSCORE;
58import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_ALL_SPECIAL_CHAR;
59import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_DIGITS;
60import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_SINGLE_CAPITAL_CASE;
61import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_SINGLE_CAPITAL_CASE_AND_DIGITS_SMALL_CASES;
62import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_UPPERCASE;
Bharat saraswal84366c52016-03-23 19:40:35 +053063import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
64import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
65import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswal84366c52016-03-23 19:40:35 +053066import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053067import static org.onosproject.yangutils.utils.UtilConstants.UNDER_SCORE;
Gaurav Agrawal8a147522016-08-10 13:43:01 +053068import static org.onosproject.yangutils.utils.UtilConstants.UNUSED;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053069import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUTO_PREFIX;
Bharat saraswal8beac342016-08-04 02:00:03 +053070import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
Bharat saraswal84366c52016-03-23 19:40:35 +053071import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.appendFileContents;
72import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
Bharat saraswalc2d3be12016-06-16 00:29:12 +053073import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.PACKAGE_INFO;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053074import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
Vinod Kumar S9f26ae52016-03-23 15:30:27 +053075
Bharat saraswal97459962016-02-20 21:57:16 +053076/**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053077 * Represents common utility functionalities for code generation.
Bharat saraswal97459962016-02-20 21:57:16 +053078 */
79public final class YangIoUtils {
80
Bharat saraswale3175d32016-08-31 17:50:11 +053081 private static final int LINE_SIZE = 118;
82 private static final int SUB_LINE_SIZE = 116;
Bharat saraswal715d3fc2016-05-17 19:59:16 +053083 private static final int ZERO = 0;
Bharat saraswal97459962016-02-20 21:57:16 +053084
85 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053086 * Creates an instance of YANG io utils.
Bharat saraswal97459962016-02-20 21:57:16 +053087 */
88 private YangIoUtils() {
89 }
90
91 /**
92 * Creates the directory structure.
93 *
94 * @param path directory path
95 * @return directory structure
Bharat saraswal8beac342016-08-04 02:00:03 +053096 * @throws IOException when fails to do IO operations
Bharat saraswal97459962016-02-20 21:57:16 +053097 */
Bharat saraswal1edde622016-09-06 10:18:04 +053098 public static File createDirectories(String path)
99 throws IOException {
b.janani66b749c2016-02-24 12:23:03 +0530100 File generatedDir = new File(path);
Bharat saraswal8beac342016-08-04 02:00:03 +0530101 if (!generatedDir.exists()) {
102 boolean isGenerated = generatedDir.mkdirs();
103 if (!isGenerated) {
104 throw new IOException("failed to generated directory " + path);
105 }
106 }
Bharat saraswal97459962016-02-20 21:57:16 +0530107 return generatedDir;
108 }
109
110 /**
111 * Adds package info file for the created directory.
112 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530113 * @param path directory path
114 * @param classInfo class info for the package
115 * @param pack package of the directory
116 * @param isChildNode is it a child node
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530117 * @param pluginConfig plugin configurations
Vinod Kumar S08710982016-03-03 19:55:30 +0530118 * @throws IOException when fails to create package info file
Bharat saraswal97459962016-02-20 21:57:16 +0530119 */
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530120 public static void addPackageInfo(File path, String classInfo, String pack, boolean isChildNode,
Bharat saraswalaf413b82016-07-14 15:18:20 +0530121 YangPluginConfig pluginConfig)
Bharat saraswal250a7472016-05-12 13:16:57 +0530122 throws IOException {
Bharat saraswal97459962016-02-20 21:57:16 +0530123
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530124 pack = parsePkg(pack);
125
Bharat saraswal97459962016-02-20 21:57:16 +0530126 try {
127
Bharat saraswal84366c52016-03-23 19:40:35 +0530128 File packageInfo = new File(path + SLASH + "package-info.java");
Bharat saraswal8beac342016-08-04 02:00:03 +0530129 if (!packageInfo.exists()) {
130 boolean isGenerated = packageInfo.createNewFile();
131 if (!isGenerated) {
132 throw new IOException("failed to generated package-info " + path);
133 }
134 }
Bharat saraswal84366c52016-03-23 19:40:35 +0530135 FileWriter fileWriter = new FileWriter(packageInfo);
136 BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
137
Bharat saraswal8beac342016-08-04 02:00:03 +0530138 bufferedWriter.write(getCopyrightHeader());
Vidyashree Ramab3670472016-08-06 15:49:56 +0530139 //TODO: get the compiler annotations and pass the info
140 bufferedWriter.write(getJavaDoc(PACKAGE_INFO, classInfo, isChildNode, pluginConfig, null));
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530141 String pkg = PACKAGE + SPACE + pack + SEMI_COLAN;
142 if (pkg.length() > LINE_SIZE) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530143 pkg = whenDelimiterIsPresent(pkg, LINE_SIZE);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530144 }
145 bufferedWriter.write(pkg);
b.janani66b749c2016-02-24 12:23:03 +0530146 bufferedWriter.close();
Bharat saraswal84366c52016-03-23 19:40:35 +0530147 fileWriter.close();
Bharat saraswal97459962016-02-20 21:57:16 +0530148 } catch (IOException e) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530149 throw new IOException("Exception occurred while creating package info file.");
Bharat saraswal97459962016-02-20 21:57:16 +0530150 }
151 }
152
153 /**
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530154 * Parses package and returns updated package.
155 *
156 * @param pack package needs to be updated
157 * @return updated package
158 */
159 public static String parsePkg(String pack) {
160
161 if (pack.contains(ORG)) {
162 String[] strArray = pack.split(ORG);
163 if (strArray.length >= 3) {
164 for (int i = 1; i < strArray.length; i++) {
165 if (i == 1) {
166 pack = ORG + strArray[1];
167 } else {
168 pack = pack + ORG + strArray[i];
169 }
170 }
171 } else {
172 pack = ORG + strArray[1];
173 }
174 }
175
176 return pack;
177 }
178
179 /**
Bharat saraswal97459962016-02-20 21:57:16 +0530180 * Cleans the generated directory if already exist in source folder.
181 *
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530182 * @param dir generated directory in previous build
Bharat saraswal84366c52016-03-23 19:40:35 +0530183 * @throws IOException when failed to delete directory
Bharat saraswal97459962016-02-20 21:57:16 +0530184 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530185 public static void deleteDirectory(String dir)
186 throws IOException {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530187 File generatedDirectory = new File(dir);
Bharat saraswal97459962016-02-20 21:57:16 +0530188 if (generatedDirectory.exists()) {
Bharat saraswal97459962016-02-20 21:57:16 +0530189 try {
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530190 FileUtils.deleteDirectory(generatedDirectory);
Bharat saraswal97459962016-02-20 21:57:16 +0530191 } catch (IOException e) {
Bharat saraswal250a7472016-05-12 13:16:57 +0530192 throw new IOException(
193 "Failed to delete the generated files in " + generatedDirectory + " directory");
Bharat saraswal97459962016-02-20 21:57:16 +0530194 }
Bharat saraswal97459962016-02-20 21:57:16 +0530195 }
196 }
197
198 /**
Bharat saraswal250a7472016-05-12 13:16:57 +0530199 * Searches and deletes generated temporary directories.
200 *
201 * @param root root directory
202 * @throws IOException when fails to do IO operations.
203 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530204 public static void searchAndDeleteTempDir(String root)
205 throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +0530206 List<File> store = new LinkedList<>();
207 Stack<String> stack = new Stack<>();
208 stack.push(root);
209
210 while (!stack.empty()) {
211 root = stack.pop();
212 File file = new File(root);
Bharat saraswal8beac342016-08-04 02:00:03 +0530213 File[] fileList = file.listFiles();
214 if (fileList == null || fileList.length == 0) {
Bharat saraswal250a7472016-05-12 13:16:57 +0530215 continue;
216 }
Bharat saraswal8beac342016-08-04 02:00:03 +0530217 for (File current : fileList) {
Bharat saraswal250a7472016-05-12 13:16:57 +0530218 if (current.isDirectory()) {
219 stack.push(current.toString());
220 if (current.getName().endsWith("-Temp")) {
221 store.add(current);
222 }
223 }
224 }
225 }
226
227 for (File dir : store) {
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530228 FileUtils.deleteDirectory(dir);
Bharat saraswal250a7472016-05-12 13:16:57 +0530229 }
230 }
231
232 /**
Bharat saraswal022dae92016-03-04 20:08:09 +0530233 * Removes extra char from the string.
234 *
Bharat saraswald14cbe82016-07-14 13:26:18 +0530235 * @param valueString string to be trimmed
Bharat saraswal8beac342016-08-04 02:00:03 +0530236 * @param removalString extra chars
Bharat saraswal022dae92016-03-04 20:08:09 +0530237 * @return new string
238 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530239 public static String trimAtLast(String valueString, String removalString) {
Bharat saraswal022dae92016-03-04 20:08:09 +0530240 StringBuilder stringBuilder = new StringBuilder(valueString);
Bharat saraswal8beac342016-08-04 02:00:03 +0530241 int index = valueString.lastIndexOf(removalString);
Bharat saraswald14cbe82016-07-14 13:26:18 +0530242 if (index != -1) {
243 stringBuilder.deleteCharAt(index);
Bharat saraswal022dae92016-03-04 20:08:09 +0530244 }
Bharat saraswald14cbe82016-07-14 13:26:18 +0530245 return stringBuilder.toString();
Bharat saraswal022dae92016-03-04 20:08:09 +0530246 }
247
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530248 /**
Gaurav Agrawal8a147522016-08-10 13:43:01 +0530249 * Replaces the last occurrence of a string with a given string.
250 *
251 * @param valueString string under operation
252 * @param removalString string to be replaced
253 * @param replacingString string with which replacement is to be done
254 * @return new string
255 */
256 public static String replaceLast(String valueString, String removalString, String replacingString) {
257 StringBuilder stringBuilder = new StringBuilder(valueString);
258 int index = valueString.lastIndexOf(removalString);
259 if (index != -1) {
260 stringBuilder.replace(index, index + 1, replacingString);
261 } else {
262 stringBuilder.append(NEW_LINE + EIGHT_SPACE_INDENTATION + UNUSED + OPEN_PARENTHESIS + ONE +
Bharat saraswal1edde622016-09-06 10:18:04 +0530263 CLOSE_PARENTHESIS + SEMI_COLAN);
Gaurav Agrawal8a147522016-08-10 13:43:01 +0530264 }
265 return stringBuilder.toString();
266
267 // TODO remove generation of ENUM if there is no leaf node.
268 }
269
270
271 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530272 * Returns the directory path of the package in canonical form.
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530273 *
274 * @param baseCodeGenPath base path where the generated files needs to be
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530275 * put
276 * @param pathOfJavaPkg java package of the file being generated
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530277 * @return absolute path of the package in canonical form
278 */
279 public static String getDirectory(String baseCodeGenPath, String pathOfJavaPkg) {
280
281 if (pathOfJavaPkg.charAt(pathOfJavaPkg.length() - 1) == File.separatorChar) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530282 pathOfJavaPkg = trimAtLast(pathOfJavaPkg, SLASH);
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530283 }
Bharat saraswal84366c52016-03-23 19:40:35 +0530284 String[] strArray = pathOfJavaPkg.split(SLASH);
285 if (strArray[0].equals(EMPTY_STRING)) {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530286 return pathOfJavaPkg;
287 } else {
Bharat saraswal84366c52016-03-23 19:40:35 +0530288 return baseCodeGenPath + SLASH + pathOfJavaPkg;
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530289 }
290 }
291
292 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530293 * Returns the absolute path of the package in canonical form.
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530294 *
295 * @param baseCodeGenPath base path where the generated files needs to be
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530296 * put
297 * @param pathOfJavaPkg java package of the file being generated
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530298 * @return absolute path of the package in canonical form
299 */
300 public static String getAbsolutePackagePath(String baseCodeGenPath, String pathOfJavaPkg) {
Vinod Kumar S9f26ae52016-03-23 15:30:27 +0530301 return baseCodeGenPath + pathOfJavaPkg;
302 }
303
304 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530305 * Merges the temp java files to main java files.
Bharat saraswal84366c52016-03-23 19:40:35 +0530306 *
307 * @param appendFile temp file
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +0530308 * @param srcFile main file
Bharat saraswal84366c52016-03-23 19:40:35 +0530309 * @throws IOException when fails to append contents
310 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530311 public static void mergeJavaFiles(File appendFile, File srcFile)
312 throws IOException {
Bharat saraswal84366c52016-03-23 19:40:35 +0530313 try {
314 appendFileContents(appendFile, srcFile);
315 } catch (IOException e) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530316 throw new IOException("Failed to merge " + appendFile + " in " + srcFile);
Bharat saraswal84366c52016-03-23 19:40:35 +0530317 }
318 }
319
320 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +0530321 * Inserts data in the generated file.
Bharat saraswal84366c52016-03-23 19:40:35 +0530322 *
323 * @param file file in which need to be inserted
324 * @param data data which need to be inserted
325 * @throws IOException when fails to insert into file
326 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530327 public static void insertDataIntoJavaFile(File file, String data)
328 throws IOException {
Bharat saraswal84366c52016-03-23 19:40:35 +0530329 try {
330 updateFileHandle(file, data, false);
331 } catch (IOException e) {
332 throw new IOException("Failed to insert in " + file + "file");
333 }
334 }
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530335
336 /**
337 * Validates a line size in given file whether it is having more then 120 characters.
338 * If yes it will update and give a new file.
339 *
340 * @param dataFile file in which need to verify all lines.
341 * @return updated file
342 * @throws IOException when fails to do IO operations.
343 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530344 public static File validateLineLength(File dataFile)
345 throws IOException {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530346 FileReader fileReader = new FileReader(dataFile);
347 BufferedReader bufferReader = new BufferedReader(fileReader);
Bharat saraswal8beac342016-08-04 02:00:03 +0530348 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530349 try {
350 StringBuilder stringBuilder = new StringBuilder();
351 String line = bufferReader.readLine();
352
353 while (line != null) {
354 if (line.length() > LINE_SIZE) {
355 if (line.contains(PERIOD)) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530356 line = whenDelimiterIsPresent(line, LINE_SIZE);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530357 } else if (line.contains(SPACE)) {
358 line = whenSpaceIsPresent(line, LINE_SIZE);
359 }
360 stringBuilder.append(line);
361 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530362 append = line + NEW_LINE;
363 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530364 }
365 line = bufferReader.readLine();
366 }
Bharat saraswal8beac342016-08-04 02:00:03 +0530367 FileWriter writer = new FileWriter(dataFile);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530368 writer.write(stringBuilder.toString());
369 writer.close();
Bharat saraswal8beac342016-08-04 02:00:03 +0530370 return dataFile;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530371 } finally {
372 fileReader.close();
373 bufferReader.close();
374 }
375 }
376
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530377 /* When delimiters are present in the given line. */
Bharat saraswal8beac342016-08-04 02:00:03 +0530378 private static String whenDelimiterIsPresent(String line, int lineSize) {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530379 StringBuilder stringBuilder = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +0530380 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530381 if (line.length() > lineSize) {
382 String[] strArray = line.split(Pattern.quote(PERIOD));
383 stringBuilder = updateString(strArray, stringBuilder, PERIOD, lineSize);
384 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530385 append = line + NEW_LINE;
386 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530387 }
388 String[] strArray = stringBuilder.toString().split(NEW_LINE);
389 StringBuilder tempBuilder = new StringBuilder();
390 for (String str : strArray) {
391 if (str.length() > SUB_LINE_SIZE) {
392 if (line.contains(PERIOD) && !line.contains(PERIOD + HASH + OPEN_PARENTHESIS)) {
393 String[] strArr = str.split(Pattern.quote(PERIOD));
394 tempBuilder = updateString(strArr, tempBuilder, PERIOD, SUB_LINE_SIZE);
395 } else if (str.contains(SPACE)) {
396 tempBuilder.append(whenSpaceIsPresent(str, SUB_LINE_SIZE));
397 }
398 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530399 append = str + NEW_LINE;
400 tempBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530401 }
402 }
403 return tempBuilder.toString();
404
405 }
406
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530407 /* When spaces are present in the given line. */
Bharat saraswal2da23bf2016-08-25 15:28:39 +0530408 private static String whenSpaceIsPresent(String line, int lineSize) {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530409 StringBuilder stringBuilder = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +0530410 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530411 if (line.length() > lineSize) {
412 String[] strArray = line.split(SPACE);
413 stringBuilder = updateString(strArray, stringBuilder, SPACE, lineSize);
414 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530415 append = line + NEW_LINE;
416 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530417 }
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530418
419 String[] strArray = stringBuilder.toString().split(NEW_LINE);
420 StringBuilder tempBuilder = new StringBuilder();
421 for (String str : strArray) {
Bharat saraswale304c252016-08-16 20:56:20 +0530422 if (str.length() > LINE_SIZE) {
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530423 if (str.contains(SPACE)) {
424 String[] strArr = str.split(SPACE);
425 tempBuilder = updateString(strArr, tempBuilder, SPACE, SUB_LINE_SIZE);
426 }
427 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530428 append = str + NEW_LINE;
429 tempBuilder.append(append);
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530430 }
431 }
432 return tempBuilder.toString();
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530433 }
434
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530435 /* Updates the given line with the given size conditions. */
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530436 private static StringBuilder updateString(String[] strArray, StringBuilder stringBuilder, String string,
Bharat saraswalaf413b82016-07-14 15:18:20 +0530437 int lineSize) {
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530438
439 StringBuilder tempBuilder = new StringBuilder();
Bharat saraswal8beac342016-08-04 02:00:03 +0530440 String append;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530441 for (String str : strArray) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530442 if (strArray[strArray.length - 1].contains(OPEN_CURLY_BRACKET)) {
443 if (str.equals(strArray[strArray.length - 2])
444 && !str.equals(strArray[0])
445 && tempBuilder.length() < SUB_LINE_SIZE) {
446 String tempString = stringBuilder.toString();
447 stringBuilder.delete(ZERO, stringBuilder.length());
448 tempString = trimAtLast(tempString, string);
449 stringBuilder.append(tempString);
450 if (string.equals(PERIOD)) {
451 append = NEW_LINE + TWELVE_SPACE_INDENTATION + PERIOD + str + string;
452 } else {
453 append = NEW_LINE + TWELVE_SPACE_INDENTATION + str + string;
454 }
455 stringBuilder.append(append);
456 append = EMPTY_STRING;
457 tempBuilder.delete(ZERO, tempBuilder.length());
458 tempBuilder.append(TWELVE_SPACE_INDENTATION);
459 } else {
460 append = str + string;
461 tempBuilder.append(append);
462 }
463 } else {
464 append = str + string;
465 tempBuilder.append(append);
466 }
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530467 if (tempBuilder.length() > lineSize) {
468 String tempString = stringBuilder.toString();
469 stringBuilder.delete(ZERO, stringBuilder.length());
470 tempString = trimAtLast(tempString, string);
471 stringBuilder.append(tempString);
472 if (string.equals(PERIOD)) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530473 append = NEW_LINE + TWELVE_SPACE_INDENTATION + PERIOD + str + string;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530474 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530475 append = NEW_LINE + TWELVE_SPACE_INDENTATION + str + string;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530476 }
Bharat saraswale304c252016-08-16 20:56:20 +0530477 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530478 tempBuilder.delete(ZERO, tempBuilder.length());
479 tempBuilder.append(TWELVE_SPACE_INDENTATION);
480 } else {
Bharat saraswal8beac342016-08-04 02:00:03 +0530481 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530482 }
483 }
484 String tempString = stringBuilder.toString();
485 tempString = trimAtLast(tempString, string);
486 stringBuilder.delete(ZERO, stringBuilder.length());
Bharat saraswal8beac342016-08-04 02:00:03 +0530487 append = tempString + NEW_LINE;
488 stringBuilder.append(append);
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530489 return stringBuilder;
490 }
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530491
492 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530493 * Returns the java Package from package path.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530494 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530495 * @param packagePath package path
496 * @return java package
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530497 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530498 public static String getJavaPackageFromPackagePath(String packagePath) {
499 return packagePath.replace(SLASH, PERIOD);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530500 }
501
502 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530503 * Returns the directory path corresponding to java package.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530504 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530505 * @param packagePath package path
506 * @return java package
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530507 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530508 public static String getPackageDirPathFromJavaJPackage(String packagePath) {
509 return packagePath.replace(PERIOD, SLASH);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530510 }
511
512 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530513 * Returns the YANG identifier name as java identifier with first letter
514 * in small.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530515 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530516 * @param yangIdentifier identifier in YANG file.
517 * @return corresponding java identifier
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530518 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530519 public static String getSmallCase(String yangIdentifier) {
520 return yangIdentifier.substring(0, 1).toLowerCase() + yangIdentifier.substring(1);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530521 }
522
523 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530524 * Returns the YANG identifier name as java identifier with first letter
525 * in capital.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530526 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530527 * @param yangIdentifier identifier in YANG file
528 * @return corresponding java identifier
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530529 */
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530530 public static String getCapitalCase(String yangIdentifier) {
531 yangIdentifier = yangIdentifier.substring(0, 1).toUpperCase() + yangIdentifier.substring(1);
532 return restrictConsecutiveCapitalCase(yangIdentifier);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530533 }
534
535 /**
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530536 * Restricts consecutive capital cased string as a rule in camel case.
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530537 *
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530538 * @param consecCapitalCaseRemover which requires the restriction of consecutive capital case
539 * @return string without consecutive capital case
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530540 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530541 private static String restrictConsecutiveCapitalCase(String consecCapitalCaseRemover) {
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530542
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530543 for (int k = 0; k < consecCapitalCaseRemover.length(); k++) {
544 if (k + 1 < consecCapitalCaseRemover.length()) {
545 if (Character.isUpperCase(consecCapitalCaseRemover.charAt(k))) {
546 if (Character.isUpperCase(consecCapitalCaseRemover.charAt(k + 1))) {
547 consecCapitalCaseRemover = consecCapitalCaseRemover.substring(0, k + 1)
548 + consecCapitalCaseRemover.substring(k + 1, k + 2).toLowerCase()
549 + consecCapitalCaseRemover.substring(k + 2);
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530550 }
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530551 }
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530552 }
553 }
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530554 return consecCapitalCaseRemover;
Bharat saraswalc2d3be12016-06-16 00:29:12 +0530555 }
556
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530557 /**
558 * Adds prefix, if the string begins with digit or is a java key word.
559 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530560 * @param camelCasePrefix string for adding prefix
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530561 * @param conflictResolver object of YANG to java naming conflict util
562 * @return prefixed camel case string
563 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530564 private static String addPrefix(String camelCasePrefix, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530565
566 String prefix = getPrefixForIdentifier(conflictResolver);
567 if (camelCasePrefix.matches(REGEX_FOR_FIRST_DIGIT)) {
568 camelCasePrefix = prefix + camelCasePrefix;
569 }
570 if (JAVA_KEY_WORDS.contains(camelCasePrefix)) {
571 camelCasePrefix = prefix + camelCasePrefix.substring(0, 1).toUpperCase()
572 + camelCasePrefix.substring(1);
573 }
574 return camelCasePrefix;
575 }
576
577 /**
578 * Applies the rule that a string does not end with a capitalized letter and capitalizes
579 * the letter next to a number in an array.
580 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530581 * @param stringArray containing strings for camel case separation
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530582 * @param conflictResolver object of YANG to java naming conflict util
583 * @return camel case rule checked string
584 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530585 private static String applyCamelCaseRule(String[] stringArray, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530586
587 String ruleChecker = stringArray[0].toLowerCase();
588 int i;
589 if (ruleChecker.matches(REGEX_FOR_FIRST_DIGIT)) {
590 i = 0;
591 ruleChecker = EMPTY_STRING;
592 } else {
593 i = 1;
594 }
595 for (; i < stringArray.length; i++) {
596 if (i + 1 == stringArray.length) {
597 if (stringArray[i].matches(REGEX_FOR_SINGLE_LETTER)
598 || stringArray[i].matches(REGEX_FOR_DIGITS_WITH_SINGLE_LETTER)) {
599 ruleChecker = ruleChecker + stringArray[i].toLowerCase();
600 break;
601 }
602 }
603 if (stringArray[i].matches(REGEX_FOR_FIRST_DIGIT)) {
604 for (int j = 0; j < stringArray[i].length(); j++) {
605 char letterCheck = stringArray[i].charAt(j);
606 if (Character.isLetter(letterCheck)) {
607 stringArray[i] = stringArray[i].substring(0, j)
608 + stringArray[i].substring(j, j + 1).toUpperCase() + stringArray[i].substring(j + 1);
609 break;
610 }
611 }
612 ruleChecker = ruleChecker + stringArray[i];
613 } else {
614 ruleChecker = ruleChecker + stringArray[i].substring(0, 1).toUpperCase() + stringArray[i].substring(1);
615 }
616 }
617 String ruleCheckerWithPrefix = addPrefix(ruleChecker, conflictResolver);
618 return restrictConsecutiveCapitalCase(ruleCheckerWithPrefix);
619 }
620
621 /**
622 * Resolves the conflict when input has upper case.
623 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530624 * @param stringArray containing strings for upper case conflict resolver
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530625 * @param conflictResolver object of YANG to java naming conflict util
626 * @return camel cased string
627 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530628 private static String upperCaseConflictResolver(String[] stringArray,
629 YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530630
631 for (int l = 0; l < stringArray.length; l++) {
632 String[] upperCaseSplitArray = stringArray[l].split(REGEX_WITH_UPPERCASE);
633 for (int m = 0; m < upperCaseSplitArray.length; m++) {
634 if (upperCaseSplitArray[m].matches(REGEX_WITH_SINGLE_CAPITAL_CASE)) {
635 int check = m;
636 while (check + 1 < upperCaseSplitArray.length) {
637 if (upperCaseSplitArray[check + 1].matches(REGEX_WITH_SINGLE_CAPITAL_CASE)) {
638 upperCaseSplitArray[check + 1] = upperCaseSplitArray[check + 1].toLowerCase();
639 check = check + 1;
640 } else if (upperCaseSplitArray[check + 1]
641 .matches(REGEX_WITH_SINGLE_CAPITAL_CASE_AND_DIGITS_SMALL_CASES)) {
642 upperCaseSplitArray[check + 1] = upperCaseSplitArray[check + 1].toLowerCase();
643 break;
644 } else {
645 break;
646 }
647 }
648 }
649 }
650 StringBuilder strBuilder = new StringBuilder();
651 for (String element : upperCaseSplitArray) {
652 strBuilder.append(element);
653 }
654 stringArray[l] = strBuilder.toString();
655 }
Bharat saraswal8beac342016-08-04 02:00:03 +0530656 List<String> result = new ArrayList<>();
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530657 for (String element : stringArray) {
658 String[] capitalCaseSplitArray = element.split(REGEX_WITH_UPPERCASE);
659 for (String letter : capitalCaseSplitArray) {
660 String[] arrayForAddition = letter.split(REGEX_WITH_DIGITS);
661 List<String> list = Arrays.asList(arrayForAddition);
662 for (String str : list) {
663 if (str != null && !str.isEmpty()) {
664 result.add(str);
665 }
666 }
667 }
668 }
669 stringArray = result.toArray(new String[result.size()]);
670 return applyCamelCaseRule(stringArray, conflictResolver);
671 }
672
673 /**
674 * Returns the YANG identifier name as java identifier.
675 *
Bharat saraswalaf413b82016-07-14 15:18:20 +0530676 * @param yangIdentifier identifier in YANG file
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530677 * @param conflictResolver object of YANG to java naming conflict util
678 * @return corresponding java identifier
679 */
680 public static String getCamelCase(String yangIdentifier, YangToJavaNamingConflictUtil conflictResolver) {
681
682 if (conflictResolver != null) {
683 String replacementForHyphen = conflictResolver.getReplacementForHyphen();
684 String replacementForPeriod = conflictResolver.getReplacementForPeriod();
685 String replacementForUnderscore = conflictResolver.getReplacementForUnderscore();
686 if (replacementForPeriod != null) {
687 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_PERIOD,
Bharat saraswal1edde622016-09-06 10:18:04 +0530688 PERIOD + replacementForPeriod.toLowerCase() + PERIOD);
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530689 }
690 if (replacementForUnderscore != null) {
691 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_UNDERSCORE,
Bharat saraswal1edde622016-09-06 10:18:04 +0530692 UNDER_SCORE + replacementForUnderscore.toLowerCase() +
693 UNDER_SCORE);
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530694 }
695 if (replacementForHyphen != null) {
696 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_HYPHEN,
Bharat saraswal1edde622016-09-06 10:18:04 +0530697 HYPHEN + replacementForHyphen.toLowerCase() + HYPHEN);
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530698 }
699 }
700 yangIdentifier = yangIdentifier.replaceAll(REGEX_FOR_IDENTIFIER_SPECIAL_CHAR, COLAN);
701 String[] strArray = yangIdentifier.split(COLAN);
702 if (strArray[0].isEmpty()) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530703 List<String> stringArrangement = new ArrayList<>();
704 stringArrangement.addAll(Arrays.asList(strArray).subList(1, strArray.length));
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530705 strArray = stringArrangement.toArray(new String[stringArrangement.size()]);
706 }
707 return upperCaseConflictResolver(strArray, conflictResolver);
708 }
709
710 /**
711 * Prefix for adding with identifier and namespace, when it is a java keyword or starting with digits.
712 *
713 * @param conflictResolver object of YANG to java naming conflict util
714 * @return prefix which needs to be added
715 */
716 public static String getPrefixForIdentifier(YangToJavaNamingConflictUtil conflictResolver) {
717
718 String prefixForIdentifier = null;
719 if (conflictResolver != null) {
720 prefixForIdentifier = conflictResolver.getPrefixForIdentifier();
721 }
722 if (prefixForIdentifier != null) {
723 prefixForIdentifier = prefixForIdentifier.replaceAll(REGEX_WITH_ALL_SPECIAL_CHAR, COLAN);
724 String[] strArray = prefixForIdentifier.split(COLAN);
725 try {
726 if (strArray[0].isEmpty()) {
Bharat saraswal8beac342016-08-04 02:00:03 +0530727 List<String> stringArrangement = new ArrayList<>();
728 stringArrangement.addAll(Arrays.asList(strArray).subList(1, strArray.length));
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530729 strArray = stringArrangement.toArray(new String[stringArrangement.size()]);
730 }
731 prefixForIdentifier = strArray[0];
732 for (int j = 1; j < strArray.length; j++) {
733 prefixForIdentifier = prefixForIdentifier + strArray[j].substring(0, 1).toUpperCase() +
734 strArray[j].substring(1);
735 }
736 } catch (ArrayIndexOutOfBoundsException outOfBoundsException) {
737 throw new TranslatorException("The given prefix in pom.xml is invalid.");
738 }
739 } else {
740 prefixForIdentifier = YANG_AUTO_PREFIX;
741 }
742 return prefixForIdentifier;
743 }
Bharat saraswal1edde622016-09-06 10:18:04 +0530744
745 /**
746 * Removes empty directory.
747 *
748 * @param path path to be checked
749 */
750 public static void removeEmptyDirectory(String path) {
751 int index;
752 while (path != null && !path.equals("")) {
753 if (!removeDirectory(path)) {
754 break;
755 } else {
756 index = path.lastIndexOf(SLASH);
757 path = path.substring(0, index);
758 }
759 }
760 }
761
762 private static boolean removeDirectory(String path) {
763 File dir = new File(path);
764 boolean isDeleted = false;
765 if (dir.isDirectory()) {
766 File[] files = dir.listFiles();
767 if (files != null && files.length == 0) {
768 isDeleted = dir.delete();
769 } else if (files != null && files.length == 1) {
770 if (files[0].getName().equals("package-info.java")
771 || files[0].getName().endsWith("-temp")) {
772 isDeleted = dir.delete();
773 }
774 }
775 }
776 return isDeleted;
777 }
778
Bharat saraswal97459962016-02-20 21:57:16 +0530779}