diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..05ebabe --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true + +[gradlew.bat] +charset = latin1 +end_of_line = crlf + +[*.{yml,yaml}] +indent_size = 2 diff --git a/build.gradle b/build.gradle index c07d615..7e20999 100644 --- a/build.gradle +++ b/build.gradle @@ -1,44 +1,37 @@ -plugins { - id 'org.springframework.boot' version '2.6.6' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'java' -} +//file:noinspection GrUnresolvedAccess +buildscript { + apply from: 'versions.gradle' -group = 'ru.di9' -version = '1.0-SNAPSHOT' - -compileJava { - targetCompatibility = sourceCompatibility = JavaVersion.VERSION_17 -} - -repositories { - mavenCentral() -} - -dependencies { - annotationProcessor('org.projectlombok:lombok') - compileOnly('org.projectlombok:lombok') - - annotationProcessor('org.springframework.boot:spring-boot-configuration-processor') - implementation('org.springframework.boot:spring-boot-starter-web') - implementation('org.springframework.boot:spring-boot-starter-aop') - - implementation('com.squareup.okhttp3:okhttp:4.9.3') -} - -tasks.named('compileJava') { - it.dependsOn('moveSpringConfigurationMetadata') -} - -tasks.register('moveSpringConfigurationMetadata').configure { - it.dependsOn('processResources') - doLast { - def metafile = file("${sourceSets.main.output.resourcesDir}/META-INF/additional-spring-configuration-metadata.json") - if (metafile.exists()) { - def metafileTo = file("${sourceSets.main.output.classesDirs.asPath}/META-INF/spring-configuration-metadata.json") - metafileTo.parentFile.mkdirs() - metafile.renameTo(metafileTo) - } + repositories { + maven { url 'https://plugins.gradle.org/m2/' } + } + dependencies { + // https://plugins.gradle.org/plugin/org.springframework.boot + classpath "org.springframework.boot:spring-boot-gradle-plugin:${pluginSpringBootVerson}" + // https://plugins.gradle.org/plugin/io.spring.dependency-management + classpath "io.spring.gradle:dependency-management-plugin:${pluginSpringBomVerson}" } } +subprojects { + apply plugin: 'java' + + group = 'ru.di9' + + compileJava { + targetCompatibility = sourceCompatibility = JavaVersion.VERSION_17 + } + + repositories { + mavenCentral() + } + + dependencies { + annotationProcessor("org.projectlombok:lombok:${lombokVersion}") + compileOnly("org.projectlombok:lombok:${lombokVersion}") + } + + configurations.implementation.resolutionStrategy { + failOnVersionConflict() + } +} diff --git a/mirror-app/build.gradle b/mirror-app/build.gradle new file mode 100644 index 0000000..c5d6b4c --- /dev/null +++ b/mirror-app/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'java-library' + +dependencies { + api("com.squareup.okhttp3:okhttp:${okhttpVersion}") +} diff --git a/src/main/java/ru/di9/mirror/Utils.java b/mirror-app/src/main/java/ru/di9/mirror/app/Utils.java similarity index 91% rename from src/main/java/ru/di9/mirror/Utils.java rename to mirror-app/src/main/java/ru/di9/mirror/app/Utils.java index fc85a02..17b2ae4 100644 --- a/src/main/java/ru/di9/mirror/Utils.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/Utils.java @@ -1,4 +1,4 @@ -package ru.di9.mirror; +package ru.di9.mirror.app; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/src/main/java/ru/di9/mirror/domain/FileRecord.java b/mirror-app/src/main/java/ru/di9/mirror/app/domain/FileRecord.java similarity index 76% rename from src/main/java/ru/di9/mirror/domain/FileRecord.java rename to mirror-app/src/main/java/ru/di9/mirror/app/domain/FileRecord.java index 18f6b0c..0fd0bf8 100644 --- a/src/main/java/ru/di9/mirror/domain/FileRecord.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/domain/FileRecord.java @@ -1,4 +1,4 @@ -package ru.di9.mirror.domain; +package ru.di9.mirror.app.domain; import java.io.InputStream; diff --git a/src/main/java/ru/di9/mirror/domain/PathRecord.java b/mirror-app/src/main/java/ru/di9/mirror/app/domain/PathRecord.java similarity index 63% rename from src/main/java/ru/di9/mirror/domain/PathRecord.java rename to mirror-app/src/main/java/ru/di9/mirror/app/domain/PathRecord.java index 6bf947c..9f9e914 100644 --- a/src/main/java/ru/di9/mirror/domain/PathRecord.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/domain/PathRecord.java @@ -1,4 +1,4 @@ -package ru.di9.mirror.domain; +package ru.di9.mirror.app.domain; public record PathRecord(String name, PathType type) { } diff --git a/src/main/java/ru/di9/mirror/domain/PathType.java b/mirror-app/src/main/java/ru/di9/mirror/app/domain/PathType.java similarity index 57% rename from src/main/java/ru/di9/mirror/domain/PathType.java rename to mirror-app/src/main/java/ru/di9/mirror/app/domain/PathType.java index 577a48a..33a66a7 100644 --- a/src/main/java/ru/di9/mirror/domain/PathType.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/domain/PathType.java @@ -1,4 +1,4 @@ -package ru.di9.mirror.domain; +package ru.di9.mirror.app.domain; public enum PathType { FILE, DIRECTORY diff --git a/src/main/java/ru/di9/mirror/domain/WalkerResult.java b/mirror-app/src/main/java/ru/di9/mirror/app/domain/WalkerResult.java similarity index 78% rename from src/main/java/ru/di9/mirror/domain/WalkerResult.java rename to mirror-app/src/main/java/ru/di9/mirror/app/domain/WalkerResult.java index 7017454..646490c 100644 --- a/src/main/java/ru/di9/mirror/domain/WalkerResult.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/domain/WalkerResult.java @@ -1,4 +1,4 @@ -package ru.di9.mirror.domain; +package ru.di9.mirror.app.domain; import java.util.List; diff --git a/src/main/java/ru/di9/mirror/services/FileStorageService.java b/mirror-app/src/main/java/ru/di9/mirror/app/service/FileStorageService.java similarity index 88% rename from src/main/java/ru/di9/mirror/services/FileStorageService.java rename to mirror-app/src/main/java/ru/di9/mirror/app/service/FileStorageService.java index 249c7ab..d6a4e01 100644 --- a/src/main/java/ru/di9/mirror/services/FileStorageService.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/service/FileStorageService.java @@ -1,12 +1,10 @@ -package ru.di9.mirror.services; +package ru.di9.mirror.app.service; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import ru.di9.mirror.Utils; -import ru.di9.mirror.domain.FileRecord; -import ru.di9.mirror.domain.PathRecord; -import ru.di9.mirror.domain.PathType; -import ru.di9.mirror.domain.WalkerResult; +import ru.di9.mirror.app.Utils; +import ru.di9.mirror.app.domain.FileRecord; +import ru.di9.mirror.app.domain.PathRecord; +import ru.di9.mirror.app.domain.PathType; +import ru.di9.mirror.app.domain.WalkerResult; import java.io.IOException; import java.io.InputStream; @@ -19,12 +17,11 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; -@Service public class FileStorageService implements StorageService { private final Path storagePath; - public FileStorageService(@Value("${maven.storage}") String storagePath) { + public FileStorageService(String storagePath) { this.storagePath = Paths.get(storagePath).resolve("local"); } diff --git a/src/main/java/ru/di9/mirror/services/MavenCentralStorageService.java b/mirror-app/src/main/java/ru/di9/mirror/app/service/MavenCentralStorageService.java similarity index 90% rename from src/main/java/ru/di9/mirror/services/MavenCentralStorageService.java rename to mirror-app/src/main/java/ru/di9/mirror/app/service/MavenCentralStorageService.java index e70c176..b24e4eb 100644 --- a/src/main/java/ru/di9/mirror/services/MavenCentralStorageService.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/service/MavenCentralStorageService.java @@ -1,17 +1,15 @@ -package ru.di9.mirror.services; +package ru.di9.mirror.app.service; import lombok.SneakyThrows; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -import org.springframework.stereotype.Service; -import ru.di9.mirror.domain.FileRecord; +import ru.di9.mirror.app.domain.FileRecord; import java.io.IOException; import java.util.Objects; import java.util.Optional; -@Service public class MavenCentralStorageService extends MirrorService { private static final String MAVEN_CENTRAL_URL = "https://repo1.maven.org/maven2"; diff --git a/src/main/java/ru/di9/mirror/services/MirrorService.java b/mirror-app/src/main/java/ru/di9/mirror/app/service/MirrorService.java similarity index 82% rename from src/main/java/ru/di9/mirror/services/MirrorService.java rename to mirror-app/src/main/java/ru/di9/mirror/app/service/MirrorService.java index a6a4280..97f9794 100644 --- a/src/main/java/ru/di9/mirror/services/MirrorService.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/service/MirrorService.java @@ -1,6 +1,6 @@ -package ru.di9.mirror.services; +package ru.di9.mirror.app.service; -import ru.di9.mirror.domain.WalkerResult; +import ru.di9.mirror.app.domain.WalkerResult; import java.io.InputStream; import java.util.Optional; diff --git a/src/main/java/ru/di9/mirror/services/MirroredStorageService.java b/mirror-app/src/main/java/ru/di9/mirror/app/service/MirroredStorageService.java similarity index 88% rename from src/main/java/ru/di9/mirror/services/MirroredStorageService.java rename to mirror-app/src/main/java/ru/di9/mirror/app/service/MirroredStorageService.java index 1d5961a..6fb3b3f 100644 --- a/src/main/java/ru/di9/mirror/services/MirroredStorageService.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/service/MirroredStorageService.java @@ -1,14 +1,13 @@ -package ru.di9.mirror.services; +package ru.di9.mirror.app.service; -import org.springframework.stereotype.Service; -import ru.di9.mirror.domain.FileRecord; -import ru.di9.mirror.domain.WalkerResult; +import ru.di9.mirror.app.domain.FileRecord; +import ru.di9.mirror.app.domain.WalkerResult; import java.io.InputStream; import java.util.List; import java.util.Optional; -@Service +@SuppressWarnings("ClassCanBeRecord") public class MirroredStorageService implements StorageService { private final FileStorageService fileStorageService; diff --git a/src/main/java/ru/di9/mirror/services/StorageService.java b/mirror-app/src/main/java/ru/di9/mirror/app/service/StorageService.java similarity index 66% rename from src/main/java/ru/di9/mirror/services/StorageService.java rename to mirror-app/src/main/java/ru/di9/mirror/app/service/StorageService.java index 640d6b7..5ed475b 100644 --- a/src/main/java/ru/di9/mirror/services/StorageService.java +++ b/mirror-app/src/main/java/ru/di9/mirror/app/service/StorageService.java @@ -1,7 +1,7 @@ -package ru.di9.mirror.services; +package ru.di9.mirror.app.service; -import ru.di9.mirror.domain.FileRecord; -import ru.di9.mirror.domain.WalkerResult; +import ru.di9.mirror.app.domain.FileRecord; +import ru.di9.mirror.app.domain.WalkerResult; import java.io.InputStream; import java.util.Optional; diff --git a/mirror-web/build.gradle b/mirror-web/build.gradle new file mode 100644 index 0000000..8e6187c --- /dev/null +++ b/mirror-web/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' + +dependencies { + implementation(project(':mirror-app')) + + annotationProcessor('org.springframework.boot:spring-boot-configuration-processor') + implementation('org.springframework.boot:spring-boot-starter-web') +} + +tasks.named('compileJava') { + it.dependsOn('moveSpringConfigurationMetadata') +} + +tasks.register('moveSpringConfigurationMetadata').configure { + it.dependsOn('processResources') + doLast { + def metafile = file("${sourceSets.main.output.resourcesDir}/META-INF/additional-spring-configuration-metadata.json") + if (metafile.exists()) { + def metafileTo = file("${sourceSets.main.output.classesDirs.asPath}/META-INF/spring-configuration-metadata.json") + metafileTo.parentFile.mkdirs() + metafile.renameTo(metafileTo) + } + } +} diff --git a/src/main/java/ru/di9/mirror/Application.java b/mirror-web/src/main/java/ru/di9/mirror/web/Application.java similarity index 56% rename from src/main/java/ru/di9/mirror/Application.java rename to mirror-web/src/main/java/ru/di9/mirror/web/Application.java index b6d6414..fd6a6b2 100644 --- a/src/main/java/ru/di9/mirror/Application.java +++ b/mirror-web/src/main/java/ru/di9/mirror/web/Application.java @@ -1,4 +1,4 @@ -package ru.di9.mirror; +package ru.di9.mirror.web; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -6,8 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } } diff --git a/mirror-web/src/main/java/ru/di9/mirror/web/config/WebConfig.java b/mirror-web/src/main/java/ru/di9/mirror/web/config/WebConfig.java new file mode 100644 index 0000000..44389a8 --- /dev/null +++ b/mirror-web/src/main/java/ru/di9/mirror/web/config/WebConfig.java @@ -0,0 +1,31 @@ +package ru.di9.mirror.web.config; + +import okhttp3.OkHttpClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.di9.mirror.app.service.*; + +import java.util.List; + +@Configuration +public class WebConfig { + + @Bean + public StorageService mirroredStorageService(FileStorageService fileStorageService, + List mirrors) { + return new MirroredStorageService(fileStorageService, mirrors); + } + + @Bean + public FileStorageService fileStorageService(@Value("${maven.storage}") String storagePath) { + return new FileStorageService(storagePath); + } + + @Bean + public List mirrors() { + return List.of( + new MavenCentralStorageService(new OkHttpClient()) + ); + } +} diff --git a/src/main/java/ru/di9/mirror/controller/IndexOfMavenController.java b/mirror-web/src/main/java/ru/di9/mirror/web/controller/IndexOfMavenController.java similarity index 91% rename from src/main/java/ru/di9/mirror/controller/IndexOfMavenController.java rename to mirror-web/src/main/java/ru/di9/mirror/web/controller/IndexOfMavenController.java index 9ee9663..12946de 100644 --- a/src/main/java/ru/di9/mirror/controller/IndexOfMavenController.java +++ b/mirror-web/src/main/java/ru/di9/mirror/web/controller/IndexOfMavenController.java @@ -1,4 +1,4 @@ -package ru.di9.mirror.controller; +package ru.di9.mirror.web.controller; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.io.InputStreamResource; @@ -10,12 +10,12 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import ru.di9.mirror.Utils; -import ru.di9.mirror.domain.FileRecord; -import ru.di9.mirror.domain.PathRecord; -import ru.di9.mirror.domain.PathType; -import ru.di9.mirror.domain.WalkerResult; -import ru.di9.mirror.services.StorageService; +import ru.di9.mirror.app.Utils; +import ru.di9.mirror.app.domain.FileRecord; +import ru.di9.mirror.app.domain.PathRecord; +import ru.di9.mirror.app.domain.PathType; +import ru.di9.mirror.app.domain.WalkerResult; +import ru.di9.mirror.app.service.StorageService; import java.util.List; import java.util.Optional; diff --git a/src/main/java/ru/di9/mirror/controller/MavenController.java b/mirror-web/src/main/java/ru/di9/mirror/web/controller/MavenController.java similarity index 81% rename from src/main/java/ru/di9/mirror/controller/MavenController.java rename to mirror-web/src/main/java/ru/di9/mirror/web/controller/MavenController.java index d9b92c0..eef5e8c 100644 --- a/src/main/java/ru/di9/mirror/controller/MavenController.java +++ b/mirror-web/src/main/java/ru/di9/mirror/web/controller/MavenController.java @@ -1,4 +1,4 @@ -package ru.di9.mirror.controller; +package ru.di9.mirror.web.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; @@ -12,8 +12,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; -import ru.di9.mirror.domain.FileRecord; -import ru.di9.mirror.services.StorageService; +import ru.di9.mirror.app.domain.FileRecord; +import ru.di9.mirror.app.service.StorageService; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -41,11 +41,11 @@ public class MavenController { FileRecord fileRecord = fileRecordOptional.get(); responseEntity = ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, - "attachment; filename=\"" + fileRecord.name() + "\"") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .contentLength(fileRecord.size()) - .body(new InputStreamResource(fileRecord.inputStream())); + .header(HttpHeaders.CONTENT_DISPOSITION, + "attachment; filename=\"" + fileRecord.name() + "\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .contentLength(fileRecord.size()) + .body(new InputStreamResource(fileRecord.inputStream())); } return responseEntity; diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/mirror-web/src/main/resources/META-INF/additional-spring-configuration-metadata.json similarity index 100% rename from src/main/resources/META-INF/additional-spring-configuration-metadata.json rename to mirror-web/src/main/resources/META-INF/additional-spring-configuration-metadata.json diff --git a/src/main/resources/application.yml b/mirror-web/src/main/resources/application.yml similarity index 100% rename from src/main/resources/application.yml rename to mirror-web/src/main/resources/application.yml diff --git a/settings.gradle b/settings.gradle index d2b45b0..0cfa533 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,4 @@ rootProject.name = 'project-mirror' + +include('mirror-app') +include('mirror-web') diff --git a/src/main/java/ru/di9/mirror/aspect/LoggerAspect.java b/src/main/java/ru/di9/mirror/aspect/LoggerAspect.java deleted file mode 100644 index c52c26d..0000000 --- a/src/main/java/ru/di9/mirror/aspect/LoggerAspect.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.di9.mirror.aspect; - -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.springframework.stereotype.Component; - -@Slf4j -@Aspect -@Component -public class LoggerAspect { - - @Around("execution(* ru.di9.mirror.controller.MavenController.*(..))") - public Object logAroundMavenController(ProceedingJoinPoint joinPoint) throws Throwable { - return logAround(joinPoint); - } - - @Around("execution(* ru.di9.mirror.controller.IndexOfMavenController.*(..))") - public Object logAroundIndexOfMavenController(ProceedingJoinPoint joinPoint) throws Throwable { - return logAround(joinPoint); - } - - private Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { - log.info("[ASPECT] enter {} <- {}", joinPoint.getSignature().toLongString(), joinPoint.getArgs()); - Object result = joinPoint.proceed(); - log.info("[ASPECT] exit {} -> [{}]", joinPoint.getSignature().toLongString(), result); - return result; - } -} diff --git a/src/main/java/ru/di9/mirror/config/Config.java b/src/main/java/ru/di9/mirror/config/Config.java deleted file mode 100644 index 1c198fb..0000000 --- a/src/main/java/ru/di9/mirror/config/Config.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.di9.mirror.config; - -import okhttp3.OkHttpClient; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class Config { - - @Bean - public OkHttpClient okHttpClient() { - return new OkHttpClient(); - } -} diff --git a/versions.gradle b/versions.gradle new file mode 100644 index 0000000..385d46c --- /dev/null +++ b/versions.gradle @@ -0,0 +1,7 @@ +ext { + lombokVersion = '1.18.20' + okhttpVersion = '4.9.3' + + pluginSpringBootVerson = '2.6.6' + pluginSpringBomVerson = '1.0.11.RELEASE' +}