Rename SourceCodeStructure to SourceStructure

This commit generalizes the main and test structure so that it can be
used for more use cases.
This commit is contained in:
Stephane Nicoll 2019-08-21 16:09:17 +02:00
parent 53a0484289
commit dbd1198996
13 changed files with 86 additions and 57 deletions

View File

@ -77,7 +77,7 @@ public class MainSourceCodeProjectContributor<T extends TypeDeclaration, C exten
customizeMainApplicationType(mainApplicationType);
customizeMainCompilationUnit(compilationUnit);
customizeMainSourceCode(sourceCode);
this.sourceWriter.writeTo(this.projectDescription.getBuildSystem().getMainDirectory(projectRoot,
this.sourceWriter.writeTo(this.projectDescription.getBuildSystem().getMainSource(projectRoot,
this.projectDescription.getLanguage()), sourceCode);
}

View File

@ -72,7 +72,7 @@ public class TestSourceCodeProjectContributor<T extends TypeDeclaration, C exten
T testApplicationType = compilationUnit.createTypeDeclaration(testName);
customizeTestApplicationType(testApplicationType);
customizeTestSourceCode(sourceCode);
this.sourceWriter.writeTo(this.projectDescription.getBuildSystem().getTestDirectory(projectRoot,
this.sourceWriter.writeTo(this.projectDescription.getBuildSystem().getTestSource(projectRoot,
this.projectDescription.getLanguage()), sourceCode);
}

View File

@ -20,7 +20,7 @@ import java.nio.file.Path;
import java.util.Objects;
import io.spring.initializr.generator.language.Language;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceStructure;
import org.springframework.core.io.support.SpringFactoriesLoader;
@ -46,12 +46,24 @@ public interface BuildSystem {
return null;
}
default SourceCodeStructure getMainDirectory(Path projectRoot, Language language) {
return new SourceCodeStructure(projectRoot.resolve("src/main/" + language.id()));
/**
* Returns a {@link SourceStructure} for main sources.
* @param projectRoot the root of the project structure
* @param language the language of the project
* @return a {@link SourceStructure} for main assets
*/
default SourceStructure getMainSource(Path projectRoot, Language language) {
return new SourceStructure(projectRoot.resolve("src/main/"), language.id());
}
default SourceCodeStructure getTestDirectory(Path projectRoot, Language language) {
return new SourceCodeStructure(projectRoot.resolve("src/test/" + language.id()));
/**
* Returns a {@link SourceStructure} for test sources.
* @param projectRoot the root of the project structure
* @param language the language of the project
* @return a {@link SourceStructure} for test assets
*/
default SourceStructure getTestSource(Path projectRoot, Language language) {
return new SourceStructure(projectRoot.resolve("src/test/"), language.id());
}
static BuildSystem forId(String id) {

View File

@ -28,11 +28,11 @@ public interface SourceCodeWriter<S extends SourceCode<?, ?>> {
/**
* Write, to the given {@code structure}, the given {@code sourceCode}.
* @param structure the {@link SourceCodeStructure} beneath which the source code is
* @param structure the {@link SourceStructure} beneath which the source code is
* written
* @param sourceCode the source code to write
* @throws IOException if writing fails
*/
void writeTo(SourceCodeStructure structure, S sourceCode) throws IOException;
void writeTo(SourceStructure structure, S sourceCode) throws IOException;
}

View File

@ -21,22 +21,38 @@ import java.nio.file.Files;
import java.nio.file.Path;
/**
* Provide dedicated method for directories that hold code.
* Provide dedicated method for directories that hold sources.
*
* @author Stephane Nicoll
*/
public class SourceCodeStructure {
public class SourceStructure {
private final Path rootDirectory;
public SourceCodeStructure(Path rootDirectory) {
private final Path sourcesDirectory;
public SourceStructure(Path rootDirectory, String sourcesDirectoryName) {
this.rootDirectory = rootDirectory;
this.sourcesDirectory = rootDirectory.resolve(sourcesDirectoryName);
}
/**
* Return the root {@link Path} of this structure. Can be used to access additional
* resources.
* @return the root directory
*/
public Path getRootDirectory() {
return this.rootDirectory;
}
/**
* Return the sources {@link Path} of this structure.
* @return the source code directory
*/
public Path getSourcesDirectory() {
return this.sourcesDirectory;
}
/**
* Resource a source file, creating its package structure if necessary.
* @param packageName the name of the package
@ -47,21 +63,22 @@ public class SourceCodeStructure {
* structure
*/
public Path resolveSourceFile(String packageName, String file) throws IOException {
return createPackage(packageName).resolve(file);
return createPackage(this.sourcesDirectory, packageName).resolve(file);
}
/**
* Create the specified package if necessary.
* @param srcDirectory the source directory for the package
* @param packageName the name of the package to create
* @return the directory where source code to this package should reside
* @return the directory where source for this package should reside
* @throws IOException if an error occurred while trying to create the directory
* structure
*/
public Path createPackage(String packageName) throws IOException {
if (!Files.exists(this.rootDirectory)) {
Files.createDirectories(this.rootDirectory);
protected Path createPackage(Path srcDirectory, String packageName) throws IOException {
if (!Files.exists(srcDirectory)) {
Files.createDirectories(srcDirectory);
}
Path directory = this.rootDirectory.resolve(packageName.replace('.', '/'));
Path directory = srcDirectory.resolve(packageName.replace('.', '/'));
Files.createDirectories(directory);
return directory;
}

View File

@ -40,8 +40,8 @@ import io.spring.initializr.generator.language.Annotatable;
import io.spring.initializr.generator.language.Annotation;
import io.spring.initializr.generator.language.Parameter;
import io.spring.initializr.generator.language.SourceCode;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceCodeWriter;
import io.spring.initializr.generator.language.SourceStructure;
/**
* A {@link SourceCodeWriter} that writes {@link SourceCode} in Groovy.
@ -88,13 +88,13 @@ public class GroovySourceCodeWriter implements SourceCodeWriter<GroovySourceCode
}
@Override
public void writeTo(SourceCodeStructure structure, GroovySourceCode sourceCode) throws IOException {
public void writeTo(SourceStructure structure, GroovySourceCode sourceCode) throws IOException {
for (GroovyCompilationUnit compilationUnit : sourceCode.getCompilationUnits()) {
writeTo(structure, compilationUnit);
}
}
private void writeTo(SourceCodeStructure structure, GroovyCompilationUnit compilationUnit) throws IOException {
private void writeTo(SourceStructure structure, GroovyCompilationUnit compilationUnit) throws IOException {
Path output = structure.resolveSourceFile(compilationUnit.getPackageName(),
compilationUnit.getName() + ".groovy");
try (IndentingWriter writer = this.indentingWriterFactory.createIndentingWriter("groovy",

View File

@ -40,8 +40,8 @@ import io.spring.initializr.generator.language.Annotatable;
import io.spring.initializr.generator.language.Annotation;
import io.spring.initializr.generator.language.Parameter;
import io.spring.initializr.generator.language.SourceCode;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceCodeWriter;
import io.spring.initializr.generator.language.SourceStructure;
/**
* A {@link SourceCodeWriter} that writes {@link SourceCode} in Java.
@ -89,13 +89,13 @@ public class JavaSourceCodeWriter implements SourceCodeWriter<JavaSourceCode> {
}
@Override
public void writeTo(SourceCodeStructure structure, JavaSourceCode sourceCode) throws IOException {
public void writeTo(SourceStructure structure, JavaSourceCode sourceCode) throws IOException {
for (JavaCompilationUnit compilationUnit : sourceCode.getCompilationUnits()) {
writeTo(structure, compilationUnit);
}
}
private void writeTo(SourceCodeStructure structure, JavaCompilationUnit compilationUnit) throws IOException {
private void writeTo(SourceStructure structure, JavaCompilationUnit compilationUnit) throws IOException {
Path output = structure.resolveSourceFile(compilationUnit.getPackageName(),
compilationUnit.getName() + ".java");
Files.createDirectories(output.getParent());

View File

@ -36,8 +36,8 @@ import io.spring.initializr.generator.language.Annotatable;
import io.spring.initializr.generator.language.Annotation;
import io.spring.initializr.generator.language.Parameter;
import io.spring.initializr.generator.language.SourceCode;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceCodeWriter;
import io.spring.initializr.generator.language.SourceStructure;
/**
* A {@link SourceCodeWriter} that writes {@link SourceCode} in Kotlin.
@ -54,13 +54,13 @@ public class KotlinSourceCodeWriter implements SourceCodeWriter<KotlinSourceCode
}
@Override
public void writeTo(SourceCodeStructure structure, KotlinSourceCode sourceCode) throws IOException {
public void writeTo(SourceStructure structure, KotlinSourceCode sourceCode) throws IOException {
for (KotlinCompilationUnit compilationUnit : sourceCode.getCompilationUnits()) {
writeTo(structure, compilationUnit);
}
}
private void writeTo(SourceCodeStructure structure, KotlinCompilationUnit compilationUnit) throws IOException {
private void writeTo(SourceStructure structure, KotlinCompilationUnit compilationUnit) throws IOException {
Path output = structure.resolveSourceFile(compilationUnit.getPackageName(), compilationUnit.getName() + ".kt");
Files.createDirectories(output.getParent());
try (IndentingWriter writer = this.indentingWriterFactory.createIndentingWriter("kotlin",

View File

@ -20,7 +20,7 @@ import java.nio.file.Path;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem;
import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceStructure;
import io.spring.initializr.generator.language.java.JavaLanguage;
import io.spring.initializr.generator.language.kotlin.KotlinLanguage;
import org.junit.jupiter.api.Test;
@ -54,16 +54,16 @@ class BuildSystemTests {
@Test
void defaultMainDirectory(@TempDir Path directory) {
SourceCodeStructure mainCodeStructure = BuildSystem.forId("gradle").getMainDirectory(directory,
new JavaLanguage());
assertThat(mainCodeStructure.getRootDirectory()).isEqualTo(directory.resolve("src/main/java"));
SourceStructure mainCodeStructure = BuildSystem.forId("gradle").getMainSource(directory, new JavaLanguage());
assertThat(mainCodeStructure.getRootDirectory()).isEqualTo(directory.resolve("src/main"));
assertThat(mainCodeStructure.getSourcesDirectory()).isEqualTo(directory.resolve("src/main/java"));
}
@Test
void defaultTestDirectory(@TempDir Path directory) {
SourceCodeStructure testCodeStructure = BuildSystem.forId("gradle").getTestDirectory(directory,
new KotlinLanguage());
assertThat(testCodeStructure.getRootDirectory()).isEqualTo(directory.resolve("src/test/kotlin"));
SourceStructure testCodeStructure = BuildSystem.forId("gradle").getTestSource(directory, new KotlinLanguage());
assertThat(testCodeStructure.getRootDirectory()).isEqualTo(directory.resolve("src/test"));
assertThat(testCodeStructure.getSourcesDirectory()).isEqualTo(directory.resolve("src/test/kotlin"));
}
@Test

View File

@ -26,15 +26,15 @@ import org.junit.jupiter.api.io.TempDir;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link SourceCodeStructure}.
* Tests for {@link SourceStructure}.
*
* @author Stephane Nicoll
*/
class SourceCodeStructureTests {
class SourceStructureTests {
@Test
void createPackage(@TempDir Path dir) throws IOException {
Path target = new SourceCodeStructure(dir).createPackage("com.example.test");
Path target = new SourceStructure(dir, "java").createPackage(dir, "com.example.test");
assertThat(target).exists().isDirectory().isEqualByComparingTo(dir.resolve("com/example/test"));
}
@ -43,28 +43,28 @@ class SourceCodeStructureTests {
Path target = dir.resolve("com/example");
Files.createDirectories(target);
assertThat(target).exists().isDirectory();
Path path = new SourceCodeStructure(dir).createPackage("com.example");
Path path = new SourceStructure(dir, "java").createPackage(dir, "com.example");
assertThat(path).isEqualByComparingTo(target);
}
@Test
void resolveSourceFile(@TempDir Path dir) throws IOException {
Path rootDir = dir.resolve("com/example");
Path rootDir = dir.resolve("src/main/java/com/example");
assertThat(rootDir).doesNotExist();
Path target = rootDir.resolve("Test.java");
Path path = new SourceCodeStructure(dir).resolveSourceFile("com.example", "Test.java");
Path path = new SourceStructure(dir, "src/main/java").resolveSourceFile("com.example", "Test.java");
assertThat(path).doesNotExist().isEqualByComparingTo(target);
assertThat(rootDir).exists().isDirectory();
}
@Test
void resolveSourceFileWithExistingPackage(@TempDir Path dir) throws IOException {
Path rootDir = dir.resolve("com/example");
Path rootDir = dir.resolve("src/main/java/com/example");
Files.createDirectories(rootDir);
assertThat(rootDir).exists().isDirectory();
Path target = rootDir.resolve("Test.java");
assertThat(target).doesNotExist();
Path path = new SourceCodeStructure(dir).resolveSourceFile("com.example", "Test.java");
Path path = new SourceStructure(dir, "src/main/java").resolveSourceFile("com.example", "Test.java");
assertThat(path).doesNotExist().isEqualByComparingTo(target);
}

View File

@ -18,15 +18,15 @@ package io.spring.initializr.generator.language.groovy;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.UUID;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.language.Annotation;
import io.spring.initializr.generator.language.Parameter;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceStructure;
import io.spring.initializr.generator.test.io.TextTestUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@ -277,9 +277,9 @@ class GroovySourceCodeWriterTests {
}
private Path writeSourceCode(GroovySourceCode sourceCode) throws IOException {
Path projectDirectory = Files.createTempDirectory(this.directory, "project-");
this.writer.writeTo(new SourceCodeStructure(projectDirectory), sourceCode);
return projectDirectory;
SourceStructure sourceStructure = new SourceStructure(this.directory, UUID.randomUUID().toString());
this.writer.writeTo(sourceStructure, sourceCode);
return sourceStructure.getSourcesDirectory();
}
}

View File

@ -18,15 +18,15 @@ package io.spring.initializr.generator.language.java;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.UUID;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.language.Annotation;
import io.spring.initializr.generator.language.Parameter;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceStructure;
import io.spring.initializr.generator.test.io.TextTestUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@ -278,9 +278,9 @@ class JavaSourceCodeWriterTests {
}
private Path writeSourceCode(JavaSourceCode sourceCode) throws IOException {
Path projectDirectory = Files.createTempDirectory(this.directory, "project-");
this.writer.writeTo(new SourceCodeStructure(projectDirectory), sourceCode);
return projectDirectory;
SourceStructure sourceStructure = new SourceStructure(this.directory, UUID.randomUUID().toString());
this.writer.writeTo(sourceStructure, sourceCode);
return sourceStructure.getSourcesDirectory();
}
}

View File

@ -17,15 +17,15 @@
package io.spring.initializr.generator.language.kotlin;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.UUID;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.language.Annotation;
import io.spring.initializr.generator.language.Parameter;
import io.spring.initializr.generator.language.SourceCodeStructure;
import io.spring.initializr.generator.language.SourceStructure;
import io.spring.initializr.generator.test.io.TextTestUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@ -335,9 +335,9 @@ class KotlinSourceCodeWriterTests {
}
private Path writeSourceCode(KotlinSourceCode sourceCode) throws IOException {
Path projectDirectory = Files.createTempDirectory(this.directory, "project-");
this.writer.writeTo(new SourceCodeStructure(projectDirectory), sourceCode);
return projectDirectory;
SourceStructure sourceStructure = new SourceStructure(this.directory, UUID.randomUUID().toString());
this.writer.writeTo(sourceStructure, sourceCode);
return sourceStructure.getSourcesDirectory();
}
}