dcebc6355e1ee82a0c1818c78fdad67db0aecd84
[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 import javax.annotation.PostConstruct;\r
32 import org.apache.commons.io.FileUtils;\r
33 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
34 import org.commscope.tr069adapter.common.deviceversion.DeviceVersionManager;\r
35 import org.commscope.tr069adapter.common.deviceversion.ProfileDefinition;\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.beans.factory.annotation.Autowired;\r
40 import org.springframework.stereotype.Component;\r
41 \r
42 @Component\r
43 public class MOMetaDataUtil {\r
44 \r
45   private static final String STRING_I = ".{i}.";\r
46   private static final Logger LOG = LoggerFactory.getLogger(MOMetaDataUtil.class);\r
47   private static final String GENERIC_INDEX_REGEX = "\\.\\{[i-l]\\}\\.";\r
48   private static final String INDEX_REGEX = "\\.[0-9]{1,}\\.";\r
49   private static final String MO_META_DATA_FILE_LOCATION = "mapper-schema";\r
50   private Map<String, Map<String, MOMetaData>> metaDataMap;\r
51   private Map<String, Map<String, String>> metaDataReverseMap;\r
52   public static final String ORAN_SW_MGMT_URI = "urn:o-ran:software-management:1.0";\r
53 \r
54   @Autowired\r
55   DeviceVersionManager versionManager;\r
56 \r
57   @PostConstruct\r
58   public void loadMetaData() {\r
59 \r
60     try {\r
61       LOG.info("Loading mapper schema");\r
62       if (metaDataMap != null)\r
63         metaDataMap.clear();\r
64       if (metaDataReverseMap != null)\r
65         metaDataReverseMap.clear();\r
66       getMetaDataAsMap(MO_META_DATA_FILE_LOCATION);\r
67       LOG.info("Loading mapper schema successfully completed");\r
68     } catch (IOException e) {\r
69       LOG.error("Exception : {}", e.getMessage());\r
70     }\r
71   }\r
72 \r
73   private void getMetaDataAsMap(String fileLocation) throws IOException {\r
74     metaDataMap = new HashMap<>();\r
75     metaDataReverseMap = new HashMap<>();\r
76 \r
77     List<ProfileDefinition> profiles = versionManager.getSupportedProfileDefinitions();\r
78     for (ProfileDefinition profileDefinition : profiles) {\r
79       Map<String, MOMetaData> profileMetaDataMap = new HashMap<>();\r
80       Map<String, String> profileMetaDataReverseMap = new HashMap<>();\r
81 \r
82       Collection<File> files = FileUtils.listFiles(\r
83           new File(fileLocation + "/" + profileDefinition.getCsdmMappingPath()), null, false);\r
84       for (File file : files) {\r
85         LOG.info("Loading mapper schema from {}", file.getName());\r
86         List<String> lines = FileUtils.readLines(file, StandardCharsets.UTF_8);\r
87         for (String line : lines) {\r
88           if (line != null && line.startsWith("#")) {\r
89             continue;\r
90           }\r
91           if (line != null && line.split(",").length >= 3) {\r
92             parseMetaDataLine(line, profileMetaDataMap, profileMetaDataReverseMap);\r
93           }\r
94         }\r
95       }\r
96       metaDataMap.put(profileDefinition.getProfileId(), profileMetaDataMap);\r
97       metaDataReverseMap.put(profileDefinition.getProfileId(), profileMetaDataReverseMap);\r
98     }\r
99   }\r
100 \r
101   private static void parseMetaDataLine(String line, Map<String, MOMetaData> profileMetaDataMap,\r
102       Map<String, String> profileMetaDataReverseMap) {\r
103     String[] split = line.split(",");\r
104     boolean isReadOnly = false;\r
105     boolean isTabluar = false;\r
106     boolean isTabObject = false;\r
107     if (split[2].contains("-")) {\r
108       String[] dataAttr = split[2].split("-");\r
109       if ("Tabular".equalsIgnoreCase(dataAttr[0]))\r
110         isTabluar = true;\r
111       if ("ReadOnly".equalsIgnoreCase(dataAttr[1]))\r
112         isReadOnly = true;\r
113     } else if ("TabularObject".equalsIgnoreCase(split[2])) {\r
114       isTabObject = true;\r
115     }\r
116     prepareMOMetaData(isReadOnly, isTabluar, split, isTabObject, profileMetaDataMap,\r
117         profileMetaDataReverseMap);\r
118   }\r
119 \r
120   private static void prepareMOMetaData(boolean isReadOnly, boolean isTabluar, String[] split,\r
121       boolean isTabObject, Map<String, MOMetaData> profileMetaDataMap,\r
122       Map<String, String> profileMetaDataReverseMap) {\r
123     String dataType = "";\r
124     if (split.length > 3) {\r
125       dataType = split[3];\r
126     }\r
127     if (isTabObject) {\r
128       String logMessage = split[1].substring(0, split[1].length() - 5);\r
129       LOG.info("Adding Parent Objects {}", logMessage);\r
130       String substring = split[0].substring(0, split[0].length() - 4);\r
131       MOMetaData metaTabData =\r
132           new MOMetaData(substring, dataType, isReadOnly, isTabluar, isTabObject);\r
133       if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
134         metaTabData.setURI(split[4]);\r
135       }\r
136       profileMetaDataMap.put(logMessage, metaTabData);\r
137     }\r
138     MOMetaData metaData = new MOMetaData(split[0], dataType, isReadOnly, isTabluar, isTabObject);\r
139     if ((split.length > 4 && split[4] != null) && split[4].trim().length() > 0) {\r
140       metaData.setURI(split[4]);\r
141     }\r
142     profileMetaDataMap.put(split[1], metaData);\r
143     profileMetaDataReverseMap.put(split[0], split[1]);\r
144   }\r
145 \r
146   public MOMetaData getMetaDataByNetConfName(String moName, String swVersion, String hwVersion) {\r
147     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
148 \r
149     String profileId = versionManager.getAssociatedProfileId(swVersion, hwVersion);\r
150     Map<String, MOMetaData> metaData = metaDataMap.get(profileId);\r
151 \r
152     return metaData.get(moNameInGnrForm);\r
153   }\r
154 \r
155   public MOMetaData getMetaDataByTR69Name(String moName, String swVersion, String hwVersion) {\r
156     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
157 \r
158     String profileId = versionManager.getAssociatedProfileId(swVersion, hwVersion);\r
159     Map<String, String> profileReverseMetaData = metaDataReverseMap.get(profileId);\r
160     Map<String, MOMetaData> profileMetaData = metaDataMap.get(profileId);\r
161 \r
162     String netconfMoName = profileReverseMetaData.get(moNameInGnrForm);\r
163     return profileMetaData.get(netconfMoName);\r
164   }\r
165 \r
166   public String getNetconfNameByTR69NameWithIndexes(String moName, String swVersion,\r
167       String hwVersion) {\r
168     String moNameInGnrForm = moName.replaceAll(INDEX_REGEX, STRING_I);\r
169     String profileId = versionManager.getAssociatedProfileId(swVersion, hwVersion);\r
170     Map<String, String> reverseMetaData = metaDataReverseMap.get(profileId);\r
171     String netConfNMoName = reverseMetaData.get(moNameInGnrForm);\r
172     return netConfNMoName != null ? getNetConfMOByReplacingIndexes(netConfNMoName, moName)\r
173         : netConfNMoName;\r
174   }\r
175 \r
176   public List<ParameterDTO> getSupportedChildParameters(List<ParameterDTO> parameters,\r
177       String swVersion, String hwVersion) {\r
178     List<ParameterDTO> result = new ArrayList<>();\r
179     Set<MOMetaData> allMatchedChilds = new HashSet<>();\r
180     String profileId = versionManager.getAssociatedProfileId(swVersion, hwVersion);\r
181     Map<String, MOMetaData> profileMetaData = metaDataMap.get(profileId);\r
182     for (ParameterDTO param : parameters) {\r
183       String parentMONameInGnrc = param.getParamName().replaceAll(INDEX_REGEX, STRING_I);\r
184       MOMetaData moData = profileMetaData.get(parentMONameInGnrc);\r
185       if (moData != null) {\r
186         allMatchedChilds.add(new MOMetaData(\r
187             getTR69MOByReplacingIndexes(param.getParamName(), moData.getMoName()),\r
188             moData.getDataType(), moData.isReadOnly(), moData.isTabluar(), moData.isTabluarObj()));\r
189       }\r
190     }\r
191     for (MOMetaData metaData : allMatchedChilds) {\r
192       ParameterDTO param = new ParameterDTO();\r
193       String paramName = metaData.getMoName();\r
194 \r
195       param.setParamName(paramName);\r
196       param.setDataType(metaData.getDataType());\r
197       result.add(param);\r
198     }\r
199     return result;\r
200   }\r
201 \r
202   public List<ParameterDTO> getDeviceSupportedChildParameters() {\r
203     List<ParameterDTO> result = new ArrayList<>();\r
204 \r
205     ParameterDTO param1 = new ParameterDTO();\r
206     param1.setParamName("Device.DeviceInfo.Description");\r
207     param1.setParamValue("Internal");\r
208     param1.setDataType("string");\r
209     result.add(param1);\r
210     return result;\r
211   }\r
212 \r
213   public static String getTR69MOByReplacingIndexes(String netconfMo, String tr69Mo) {\r
214 \r
215     String[] split = netconfMo.split("\\.");\r
216     for (int i = 0; i < split.length; i++) {\r
217       if (split[i].matches("[0-9]{1,}")) {\r
218         tr69Mo = tr69Mo.replaceFirst(GENERIC_INDEX_REGEX, "." + split[i] + ".");\r
219       }\r
220     }\r
221     return tr69Mo;\r
222   }\r
223 \r
224   public static String getNetConfMOByReplacingIndexes(String netconfMo, String tr69Mo) {\r
225 \r
226     String[] split = tr69Mo.split("\\.");\r
227     for (int i = 0; i < split.length; i++) {\r
228       if (split[i].matches("[0-9]{1,}")) {\r
229         netconfMo = netconfMo.replaceFirst(GENERIC_INDEX_REGEX, "." + split[i] + ".");\r
230       }\r
231     }\r
232     return netconfMo;\r
233   }\r
234 }\r