4ebbf3491e89995610303f74f11da08c7d46ca24
[appc.git] / appc-config / appc-config-adaptor / provider / src / main / java / org / onap / appc / ccadaptor / XmlUtil.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : APPC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Copyright (C) 2017 Amdocs
8  * =============================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  * ============LICENSE_END=========================================================
23  */
24 package org.onap.appc.ccadaptor;
25
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.List;
29 import java.util.Map;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 public class XmlUtil {
34
35     private static final Logger log = LoggerFactory.getLogger(XmlUtil.class);
36
37     public static String getXml(Map<String, String> varmap, String var) {
38         Object o = createStructure(varmap, var);
39         return generateXml(o, 0);
40     }
41
42     private static Object createStructure(Map<String, String> flatmap, String var) {
43         if (flatmap.containsKey(var)) {
44             return flatmap.get(var);
45         }
46
47         Map<String, Object> mm = new HashMap<>();
48         for (String k : flatmap.keySet()) {
49             if (k.startsWith(var + ".")) {
50                 int i1 = k.indexOf('.', var.length() + 1);
51                 int i2 = k.indexOf('[', var.length() + 1);
52                 int i3 = k.length();
53                 if (i1 > 0 && i1 < i3) {
54                     i3 = i1;
55                 }
56                 if (i2 > 0 && i2 < i3) {
57                     i3 = i2;
58                 }
59                 String k1 = k.substring(var.length() + 1, i3);
60                 String var1 = k.substring(0, i3);
61                 if (!mm.containsKey(k1)) {
62                     Object str = createStructure(flatmap, var1);
63                     if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0)) {
64                         mm.put(k1, str);
65                     }
66                 }
67             }
68         }
69         if (!mm.isEmpty()) {
70             return mm;
71         }
72
73         boolean arrayFound = false;
74         for (String k : flatmap.keySet()) {
75             if (k.startsWith(var + "[")) {
76                 arrayFound = true;
77                 break;
78             }
79         }
80
81         if (arrayFound) {
82             List<Object> ll = new ArrayList<>();
83
84             int length = Integer.MAX_VALUE;
85             String lengthStr = flatmap.get(var + "_length");
86             if (lengthStr != null) {
87                 try {
88                     length = Integer.parseInt(lengthStr);
89                 } catch (Exception e) {
90                     log.warn("Invalid number for " + var + "_length:" + lengthStr);
91                 }
92             }
93
94             for (int i = 0; i < length; i++) {
95                 Object v = createStructure(flatmap, var + '[' + i + ']');
96                 if (v == null) {
97                     break;
98                 }
99                 ll.add(v);
100             }
101
102             if (!ll.isEmpty()) {
103                 return ll;
104             }
105         }
106
107         return null;
108     }
109
110     @SuppressWarnings("unchecked")
111     private static String generateXml(Object o, int indent) {
112         if (o == null) {
113             return null;
114         }
115
116         if (o instanceof String) {
117             return (String) o;
118         }
119
120         if (o instanceof Map) {
121             StringBuilder ss = new StringBuilder();
122             Map<String, Object> mm = (Map<String, Object>) o;
123             for (String k : mm.keySet()) {
124                 Object v = mm.get(k);
125                 if (v instanceof String) {
126                     ss.append(pad(indent)).append('<').append(k).append('>');
127                     ss.append(v);
128                     ss.append("</").append(k).append('>').append('\n');
129                 } else if (v instanceof Map) {
130                     ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
131                     ss.append(generateXml(v, indent + 1));
132                     ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
133                 } else if (v instanceof List) {
134                     List<Object> ll = (List<Object>) v;
135                     for (Object o1 : ll) {
136                         ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
137                         ss.append(generateXml(o1, indent + 1));
138                         ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
139                     }
140                 }
141             }
142             return ss.toString();
143         }
144
145         return null;
146     }
147
148     private static String pad(int n) {
149         String s = "";
150         for (int i = 0; i < n; i++) {
151             s += '\t';
152         }
153         return s;
154     }
155 }