258715e1140b695cbc522ae95885a5a5f0c13219
[aaf/authz.git] / misc / xgen / src / main / java / org / onap / aaf / misc / xgen / XGen.java
1 /**\r
2  * ============LICENSE_START====================================================\r
3  * org.onap.aaf\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
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \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
19  *\r
20  */\r
21 \r
22 package org.onap.aaf.misc.xgen;\r
23 \r
24 import java.io.PrintWriter;\r
25 import java.io.Writer;\r
26 import java.util.Stack;\r
27 \r
28 import org.onap.aaf.misc.env.util.IndentPrintWriter;\r
29 import org.onap.aaf.misc.env.util.StringBuilderWriter;\r
30 \r
31 public class XGen<RT extends XGen<RT>> {\r
32 \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
36     \r
37     protected XGen(Writer w) {\r
38         forward = new IndentPrintWriter(w);\r
39     }\r
40 \r
41     public int pushBack(Back b) {\r
42         int rv = backStack.size();\r
43         backStack.push(b);\r
44         return rv;\r
45     }\r
46 \r
47     public boolean pretty = false;\r
48     protected IndentPrintWriter forward;\r
49 \r
50     public IndentPrintWriter getWriter() {\r
51         return forward;\r
52     }\r
53 \r
54     protected PrintWriter back = new PrintWriter(\r
55                 new StringBuilderWriter(backSB));\r
56 \r
57     @SuppressWarnings("unchecked")\r
58     public RT pretty() {\r
59         pretty = true;\r
60         return (RT) this;\r
61     }\r
62 \r
63     protected void prettyln(PrintWriter pw) {\r
64         if (pretty)pw.println();\r
65     }\r
66 \r
67     public RT leaf(Mark mark, String tag, String ... args) {\r
68         mark.spot = backStack.size();\r
69         return leaf(tag, args);\r
70     }\r
71 \r
72     @SuppressWarnings("unchecked")\r
73     public RT leaf(String tag, String ... attrs) {\r
74         forward.append('<');\r
75         forward.append(tag);\r
76         addAttrs(attrs);\r
77         forward.append('>');\r
78         back.append("</");\r
79         back.append(tag);\r
80         back.append('>');\r
81         backStack.push(new Back(backSB.toString(), false, true));\r
82         backSB.setLength(0);\r
83         return (RT)this;\r
84     }\r
85 \r
86     public RT incr(String tag, String ... args) {\r
87         return incr(null, tag, false, args);\r
88     }\r
89 \r
90     public RT incr(String tag, boolean oneLine, String ... args) {\r
91         return incr(null, tag, oneLine, args);\r
92     }\r
93 \r
94     public RT incr(Mark mark) {\r
95         return incr(mark,mark.comment, false, new String[0]);\r
96     }\r
97 \r
98     public RT incr(Mark mark, String tag, String ... attrs) {\r
99         return incr(mark, tag, false, attrs);\r
100     }\r
101 \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
106         addAttrs(attrs);\r
107         forward.append('>');\r
108         \r
109         back.append("</");\r
110         back.append(tag);\r
111         back.append('>');\r
112     \r
113         if (pretty) {\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
117                     back.append(' ');\r
118                 }\r
119                 back.append("<!-- end ");\r
120                 back.append(mark.comment);\r
121                 back.append(" -->");\r
122                 \r
123                 forward.toCol(COMMENT_COLUMN);\r
124                 forward.append("<!-- begin ");\r
125                 forward.append(mark.comment);\r
126                 forward.append(" -->");\r
127             }\r
128             forward.inc();\r
129             if (!oneLine) {\r
130                 forward.println();\r
131             }\r
132             back.println();\r
133         }\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
137         return (RT)this;\r
138     }\r
139 \r
140     @SuppressWarnings("unchecked")\r
141     public RT tagOnly(String tag, String ... attrs) {\r
142         forward.append('<');\r
143         forward.append(tag);\r
144         addAttrs(attrs);\r
145         forward.append(" />");\r
146         if (pretty) {\r
147             forward.println();\r
148         }\r
149         return (RT)this;\r
150     }\r
151 \r
152     @SuppressWarnings("unchecked")\r
153     public RT text(String txt) {\r
154         if(txt!=null) {\r
155                 forward.append(txt);\r
156         }\r
157         return (RT)this;\r
158     }\r
159     \r
160     @SuppressWarnings("unchecked")\r
161     public RT xml(String txt) {\r
162         for (int i=0; i<txt.length();++i) {\r
163             char c = txt.charAt(i);\r
164             switch(c) {\r
165                 case '<':\r
166                     forward.append("&lt;");\r
167                     break;\r
168                 case '>':\r
169                     forward.append("&gt;");\r
170                     break;\r
171                 case '&':\r
172                     forward.append("&amp;");\r
173                     break;\r
174                 default:\r
175                     forward.append(c);\r
176             }\r
177         }\r
178         return (RT)this;\r
179     }\r
180 \r
181 \r
182     @SuppressWarnings("unchecked")\r
183     public RT textCR(int tabs, String txt) {\r
184         for (int i=0;i<tabs;++i) {\r
185             forward.append("  ");\r
186         }\r
187         if(txt!=null) {\r
188                 forward.append(txt);\r
189         }\r
190         if (pretty) {\r
191                 forward.println();\r
192         }\r
193         return (RT)this;\r
194     }\r
195 \r
196     @SuppressWarnings("unchecked")\r
197     public RT value() {\r
198         Mark mark = new Mark();\r
199         mark.spot = backStack.size()-1;\r
200         end(mark);\r
201         return (RT)this;\r
202     }\r
203 \r
204     @SuppressWarnings("unchecked")\r
205     public RT value(String txt) {\r
206         forward.append(txt);\r
207         Mark mark = new Mark();\r
208         mark.spot = backStack.size()-1;\r
209         end(mark);\r
210         return (RT)this;\r
211     }\r
212 \r
213     @SuppressWarnings("unchecked")\r
214     public RT value(String txt, int levels) {\r
215         forward.append(txt);\r
216         Mark mark = new Mark();\r
217         mark.spot = backStack.size()-levels;\r
218         end(mark);\r
219         return (RT)this;\r
220     }\r
221 \r
222     @SuppressWarnings("unchecked")\r
223     public RT end(Mark mark) {\r
224         int size = backStack.size();\r
225         Back c;\r
226         boolean println = false;\r
227         for (int i=mark==null?0:mark.spot;i<size;++i) {\r
228             c = backStack.pop();\r
229             if (c.dec)forward.dec();\r
230             forward.append(c.str);\r
231             println = c.cr;\r
232         }\r
233         if (pretty && println) {\r
234             forward.println();\r
235         }\r
236         return (RT)this;\r
237     }\r
238 \r
239     public RT end() {\r
240         Mark mark = new Mark();\r
241         mark.spot=backStack.size()-1;\r
242         if (mark.spot<0)mark.spot=0;\r
243         return end(mark);\r
244     }\r
245 \r
246     public RT end(int i) {\r
247         Mark mark = new Mark();\r
248         mark.spot=backStack.size()-i;\r
249         if (mark.spot<0)mark.spot=0;\r
250         return end(mark);\r
251     }\r
252 \r
253     public void endAll() {\r
254         end(new Mark());\r
255         forward.flush();\r
256     }\r
257 \r
258     protected void addAttrs(String[] attrs) {\r
259         if (attrs!=null) {\r
260             for (String attr : attrs) {\r
261                 if (attr!=null && attr.length()>0) {\r
262                     forward.append(' ');\r
263                     String[] split = attr.split("=",2);\r
264                     switch(split.length) {\r
265                         case 0:\r
266                             break;\r
267                         case 1:\r
268                             forward.append(split[0]);\r
269 //                            forward.append("=\"\"");\r
270                             break;\r
271                         default:\r
272                             forward.append(split[0]);\r
273                             forward.append("=\"");\r
274                             forward.append(split[1]);\r
275                             forward.append('"');\r
276                             break;\r
277                     }\r
278                 }\r
279             }\r
280         }\r
281     }\r
282 \r
283     @SuppressWarnings("unchecked")\r
284     public RT comment(String string) {\r
285         if (pretty) {\r
286             forward.print("<!--  ");\r
287             forward.print(string);\r
288             forward.println("  -->");\r
289         }\r
290         return (RT)this;\r
291     }\r
292 \r
293     public void setIndent(int indent) {\r
294         forward.setIndent(indent);\r
295         forward.toIndent();\r
296     }\r
297 \r
298     public int getIndent() {\r
299         return forward.getIndent();\r
300     }\r
301 \r
302 }\r