From 420c62f885631c6ed30abd0b12db7cc2b1eedf61 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 7 May 2022 21:41:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=20url=20=D0=BE=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=8F=D1=82=D1=8C=20=D0=B3=D1=80=D1=83=D0=BF?= =?UTF-8?q?=D0=BF=D1=83,=20=D0=B0=D1=80=D1=82=D0=B5=D1=84=D0=B0=D0=BA?= =?UTF-8?q?=D1=82,=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit see #5 --- build.gradle | 3 ++ .../mirror/core/domain/ArtifactRecord.java | 34 +++++++++++++++++++ .../ru/di9/mirror/core/domain/FileInfo.java | 13 +++++++ .../di9/mirror/core/handler/MavenHandler.java | 26 ++++++++++++-- .../core/domain/ArtifactRecordTest.java | 29 ++++++++++++++++ versions.gradle | 1 + 6 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 mirror-core/src/main/java/ru/di9/mirror/core/domain/ArtifactRecord.java create mode 100644 mirror-core/src/main/java/ru/di9/mirror/core/domain/FileInfo.java create mode 100644 mirror-core/src/test/java/ru/di9/mirror/core/domain/ArtifactRecordTest.java diff --git a/build.gradle b/build.gradle index 1c11d9d..f463119 100644 --- a/build.gradle +++ b/build.gradle @@ -28,9 +28,12 @@ subprojects { annotationProcessor("org.projectlombok:lombok:${lombokVersion}") compileOnly("org.projectlombok:lombok:${lombokVersion}") + implementation("org.slf4j:slf4j-api:${slf4jVersion}") + testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}") testCompileOnly("org.projectlombok:lombok:${lombokVersion}") testImplementation("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}") + testImplementation("org.junit.jupiter:junit-jupiter-params:${junitJupiterVersion}") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}") testImplementation("org.mockito:mockito-core:${mockitoCoreVersion}") } diff --git a/mirror-core/src/main/java/ru/di9/mirror/core/domain/ArtifactRecord.java b/mirror-core/src/main/java/ru/di9/mirror/core/domain/ArtifactRecord.java new file mode 100644 index 0000000..e51001d --- /dev/null +++ b/mirror-core/src/main/java/ru/di9/mirror/core/domain/ArtifactRecord.java @@ -0,0 +1,34 @@ +package ru.di9.mirror.core.domain; + +import java.util.StringJoiner; + +public record ArtifactRecord(String group, String artifactId, String version, boolean isSnapshot) { + private static final String SNAPSHOT = "SNAPSHOT"; + + public static ArtifactRecord fromHttpPath(String httpPath) { + if (httpPath.startsWith("/")) { + httpPath = httpPath.substring(1); + } + + String[] partsPath = httpPath.split("/"); + String version = partsPath[partsPath.length-2]; + boolean isSnapshot = version.contains(SNAPSHOT); + + String fileName = partsPath[partsPath.length-1]; + + String artifactId; + if (isSnapshot) { + String partVersion = version.substring(0, version.lastIndexOf(SNAPSHOT)); + artifactId = fileName.substring(0, fileName.indexOf(partVersion) - 1); + } else { + artifactId = fileName.substring(0, (fileName.lastIndexOf('.') - version.length() - 1)); + } + + StringJoiner sj = new StringJoiner("."); + for (int i = 0; i < partsPath.length - 3; i++) { + sj.add(partsPath[i]); + } + + return new ArtifactRecord(sj.toString(), artifactId, version, isSnapshot); + } +} diff --git a/mirror-core/src/main/java/ru/di9/mirror/core/domain/FileInfo.java b/mirror-core/src/main/java/ru/di9/mirror/core/domain/FileInfo.java new file mode 100644 index 0000000..a9d4a15 --- /dev/null +++ b/mirror-core/src/main/java/ru/di9/mirror/core/domain/FileInfo.java @@ -0,0 +1,13 @@ +package ru.di9.mirror.core.domain; + +public record FileInfo(String fullName, String name, String ext) { + + public static FileInfo of(String fileName) { + int idx = fileName.lastIndexOf('.'); + return new FileInfo( + fileName, + fileName.substring(0, idx), + fileName.substring(idx + 1) + ); + } +} diff --git a/mirror-core/src/main/java/ru/di9/mirror/core/handler/MavenHandler.java b/mirror-core/src/main/java/ru/di9/mirror/core/handler/MavenHandler.java index 3d4bb3a..2d26c9d 100644 --- a/mirror-core/src/main/java/ru/di9/mirror/core/handler/MavenHandler.java +++ b/mirror-core/src/main/java/ru/di9/mirror/core/handler/MavenHandler.java @@ -1,6 +1,9 @@ package ru.di9.mirror.core.handler; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import ru.di9.mirror.core.domain.ArtifactRecord; +import ru.di9.mirror.core.domain.FileInfo; import ru.di9.mirror.core.handler.response.GetFileResponse; import ru.di9.mirror.core.service.ExternalMavenService; import ru.di9.mirror.core.service.MinioService; @@ -9,6 +12,7 @@ import java.io.InputStream; import java.util.List; import java.util.Optional; +@Slf4j @RequiredArgsConstructor public class MavenHandler { @@ -16,14 +20,21 @@ public class MavenHandler { private final List externalMavenServices; public Optional getFile(String path) { - final String fileName = path.substring(path.lastIndexOf("/") + 1); + var fileInfo = FileInfo.of(path.substring(path.lastIndexOf("/") + 1)); + + if (!fileInfo.fullName().equalsIgnoreCase("maven-metadata.xml") + || !fileInfo.ext().equalsIgnoreCase("sha1")) { + + ArtifactRecord artifactRecord = ArtifactRecord.fromHttpPath(path); + log.info(artifactRecord.toString()); + } Optional optionalInputStream = minioService.get("/local/" + path); if (optionalInputStream.isPresent()) { return optionalInputStream - .map(inputStream -> new GetFileResponse(fileName, inputStream)); + .map(inputStream -> new GetFileResponse(fileInfo.name(), inputStream)); } else { - return findInMirrors(path, fileName); + return findInMirrors(path, fileInfo.name()); } } @@ -50,6 +61,15 @@ public class MavenHandler { } public void putFile(String path, InputStream inputStream) { + var fileInfo = FileInfo.of(path.substring(path.lastIndexOf("/") + 1)); + + if (!fileInfo.fullName().equalsIgnoreCase("maven-metadata.xml") + || !fileInfo.ext().equalsIgnoreCase("sha1")) { + + ArtifactRecord artifactRecord = ArtifactRecord.fromHttpPath(path); + log.info(artifactRecord.toString()); + } + minioService.put("/local/" + path, inputStream); } } diff --git a/mirror-core/src/test/java/ru/di9/mirror/core/domain/ArtifactRecordTest.java b/mirror-core/src/test/java/ru/di9/mirror/core/domain/ArtifactRecordTest.java new file mode 100644 index 0000000..2fe88cd --- /dev/null +++ b/mirror-core/src/test/java/ru/di9/mirror/core/domain/ArtifactRecordTest.java @@ -0,0 +1,29 @@ +package ru.di9.mirror.core.domain; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +class ArtifactRecordTest { + + @ParameterizedTest(name = "[{index}] {0}") + @MethodSource("fromHttpPathSource") + void fromHttpPath(String httpPath, ArtifactRecord expected) { + ArtifactRecord actual = ArtifactRecord.fromHttpPath(httpPath); + Assertions.assertEquals(expected, actual); + } + + static Stream fromHttpPathSource() { + return Stream.of( + Arguments.of("com/google/guava/guava/21.0/guava-21.0.jar", + new ArtifactRecord("com.google.guava", "guava", "21.0", false)), + Arguments.of("org/bukkit/bukkit/1.12.2-R0.1-SNAPSHOT/bukkit-1.12.2-R0.1-20180712.012114-155.jar", + new ArtifactRecord("org.bukkit", "bukkit", "1.12.2-R0.1-SNAPSHOT", true)), + Arguments.of("/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar", + new ArtifactRecord("org.projectlombok", "lombok", "1.18.22", false)) + ); + } +} diff --git a/versions.gradle b/versions.gradle index a425c99..d5bdfcb 100644 --- a/versions.gradle +++ b/versions.gradle @@ -1,5 +1,6 @@ ext { lombokVersion = '1.18.20' + slf4jVersion = '1.7.36' minioVersion = '8.3.9' springBootVerson = '2.6.6'