AT&T 2.0.19 Code drop, stage 1
[aaf/authz.git] / misc / xgen / src / main / java / org / onap / aaf / misc / xgen / XGen.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  *
20  */
21
22 package org.onap.aaf.misc.xgen;
23
24 import java.io.PrintWriter;
25 import java.io.Writer;
26 import java.util.Stack;
27
28 import org.onap.aaf.misc.env.util.IndentPrintWriter;
29 import org.onap.aaf.misc.env.util.StringBuilderWriter;
30
31 public class XGen<RT extends XGen<RT>> {
32
33         public static int COMMENT_COLUMN = 40;
34         private StringBuilder backSB = new StringBuilder();
35         private Stack<Back> backStack = new Stack<Back>();
36         
37         protected XGen(Writer w) {
38                 forward = new IndentPrintWriter(w);
39         }
40
41         public int pushBack(Back b) {
42                 int rv = backStack.size();
43                 backStack.push(b);
44                 return rv;
45         }
46
47         public boolean pretty = false;
48         protected IndentPrintWriter forward;
49
50         public IndentPrintWriter getWriter() {
51                 return forward;
52         }
53
54         protected PrintWriter back = new PrintWriter(
55                                 new StringBuilderWriter(backSB));
56
57         @SuppressWarnings("unchecked")
58         public RT pretty() {
59                 pretty = true;
60                 return (RT) this;
61         }
62
63         protected void prettyln(PrintWriter pw) {
64                 if(pretty)pw.println();
65         }
66
67         public RT leaf(Mark mark, String tag, String ... args) {
68                 mark.spot = backStack.size();
69                 return leaf(tag, args);
70         }
71
72         @SuppressWarnings("unchecked")
73         public RT leaf(String tag, String ... attrs) {
74                 forward.append('<');
75                 forward.append(tag);
76                 addAttrs(attrs);
77                 forward.append('>');
78                 back.append("</");
79                 back.append(tag);
80                 back.append('>');
81                 backStack.push(new Back(backSB.toString(), false, true));
82                 backSB.setLength(0);
83                 return (RT)this;
84         }
85
86         public RT incr(String tag, String ... args) {
87                 return incr(null, tag, false, args);
88         }
89
90         public RT incr(String tag, boolean oneLine, String ... args) {
91                 return incr(null, tag, oneLine, args);
92         }
93
94         public RT incr(Mark mark) {
95                 return incr(mark,mark.comment, false, new String[0]);
96         }
97
98         public RT incr(Mark mark, String tag, String ... attrs) {
99                 return incr(mark, tag, false, attrs);
100         }
101
102         @SuppressWarnings("unchecked")
103         public RT incr(Mark mark, String tag, boolean oneLine, String ... attrs) {
104                 forward.append('<');
105                 forward.append(tag);
106                 addAttrs(attrs);
107                 forward.append('>');
108                 
109                 back.append("</");
110                 back.append(tag);
111                 back.append('>');
112         
113                 if(pretty) {
114                         if(mark!=null && mark.comment!=null) {
115                                 int fi = forward.getIndent()*IndentPrintWriter.INDENT;
116                                 for(int i = fi+backSB.length();i<=COMMENT_COLUMN;++i) {
117                                         back.append(' ');
118                                 }
119                                 back.append("<!-- end ");
120                                 back.append(mark.comment);
121                                 back.append(" -->");
122                                 
123                                 forward.toCol(COMMENT_COLUMN);
124                                 forward.append("<!-- begin ");
125                                 forward.append(mark.comment);
126                                 forward.append(" -->");
127                         }
128                         forward.inc();
129                         if(!oneLine) {
130                                 forward.println();
131                         }
132                         back.println();
133                 }
134                 if(mark!=null)mark.spot = backStack.size();
135                 backStack.push(new Back(backSB.toString(),true, false));
136                 backSB.setLength(0);
137                 return (RT)this;
138         }
139
140         @SuppressWarnings("unchecked")
141         public RT tagOnly(String tag, String ... attrs) {
142                 forward.append('<');
143                 forward.append(tag);
144                 addAttrs(attrs);
145                 forward.append(" />");
146                 if(pretty) {
147                         forward.println();
148                 }
149                 return (RT)this;
150         }
151
152         @SuppressWarnings("unchecked")
153         public RT text(String txt) {
154                 forward.append(txt);
155                 return (RT)this;
156         }
157         
158         @SuppressWarnings("unchecked")
159         public RT xml(String txt) {
160                 for(int i=0; i<txt.length();++i) {
161                         char c = txt.charAt(i);
162                         switch(c) {
163                                 case '<':
164                                         forward.append("&lt;");
165                                         break;
166                                 case '>':
167                                         forward.append("&gt;");
168                                         break;
169                                 case '&':
170                                         forward.append("&amp;");
171                                         break;
172                                 default:
173                                         forward.append(c);
174                         }
175                 }
176                 return (RT)this;
177         }
178
179
180         @SuppressWarnings("unchecked")
181         public RT textCR(int tabs, String txt) {
182                 for(int i=0;i<tabs;++i) {
183                         forward.append("  ");
184                 }
185                 forward.append(txt);
186                 if(pretty)forward.println();
187                 return (RT)this;
188         }
189
190         @SuppressWarnings("unchecked")
191         public RT value() {
192                 Mark mark = new Mark();
193                 mark.spot = backStack.size()-1;
194                 end(mark);
195                 return (RT)this;
196         }
197
198         @SuppressWarnings("unchecked")
199         public RT value(String txt) {
200                 forward.append(txt);
201                 Mark mark = new Mark();
202                 mark.spot = backStack.size()-1;
203                 end(mark);
204                 return (RT)this;
205         }
206
207         @SuppressWarnings("unchecked")
208         public RT value(String txt, int levels) {
209                 forward.append(txt);
210                 Mark mark = new Mark();
211                 mark.spot = backStack.size()-levels;
212                 end(mark);
213                 return (RT)this;
214         }
215
216         @SuppressWarnings("unchecked")
217         public RT end(Mark mark) {
218                 int size = backStack.size();
219                 Back c;
220                 boolean println = false;
221                 for(int i=mark==null?0:mark.spot;i<size;++i) {
222                         c = backStack.pop();
223                         if(c.dec)forward.dec();
224                         forward.append(c.str);
225                         println = c.cr;
226                 }
227                 if(pretty && println) {
228                         forward.println();
229                 }
230                 return (RT)this;
231         }
232
233         public RT end() {
234                 Mark mark = new Mark();
235                 mark.spot=backStack.size()-1;
236                 if(mark.spot<0)mark.spot=0;
237                 return end(mark);
238         }
239
240         public RT end(int i) {
241                 Mark mark = new Mark();
242                 mark.spot=backStack.size()-i;
243                 if(mark.spot<0)mark.spot=0;
244                 return end(mark);
245         }
246
247         public void endAll() {
248                 end(new Mark());
249                 forward.flush();
250         }
251
252         protected void addAttrs(String[] attrs) {
253                 if(attrs!=null) {
254                         for(String attr : attrs) {
255                                 if(attr!=null && attr.length()>0) {
256                                         forward.append(' ');
257                                         String[] split = attr.split("=",2);
258                                         switch(split.length) {
259                                                 case 0:
260                                                         break;
261                                                 case 1:
262                                                         forward.append(split[0]);
263 //                                                      forward.append("=\"\"");
264                                                         break;
265                                                 default:
266                                                         forward.append(split[0]);
267                                                         forward.append("=\"");
268                                                         forward.append(split[1]);
269                                                         forward.append('"');
270                                                         break;
271                                         }
272                                 }
273                         }
274                 }
275         }
276
277         @SuppressWarnings("unchecked")
278         public RT comment(String string) {
279                 if(pretty) {
280                         forward.print("<!--  ");
281                         forward.print(string);
282                         forward.println("  -->");
283                 }
284                 return (RT)this;
285         }
286
287         public void setIndent(int indent) {
288                 forward.setIndent(indent);
289                 forward.toIndent();
290         }
291
292         public int getIndent() {
293                 return forward.getIndent();
294         }
295
296 }