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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
19 package org.commscope.tr069adapter.config.service;
\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
40 public class ConfigurationDataService {
\r
41 private final Logger logger = LoggerFactory.getLogger(this.getClass());
\r
44 ConfigurationDataRepository configDataRepository;
\r
47 ConfigurationXMLDataParser configurationXMLDataParser;
\r
49 public void saveConfigFileContent(ConfigFileContent configFileContent) {
\r
50 configDataRepository.save(configFileContent);
\r
53 public Iterable<ConfigFileContent> getAllConfigFileContent() {
\r
54 return configDataRepository.findAll();
\r
57 public Optional<ConfigFileContent> getConfigFileContent(String macId) {
\r
58 return configDataRepository.findById(macId);
\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
74 DeviceVersion inputVersion = new DeviceVersion(swVersion, hwVersion);
\r
75 Entry<DeviceVersion, ConfigurationData> floorEntry = configDataMap.floorEntry(inputVersion);
\r
77 if (null == floorEntry) {
\r
78 logger.error("Configuration file is not available for device {}", macId);
\r
79 return Optional.ofNullable(configurationData);
\r
82 DeviceVersion floor = floorEntry.getKey();
\r
83 configurationData = configDataMap.get(floor);
\r
84 logger.debug("Parsing of device configuration file is completed");
\r
86 logger.error("Configuration file is not available for device {}", macId);
\r
87 return Optional.ofNullable(configurationData);
\r
89 return Optional.ofNullable(configurationData);
\r
92 public void saveConfigFileContents(MultipartFile file)
\r
93 throws InvalidConfigurationServiceException {
\r
94 String fileName = StringUtils.cleanPath(file.getOriginalFilename());
\r
96 if (fileName.contains("..")) {
\r
97 throw new InvalidConfigurationServiceException(
\r
98 "Filename contains invalid path sequence " + fileName);
\r
101 ConfigFileContent configFileContent = new ConfigFileContent();
\r
104 configFileContent.setFileContent(new String(file.getBytes(), StandardCharsets.UTF_8));
\r
105 configFileContent.setMacId(Utility.getMacId(fileName));
\r
107 if (!configFileContent.getFileContent().contains("<configDataFile>")) {
\r
109 "File {} is not a valid configuration file as it doesn't contain tag \"<configDataFile>\"",
\r
111 throw new InvalidConfigurationServiceException(
\r
112 "File is not a valid configuration file as it doesn't contain tag \"<configDataFile>\"");
\r
115 } catch (Exception e) {
\r
116 throw new InvalidConfigurationServiceException(
\r
117 "Error occurred while reading file content. Reason: " + e.getMessage());
\r
120 configurationXMLDataParser.validateFile(configFileContent);
\r
122 ConfigurationData configurationData = configurationXMLDataParser.parseFile(configFileContent);
\r
123 configFileContent.setSwVersion(configurationData.getSoftwareVersion());
\r
124 configFileContent.setHwVersion(configurationData.getHardwareVersion());
\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
132 if (configFileContentEntity != null) {
\r
133 configFileContentEntity.setFileContent(configFileContent.getFileContent());
\r
134 saveConfigFileContent(configFileContentEntity);
\r
136 saveConfigFileContent(configFileContent);
\r
139 logger.debug("Configuration file content saved successfully");
\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
149 public DeviceVersion(String swVersion, String hwVersion) {
\r
151 setSwVersion(swVersion);
\r
152 this.hwVersion = hwVersion;
\r
155 public String getSwVersion() {
\r
156 return svMajorVersion + "." + svMinorVersion + "." + svPatchVersion;
\r
159 public void setSwVersion(String swVersion) {
\r
160 // TODO: conversion to integers
\r
162 if (swVersion.indexOf(".") > 0) {
\r
163 String[] verArray = swVersion.split("\\.");
\r
166 for (int i = 0; i < verArray.length; i++) {
\r
168 if (verArray[i].equals("*")) {
\r
172 svMajorVersion = Integer.parseInt(verArray[0]);
\r
173 svMinorVersion = Integer.parseInt(verArray[1]);
\r
174 svPatchVersion = Integer.parseInt(verArray[2]);
\r
176 } else if (swVersion.indexOf("x") > 0) {
\r
178 } else if (swVersion.equals("*")) {
\r
179 isGenericVersion = true;
\r
183 public String getHwVersion() {
\r
187 public void setHwVersion(String hwVersion) {
\r
188 this.hwVersion = hwVersion;
\r
191 private String hwVersion;
\r
193 public int getSvMajorVersion() {
\r
194 return svMajorVersion;
\r
197 public void setSvMajorVersion(int svMajorVersion) {
\r
198 this.svMajorVersion = svMajorVersion;
\r
201 public int getSvMinorVersion() {
\r
202 return svMinorVersion;
\r
205 public void setSvMinorVersion(int svMinorVersion) {
\r
206 this.svMinorVersion = svMinorVersion;
\r
209 public int getSvPatchVersion() {
\r
210 return svPatchVersion;
\r
213 public void setSvPatchVersion(int svPatchVersion) {
\r
214 this.svPatchVersion = svPatchVersion;
\r
217 public boolean isGenericVersion() {
\r
218 return isGenericVersion;
\r
221 public void setGenericVersion(boolean isGenericVersion) {
\r
222 this.isGenericVersion = isGenericVersion;
\r
226 public int compareTo(DeviceVersion o) {
\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
233 return svPatchVersion - o.svPatchVersion;
\r