Merge "fix critical sonar"
[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