From 6bb083755cf8d2edd1371eb5069f193065d687c9 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 9 May 2022 19:42:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20mongodb=20=D0=B2=20=D0=BE=D1=82=D0=BB=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mirror-core/build.gradle | 1 - .../mirror/core/domain/ArtifactRecord.java | 38 ---------------- .../mirror/core/entity/ArtifactEntity.java | 45 ++++++++++++++----- .../di9/mirror/core/handler/MavenHandler.java | 21 +++++---- .../core/repository/ArtifactRepository.java | 28 +----------- .../ArtifactEntityTest.java} | 14 +++--- mirror-mongo/build.gradle | 7 +++ .../mongo/entity/MongoArtifactEntity.java | 6 +++ .../repository/MongoArtifactRepository.java | 29 ++++++++++++ mirror-web/build.gradle | 1 + .../ru/di9/mirror/web/config/MinioConfig.java | 3 +- .../ru/di9/mirror/web/config/MongoConfig.java | 10 ++++- .../ru/di9/mirror/web/config/WebConfig.java | 8 +--- settings.gradle | 1 + 14 files changed, 108 insertions(+), 104 deletions(-) delete mode 100644 mirror-core/src/main/java/ru/di9/mirror/core/domain/ArtifactRecord.java rename mirror-core/src/test/java/ru/di9/mirror/core/{domain/ArtifactRecordTest.java => entity/ArtifactEntityTest.java} (68%) create mode 100644 mirror-mongo/build.gradle create mode 100644 mirror-mongo/src/main/java/ru/di9/mirror/mongo/entity/MongoArtifactEntity.java create mode 100644 mirror-mongo/src/main/java/ru/di9/mirror/mongo/repository/MongoArtifactRepository.java diff --git a/mirror-core/build.gradle b/mirror-core/build.gradle index 26e25c4..c5d6b4c 100644 --- a/mirror-core/build.gradle +++ b/mirror-core/build.gradle @@ -2,5 +2,4 @@ apply plugin: 'java-library' dependencies { api("com.squareup.okhttp3:okhttp:${okhttpVersion}") - api("org.mongodb:mongodb-driver-sync:${mongoDriver}") } 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 deleted file mode 100644 index f6185f4..0000000 --- a/mirror-core/src/main/java/ru/di9/mirror/core/domain/ArtifactRecord.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.di9.mirror.core.domain; - -import lombok.extern.slf4j.Slf4j; - -import java.util.StringJoiner; - -@Slf4j -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); - } - log.info("httpPath = {}", httpPath); - - 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/entity/ArtifactEntity.java b/mirror-core/src/main/java/ru/di9/mirror/core/entity/ArtifactEntity.java index 687c45e..cf61e64 100644 --- a/mirror-core/src/main/java/ru/di9/mirror/core/entity/ArtifactEntity.java +++ b/mirror-core/src/main/java/ru/di9/mirror/core/entity/ArtifactEntity.java @@ -1,28 +1,49 @@ package ru.di9.mirror.core.entity; +import lombok.AllArgsConstructor; import lombok.Data; -import lombok.EqualsAndHashCode; -import org.bson.types.ObjectId; -import ru.di9.mirror.core.domain.ArtifactRecord; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import java.util.StringJoiner; + +@Slf4j +@AllArgsConstructor +@NoArgsConstructor @Data -@EqualsAndHashCode(exclude = {"id"}) public class ArtifactEntity { - private ObjectId id; + private static final String SNAPSHOT = "SNAPSHOT"; private String group; private String artifactId; private String version; private boolean isSnapshot; - public static ArtifactEntity fromRecord(ArtifactRecord artifactRecord) { - var entity = new ArtifactEntity(); + public static ArtifactEntity fromHttpPath(String httpPath) { + if (httpPath.startsWith("/")) { + httpPath = httpPath.substring(1); + } + log.info("httpPath = {}", httpPath); - entity.setGroup(artifactRecord.group()); - entity.setArtifactId(artifactRecord.artifactId()); - entity.setVersion(artifactRecord.version()); - entity.setSnapshot(artifactRecord.isSnapshot()); + String[] partsPath = httpPath.split("/"); + String version = partsPath[partsPath.length-2]; + boolean isSnapshot = version.contains(SNAPSHOT); - return entity; + 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 ArtifactEntity(sj.toString(), artifactId, version, isSnapshot); } } 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 77a819a..40e7517 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 @@ -2,13 +2,12 @@ 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.entity.ArtifactEntity; import ru.di9.mirror.core.handler.response.GetFileResponse; import ru.di9.mirror.core.repository.ArtifactRepository; -import ru.di9.mirror.core.service.ExternalMavenService; import ru.di9.mirror.core.repository.FileStorageRepository; +import ru.di9.mirror.core.service.ExternalMavenService; import java.io.InputStream; import java.util.List; @@ -25,12 +24,12 @@ public class MavenHandler { public Optional getFile(String path) { var fileInfo = FileInfo.of(path.substring(path.lastIndexOf("/") + 1)); - ArtifactRecord artifactRecord = null; + ArtifactEntity artifactEntity = null; if (!fileInfo.fullName().equalsIgnoreCase("maven-metadata.xml") && !fileInfo.ext().equalsIgnoreCase("sha1")) { - artifactRecord = ArtifactRecord.fromHttpPath(path); - log.info(artifactRecord.toString()); + artifactEntity = ArtifactEntity.fromHttpPath(path); + log.info(artifactEntity.toString()); } Optional optionalInputStream = fileStorageRepository.findByName("/local/" + path); @@ -38,11 +37,11 @@ public class MavenHandler { return optionalInputStream .map(inputStream -> new GetFileResponse(fileInfo.name(), inputStream)); } else { - return findInMirrors(path, fileInfo.name(), artifactRecord); + return findInMirrors(path, fileInfo.name(), artifactEntity); } } - private Optional findInMirrors(String path, String fileName, ArtifactRecord artifactRecord) { + private Optional findInMirrors(String path, String fileName, ArtifactEntity artifactEntity) { Optional result; for (ExternalMavenService externalMavenService : externalMavenServices) { final String nameForStore = "/" + externalMavenService.getId() + "/" + path; @@ -54,8 +53,8 @@ public class MavenHandler { } else { result = externalMavenService.getFile(path); if (result.isPresent()) { - if (artifactRecord != null) { - repository.save(ArtifactEntity.fromRecord(artifactRecord)); + if (artifactEntity != null) { + repository.save(artifactEntity); } fileStorageRepository.save(nameForStore, result.get()); @@ -74,8 +73,8 @@ public class MavenHandler { if (!fileInfo.fullName().equalsIgnoreCase("maven-metadata.xml") && !fileInfo.ext().equalsIgnoreCase("sha1")) { - ArtifactRecord artifactRecord = ArtifactRecord.fromHttpPath(path); - log.info(artifactRecord.toString()); + ArtifactEntity artifactEntity = ArtifactEntity.fromHttpPath(path); + log.info(artifactEntity.toString()); } fileStorageRepository.save("/local/" + path, inputStream); diff --git a/mirror-core/src/main/java/ru/di9/mirror/core/repository/ArtifactRepository.java b/mirror-core/src/main/java/ru/di9/mirror/core/repository/ArtifactRepository.java index ba3f61d..51b6167 100644 --- a/mirror-core/src/main/java/ru/di9/mirror/core/repository/ArtifactRepository.java +++ b/mirror-core/src/main/java/ru/di9/mirror/core/repository/ArtifactRepository.java @@ -1,32 +1,8 @@ package ru.di9.mirror.core.repository; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.result.InsertOneResult; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.bson.Document; -import org.bson.types.ObjectId; import ru.di9.mirror.core.entity.ArtifactEntity; -@Slf4j -@RequiredArgsConstructor -public class ArtifactRepository { - private final MongoCollection collection; +public interface ArtifactRepository { - public void save(ArtifactEntity artifactEntity) { - if (artifactEntity.getId() == null) { - insert(artifactEntity); - } - } - - private void insert(ArtifactEntity artifactEntity) { - InsertOneResult insertOneResult = collection.insertOne(new Document() - .append("_id", new ObjectId()) - .append("group", artifactEntity.getGroup()) - .append("artifactId", artifactEntity.getArtifactId()) - .append("version", artifactEntity.getVersion()) - .append("is_snapshot", artifactEntity.isSnapshot())); - - log.info("InsertedId: {}", insertOneResult.getInsertedId()); - } + ArtifactEntity save(ArtifactEntity artifactEntity); } 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/entity/ArtifactEntityTest.java similarity index 68% rename from mirror-core/src/test/java/ru/di9/mirror/core/domain/ArtifactRecordTest.java rename to mirror-core/src/test/java/ru/di9/mirror/core/entity/ArtifactEntityTest.java index 2fe88cd..75336d0 100644 --- a/mirror-core/src/test/java/ru/di9/mirror/core/domain/ArtifactRecordTest.java +++ b/mirror-core/src/test/java/ru/di9/mirror/core/entity/ArtifactEntityTest.java @@ -1,4 +1,4 @@ -package ru.di9.mirror.core.domain; +package ru.di9.mirror.core.entity; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; @@ -7,23 +7,23 @@ import org.junit.jupiter.params.provider.MethodSource; import java.util.stream.Stream; -class ArtifactRecordTest { +class ArtifactEntityTest { @ParameterizedTest(name = "[{index}] {0}") @MethodSource("fromHttpPathSource") - void fromHttpPath(String httpPath, ArtifactRecord expected) { - ArtifactRecord actual = ArtifactRecord.fromHttpPath(httpPath); + void fromHttpPath(String httpPath, ArtifactEntity expected) { + ArtifactEntity actual = ArtifactEntity.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)), + new ArtifactEntity("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)), + new ArtifactEntity("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)) + new ArtifactEntity("org.projectlombok", "lombok", "1.18.22", false)) ); } } diff --git a/mirror-mongo/build.gradle b/mirror-mongo/build.gradle new file mode 100644 index 0000000..25171e8 --- /dev/null +++ b/mirror-mongo/build.gradle @@ -0,0 +1,7 @@ +apply plugin: 'java-library' + +dependencies { + implementation(project(':mirror-core')) + + api("org.mongodb:mongodb-driver-sync:${mongoDriver}") +} diff --git a/mirror-mongo/src/main/java/ru/di9/mirror/mongo/entity/MongoArtifactEntity.java b/mirror-mongo/src/main/java/ru/di9/mirror/mongo/entity/MongoArtifactEntity.java new file mode 100644 index 0000000..60a7018 --- /dev/null +++ b/mirror-mongo/src/main/java/ru/di9/mirror/mongo/entity/MongoArtifactEntity.java @@ -0,0 +1,6 @@ +package ru.di9.mirror.mongo.entity; + +import ru.di9.mirror.core.entity.ArtifactEntity; + +public class MongoArtifactEntity extends ArtifactEntity { +} diff --git a/mirror-mongo/src/main/java/ru/di9/mirror/mongo/repository/MongoArtifactRepository.java b/mirror-mongo/src/main/java/ru/di9/mirror/mongo/repository/MongoArtifactRepository.java new file mode 100644 index 0000000..7930646 --- /dev/null +++ b/mirror-mongo/src/main/java/ru/di9/mirror/mongo/repository/MongoArtifactRepository.java @@ -0,0 +1,29 @@ +package ru.di9.mirror.mongo.repository; + +import com.mongodb.client.MongoCollection; +import com.mongodb.client.result.InsertOneResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.bson.types.ObjectId; +import ru.di9.mirror.core.entity.ArtifactEntity; +import ru.di9.mirror.core.repository.ArtifactRepository; + +@Slf4j +@RequiredArgsConstructor +public class MongoArtifactRepository implements ArtifactRepository { + private final MongoCollection collection; + + @Override + public ArtifactEntity save(ArtifactEntity artifactEntity) { + InsertOneResult insertOneResult = collection.insertOne(new Document() + .append("_id", new ObjectId()) + .append("group", artifactEntity.getGroup()) + .append("artifactId", artifactEntity.getArtifactId()) + .append("version", artifactEntity.getVersion()) + .append("is_snapshot", artifactEntity.isSnapshot())); + + log.info("InsertedId: {}", insertOneResult.getInsertedId()); + return artifactEntity; + } +} diff --git a/mirror-web/build.gradle b/mirror-web/build.gradle index f0eaa69..067bda1 100644 --- a/mirror-web/build.gradle +++ b/mirror-web/build.gradle @@ -4,6 +4,7 @@ apply plugin: 'org.springframework.boot' dependencies { implementation(project(':mirror-core')) implementation(project(':mirror-minio')) + implementation(project(':mirror-mongo')) annotationProcessor("org.springframework.boot:spring-boot-configuration-processor:${springBootVerson}") implementation("org.springframework.boot:spring-boot-starter-web:${springBootVerson}") diff --git a/mirror-web/src/main/java/ru/di9/mirror/web/config/MinioConfig.java b/mirror-web/src/main/java/ru/di9/mirror/web/config/MinioConfig.java index 1a78134..d1169a8 100644 --- a/mirror-web/src/main/java/ru/di9/mirror/web/config/MinioConfig.java +++ b/mirror-web/src/main/java/ru/di9/mirror/web/config/MinioConfig.java @@ -11,7 +11,8 @@ import ru.di9.mirror.minio.service.MinioRepository; public class MinioConfig { @Bean - public FileStorageRepository fileStorageRepository(MinioClient minioClient, @Value("${minio.bucket}") String bucket) { + public FileStorageRepository fileStorageRepository(MinioClient minioClient, + @Value("${minio.bucket}") String bucket) { return new MinioRepository(minioClient, bucket); } diff --git a/mirror-web/src/main/java/ru/di9/mirror/web/config/MongoConfig.java b/mirror-web/src/main/java/ru/di9/mirror/web/config/MongoConfig.java index 02437f5..531eddd 100644 --- a/mirror-web/src/main/java/ru/di9/mirror/web/config/MongoConfig.java +++ b/mirror-web/src/main/java/ru/di9/mirror/web/config/MongoConfig.java @@ -10,6 +10,8 @@ import org.bson.Document; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import ru.di9.mirror.core.repository.ArtifactRepository; +import ru.di9.mirror.mongo.repository.MongoArtifactRepository; import java.util.List; @@ -17,7 +19,8 @@ import java.util.List; public class MongoConfig { @Bean - public MongoClient mongoClient(@Value("${mongodb.host}") String host, @Value("${mongodb.port}") int port) { + public MongoClient mongoClient(@Value("${mongodb.host}") String host, + @Value("${mongodb.port}") int port) { return MongoClients.create(MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(List.of(new ServerAddress(host, port)))) .build()); @@ -33,4 +36,9 @@ public class MongoConfig { public MongoCollection artifactCollection(MongoDatabase database) { return database.getCollection("artifacts"); } + + @Bean + public ArtifactRepository artifactRepository(MongoCollection artifactCollection) { + return new MongoArtifactRepository(artifactCollection); + } } 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 index df4fb8b..22740a9 100644 --- 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 @@ -1,15 +1,13 @@ package ru.di9.mirror.web.config; -import com.mongodb.client.MongoCollection; import okhttp3.OkHttpClient; -import org.bson.Document; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.di9.mirror.core.handler.IndexOfHandler; import ru.di9.mirror.core.handler.MavenHandler; import ru.di9.mirror.core.repository.ArtifactRepository; -import ru.di9.mirror.core.service.ExternalMavenService; import ru.di9.mirror.core.repository.FileStorageRepository; +import ru.di9.mirror.core.service.ExternalMavenService; import java.util.List; @@ -41,8 +39,4 @@ public class WebConfig { return new OkHttpClient(); } - @Bean - public ArtifactRepository artifactRepository(MongoCollection artifactCollection) { - return new ArtifactRepository(artifactCollection); - } } diff --git a/settings.gradle b/settings.gradle index c94e778..9bf2540 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,5 @@ rootProject.name = 'project-mirror' include('mirror-core') include('mirror-minio') +include('mirror-mongo') include('mirror-web')