2 * ============LICENSE_START====================================================
\r
4 * ===========================================================================
\r
5 * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
\r
6 * ===========================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END====================================================
\r
22 package org.onap.aaf.misc.xgen;
\r
24 import java.io.PrintWriter;
\r
25 import java.io.Writer;
\r
26 import java.util.Stack;
\r
28 import org.onap.aaf.misc.env.util.IndentPrintWriter;
\r
29 import org.onap.aaf.misc.env.util.StringBuilderWriter;
\r
31 public class XGen<RT extends XGen<RT>> {
\r
33 private static final int COMMENT_COLUMN = 40;
\r
34 private StringBuilder backSB = new StringBuilder();
\r
35 private Stack<Back> backStack = new Stack<Back>();
\r
37 protected XGen(Writer w) {
\r
38 forward = new IndentPrintWriter(w);
\r
41 public int pushBack(Back b) {
\r
42 int rv = backStack.size();
\r
47 public boolean pretty = false;
\r
48 protected IndentPrintWriter forward;
\r
50 public IndentPrintWriter getWriter() {
\r
54 protected PrintWriter back = new PrintWriter(
\r
55 new StringBuilderWriter(backSB));
\r
57 @SuppressWarnings("unchecked")
\r
58 public RT pretty() {
\r
63 protected void prettyln(PrintWriter pw) {
\r
64 if (pretty)pw.println();
\r
67 public RT leaf(Mark mark, String tag, String ... args) {
\r
68 mark.spot = backStack.size();
\r
69 return leaf(tag, args);
\r
72 @SuppressWarnings("unchecked")
\r
73 public RT leaf(String tag, String ... attrs) {
\r
74 forward.append('<');
\r
75 forward.append(tag);
\r
77 forward.append('>');
\r
81 backStack.push(new Back(backSB.toString(), false, true));
\r
82 backSB.setLength(0);
\r
86 public RT incr(String tag, String ... args) {
\r
87 return incr(null, tag, false, args);
\r
90 public RT incr(String tag, boolean oneLine, String ... args) {
\r
91 return incr(null, tag, oneLine, args);
\r
94 public RT incr(Mark mark) {
\r
95 return incr(mark,mark.comment, false, new String[0]);
\r
98 public RT incr(Mark mark, String tag, String ... attrs) {
\r
99 return incr(mark, tag, false, attrs);
\r
102 @SuppressWarnings("unchecked")
\r
103 public RT incr(Mark mark, String tag, boolean oneLine, String ... attrs) {
\r
104 forward.append('<');
\r
105 forward.append(tag);
\r
107 forward.append('>');
\r
114 if (mark!=null && mark.comment!=null) {
\r
115 int fi = forward.getIndent()*IndentPrintWriter.INDENT_MULTIPLIER;
\r
116 for (int i = fi+backSB.length();i<=COMMENT_COLUMN;++i) {
\r
119 back.append("<!-- end ");
\r
120 back.append(mark.comment);
\r
121 back.append(" -->");
\r
123 forward.toCol(COMMENT_COLUMN);
\r
124 forward.append("<!-- begin ");
\r
125 forward.append(mark.comment);
\r
126 forward.append(" -->");
\r
134 if (mark!=null)mark.spot = backStack.size();
\r
135 backStack.push(new Back(backSB.toString(),true, false));
\r
136 backSB.setLength(0);
\r
140 @SuppressWarnings("unchecked")
\r
141 public RT tagOnly(String tag, String ... attrs) {
\r
142 forward.append('<');
\r
143 forward.append(tag);
\r
145 forward.append(" />");
\r
152 @SuppressWarnings("unchecked")
\r
153 public RT text(String txt) {
\r
154 forward.append(txt);
\r
158 @SuppressWarnings("unchecked")
\r
159 public RT xml(String txt) {
\r
160 for (int i=0; i<txt.length();++i) {
\r
161 char c = txt.charAt(i);
\r
164 forward.append("<");
\r
167 forward.append(">");
\r
170 forward.append("&");
\r
180 @SuppressWarnings("unchecked")
\r
181 public RT textCR(int tabs, String txt) {
\r
182 for (int i=0;i<tabs;++i) {
\r
183 forward.append(" ");
\r
185 forward.append(txt);
\r
186 if (pretty)forward.println();
\r
190 @SuppressWarnings("unchecked")
\r
191 public RT value() {
\r
192 Mark mark = new Mark();
\r
193 mark.spot = backStack.size()-1;
\r
198 @SuppressWarnings("unchecked")
\r
199 public RT value(String txt) {
\r
200 forward.append(txt);
\r
201 Mark mark = new Mark();
\r
202 mark.spot = backStack.size()-1;
\r
207 @SuppressWarnings("unchecked")
\r
208 public RT value(String txt, int levels) {
\r
209 forward.append(txt);
\r
210 Mark mark = new Mark();
\r
211 mark.spot = backStack.size()-levels;
\r
216 @SuppressWarnings("unchecked")
\r
217 public RT end(Mark mark) {
\r
218 int size = backStack.size();
\r
220 boolean println = false;
\r
221 for (int i=mark==null?0:mark.spot;i<size;++i) {
\r
222 c = backStack.pop();
\r
223 if (c.dec)forward.dec();
\r
224 forward.append(c.str);
\r
227 if (pretty && println) {
\r
234 Mark mark = new Mark();
\r
235 mark.spot=backStack.size()-1;
\r
236 if (mark.spot<0)mark.spot=0;
\r
240 public RT end(int i) {
\r
241 Mark mark = new Mark();
\r
242 mark.spot=backStack.size()-i;
\r
243 if (mark.spot<0)mark.spot=0;
\r
247 public void endAll() {
\r
252 protected void addAttrs(String[] attrs) {
\r
254 for (String attr : attrs) {
\r
255 if (attr!=null && attr.length()>0) {
\r
256 forward.append(' ');
\r
257 String[] split = attr.split("=",2);
\r
258 switch(split.length) {
\r
262 forward.append(split[0]);
\r
263 // forward.append("=\"\"");
\r
266 forward.append(split[0]);
\r
267 forward.append("=\"");
\r
268 forward.append(split[1]);
\r
269 forward.append('"');
\r
277 @SuppressWarnings("unchecked")
\r
278 public RT comment(String string) {
\r
280 forward.print("<!-- ");
\r
281 forward.print(string);
\r
282 forward.println(" -->");
\r
287 public void setIndent(int indent) {
\r
288 forward.setIndent(indent);
\r
289 forward.toIndent();
\r
292 public int getIndent() {
\r
293 return forward.getIndent();
\r