Second part of onap rename
[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
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 public class XmlUtil
32 {
33
34   private static final Logger log = LoggerFactory.getLogger(XmlUtil.class);
35
36   public static String getXml(Map<String, String> varmap, String var)
37   {
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   {
44     if (flatmap.containsKey(var))
45       return flatmap.get(var);
46
47     Map<String, Object> mm = new HashMap<>();
48     for (String k : flatmap.keySet())
49       if (k.startsWith(var + "."))
50       {
51         int i1 = k.indexOf('.', var.length() + 1);
52         int i2 = k.indexOf('[', var.length() + 1);
53         int i3 = k.length();
54         if (i1 > 0 && i1 < i3)
55           i3 = i1;
56         if (i2 > 0 && i2 < i3)
57           i3 = i2;
58         String k1 = k.substring(var.length() + 1, i3);
59         String var1 = k.substring(0, i3);
60         if (!mm.containsKey(k1))
61         {
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     if (!mm.isEmpty())
68       return mm;
69
70     boolean arrayFound = false;
71     for (String k : flatmap.keySet())
72       if (k.startsWith(var + "["))
73       {
74         arrayFound = true;
75         break;
76       }
77
78     if (arrayFound)
79     {
80       List<Object> ll = new ArrayList<>();
81
82       int length = Integer.MAX_VALUE;
83       String lengthStr = flatmap.get(var + "_length");
84       if (lengthStr != null)
85       {
86         try
87         {
88           length = Integer.parseInt(lengthStr);
89         }
90         catch (Exception e)
91         {
92           log.warn("Invalid number for " + var + "_length:" + lengthStr);
93         }
94       }
95
96       for (int i = 0; i < length; i++)
97       {
98         Object v = createStructure(flatmap, var + '[' + i + ']');
99         if (v == null)
100           break;
101         ll.add(v);
102       }
103
104       if (!ll.isEmpty())
105         return ll;
106     }
107
108     return null;
109   }
110
111   @SuppressWarnings("unchecked")
112   private static String generateXml(Object o, int indent)
113   {
114     if (o == null)
115       return null;
116
117     if (o instanceof String)
118       return (String) o;
119
120     if (o instanceof Map)
121     {
122       StringBuilder ss = new StringBuilder();
123       Map<String, Object> mm = (Map<String, Object>) o;
124       for (String k : mm.keySet())
125       {
126         Object v = mm.get(k);
127         if (v instanceof String)
128         {
129           ss.append(pad(indent)).append('<').append(k).append('>');
130           ss.append(v);
131           ss.append("</").append(k).append('>').append('\n');
132         }
133         else if (v instanceof Map)
134         {
135           ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
136           ss.append(generateXml(v, indent + 1));
137           ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
138         }
139         else if (v instanceof List)
140         {
141           List<Object> ll = (List<Object>) v;
142           for (Object o1 : ll)
143           {
144             ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
145             ss.append(generateXml(o1, indent + 1));
146             ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
147           }
148         }
149       }
150       return ss.toString();
151     }
152
153     return null;
154   }
155
156   private static String pad(int n)
157   {
158     String s = "";
159     for (int i = 0; i < n; i++)
160       s += '\t';
161     return s;
162   }
163 }