2 * Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.javav2.generator.util;
10 import com.google.common.annotations.Beta;
11 import java.util.regex.Pattern;
12 import javax.annotation.RegEx;
13 import org.apache.commons.lang3.StringUtils;
16 * Utility class for cleaning yang models of excess whitespaces.
19 public final class YangSnippetCleaner {
21 private static final String[] RESERVED_LINES = { "yang-version", "namespace" };
24 private static final String NEW_LINE_REGEX = "\\r?\\n";
25 private static final Pattern NEW_LINE_PATTERN = Pattern.compile(NEW_LINE_REGEX);
28 private static final String WS_REGEX = "\\s+";
29 private static final Pattern WS_PATTERN = Pattern.compile(WS_REGEX);
31 private static final String START_BODY = "{";
32 private static final String END_BODY = "}";
33 private static final String KEY_PART = "key \"";
34 private static final String UNIQUE_PART = "unique \"";
35 private static final String SPECIAL_END_LINE = "\";";
37 private static final char NEW_LINE = '\n';
38 private static final char SPACE = ' ';
40 private static final int INDENT = 4;
42 private YangSnippetCleaner() {
43 throw new UnsupportedOperationException("Util class");
47 * Cleaning yang model of excess whitespaces, adding indentations.
50 * - unformed yang model
51 * @return cleaned yang model
53 public static String clean(final String unformedYang) {
55 final StringBuilder sb = new StringBuilder();
56 final String[] splitter = NEW_LINE_PATTERN.split(unformedYang);
58 for (int i = 0; i < splitter.length; i++) {
59 if (!StringUtils.isBlank(splitter[i])) {
60 String line = cleanLine(splitter[i]);
61 if (START_BODY.equals(line)) {
62 indentCount = mergeWithPrevious(sb, indentCount);
65 if ((line.contains(KEY_PART) || line.contains(UNIQUE_PART)) && line.endsWith(SPECIAL_END_LINE)) {
66 line = new StringBuilder(line.substring(0, line.indexOf(SPECIAL_END_LINE) - 1))
67 .append(SPECIAL_END_LINE).toString();
69 indentCount = lineIndent(sb, indentCount, line);
70 sb.append(line).append(NEW_LINE);
71 if (!StringUtils.startsWithAny(line, RESERVED_LINES) && indentCount == 1 && i != 0) {
76 if (sb.length() == 0) {
79 if (sb.charAt(sb.length() - 4) == NEW_LINE && sb.charAt(sb.length() - 3) == NEW_LINE) {
80 sb.deleteCharAt(sb.length() - 3);
82 removeRemainingWhitespace(sb);
88 private static int mergeWithPrevious(final StringBuilder sb, final int indentCount) {
89 removeRemainingWhitespace(sb);
91 sb.append(START_BODY);
93 int newIndentCount = indentCount;
94 return ++newIndentCount;
97 private static void removeRemainingWhitespace(final StringBuilder sb) {
98 while (StringUtils.isWhitespace(String.valueOf(sb.charAt(sb.length() - 1)))) {
99 sb.deleteCharAt(sb.length() - 1);
103 private static String cleanLine(final String split) {
104 final StringBuilder sb = new StringBuilder();
105 final String[] s = WS_PATTERN.split(split);
106 for (int i = 0; i < s.length; i++) {
107 if (!StringUtils.isBlank(s[i])) {
109 if (i != s.length - 1) {
114 return sb.toString();
117 private static int lineIndent(final StringBuilder sb, final int indentCount, final String line) {
118 int newIndentCount = indentCount;
119 if (line.contains(END_BODY) && !line.contains(START_BODY)) {
122 for (int i = 0; i < newIndentCount * INDENT; i++) {
126 if (line.contains(START_BODY) && !line.contains(END_BODY)) {
130 return newIndentCount;