Conform ccsdk/sli/plugins to ONAP Style
[ccsdk/sli/plugins.git] / restapi-call-node / provider / src / main / java / org / onap / ccsdk / sli / plugins / restapicall / XmlJsonUtil.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * openECOMP : SDN-C
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                      reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.ccsdk.sli.plugins.restapicall;
23
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 public class XmlJsonUtil {
33
34     private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class);
35
36     public static String getXml(Map<String, String> varmap, String var) {
37         boolean escape = true;
38         if (var.startsWith("'")) {
39             var = var.substring(1);
40             escape = false;
41         }
42
43         Object o = createStructure(varmap, var);
44         return generateXml(o, 0, escape);
45     }
46
47     public static String getJson(Map<String, String> varmap, String var) {
48         boolean escape = true;
49         if (var.startsWith("'")) {
50             var = var.substring(1);
51             escape = false;
52         }
53
54         Object o = createStructure(varmap, var);
55         return generateJson(o, escape);
56     }
57
58     private static Object createStructure(Map<String, String> flatmap, String var) {
59         if (flatmap.containsKey(var)) {
60             if (var.endsWith("_length") || var.endsWith("].key"))
61                 return null;
62             return flatmap.get(var);
63         }
64
65         Map<String, Object> mm = new HashMap<>();
66         for (String k : flatmap.keySet())
67             if (k.startsWith(var + ".")) {
68                 int i1 = k.indexOf('.', var.length() + 1);
69                 int i2 = k.indexOf('[', var.length() + 1);
70                 int i3 = k.length();
71                 if (i1 > 0 && i1 < i3)
72                     i3 = i1;
73                 if (i2 > 0 && i2 < i3)
74                     i3 = i2;
75                 String k1 = k.substring(var.length() + 1, i3);
76                 String var1 = k.substring(0, i3);
77                 if (!mm.containsKey(k1)) {
78                     Object str = createStructure(flatmap, var1);
79                     if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0))
80                         mm.put(k1, str);
81                 }
82             }
83         if (!mm.isEmpty())
84             return mm;
85
86         boolean arrayFound = false;
87         for (String k : flatmap.keySet())
88             if (k.startsWith(var + "[")) {
89                 arrayFound = true;
90                 break;
91             }
92
93         if (arrayFound) {
94             List<Object> ll = new ArrayList<>();
95
96             int length = Integer.MAX_VALUE;
97             String lengthStr = flatmap.get(var + "_length");
98             if (lengthStr != null) {
99                 try {
100                     length = Integer.parseInt(lengthStr);
101                 } catch (Exception e) {
102                     log.warn("Invalid number for " + var + "_length:" + lengthStr);
103                 }
104             }
105
106             for (int i = 0; i < length; i++) {
107                 Object v = createStructure(flatmap, var + '[' + i + ']');
108                 if (v == null)
109                     break;
110                 ll.add(v);
111             }
112
113             if (!ll.isEmpty())
114                 return ll;
115         }
116
117         return null;
118     }
119
120     @SuppressWarnings("unchecked")
121     private static String generateXml(Object o, int indent, boolean escape) {
122         if (o == null)
123             return null;
124
125         if (o instanceof String)
126             return escape ? escapeXml((String) o) : (String) o;;
127
128         if (o instanceof Map) {
129             StringBuilder ss = new StringBuilder();
130             Map<String, Object> mm = (Map<String, Object>) o;
131             for (String k : mm.keySet()) {
132                 Object v = mm.get(k);
133                 if (v instanceof String) {
134                     String s = escape ? escapeXml((String) v) : (String) v;
135                     ss.append(pad(indent)).append('<').append(k).append('>');
136                     ss.append(s);
137                     ss.append("</").append(k).append('>').append('\n');
138                 } else if (v instanceof Map) {
139                     ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
140                     ss.append(generateXml(v, indent + 1, escape));
141                     ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
142                 } else if (v instanceof List) {
143                     List<Object> ll = (List<Object>) v;
144                     for (Object o1 : ll) {
145                         ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
146                         ss.append(generateXml(o1, indent + 1, escape));
147                         ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
148                     }
149                 }
150             }
151             return ss.toString();
152         }
153
154         return null;
155     }
156
157     private static String generateJson(Object o, boolean escape) {
158         if (o == null)
159             return null;
160
161         StringBuilder ss = new StringBuilder();
162         generateJson(ss, o, 0, false, escape);
163         return ss.toString();
164     }
165
166     @SuppressWarnings("unchecked")
167     private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape) {
168         if (o instanceof String) {
169             String s = escape ? escapeJson((String) o) : (String) o;
170             if (padFirst)
171                 ss.append(pad(indent));
172             ss.append('"').append(s).append('"');
173             return;
174         }
175
176         if (o instanceof Map) {
177             Map<String, Object> mm = (Map<String, Object>) o;
178
179             if (padFirst)
180                 ss.append(pad(indent));
181             ss.append("{\n");
182
183             boolean first = true;
184             for (String k : mm.keySet()) {
185                 if (!first)
186                     ss.append(",\n");
187                 first = false;
188
189                 Object v = mm.get(k);
190                 ss.append(pad(indent + 1)).append('"').append(k).append("\": ");
191                 generateJson(ss, v, indent + 1, false, escape);
192             }
193
194             ss.append("\n");
195             ss.append(pad(indent)).append('}');
196
197             return;
198         }
199
200         if (o instanceof List) {
201             List<Object> ll = (List<Object>) o;
202
203             if (padFirst)
204                 ss.append(pad(indent));
205             ss.append("[\n");
206
207             boolean first = true;
208             for (Object o1 : ll) {
209                 if (!first)
210                     ss.append(",\n");
211                 first = false;
212
213                 generateJson(ss, o1, indent + 1, true, escape);
214             }
215
216             ss.append("\n");
217             ss.append(pad(indent)).append(']');
218         }
219     }
220
221     public static String removeLastCommaJson(String s) {
222         StringBuilder sb = new StringBuilder();
223         int k = 0;
224         int start = 0;
225         while (k < s.length()) {
226             int i11 = s.indexOf('}', k);
227             int i12 = s.indexOf(']', k);
228             int i1 = -1;
229             if (i11 < 0)
230                 i1 = i12;
231             else if (i12 < 0)
232                 i1 = i11;
233             else
234                 i1 = i11 < i12 ? i11 : i12;
235             if (i1 < 0)
236                 break;
237
238             int i2 = s.lastIndexOf(',', i1);
239             if (i2 < 0) {
240                 k = i1 + 1;
241                 continue;
242             }
243
244             String between = s.substring(i2 + 1, i1);
245             if (between.trim().length() > 0) {
246                 k = i1 + 1;
247                 continue;
248             }
249
250             sb.append(s.substring(start, i2));
251             start = i2 + 1;
252             k = i1 + 1;
253         }
254
255         sb.append(s.substring(start, s.length()));
256
257         return sb.toString();
258     }
259
260     public static String removeEmptyStructJson(String s) {
261         int k = 0;
262         while (k < s.length()) {
263             boolean curly = true;
264             int i11 = s.indexOf('{', k);
265             int i12 = s.indexOf('[', k);
266             int i1 = -1;
267             if (i11 < 0) {
268                 i1 = i12;
269                 curly = false;
270             } else if (i12 < 0)
271                 i1 = i11;
272             else
273                 if (i11 < i12)
274                     i1 = i11;
275                 else {
276                     i1 = i12;
277                     curly = false;
278                 }
279
280             if (i1 >= 0) {
281                 int i2 = curly ? s.indexOf('}', i1) : s.indexOf(']', i1);
282                 if (i2 > 0) {
283                     String value = s.substring(i1 + 1, i2);
284                     if (value.trim().length() == 0) {
285                         int i4 = s.lastIndexOf('\n', i1);
286                         if (i4 < 0)
287                             i4 = 0;
288                         int i5 = s.indexOf('\n', i2);
289                         if (i5 < 0)
290                             i5 = s.length();
291
292                         s = s.substring(0, i4) + s.substring(i5);
293                         k = 0;
294                     } else
295                         k = i1 + 1;
296                 } else
297                     break;
298             } else
299                 break;
300         }
301
302         return s;
303     }
304
305     public static String removeEmptyStructXml(String s) {
306         int k = 0;
307         while (k < s.length()) {
308             int i1 = s.indexOf('<', k);
309             if (i1 < 0 || i1 == s.length() - 1)
310                 break;
311
312             char c1 = s.charAt(i1 + 1);
313             if (c1 == '?' || c1 == '!') {
314                 k = i1 + 2;
315                 continue;
316             }
317
318             int i2 = s.indexOf('>', i1);
319             if (i2 < 0) {
320                 k = i1 + 1;
321                 continue;
322             }
323
324             String closingTag = "</" + s.substring(i1 + 1, i2 + 1);
325             int i3 = s.indexOf(closingTag, i2 + 1);
326             if (i3 < 0) {
327                 k = i2 + 1;
328                 continue;
329             }
330
331             String value = s.substring(i2 + 1, i3);
332             if (value.trim().length() > 0) {
333                 k = i2 + 1;
334                 continue;
335             }
336
337             int i4 = s.lastIndexOf('\n', i1);
338             if (i4 < 0)
339                 i4 = 0;
340             int i5 = s.indexOf('\n', i3);
341             if (i5 < 0)
342                 i5 = s.length();
343
344             s = s.substring(0, i4) + s.substring(i5);
345             k = 0;
346         }
347
348         return s;
349     }
350
351     private static String escapeXml(String v) {
352         String s = v.replaceAll("&", "&amp;");
353         s = s.replaceAll("<", "&lt;");
354         s = s.replaceAll("'", "&apos;");
355         s = s.replaceAll("\"", "&quot;");
356         s = s.replaceAll(">", "&gt;");
357         return s;
358     }
359
360     private static String escapeJson(String v) {
361         String s = v.replaceAll("\\\\", "\\\\\\\\");
362         s = s.replaceAll("\"", "\\\\\"");
363         return s;
364     }
365
366     private static String pad(int n) {
367         String s = "";
368         for (int i = 0; i < n; i++)
369             s += '\t';
370         return s;
371     }
372 }