Bug 6859 #2 Binding generator v1 refactoring
[mdsal.git] / binding / mdsal-binding-generator-impl / src / main / java / org / opendaylight / mdsal / binding / generator / impl / YangTextTemplate.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.generator.impl;
9
10 import com.google.common.base.CharMatcher;
11 import com.google.common.base.Strings;
12 import com.google.common.collect.Iterables;
13 import java.util.StringTokenizer;
14 import org.opendaylight.yangtools.yang.common.QName;
15
16 final class YangTextTemplate {
17     private static final CharMatcher NEWLINE_OR_TAB = CharMatcher.anyOf("\n\t");
18
19     private YangTextTemplate() {
20         throw new UnsupportedOperationException();
21     }
22
23     static String formatSchemaPath(final String moduleName, final Iterable<QName> schemaPath) {
24         final StringBuilder sb = new StringBuilder();
25         sb.append(moduleName);
26
27         QName currentElement = Iterables.getFirst(schemaPath, null);
28         for (QName pathElement : schemaPath) {
29             sb.append('/');
30             if (!currentElement.getNamespace().equals(pathElement.getNamespace())) {
31                 currentElement = pathElement;
32                 sb.append(pathElement);
33             } else {
34                 sb.append(pathElement.getLocalName());
35             }
36         }
37         return sb.toString();
38     }
39
40     static String formatToAugmentPath(final Iterable<QName> schemaPath) {
41         final StringBuilder sb = new StringBuilder();
42         for (QName pathElement : schemaPath) {
43             sb.append("\\(").append(pathElement.getNamespace()).append(')').append(pathElement.getLocalName());
44         }
45         return sb.toString();
46     }
47
48     static String formatToParagraph(final String text, final int nextLineIndent) {
49         if (Strings.isNullOrEmpty(text)) {
50             return "";
51         }
52
53         final StringBuilder sb = new StringBuilder();
54         final StringBuilder lineBuilder = new StringBuilder();
55         boolean isFirstElementOnNewLineEmptyChar = false;
56         final String lineIndent = Strings.repeat(" ", nextLineIndent);
57
58         String formattedText = NEWLINE_OR_TAB.removeFrom(text);
59         formattedText = formattedText.replaceAll(" +", " ");
60
61         final StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true);
62
63         while (tokenizer.hasMoreElements()) {
64             final String nextElement = tokenizer.nextElement().toString();
65
66             if (lineBuilder.length() + nextElement.length() > 80) {
67                 // Trim trailing whitespace
68                 for (int i = lineBuilder.length() - 1; i >= 0 && lineBuilder.charAt(i) != ' '; --i) {
69                     lineBuilder.setLength(i);
70                 }
71
72                 // Trim leading whitespace
73                 while (lineBuilder.charAt(0) == ' ') {
74                     lineBuilder.deleteCharAt(0);
75                 }
76
77                 sb.append(lineBuilder).append('\n');
78                 lineBuilder.setLength(0);
79
80                 if (nextLineIndent > 0) {
81                     sb.append(lineIndent);
82                 }
83
84                 if (" ".equals(nextElement)) {
85                     isFirstElementOnNewLineEmptyChar = true;
86                 }
87             }
88             if (isFirstElementOnNewLineEmptyChar) {
89                 isFirstElementOnNewLineEmptyChar = false;
90             } else {
91                 lineBuilder.append(nextElement);
92             }
93         }
94
95         return sb.append(lineBuilder).append('\n').toString();
96     }
97 }