дробим проект на субмодули

This commit is contained in:
2022-04-28 13:41:57 +03:00
parent e2fc75877d
commit a868b66e0c
24 changed files with 161 additions and 133 deletions

15
.editorconfig Normal file
View 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

View File

@@ -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
View File

@@ -0,0 +1,5 @@
apply plugin: 'java-library'
dependencies {
api("com.squareup.okhttp3:okhttp:${okhttpVersion}")
}

View File

@@ -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;

View File

@@ -1,4 +1,4 @@
package ru.di9.mirror.domain; package ru.di9.mirror.app.domain;
import java.io.InputStream; import java.io.InputStream;

View File

@@ -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) {
} }

View File

@@ -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

View File

@@ -1,4 +1,4 @@
package ru.di9.mirror.domain; package ru.di9.mirror.app.domain;
import java.util.List; import java.util.List;

View File

@@ -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");
} }

View File

@@ -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";

View File

@@ -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;

View File

@@ -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;

View File

@@ -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
View 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)
}
}
}

View File

@@ -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);
} }
} }

View File

@@ -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())
);
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -1 +1,4 @@
rootProject.name = 'project-mirror' rootProject.name = 'project-mirror'
include('mirror-app')
include('mirror-web')

View File

@@ -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;
}
}

View File

@@ -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
View File

@@ -0,0 +1,7 @@
ext {
lombokVersion = '1.18.20'
okhttpVersion = '4.9.3'
pluginSpringBootVerson = '2.6.6'
pluginSpringBomVerson = '1.0.11.RELEASE'
}