Reformat code according to Java Code Guidelines
[appc.git] / appc-config / appc-config-adaptor / provider / src / main / java / org / onap / appc / ccadaptor / XmlUtil.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : APP-C
4  * ================================================================================
5  * Copyright (C) 2017 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 package org.onap.appc.ccadaptor;
22
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 public class XmlUtil {
31
32     private static final Logger log = LoggerFactory.getLogger(XmlUtil.class);
33
34     public static String getXml(Map<String, String> varmap, String var) {
35         Object o = createStructure(varmap, var);
36         return generateXml(o, 0);
37     }
38
39     private static Object createStructure(Map<String, String> flatmap, String var) {
40         if (flatmap.containsKey(var)) {
41             return flatmap.get(var);
42         }
43
44         Map<String, Object> mm = new HashMap<>();
45         for (String k : flatmap.keySet()) {
46             if (k.startsWith(var + ".")) {
47                 int i1 = k.indexOf('.', var.length() + 1);
48                 int i2 = k.indexOf('[', var.length() + 1);
49                 int i3 = k.length();
50                 if (i1 > 0 && i1 < i3) {
51                     i3 = i1;
52                 }
53                 if (i2 > 0 && i2 < i3) {
54                     i3 = i2;
55                 }
56                 String k1 = k.substring(var.length() + 1, i3);
57                 String var1 = k.substring(0, i3);
58                 if (!mm.containsKey(k1)) {
59                     Object str = createStructure(flatmap, var1);
60                     if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0)) {
61                         mm.put(k1, str);
62                     }
63                 }
64             }
65         }
66         if (!mm.isEmpty()) {
67             return mm;
68         }
69
70         boolean arrayFound = false;
71         for (String k : flatmap.keySet()) {
72             if (k.startsWith(var + "[")) {
73                 arrayFound = true;
74                 break;
75             }
76         }
77
78         if (arrayFound) {
79             List<Object> ll = new ArrayList<>();
80
81             int length = Integer.MAX_VALUE;
82             String lengthStr = flatmap.get(var + "_length");
83             if (lengthStr != null) {
84                 try {
85                     length = Integer.parseInt(lengthStr);
86                 } catch (Exception e) {
87                     log.warn("Invalid number for " + var + "_length:" + lengthStr);
88                 }
89             }
90
91             for (int i = 0; i < length; i++) {
92                 Object v = createStructure(flatmap, var + '[' + i + ']');
93                 if (v == null) {
94                     break;
95                 }
96                 ll.add(v);
97             }
98
99             if (!ll.isEmpty()) {
100                 return ll;
101             }
102         }
103
104         return null;
105     }
106
107     @SuppressWarnings("unchecked")
108     private static String generateXml(Object o, int indent) {
109         if (o == null) {
110             return null;
111         }
112
113         if (o instanceof String) {
114             return (String) o;
115         }
116
117         if (o instanceof Map) {
118             StringBuilder ss = new StringBuilder();
119             Map<String, Object> mm = (Map<String, Object>) o;
120             for (String k : mm.keySet()) {
121                 Object v = mm.get(k);
122                 if (v instanceof String) {
123                     ss.append(pad(indent)).append('<').append(k).append('>');
124                     ss.append(v);
125                     ss.append("</").append(k).append('>').append('\n');
126                 } else if (v instanceof Map) {
127                     ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
128                     ss.append(generateXml(v, indent + 1));
129                     ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
130                 } else if (v instanceof List) {
131                     List<Object> ll = (List<Object>) v;
132                     for (Object o1 : ll) {
133                         ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
134                         ss.append(generateXml(o1, indent + 1));
135                         ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
136                     }
137                 }
138             }
139             return ss.toString();
140         }
141
142         return null;
143     }
144
145     private static String pad(int n) {
146         String s = "";
147         for (int i = 0; i < n; i++) {
148             s += '\t';
149         }
150         return s;
151     }
152 }