дробим проект на субмодули
This commit is contained in:
15
.editorconfig
Normal file
15
.editorconfig
Normal file
@@ -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
|
||||||
73
build.gradle
73
build.gradle
@@ -1,44 +1,37 @@
|
|||||||
plugins {
|
//file:noinspection GrUnresolvedAccess
|
||||||
id 'org.springframework.boot' version '2.6.6'
|
buildscript {
|
||||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
apply from: 'versions.gradle'
|
||||||
id 'java'
|
|
||||||
}
|
|
||||||
|
|
||||||
group = 'ru.di9'
|
repositories {
|
||||||
version = '1.0-SNAPSHOT'
|
maven { url 'https://plugins.gradle.org/m2/' }
|
||||||
|
}
|
||||||
compileJava {
|
dependencies {
|
||||||
targetCompatibility = sourceCompatibility = JavaVersion.VERSION_17
|
// 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
|
||||||
repositories {
|
classpath "io.spring.gradle:dependency-management-plugin:${pluginSpringBomVerson}"
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
5
mirror-app/build.gradle
Normal file
5
mirror-app/build.gradle
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
apply plugin: 'java-library'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
api("com.squareup.okhttp3:okhttp:${okhttpVersion}")
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ru.di9.mirror;
|
package ru.di9.mirror.app;
|
||||||
|
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ru.di9.mirror.domain;
|
package ru.di9.mirror.app.domain;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ru.di9.mirror.domain;
|
package ru.di9.mirror.app.domain;
|
||||||
|
|
||||||
public record PathRecord(String name, PathType type) {
|
public record PathRecord(String name, PathType type) {
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ru.di9.mirror.domain;
|
package ru.di9.mirror.app.domain;
|
||||||
|
|
||||||
public enum PathType {
|
public enum PathType {
|
||||||
FILE, DIRECTORY
|
FILE, DIRECTORY
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ru.di9.mirror.domain;
|
package ru.di9.mirror.app.domain;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -1,12 +1,10 @@
|
|||||||
package ru.di9.mirror.services;
|
package ru.di9.mirror.app.service;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import ru.di9.mirror.app.Utils;
|
||||||
import org.springframework.stereotype.Service;
|
import ru.di9.mirror.app.domain.FileRecord;
|
||||||
import ru.di9.mirror.Utils;
|
import ru.di9.mirror.app.domain.PathRecord;
|
||||||
import ru.di9.mirror.domain.FileRecord;
|
import ru.di9.mirror.app.domain.PathType;
|
||||||
import ru.di9.mirror.domain.PathRecord;
|
import ru.di9.mirror.app.domain.WalkerResult;
|
||||||
import ru.di9.mirror.domain.PathType;
|
|
||||||
import ru.di9.mirror.domain.WalkerResult;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -19,12 +17,11 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@Service
|
|
||||||
public class FileStorageService implements StorageService {
|
public class FileStorageService implements StorageService {
|
||||||
|
|
||||||
private final Path storagePath;
|
private final Path storagePath;
|
||||||
|
|
||||||
public FileStorageService(@Value("${maven.storage}") String storagePath) {
|
public FileStorageService(String storagePath) {
|
||||||
this.storagePath = Paths.get(storagePath).resolve("local");
|
this.storagePath = Paths.get(storagePath).resolve("local");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,17 +1,15 @@
|
|||||||
package ru.di9.mirror.services;
|
package ru.di9.mirror.app.service;
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
import org.springframework.stereotype.Service;
|
import ru.di9.mirror.app.domain.FileRecord;
|
||||||
import ru.di9.mirror.domain.FileRecord;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
|
||||||
public class MavenCentralStorageService extends MirrorService {
|
public class MavenCentralStorageService extends MirrorService {
|
||||||
|
|
||||||
private static final String MAVEN_CENTRAL_URL = "https://repo1.maven.org/maven2";
|
private static final String MAVEN_CENTRAL_URL = "https://repo1.maven.org/maven2";
|
||||||
@@ -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.io.InputStream;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
package ru.di9.mirror.services;
|
package ru.di9.mirror.app.service;
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
import ru.di9.mirror.app.domain.FileRecord;
|
||||||
import ru.di9.mirror.domain.FileRecord;
|
import ru.di9.mirror.app.domain.WalkerResult;
|
||||||
import ru.di9.mirror.domain.WalkerResult;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@SuppressWarnings("ClassCanBeRecord")
|
||||||
public class MirroredStorageService implements StorageService {
|
public class MirroredStorageService implements StorageService {
|
||||||
|
|
||||||
private final FileStorageService fileStorageService;
|
private final FileStorageService fileStorageService;
|
||||||
@@ -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.app.domain.FileRecord;
|
||||||
import ru.di9.mirror.domain.WalkerResult;
|
import ru.di9.mirror.app.domain.WalkerResult;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
25
mirror-web/build.gradle
Normal file
25
mirror-web/build.gradle
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ru.di9.mirror;
|
package ru.di9.mirror.web;
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
@@ -6,8 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class Application {
|
public class Application {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(Application.class, args);
|
SpringApplication.run(Application.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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<MirrorService> mirrors) {
|
||||||
|
return new MirroredStorageService(fileStorageService, mirrors);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FileStorageService fileStorageService(@Value("${maven.storage}") String storagePath) {
|
||||||
|
return new FileStorageService(storagePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public List<MirrorService> mirrors() {
|
||||||
|
return List.of(
|
||||||
|
new MavenCentralStorageService(new OkHttpClient())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.core.io.InputStreamResource;
|
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.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import ru.di9.mirror.Utils;
|
import ru.di9.mirror.app.Utils;
|
||||||
import ru.di9.mirror.domain.FileRecord;
|
import ru.di9.mirror.app.domain.FileRecord;
|
||||||
import ru.di9.mirror.domain.PathRecord;
|
import ru.di9.mirror.app.domain.PathRecord;
|
||||||
import ru.di9.mirror.domain.PathType;
|
import ru.di9.mirror.app.domain.PathType;
|
||||||
import ru.di9.mirror.domain.WalkerResult;
|
import ru.di9.mirror.app.domain.WalkerResult;
|
||||||
import ru.di9.mirror.services.StorageService;
|
import ru.di9.mirror.app.service.StorageService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package ru.di9.mirror.controller;
|
package ru.di9.mirror.web.controller;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
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.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.PutMapping;
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import ru.di9.mirror.domain.FileRecord;
|
import ru.di9.mirror.app.domain.FileRecord;
|
||||||
import ru.di9.mirror.services.StorageService;
|
import ru.di9.mirror.app.service.StorageService;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -41,11 +41,11 @@ public class MavenController {
|
|||||||
FileRecord fileRecord = fileRecordOptional.get();
|
FileRecord fileRecord = fileRecordOptional.get();
|
||||||
|
|
||||||
responseEntity = ResponseEntity.ok()
|
responseEntity = ResponseEntity.ok()
|
||||||
.header(HttpHeaders.CONTENT_DISPOSITION,
|
.header(HttpHeaders.CONTENT_DISPOSITION,
|
||||||
"attachment; filename=\"" + fileRecord.name() + "\"")
|
"attachment; filename=\"" + fileRecord.name() + "\"")
|
||||||
.contentType(MediaType.APPLICATION_OCTET_STREAM)
|
.contentType(MediaType.APPLICATION_OCTET_STREAM)
|
||||||
.contentLength(fileRecord.size())
|
.contentLength(fileRecord.size())
|
||||||
.body(new InputStreamResource(fileRecord.inputStream()));
|
.body(new InputStreamResource(fileRecord.inputStream()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return responseEntity;
|
return responseEntity;
|
||||||
@@ -1 +1,4 @@
|
|||||||
rootProject.name = 'project-mirror'
|
rootProject.name = 'project-mirror'
|
||||||
|
|
||||||
|
include('mirror-app')
|
||||||
|
include('mirror-web')
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
7
versions.gradle
Normal file
7
versions.gradle
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
ext {
|
||||||
|
lombokVersion = '1.18.20'
|
||||||
|
okhttpVersion = '4.9.3'
|
||||||
|
|
||||||
|
pluginSpringBootVerson = '2.6.6'
|
||||||
|
pluginSpringBomVerson = '1.0.11.RELEASE'
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user