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 * Util class for cleaning yang models of excess whitespaces
20 public final class YangSnippetCleaner {
22 private static final String[] RESERVED_LINES = { "yang-version", "namespace" };
25 private static final String NEW_LINE_REGEX = "\\r?\\n";
26 private static final Pattern NEW_LINE_PATTERN = Pattern.compile(NEW_LINE_REGEX);
29 private static final String WS_REGEX = "\\s+";
30 private static final Pattern WS_PATTERN = Pattern.compile(WS_REGEX);
32 private static final String START_BODY = "{";
33 private static final String END_BODY = "}";
34 private static final String KEY_PART = "key \"";
35 private static final String UNIQUE_PART = "unique \"";
36 private static final String SPECIAL_END_LINE = "\";";
38 private static final char NEW_LINE = '\n';
39 private static final char SPACE = ' ';
41 private static final int INDENT = 4;
43 private YangSnippetCleaner() {
44 throw new UnsupportedOperationException("Util class");
48 * Cleaning yang model of excess whitespaces, adding indentations
51 * - unformed yang model
52 * @return cleaned yang model
54 public static String clean(final String unformedYang) {
56 final StringBuilder sb = new StringBuilder();
57 final String[] splitter = unformedYang.split(NEW_LINE_PATTERN.pattern());
59 for (int i = 0; i < splitter.length; i++) {
60 if (!StringUtils.isBlank(splitter[i])) {
61 String line = cleanLine(splitter[i]);
62 if(line.equals(START_BODY)) {
63 indentCount = mergeWithPrevious(sb, indentCount);
66 if ((line.contains(KEY_PART) || line.contains(UNIQUE_PART)) && line.endsWith(SPECIAL_END_LINE)) {
67 line = new StringBuilder(line.substring(0, line.indexOf(SPECIAL_END_LINE) - 1))
68 .append(SPECIAL_END_LINE).toString();
70 indentCount = lineIndent(sb, indentCount, line);
71 sb.append(line).append(NEW_LINE);
72 if (!StringUtils.startsWithAny(line, RESERVED_LINES) && indentCount == 1 && i != 0) {
77 if (sb.toString().isEmpty()) {
80 if (sb.charAt(sb.length() - 4) == NEW_LINE && sb.charAt(sb.length() - 3) == NEW_LINE) {
81 sb.deleteCharAt(sb.length() - 3);
83 removeRemainingWhitespace(sb);
89 private static int mergeWithPrevious(final StringBuilder sb, final int indentCount) {
90 int newIndentCount = indentCount;
91 removeRemainingWhitespace(sb);
93 sb.append(START_BODY);
95 return ++newIndentCount;
98 private static void removeRemainingWhitespace(final StringBuilder sb) {
99 while (StringUtils.isWhitespace(String.valueOf(sb.charAt(sb.length() - 1)))) {
100 sb.deleteCharAt(sb.length() - 1);
104 private static String cleanLine(final String split) {
105 final StringBuilder sb = new StringBuilder();
106 final String[] s = split.split(WS_PATTERN.pattern());
107 for (int i = 0; i < s.length; i++) {
108 if (!StringUtils.isBlank(s[i])) {
110 if (i != (s.length - 1)) {
115 return sb.toString();
118 private static int lineIndent(final StringBuilder sb, final int indentCount, final String line) {
119 int newIndentCount = indentCount;
120 if (line.contains(END_BODY) && !line.contains(START_BODY)) {
123 for (int i = 0; i < (newIndentCount * INDENT); i++) {
127 if (line.contains(START_BODY) && !line.contains(END_BODY)) {
131 return newIndentCount;