0ce8aefccedfd6354a87863cbd2a846cd27953d3
[oam/tr069-adapter.git] / config-data / src / main / java / org / commscope / tr069adapter / config / service / ConfigurationDataService.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.config.service;\r
20 \r
21 import java.nio.charset.StandardCharsets;\r
22 import java.util.List;\r
23 import java.util.Map.Entry;\r
24 import java.util.Optional;\r
25 import java.util.TreeMap;\r
26 import org.commscope.tr069adapter.acs.common.dto.ConfigurationData;\r
27 import org.commscope.tr069adapter.config.constants.Utility;\r
28 import org.commscope.tr069adapter.config.exceptions.InvalidConfigurationServiceException;\r
29 import org.commscope.tr069adapter.config.model.ConfigFileContent;\r
30 import org.commscope.tr069adapter.config.parser.ConfigurationXMLDataParser;\r
31 import org.commscope.tr069adapter.config.repository.ConfigurationDataRepository;\r
32 import org.slf4j.Logger;\r
33 import org.slf4j.LoggerFactory;\r
34 import org.springframework.beans.factory.annotation.Autowired;\r
35 import org.springframework.stereotype.Service;\r
36 import org.springframework.util.StringUtils;\r
37 import org.springframework.web.multipart.MultipartFile;\r
38 \r
39 @Service\r
40 public class ConfigurationDataService {\r
41   private final Logger logger = LoggerFactory.getLogger(this.getClass());\r
42 \r
43   @Autowired\r
44   ConfigurationDataRepository configDataRepository;\r
45 \r
46   @Autowired\r
47   ConfigurationXMLDataParser configurationXMLDataParser;\r
48 \r
49   public void saveConfigFileContent(ConfigFileContent configFileContent) {\r
50     configDataRepository.save(configFileContent);\r
51   }\r
52 \r
53   public Iterable<ConfigFileContent> getAllConfigFileContent() {\r
54     return configDataRepository.findAll();\r
55   }\r
56 \r
57   public Optional<ConfigFileContent> getConfigFileContent(String macId) {\r
58     return configDataRepository.findById(macId);\r
59   }\r
60 \r
61   public Optional<ConfigurationData> getConfigurationData(String macId, String swVersion,\r
62       String hwVersion) throws InvalidConfigurationServiceException {\r
63     ConfigurationData configurationData = null;\r
64     List<ConfigFileContent> configFileContentList = configDataRepository.findByMacId(macId);\r
65     TreeMap<DeviceVersion, ConfigurationData> configDataMap = new TreeMap<>();\r
66     if (!configFileContentList.isEmpty()) {\r
67       logger.debug("Parsing configuration file for device {}", macId);\r
68       for (ConfigFileContent configFileContent : configFileContentList) {\r
69         ConfigurationData cfgData = configurationXMLDataParser.parseFile(configFileContent);\r
70         DeviceVersion dVersion =\r
71             new DeviceVersion(cfgData.getSoftwareVersion(), cfgData.getHardwareVersion());\r
72         configDataMap.put(dVersion, cfgData);\r
73       }\r
74       DeviceVersion inputVersion = new DeviceVersion(swVersion, hwVersion);\r
75       Entry<DeviceVersion, ConfigurationData> floorEntry = configDataMap.floorEntry(inputVersion);\r
76 \r
77       if (null == floorEntry) {\r
78         logger.error("Configuration file is not available for device {}", macId);\r
79         return Optional.ofNullable(configurationData);\r
80       }\r
81 \r
82       DeviceVersion floor = floorEntry.getKey();\r
83       configurationData = configDataMap.get(floor);\r
84       logger.debug("Parsing of device configuration file is completed");\r
85     } else {\r
86       logger.error("Configuration file is not available for device {}", macId);\r
87       return Optional.ofNullable(configurationData);\r
88     }\r
89     return Optional.ofNullable(configurationData);\r
90   }\r
91 \r
92   public void saveConfigFileContents(MultipartFile file)\r
93       throws InvalidConfigurationServiceException {\r
94     String fileName = StringUtils.cleanPath(file.getOriginalFilename());\r
95 \r
96     if (fileName.contains("..")) {\r
97       throw new InvalidConfigurationServiceException(\r
98           "Filename contains invalid path sequence " + fileName);\r
99     }\r
100 \r
101     ConfigFileContent configFileContent = new ConfigFileContent();\r
102 \r
103     try {\r
104       configFileContent.setFileContent(new String(file.getBytes(), StandardCharsets.UTF_8));\r
105       configFileContent.setMacId(Utility.getMacId(fileName));\r
106 \r
107       if (!configFileContent.getFileContent().contains("<configDataFile>")) {\r
108         logger.error(\r
109             "File {} is not a valid configuration file as it doesn't contain tag \"<configDataFile>\"",\r
110             fileName);\r
111         throw new InvalidConfigurationServiceException(\r
112             "File is not a valid configuration file as it doesn't contain tag \"<configDataFile>\"");\r
113       }\r
114 \r
115     } catch (Exception e) {\r
116       throw new InvalidConfigurationServiceException(\r
117           "Error occurred while reading file content. Reason: " + e.getMessage());\r
118     }\r
119 \r
120     configurationXMLDataParser.validateFile(configFileContent);\r
121 \r
122     ConfigurationData configurationData = configurationXMLDataParser.parseFile(configFileContent);\r
123     configFileContent.setSwVersion(configurationData.getSoftwareVersion());\r
124     configFileContent.setHwVersion(configurationData.getHardwareVersion());\r
125 \r
126     logger.debug("Saving configuration file {} content for device of macId {}", fileName,\r
127         Utility.getMacId(fileName));\r
128     ConfigFileContent configFileContentEntity =\r
129         configDataRepository.findByMacIdAndSwVersionAndHwVersion(configFileContent.getMacId(),\r
130             configFileContent.getSwVersion(), configFileContent.getHwVersion());\r
131 \r
132     if (configFileContentEntity != null) {\r
133       configFileContentEntity.setFileContent(configFileContent.getFileContent());\r
134       saveConfigFileContent(configFileContentEntity);\r
135     } else {\r
136       saveConfigFileContent(configFileContent);\r
137     }\r
138 \r
139     logger.debug("Configuration file content saved successfully");\r
140   }\r
141 \r
142   class DeviceVersion implements Comparable<DeviceVersion> {\r
143     private static final long serialVersionUID = -7251276716604249440L;\r
144     private int svMajorVersion = 0;\r
145     private int svMinorVersion = 0;\r
146     private int svPatchVersion = 0;\r
147     private boolean isGenericVersion = false;\r
148 \r
149     public DeviceVersion(String swVersion, String hwVersion) {\r
150       super();\r
151       setSwVersion(swVersion);\r
152       this.hwVersion = hwVersion;\r
153     }\r
154 \r
155     public String getSwVersion() {\r
156       return svMajorVersion + "." + svMinorVersion + "." + svPatchVersion;\r
157     }\r
158 \r
159     public void setSwVersion(String swVersion) {\r
160       // TODO: conversion to integers\r
161 \r
162       if (swVersion.indexOf(".") > 0) {\r
163         String[] verArray = swVersion.split("\\.");\r
164 \r
165 \r
166         for (int i = 0; i < verArray.length; i++) {\r
167 \r
168           if (verArray[i].equals("*")) {\r
169             verArray[i] = "0";\r
170           }\r
171         }\r
172         svMajorVersion = Integer.parseInt(verArray[0]);\r
173         svMinorVersion = Integer.parseInt(verArray[1]);\r
174         svPatchVersion = Integer.parseInt(verArray[2]);\r
175 \r
176       } else if (swVersion.indexOf("x") > 0) {\r
177         swVersion = "*";\r
178       } else if (swVersion.equals("*")) {\r
179         isGenericVersion = true;\r
180       }\r
181     }\r
182 \r
183     public String getHwVersion() {\r
184       return hwVersion;\r
185     }\r
186 \r
187     public void setHwVersion(String hwVersion) {\r
188       this.hwVersion = hwVersion;\r
189     }\r
190 \r
191     private String hwVersion;\r
192 \r
193     public int getSvMajorVersion() {\r
194       return svMajorVersion;\r
195     }\r
196 \r
197     public void setSvMajorVersion(int svMajorVersion) {\r
198       this.svMajorVersion = svMajorVersion;\r
199     }\r
200 \r
201     public int getSvMinorVersion() {\r
202       return svMinorVersion;\r
203     }\r
204 \r
205     public void setSvMinorVersion(int svMinorVersion) {\r
206       this.svMinorVersion = svMinorVersion;\r
207     }\r
208 \r
209     public int getSvPatchVersion() {\r
210       return svPatchVersion;\r
211     }\r
212 \r
213     public void setSvPatchVersion(int svPatchVersion) {\r
214       this.svPatchVersion = svPatchVersion;\r
215     }\r
216 \r
217     public boolean isGenericVersion() {\r
218       return isGenericVersion;\r
219     }\r
220 \r
221     public void setGenericVersion(boolean isGenericVersion) {\r
222       this.isGenericVersion = isGenericVersion;\r
223     }\r
224 \r
225     @Override\r
226     public int compareTo(DeviceVersion o) {\r
227 \r
228       if (svMajorVersion != o.svMajorVersion) {\r
229         return (svMajorVersion - o.svMajorVersion);\r
230       } else if (svMinorVersion != o.svMinorVersion) {\r
231         return svMinorVersion - o.svMinorVersion;\r
232       } else {\r
233         return svPatchVersion - o.svPatchVersion;\r
234       }\r
235     }\r
236   }\r
237 \r
238 }\r