diff --git a/.claude/settings.local.json b/.claude/settings.local.json index e88d7d2..1f2cf22 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -4,7 +4,8 @@ "Bash(.gradlew.bat build:*)", "Bash(echo:*)", "Bash(gradle wrapper:*)", - "Bash(./gradlew build:*)" + "Bash(./gradlew build:*)", + "Bash(./gradlew clean build:*)" ], "deny": [], "ask": [] diff --git a/build.gradle b/build.gradle index d5064ba..27d4140 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { group = 'com.cfdeployer' version = '1.0.0' -sourceCompatibility = '17' +sourceCompatibility = '21' configurations { compileOnly { @@ -21,7 +21,6 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'commons-io:commons-io:2.15.1' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/com/cfdeployer/controller/CfDeployController.java b/src/main/java/com/cfdeployer/controller/CfDeployController.java index fe1dd6d..04ac556 100644 --- a/src/main/java/com/cfdeployer/controller/CfDeployController.java +++ b/src/main/java/com/cfdeployer/controller/CfDeployController.java @@ -6,7 +6,8 @@ import com.cfdeployer.service.CfCliService; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -16,12 +17,13 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -@Slf4j @RestController @RequestMapping("/api/cf") @RequiredArgsConstructor public class CfDeployController { + private static final Logger log = LoggerFactory.getLogger(CfDeployController.class); + private final CfCliService cfCliService; private final ObjectMapper objectMapper; diff --git a/src/main/java/com/cfdeployer/exception/GlobalExceptionHandler.java b/src/main/java/com/cfdeployer/exception/GlobalExceptionHandler.java index 1af4b09..5526ad6 100644 --- a/src/main/java/com/cfdeployer/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/cfdeployer/exception/GlobalExceptionHandler.java @@ -1,7 +1,8 @@ package com.cfdeployer.exception; import com.cfdeployer.model.CfDeployResponse; -import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; @@ -14,10 +15,11 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; -@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleValidationExceptions(MethodArgumentNotValidException ex) { log.error("Validation error occurred", ex); diff --git a/src/main/java/com/cfdeployer/service/CfCliService.java b/src/main/java/com/cfdeployer/service/CfCliService.java index 89ff057..1879ee8 100644 --- a/src/main/java/com/cfdeployer/service/CfCliService.java +++ b/src/main/java/com/cfdeployer/service/CfCliService.java @@ -3,8 +3,8 @@ package com.cfdeployer.service; import com.cfdeployer.model.CfDeployRequest; import com.cfdeployer.model.CfDeployResponse; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -18,16 +18,18 @@ import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.PosixFilePermission; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; -@Slf4j @Service @RequiredArgsConstructor public class CfCliService { + private static final Logger log = LoggerFactory.getLogger(CfCliService.class); + @Value("${cf.cli.timeout:600}") private long timeout; @@ -206,7 +208,15 @@ public class CfCliService { private void cleanupTempDirectory(Path tempDir) { try { - FileUtils.deleteDirectory(tempDir.toFile()); + Files.walk(tempDir) + .sorted(Comparator.reverseOrder()) + .forEach(path -> { + try { + Files.delete(path); + } catch (IOException e) { + log.warn("Failed to delete file: {}", path, e); + } + }); log.debug("Cleaned up temporary directory: {}", tempDir); } catch (IOException e) { log.warn("Failed to clean up temporary directory: {}", tempDir, e); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..e7e2550 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,20 @@ +# Server Configuration +server.port=8080 + +# Application Name +spring.application.name=cf-deployer + +# Multipart Configuration +spring.servlet.multipart.max-file-size=500MB +spring.servlet.multipart.max-request-size=500MB +spring.servlet.multipart.enabled=true + +# Cloud Foundry CLI Configuration +cf.cli.timeout=600 +cf.cli.path= + +# Logging Configuration +logging.level.root=INFO +logging.level.com.cfdeployer=DEBUG +logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n +logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 1cd4b16..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,24 +0,0 @@ -server: - port: 8080 - -spring: - application: - name: cf-deployer - servlet: - multipart: - max-file-size: 500MB - max-request-size: 500MB - enabled: true - -cf: - cli: - timeout: 600 - path: - -logging: - level: - root: INFO - com.cfdeployer: DEBUG - pattern: - console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" - file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"