From e66f1d9451eb61a40721970414877ce04ad52296 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 24 Apr 2022 15:33:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B5=D1=80=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20Maven=20Central?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 + .../java/ru/di9/mirror/config/Config.java | 14 ++++++ .../services/MavenCentralStorageService.java | 44 ++++++++++++++----- .../ru/di9/mirror/services/MirrorService.java | 19 ++++++++ .../services/MirroredStorageService.java | 18 +++++--- 5 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ru/di9/mirror/config/Config.java create mode 100644 src/main/java/ru/di9/mirror/services/MirrorService.java diff --git a/build.gradle b/build.gradle index b696e75..71e526f 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,8 @@ dependencies { annotationProcessor('org.springframework.boot:spring-boot-configuration-processor') implementation('org.springframework.boot:spring-boot-starter-web') + + implementation('com.squareup.okhttp3:okhttp:4.9.3') } tasks.named('compileJava') { diff --git a/src/main/java/ru/di9/mirror/config/Config.java b/src/main/java/ru/di9/mirror/config/Config.java new file mode 100644 index 0000000..1c198fb --- /dev/null +++ b/src/main/java/ru/di9/mirror/config/Config.java @@ -0,0 +1,14 @@ +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/src/main/java/ru/di9/mirror/services/MavenCentralStorageService.java b/src/main/java/ru/di9/mirror/services/MavenCentralStorageService.java index 5dab733..e70c176 100644 --- a/src/main/java/ru/di9/mirror/services/MavenCentralStorageService.java +++ b/src/main/java/ru/di9/mirror/services/MavenCentralStorageService.java @@ -1,26 +1,46 @@ package ru.di9.mirror.services; +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.domain.WalkerResult; -import java.io.InputStream; +import java.io.IOException; +import java.util.Objects; import java.util.Optional; @Service -public class MavenCentralStorageService implements StorageService { +public class MavenCentralStorageService extends MirrorService { + + private static final String MAVEN_CENTRAL_URL = "https://repo1.maven.org/maven2"; + private final OkHttpClient okHttpClient; + + public MavenCentralStorageService(OkHttpClient okHttpClient) { + this.okHttpClient = okHttpClient; + } + @Override + @SneakyThrows public Optional getFile(String path) { - return Optional.empty(); - } + Request request = new Request.Builder() + .url(MAVEN_CENTRAL_URL + path) + .build(); - @Override - public void putFile(String path, InputStream inputStream) { - throw new UnsupportedOperationException(); - } + Response response = okHttpClient.newCall(request).execute(); + if (!response.isSuccessful()) { + if (response.code() == 404) { + return Optional.empty(); + } - @Override - public Optional walker(String path) { - throw new UnsupportedOperationException(); + throw new IOException("Unexpected code " + response); + } + + return Optional.of(new FileRecord( + path, + Long.parseLong(Objects.requireNonNull(response.header("Content-Length"))), + Objects.requireNonNull(response.body()).byteStream() + )); } } diff --git a/src/main/java/ru/di9/mirror/services/MirrorService.java b/src/main/java/ru/di9/mirror/services/MirrorService.java new file mode 100644 index 0000000..a6a4280 --- /dev/null +++ b/src/main/java/ru/di9/mirror/services/MirrorService.java @@ -0,0 +1,19 @@ +package ru.di9.mirror.services; + +import ru.di9.mirror.domain.WalkerResult; + +import java.io.InputStream; +import java.util.Optional; + +public abstract class MirrorService implements StorageService{ + + @Override + public void putFile(String path, InputStream inputStream) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional walker(String path) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/ru/di9/mirror/services/MirroredStorageService.java b/src/main/java/ru/di9/mirror/services/MirroredStorageService.java index 90d18c9..1d5961a 100644 --- a/src/main/java/ru/di9/mirror/services/MirroredStorageService.java +++ b/src/main/java/ru/di9/mirror/services/MirroredStorageService.java @@ -5,18 +5,19 @@ import ru.di9.mirror.domain.FileRecord; import ru.di9.mirror.domain.WalkerResult; import java.io.InputStream; +import java.util.List; import java.util.Optional; @Service public class MirroredStorageService implements StorageService { private final FileStorageService fileStorageService; - private final MavenCentralStorageService mavenCentralStorageService; + private final List mirrors; public MirroredStorageService(FileStorageService fileStorageService, - MavenCentralStorageService mavenCentralStorageService) { + List mirrors) { this.fileStorageService = fileStorageService; - this.mavenCentralStorageService = mavenCentralStorageService; + this.mirrors = mirrors; } @Override @@ -28,9 +29,14 @@ public class MirroredStorageService implements StorageService { return optional; } - mavenCentralStorageService.getFile(path).ifPresent(fileRecord -> - fileStorageService.putFile(fileRecord.name(), fileRecord.inputStream())); - + for (StorageService mirror : mirrors) { + optional = mirror.getFile(path); + if (optional.isPresent()) { + FileRecord fileRecord = optional.get(); + fileStorageService.putFile(fileRecord.name(), fileRecord.inputStream()); + break; + } + } return fileStorageService.getFile(path); }