a038468fb4cbc0e9e688e573b29ef279bbcdfcdf
[oam/tr069-adapter.git] / mapper / src / main / java / org / commscope / tr069adapter / mapper / util / MOMetaDataUtil.java
1 /*\r
2  * ============LICENSE_START========================================================================\r
3  * ONAP : tr-069-adapter\r
4  * =================================================================================================\r
5  * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
6  * =================================================================================================\r
7  * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
8  * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
9  * may obtain a copy of the License at\r
10  *\r
11  * http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
14  * either express or implied. See the License for the specific language governing permissions and\r
15  * limitations under the License.\r
16  * ===============LICENSE_END=======================================================================\r
17  */\r
18 \r
19 package org.commscope.tr069adapter.mapper.util;\r
20 \r
21 import java.io.File;\r
22 import java.io.IOException;\r
23 import java.nio.charset.StandardCharsets;\r
24 import java.util.ArrayList;\r
25 import java.util.Collection;\r
26 import java.util.HashMap;\r
27 import java.util.HashSet;\r
28 import java.util.List;\r
29 import java.util.Map;\r
30 import java.util.Set;\r
31 \r
32 import javax.annotation.PostConstruct;\r
33 \r
34 import org.apache.commons.io.FileUtils;\r
35 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
36 import org.commscope.tr069adapter.mapper.MOMetaData;\r
37 import org.slf4j.Logger;\r
38 import org.slf4j.LoggerFactory;\r
39 import org.springframework.stereotype.Component;\r
40 \r
41 @Component\r
42 public class MOMetaDataUtil {\r
43 \r
44   private static final String STRING_I = ".{i}.";\r
45   private static final Logger LOG = LoggerFactory.getLogger(MOMetaDataUtil.class);\r
46   private static final String GENERIC_INDEX_REGEX = "\\.\\{[i-l]\\}\\.";\r
47   private static final String INDEX_REGEX = "\\.[0-9]{1,}\\.";\r
48   private static final String MO_META_DATA_FILE_LOCATION = "mapper-schema";\r
49   private Map<String, MOMetaData> metaDataMap;\r
50   private Map<String, String> metaDataReverseMap;\r
51   public static final String ORAN_SW_MGMT_URI = "urn:o-ran:software-management:1.0";\r
52 \r
53   @PostConstruct\r
54   public void loadMetaData() {\r
55     try {\r
56       LOG.info("Loading mapper schema");\r
57       if (metaDataMap != null)\r
58         metaDataMap.clear();\r
59       if (metaDataReverseMap != null)\r
60         metaDataReverseMap.clear();\r
61       getMetaDataAsMap(MO_META_DATA_FILE_LOCATION);\r
62       LOG.info("Loading mapper schema successfully completed");\r
63     } catch (IOException e) {\r
64       LOG.error("Exception : {}", e.getMessage());\r
65     }\r
66   }\r
67 \r
68   private void getMetaDataAsMap(String fileLocation) throws IOException {\r
69     metaDataMap = new HashMap<>();\r
70     metaDataReverseMap = new HashMap<>();\r
71     Collection<File> files = FileUtils.listFiles(new File(fileLocation), null, false);\r
72 \r
73     for (File file : files) {\r
74       LOG.info("Loading mapper schema from {}", file.getName());\r
75       List<String> lines = FileUtils.readLines(file, StandardCharsets.UTF_8);\r
76       for (String line : lines) {\r
77         if (line != null && line.startsWith("#")) {\r
78           continue;\r
79         }\r
80         if (line != null && line.split(",").length >= 3) {\r
81 \r
82           parseMetaDataLine(line, metaDataMap, metaDataReverseMap);\r
83 \r
84         }\r
85       }\r
86     }\r
87   }\r
88 \r
89   private static void parseMetaDataLine(String line, Map<String, MOMetaData> metaDataMap,\r
90       Map<String, String> metaDataReverseMap) {\r
91     String[] split = line.split(",");\r
92     boolean isReadOnly = false;\r
93     boolean isTabluar = false;\r
94     boolean isTabObject = false;\r
95     if (split[2].contains("-")) {\r
96       String[] dataAttr = split[2].split("-");\r
97       if ("Tabular".equalsIgnoreCase(dataAttr[0]))\r
98         isTabluar = true;\r
99       if ("ReadOnly".equalsIgnoreCase(dataAttr[1]))\r
100         isReadOnly = true;\r
101     } else if ("TabularObject".equalsIgnoreCase(split[2])) {\r
102       isTabObject = true;\r
103     }\r
104     prepareMOMetaData(isReadOnly, isTabluar, split, isTabObject, metaDataMap, metaDataReverseMap);\r
105   }\r
106 \r
107   private static void prepareMOMetaData(boolean isReadOnly, boolean isTabluar, String[] split,\r
108       boolean isTabObject, Map<String, MOMetaData> metaDataMap,\r
109       Map<String, String> metaDataReverseMap) {\r
110     String dataType = "";\r
111     if (split.length > 3) {\r
112       dataType = split[3];\r
113     }\r
114     if (isTabObject) {\r
115       String logMessage = split[1].substring(0, split[1].length() - 5);\r
116       LOG.info("Adding Parent Objects {}", logMessage);\r
117       String substring = split[0].substring(0, split[0].length() - 4);\r
118       MOMetaData metaTabData =\r
119           new MOMetaData(substring, dataType, isReadOnly, isTabluar, isTabObject);\r
120       if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
121         metaTabData.setURI(split[4]);\r
122       }\r
123       metaDataMap.put(logMessage, metaTabData);\r
124     }\r
125     MOMetaData metaData = new MOMetaData(split[0], dataType, isReadOnly, isTabluar, isTabObject);\r
126     if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
127       metaData.setURI(split[4]);\r
128     }\r
129     metaDataMap.put(split[1], metaData);\r
130     metaDataReverseMap.put(split[0], split[1]);\r
131   }\r
132 \r
133   public MOMetaData getMetaDataByNetConfName(String moName) {\r
134     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
135     return metaDataMap.get(moNameInGnrForm);\r
136   }\r
137 \r
138   public MOMetaData getMetaDataByTR69Name(String moName) {\r
139     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
140     String netconfMoName = metaDataReverseMap.get(moNameInGnrForm);\r
141     return metaDataMap.get(netconfMoName);\r
142   }\r
143 \r
144   public String getNetconfNameByTR69Name(String moName) {\r
145     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
146     return metaDataReverseMap.get(moNameInGnrForm);\r
147   }\r
148 \r
149   public String getNetconfNameByTR69NameWithIndexes(String moName) {\r
150     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
151     String netConfNMoName = metaDataReverseMap.get(moNameInGnrForm);\r
152     return netConfNMoName != null ? getNetConfMOByReplacingIndexes(netConfNMoName, moName)\r
153         : netConfNMoName;\r
154   }\r
155 \r
156   public Set<String> getAllMONames() {\r
157     return metaDataMap.keySet();\r
158   }\r
159 \r
160   public List<ParameterDTO> getSupportedChildParameters(List<ParameterDTO> parameters) {\r
161     List<ParameterDTO> result = new ArrayList<>();\r
162     Set<MOMetaData> allMatchedChilds = new HashSet<>();\r
163     for (ParameterDTO param : parameters) {\r
164       String parentMONameInGnrc = param.getParamName().replaceAll(INDEX_REGEX, STRING_I);\r
165       MOMetaData moData = metaDataMap.get(parentMONameInGnrc);\r
166       if (moData != null) {\r
167         allMatchedChilds.add(new MOMetaData(\r
168             getTR69MOByReplacingIndexes(param.getParamName(), moData.getMoName()),\r
169             moData.getDataType(), moData.isReadOnly(), moData.isTabluar(), moData.isTabluarObj()));\r
170       }\r
171     }\r
172     for (MOMetaData metaData : allMatchedChilds) {\r
173       ParameterDTO param = new ParameterDTO();\r
174       String paramName = metaData.getMoName();\r
175 \r
176       param.setParamName(paramName);\r
177       param.setDataType(metaData.getDataType());\r
178       result.add(param);\r
179     }\r
180     return result;\r
181   }\r
182 \r
183   public List<ParameterDTO> getDeviceSupportedChildParameters() {\r
184     List<ParameterDTO> result = new ArrayList<>();\r
185 \r
186     ParameterDTO param1 = new ParameterDTO();\r
187     param1.setParamName("Device.DeviceInfo.Description");\r
188     param1.setParamValue("Internal");\r
189     param1.setDataType("string");\r
190     result.add(param1);\r
191     return result;\r
192   }\r
193 \r
194   public static String getTR69MOByReplacingIndexes(String netconfMo, String tr69Mo) {\r
195 \r
196     String[] split = netconfMo.split("\\.");\r
197     for (int i = 0; i < split.length; i++) {\r
198       if (split[i].matches("[0-9]{1,}")) {\r
199         tr69Mo = tr69Mo.replaceFirst(GENERIC_INDEX_REGEX, "." + split[i] + ".");\r
200       }\r
201     }\r
202 \r
203     return tr69Mo;\r
204 \r
205   }\r
206 \r
207   public static String getNetConfMOByReplacingIndexes(String netconfMo, String tr69Mo) {\r
208 \r
209     String[] split = tr69Mo.split("\\.");\r
210     for (int i = 0; i < split.length; i++) {\r
211       if (split[i].matches("[0-9]{1,}")) {\r
212         netconfMo = netconfMo.replaceFirst(GENERIC_INDEX_REGEX, "." + split[i] + ".");\r
213       }\r
214     }\r
215 \r
216     return netconfMo;\r
217 \r
218   }\r
219 \r
220 }\r