Update DCAE Startup Info
[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         forward.append(txt);\r
155         return (RT)this;\r
156     }\r
157     \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
162             switch(c) {\r
163                 case '<':\r
164                     forward.append("&lt;");\r
165                     break;\r
166                 case '>':\r
167                     forward.append("&gt;");\r
168                     break;\r
169                 case '&':\r
170                     forward.append("&amp;");\r
171                     break;\r
172                 default:\r
173                     forward.append(c);\r
174             }\r
175         }\r
176         return (RT)this;\r
177     }\r
178 \r
179 \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
184         }\r
185         forward.append(txt);\r
186         if (pretty)forward.println();\r
187         return (RT)this;\r
188     }\r
189 \r
190     @SuppressWarnings("unchecked")\r
191     public RT value() {\r
192         Mark mark = new Mark();\r
193         mark.spot = backStack.size()-1;\r
194         end(mark);\r
195         return (RT)this;\r
196     }\r
197 \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
203         end(mark);\r
204         return (RT)this;\r
205     }\r
206 \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
212         end(mark);\r
213         return (RT)this;\r
214     }\r
215 \r
216     @SuppressWarnings("unchecked")\r
217     public RT end(Mark mark) {\r
218         int size = backStack.size();\r
219         Back c;\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
225             println = c.cr;\r
226         }\r
227         if (pretty && println) {\r
228             forward.println();\r
229         }\r
230         return (RT)this;\r
231     }\r
232 \r
233     public RT end() {\r
234         Mark mark = new Mark();\r
235         mark.spot=backStack.size()-1;\r
236         if (mark.spot<0)mark.spot=0;\r
237         return end(mark);\r
238     }\r
239 \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
244         return end(mark);\r
245     }\r
246 \r
247     public void endAll() {\r
248         end(new Mark());\r
249         forward.flush();\r
250     }\r
251 \r
252     protected void addAttrs(String[] attrs) {\r
253         if (attrs!=null) {\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
259                         case 0:\r
260                             break;\r
261                         case 1:\r
262                             forward.append(split[0]);\r
263 //                            forward.append("=\"\"");\r
264                             break;\r
265                         default:\r
266                             forward.append(split[0]);\r
267                             forward.append("=\"");\r
268                             forward.append(split[1]);\r
269                             forward.append('"');\r
270                             break;\r
271                     }\r
272                 }\r
273             }\r
274         }\r
275     }\r
276 \r
277     @SuppressWarnings("unchecked")\r
278     public RT comment(String string) {\r
279         if (pretty) {\r
280             forward.print("<!--  ");\r
281             forward.print(string);\r
282             forward.println("  -->");\r
283         }\r
284         return (RT)this;\r
285     }\r
286 \r
287     public void setIndent(int indent) {\r
288         forward.setIndent(indent);\r
289         forward.toIndent();\r
290     }\r
291 \r
292     public int getIndent() {\r
293         return forward.getIndent();\r
294     }\r
295 \r
296 }\r