From 702920da9f684ff81bbf9d3a40ba9076b1b288e2 Mon Sep 17 00:00:00 2001 From: kochetkov Date: Thu, 19 Sep 2024 15:32:44 +0300 Subject: [PATCH] config executor some changes --- .../org/micord/controller/ApiController.java | 64 +++++++------ .../exceptions/FileNotModifiedException.java | 10 -- .../java/org/micord/models/CachedConfig.java | 21 +++++ .../java/org/micord/service/ApiService.java | 14 +-- .../java/org/micord/service/SqlAqlService.java | 5 + .../java/org/micord/utils/ConfigLoader.java | 92 +++++++++---------- 6 files changed, 108 insertions(+), 98 deletions(-) delete mode 100644 сonfig-data-executor/src/main/java/org/micord/exceptions/FileNotModifiedException.java create mode 100644 сonfig-data-executor/src/main/java/org/micord/models/CachedConfig.java diff --git a/сonfig-data-executor/src/main/java/org/micord/controller/ApiController.java b/сonfig-data-executor/src/main/java/org/micord/controller/ApiController.java index a84ab90..eecaa31 100644 --- a/сonfig-data-executor/src/main/java/org/micord/controller/ApiController.java +++ b/сonfig-data-executor/src/main/java/org/micord/controller/ApiController.java @@ -1,14 +1,15 @@ package org.micord.controller; -import org.micord.exceptions.FileNotModifiedException; -import org.micord.service.ApiService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.io.FileNotFoundException; import java.util.List; -import java.util.concurrent.CompletableFuture; + +import org.micord.service.ApiService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * REST Controller for API operations. @@ -17,31 +18,34 @@ import java.util.concurrent.CompletableFuture; @RequestMapping("/api") public class ApiController { - @Autowired - private ApiService apiService; + @Autowired + private ApiService apiService; - @PostMapping("/block") - public CompletableFuture> block(@RequestBody List ids) throws FileNotFoundException, FileNotModifiedException { - return apiService.process("block", ids) - .thenApply(ResponseEntity::ok); - } + @PostMapping("/block") + public ResponseEntity block(@RequestBody List ids) throws FileNotFoundException { + apiService.process("block", ids); + return ResponseEntity.ok(""); + } - @PostMapping("/unblock") - public CompletableFuture> unblock(@RequestBody List ids) throws FileNotFoundException, FileNotModifiedException { - return apiService.process("unblock", ids) - .thenApply(ResponseEntity::ok); - } + @PostMapping("/unblock") + public ResponseEntity unblock(@RequestBody List ids) throws FileNotFoundException { - @PostMapping("/removeFromSystem") - public CompletableFuture> removeFromSystem(@RequestBody List ids) throws FileNotFoundException, FileNotModifiedException { - return apiService.process("removeFromSystem", ids) - .thenApply(ResponseEntity::ok); - } + apiService.process("unblock", ids); + return ResponseEntity.ok(""); + } - @PostMapping("/removeFromCallList") - public CompletableFuture> removeFromCallList(@RequestBody List ids) throws FileNotFoundException, FileNotModifiedException { - return apiService.process("removeFromCallList", ids) - .thenApply(ResponseEntity::ok); - } + @PostMapping("/removeFromSystem") + public ResponseEntity removeFromSystem(@RequestBody List ids) + throws FileNotFoundException { -} \ No newline at end of file + apiService.process("removeFromSystem", ids); + return ResponseEntity.ok(""); + } + + @PostMapping("/removeFromCallList") + public ResponseEntity removeFromCallList(@RequestBody List ids) + throws FileNotFoundException { + apiService.process("removeFromCallList", ids); + return ResponseEntity.ok(""); + } +} diff --git a/сonfig-data-executor/src/main/java/org/micord/exceptions/FileNotModifiedException.java b/сonfig-data-executor/src/main/java/org/micord/exceptions/FileNotModifiedException.java deleted file mode 100644 index d9678e6..0000000 --- a/сonfig-data-executor/src/main/java/org/micord/exceptions/FileNotModifiedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.micord.exceptions; - -/** - * @author Maksim Tereshin - */ -public class FileNotModifiedException extends Exception { - public FileNotModifiedException(String message) { - super(message); - } -} diff --git a/сonfig-data-executor/src/main/java/org/micord/models/CachedConfig.java b/сonfig-data-executor/src/main/java/org/micord/models/CachedConfig.java new file mode 100644 index 0000000..1c19cbb --- /dev/null +++ b/сonfig-data-executor/src/main/java/org/micord/models/CachedConfig.java @@ -0,0 +1,21 @@ +package org.micord.models; + +import java.nio.file.attribute.FileTime; + +public class CachedConfig { + private final Requests config; + private final FileTime modifiedTime; + + public CachedConfig(Requests config, FileTime modifiedTime) { + this.config = config; + this.modifiedTime = modifiedTime; + } + + public Requests getConfig() { + return config; + } + + public FileTime getModifiedTime() { + return modifiedTime; + } +} diff --git a/сonfig-data-executor/src/main/java/org/micord/service/ApiService.java b/сonfig-data-executor/src/main/java/org/micord/service/ApiService.java index b014ea7..3499bd0 100644 --- a/сonfig-data-executor/src/main/java/org/micord/service/ApiService.java +++ b/сonfig-data-executor/src/main/java/org/micord/service/ApiService.java @@ -16,26 +16,16 @@ public class ApiService { @Autowired private ConfigLoader configLoader; - @Autowired - private S3Service s3Service; - @Autowired private SqlAqlService sqlAndAqlService; - public CompletableFuture process(String methodName, List ids) throws FileNotFoundException, FileNotModifiedException { + public void process(String methodName, List ids) throws FileNotFoundException { Optional optionalConfig = configLoader.loadConfigIfModified(methodName); if (optionalConfig.isEmpty()) { throw new FileNotFoundException("Configuration for method " + methodName + " could not be loaded."); } - Requests config = optionalConfig.get(); - sqlAndAqlService.processSqlAndAqlRequests(config, ids); - - return CompletableFuture.runAsync(() -> { - s3Service.processS3Requests(config.getS3Requests(), ids); - }).thenApply(v -> "Processing complete"); } - -} \ No newline at end of file +} diff --git a/сonfig-data-executor/src/main/java/org/micord/service/SqlAqlService.java b/сonfig-data-executor/src/main/java/org/micord/service/SqlAqlService.java index 8d047be..9ab9134 100644 --- a/сonfig-data-executor/src/main/java/org/micord/service/SqlAqlService.java +++ b/сonfig-data-executor/src/main/java/org/micord/service/SqlAqlService.java @@ -15,6 +15,7 @@ import org.micord.models.Requests; import org.micord.models.SqlRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,6 +36,9 @@ public class SqlAqlService { private static final Logger logger = LoggerFactory.getLogger(SqlAqlService.class); + @Autowired + private S3Service s3Service; + @Transactional public void processSqlAndAqlRequests(Requests config, List ids) { if (config.getSqlRequests() != null) { @@ -48,6 +52,7 @@ public class SqlAqlService { processAqlRequests(request, ids); } } + s3Service.processS3Requests(config.getS3Requests(), ids); } private void processSqlRequests(SqlRequest request, List ids) { diff --git a/сonfig-data-executor/src/main/java/org/micord/utils/ConfigLoader.java b/сonfig-data-executor/src/main/java/org/micord/utils/ConfigLoader.java index f014d95..ca61c36 100644 --- a/сonfig-data-executor/src/main/java/org/micord/utils/ConfigLoader.java +++ b/сonfig-data-executor/src/main/java/org/micord/utils/ConfigLoader.java @@ -1,23 +1,23 @@ package org.micord.utils; -import org.micord.exceptions.FileNotModifiedException; -import org.micord.models.Requests; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.FileTime; -import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + +import org.micord.models.CachedConfig; +import org.micord.models.Requests; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; /** * @author Maksim Tereshin @@ -25,46 +25,46 @@ import java.util.logging.Logger; @Component public class ConfigLoader { - private static final Logger LOGGER = Logger.getLogger(ConfigLoader.class.getName()); - private final Map lastModifiedTimes = new HashMap<>(); + private static final Logger LOGGER = Logger.getLogger(ConfigLoader.class.getName()); + private static final Map cachedConfigs = new ConcurrentHashMap<>(); - @Value("${configDirectory}") - private String configDirectory; + @Value("${configDirectory}") + private String configDirectory; - public Optional loadConfigIfModified(String methodName) throws FileNotModifiedException { - String fileName = methodName + ".xml"; - if (configDirectory == null) { - LOGGER.log(Level.SEVERE, "No configuration directory found for method: " + methodName); - return Optional.empty(); - } + public Optional loadConfigIfModified(String methodName) { + String fileName = methodName + ".xml"; - try { - File configFile = new File(configDirectory + File.separator + fileName); - Path configFilePath = configFile.toPath(); + if (configDirectory == null) { + LOGGER.log(Level.SEVERE, "No configuration directory found for method: " + methodName); + return Optional.empty(); + } - FileTime currentModifiedTime = Files.getLastModifiedTime(configFilePath); - FileTime lastModifiedTime = lastModifiedTimes.getOrDefault(methodName, null); + try { + File configFile = new File(configDirectory + File.separator + fileName); + Path configFilePath = configFile.toPath(); + FileTime currentModifiedTime = Files.getLastModifiedTime(configFilePath); + CachedConfig cachedConfig = cachedConfigs.getOrDefault(methodName, null); - if (lastModifiedTime == null || currentModifiedTime.compareTo(lastModifiedTime) > 0) { - lastModifiedTimes.put(methodName, currentModifiedTime); + if (cachedConfig == null || !currentModifiedTime.equals(cachedConfig.getModifiedTime())) { + // Load the updated configuration + JAXBContext jaxbContext = JAXBContext.newInstance(Requests.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + Requests loadedConfig = (Requests) unmarshaller.unmarshal(configFile); + cachedConfigs.put(methodName, new CachedConfig(loadedConfig, currentModifiedTime)); + return Optional.of(loadedConfig); + } + else { + return Optional.of(cachedConfigs.get(methodName).getConfig()); + } - // Load the updated configuration - JAXBContext jaxbContext = JAXBContext.newInstance(Requests.class); - Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); - Requests loadedConfig = (Requests) unmarshaller.unmarshal(configFile); - - return Optional.of(loadedConfig); - } else { - throw new FileNotModifiedException("Configuration file for method " + methodName + " has not been modified."); - } - - } catch (IOException e) { - LOGGER.log(Level.SEVERE, "Failed to load configuration file: " + fileName, e); - return Optional.empty(); // Return empty if there is an IO error - } catch (JAXBException e) { - LOGGER.log(Level.SEVERE, "Failed to unmarshal configuration file: " + fileName, e); - return Optional.empty(); // Return empty if unmarshalling fails - } - } - -} \ No newline at end of file + } + catch (IOException e) { + LOGGER.log(Level.SEVERE, "Failed to load configuration file: " + fileName, e); + return Optional.empty(); // Return empty if there is an IO error + } + catch (JAXBException e) { + LOGGER.log(Level.SEVERE, "Failed to unmarshal configuration file: " + fileName, e); + return Optional.empty(); // Return empty if unmarshalling fails + } + } +}