From 121ca09ae8ff9865beeefd0423152a4a67d9fead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Link?= Date: Wed, 28 Aug 2024 14:46:19 +0200 Subject: [PATCH] Added DirectoryBuilder and renamed FileContent to FileBuilder. --- modules/lis-gradle-project-builder/README.md | 4 +- .../parentFolder/file.txt | 1 + .../builder/AbstractProjectBuilder.java | 21 ++---- .../project/builder/DirectoryBuilder.java | 65 +++++++++++++++++++ .../builder/DirectoryBuilderFactory.java | 9 +++ .../{FileContent.java => FileBuilder.java} | 11 +++- .../project/builder/FileBuilderFactory.java | 9 +++ .../project/builder/GradleProjectBuilder.java | 24 +++---- ...ontent.java => PropertiesFileBuilder.java} | 5 +- .../project/builder/DirectoryBuilderTest.java | 22 +++++++ ...eContentTest.java => FileBuilderTest.java} | 29 +++++---- ...st.java => PropertiesFileBuilderTest.java} | 4 +- 12 files changed, 152 insertions(+), 52 deletions(-) create mode 100644 modules/lis-gradle-project-builder/parentFolder/file.txt create mode 100644 modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilder.java create mode 100644 modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderFactory.java rename modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/{FileContent.java => FileBuilder.java} (86%) create mode 100644 modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileBuilderFactory.java rename modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/{PropertiesFileContent.java => PropertiesFileBuilder.java} (65%) create mode 100644 modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderTest.java rename modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/{FileContentTest.java => FileBuilderTest.java} (57%) rename modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/{PropertiesFileContentTest.java => PropertiesFileBuilderTest.java} (87%) diff --git a/modules/lis-gradle-project-builder/README.md b/modules/lis-gradle-project-builder/README.md index c5c50dc..ea1442d 100644 --- a/modules/lis-gradle-project-builder/README.md +++ b/modules/lis-gradle-project-builder/README.md @@ -31,8 +31,8 @@ Once you created a GradleProjectBuilder you can write content to the build and settings files using the convenience methods. ```java -FileContent fileContent = projectBuilder.buildFile(); -fileContent.append(printWriter -> { +FileContent fileBuilder = projectBuilder.buildFile(); +fileBuilder.append(printWriter -> { printWriter.println("plugins {"); printWriter.println(" `java-library`"); printWriter.println("}"); diff --git a/modules/lis-gradle-project-builder/parentFolder/file.txt b/modules/lis-gradle-project-builder/parentFolder/file.txt new file mode 100644 index 0000000..5ab2f8a --- /dev/null +++ b/modules/lis-gradle-project-builder/parentFolder/file.txt @@ -0,0 +1 @@ +Hello \ No newline at end of file diff --git a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/AbstractProjectBuilder.java b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/AbstractProjectBuilder.java index 2c6efd5..28705c6 100644 --- a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/AbstractProjectBuilder.java +++ b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/AbstractProjectBuilder.java @@ -6,33 +6,26 @@ import static java.util.Objects.requireNonNull; -public class AbstractProjectBuilder { - private final Path projectRootDir; +public class AbstractProjectBuilder extends DirectoryBuilder { private final ScriptLanguage scriptLanguage; - private final Path buildFile; + private final FileBuilder buildFile; public AbstractProjectBuilder(Path projectRootDir, ScriptLanguage scriptLanguage) throws IOException { - this.projectRootDir = requireNonNull(projectRootDir); + super(projectRootDir); this.scriptLanguage = requireNonNull(scriptLanguage); - buildFile = this.projectRootDir.resolve(scriptLanguage.buildFileName()); - - if (!Files.isDirectory(projectRootDir)) { - Files.createDirectories(this.projectRootDir); - } - - Files.createFile(buildFile); + buildFile = file(scriptLanguage.buildFileName()); } protected Path getProjectRootDir() { - return projectRootDir; + return getPath(); } public ScriptLanguage getScriptLanguage() { return scriptLanguage; } - public FileContent buildFile() { - return new FileContent(buildFile); + public FileBuilder buildFile() { + return buildFile; } } diff --git a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilder.java b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilder.java new file mode 100644 index 0000000..299733c --- /dev/null +++ b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilder.java @@ -0,0 +1,65 @@ +package com.link_intersystems.gradle.project.builder; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static java.util.Objects.requireNonNull; + +public class DirectoryBuilder { + + private Path directory; + + public DirectoryBuilder(Path directory) throws IOException { + if (!Files.exists(directory)) { + Files.createDirectories(directory); + } + this.directory = requireNonNull(directory); + } + + public Path getPath() { + return directory; + } + + public DirectoryBuilder directory(String relativePath) throws IOException { + return directory(Paths.get(relativePath), DirectoryBuilder::new); + } + + + public T directory(String relativePath, DirectoryBuilderFactory directoryBuilderFactory) throws IOException { + return directory(Paths.get(relativePath), directoryBuilderFactory); + } + + public DirectoryBuilder directory(Path relativePath) throws IOException { + return directory(relativePath, DirectoryBuilder::new); + } + + public T directory(Path relativePath, DirectoryBuilderFactory directoryBuilderFactory) throws IOException { + Path nextDirectoryPath = relativePath.subpath(0, 1); + return directoryBuilderFactory.create(directory.resolve(nextDirectoryPath)); + } + + public FileBuilder file(String relativeFilePath) throws IOException { + return file(relativeFilePath, FileBuilder::new); + } + + public T file(String relativeFilePath, FileBuilderFactory fileBuilderFactory) throws IOException { + return file(Paths.get(relativeFilePath), fileBuilderFactory); + } + + public FileBuilder file(Path relativeFilePath) throws IOException { + return file(relativeFilePath, FileBuilder::new); + } + + public T file(Path relativeFilePath, FileBuilderFactory fileBuilderFactory) throws IOException { + int nameCount = relativeFilePath.getNameCount(); + if (nameCount == 1) { + return fileBuilderFactory.create(directory.resolve(relativeFilePath)); + } + + DirectoryBuilder parentDirectory = directory(relativeFilePath.getParent()); + return parentDirectory.file(relativeFilePath.subpath(1, relativeFilePath.getNameCount()), fileBuilderFactory); + } + +} diff --git a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderFactory.java b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderFactory.java new file mode 100644 index 0000000..f201939 --- /dev/null +++ b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderFactory.java @@ -0,0 +1,9 @@ +package com.link_intersystems.gradle.project.builder; + +import java.io.IOException; +import java.nio.file.Path; + +public interface DirectoryBuilderFactory { + + public T create(Path path) throws IOException; +} diff --git a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileContent.java b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileBuilder.java similarity index 86% rename from modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileContent.java rename to modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileBuilder.java index 6e6bd05..f0e85ea 100644 --- a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileContent.java +++ b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileBuilder.java @@ -12,14 +12,21 @@ import static java.nio.file.StandardOpenOption.CREATE; import static java.util.Objects.requireNonNull; -public class FileContent { +public class FileBuilder { private final Path filepath; - public FileContent(Path filepath) { + public FileBuilder(Path filepath) throws IOException { + if (!Files.exists(filepath)) { + Files.createFile(filepath); + } this.filepath = requireNonNull(filepath); } + public Path getPath() { + return filepath; + } + public void append(String contentToAppend) { append(appender -> { appender.append(contentToAppend); diff --git a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileBuilderFactory.java b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileBuilderFactory.java new file mode 100644 index 0000000..7a8f12e --- /dev/null +++ b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/FileBuilderFactory.java @@ -0,0 +1,9 @@ +package com.link_intersystems.gradle.project.builder; + +import java.io.IOException; +import java.nio.file.Path; + +public interface FileBuilderFactory { + + public T create(Path path) throws IOException; +} diff --git a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/GradleProjectBuilder.java b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/GradleProjectBuilder.java index ce50cf6..deceb84 100644 --- a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/GradleProjectBuilder.java +++ b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/GradleProjectBuilder.java @@ -8,9 +8,9 @@ public class GradleProjectBuilder extends AbstractProjectBuilder { - private final Path settingsFile; + private final FileBuilder settingsFile; - private final Path propertiesFile; + private final PropertiesFileBuilder propertiesFile; public static GradleProjectBuilder rootProject(Path projectRoot) throws IOException { return rootProject(projectRoot, ScriptLanguage.KTS); @@ -25,10 +25,8 @@ public static GradleProjectBuilder rootProject(Path projectRoot, ScriptLanguage public GradleProjectBuilder(Path projectRoot, ScriptLanguage scriptLanguage) throws IOException { super(projectRoot, scriptLanguage); - settingsFile = projectRoot.resolve(scriptLanguage.settingsFileName()); - Files.createFile(settingsFile); - - propertiesFile = projectRoot.resolve("gradle.properties"); + settingsFile = file(scriptLanguage.settingsFileName()); + propertiesFile = file("gradle.properties", PropertiesFileBuilder::new); this.projectRoot = requireNonNull(projectRoot); } @@ -50,18 +48,12 @@ public GradleSubprojectBuilder createSubproject(String path, ScriptLanguage scri return new GradleSubprojectBuilder(getProjectRootDir().resolve(path), scriptLanguage); } - public FileContent settingsFile() { - return new FileContent(settingsFile); - } - - public PropertiesFileContent gradleProperties() { - return new PropertiesFileContent(propertiesFile); + public FileBuilder settingsFile() { + return settingsFile; } - public FileContent file(String path) throws IOException { - Path filepath = projectRoot.resolve(path); - Files.createDirectories(filepath.getParent()); - return new FileContent(filepath); + public PropertiesFileBuilder gradleProperties() { + return propertiesFile; } } diff --git a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/PropertiesFileContent.java b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/PropertiesFileBuilder.java similarity index 65% rename from modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/PropertiesFileContent.java rename to modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/PropertiesFileBuilder.java index 9eb1a09..9b18fba 100644 --- a/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/PropertiesFileContent.java +++ b/modules/lis-gradle-project-builder/src/main/java/com/link_intersystems/gradle/project/builder/PropertiesFileBuilder.java @@ -1,11 +1,12 @@ package com.link_intersystems.gradle.project.builder; +import java.io.IOException; import java.nio.file.Path; import java.util.Properties; -public class PropertiesFileContent extends FileContent { +public class PropertiesFileBuilder extends FileBuilder { - public PropertiesFileContent(Path filepath) { + public PropertiesFileBuilder(Path filepath) throws IOException { super(filepath); } diff --git a/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderTest.java b/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderTest.java new file mode 100644 index 0000000..6473ecd --- /dev/null +++ b/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/DirectoryBuilderTest.java @@ -0,0 +1,22 @@ +package com.link_intersystems.gradle.project.builder; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.IOException; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThat; + +class DirectoryBuilderTest { + + @Test + void build(@TempDir Path tempDir) throws IOException { + DirectoryBuilder directoryBuilder = new DirectoryBuilder(tempDir); + + FileBuilder fileBuilder = directoryBuilder.file("rootFolder/parentFolder/file.txt"); + fileBuilder.append("Hello"); + + assertThat(tempDir.resolve("rootFolder/parentFolder/file.txt")).hasContent("Hello"); + } +} \ No newline at end of file diff --git a/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/FileContentTest.java b/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/FileBuilderTest.java similarity index 57% rename from modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/FileContentTest.java rename to modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/FileBuilderTest.java index 2bfcfdd..439ee45 100644 --- a/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/FileContentTest.java +++ b/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/FileBuilderTest.java @@ -3,30 +3,31 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import java.io.IOException; import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; -class FileContentTest { +class FileBuilderTest { @Test - void append(@TempDir Path tempPath) { + void append(@TempDir Path tempPath) throws IOException { Path testFile = tempPath.resolve("test.txt"); - FileContent fileContent = new FileContent(testFile); + FileBuilder fileBuilder = new FileBuilder(testFile); - fileContent.append("Hello"); - fileContent.append(" World"); + fileBuilder.append("Hello"); + fileBuilder.append(" World"); assertThat(testFile).hasContent("Hello World"); } @Test - void appendWithAppendable(@TempDir Path tempPath) { + void appendWithAppendable(@TempDir Path tempPath) throws IOException { Path testFile = tempPath.resolve("test.txt"); - FileContent fileContent = new FileContent(testFile); + FileBuilder fileBuilder = new FileBuilder(testFile); - fileContent.append(appendable -> { + fileBuilder.append(appendable -> { appendable.append("Hello World", 0, 5); }); @@ -34,23 +35,23 @@ void appendWithAppendable(@TempDir Path tempPath) { } @Test - void appendFromResource(@TempDir Path tempPath) { + void appendFromResource(@TempDir Path tempPath) throws IOException { Path testFile = tempPath.resolve("test.txt"); - FileContent fileContent = new FileContent(testFile); + FileBuilder fileBuilder = new FileBuilder(testFile); - fileContent.append(getClass().getResource("test.txt")); + fileBuilder.append(getClass().getResource("test.txt")); assertThat(testFile).hasContent("Hello World"); } @Test - void print(@TempDir Path tempPath) { + void print(@TempDir Path tempPath) throws IOException { Path testFile = tempPath.resolve("test.txt"); - FileContent fileContent = new FileContent(testFile); + FileBuilder fileBuilder = new FileBuilder(testFile); - fileContent.append(printWriter -> { + fileBuilder.append(printWriter -> { printWriter.println("plugins {"); printWriter.println("\t`java-library`"); printWriter.println("}"); diff --git a/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/PropertiesFileContentTest.java b/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/PropertiesFileBuilderTest.java similarity index 87% rename from modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/PropertiesFileContentTest.java rename to modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/PropertiesFileBuilderTest.java index e24bee4..a306e42 100644 --- a/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/PropertiesFileContentTest.java +++ b/modules/lis-gradle-project-builder/src/test/java/com/link_intersystems/gradle/project/builder/PropertiesFileBuilderTest.java @@ -10,7 +10,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class PropertiesFileContentTest { +class PropertiesFileBuilderTest { @Test void writeProperties(@TempDir Path tempDir) throws IOException { @@ -19,7 +19,7 @@ void writeProperties(@TempDir Path tempDir) throws IOException { properties.setProperty("bar", "foo"); Path propertiesFilepath = tempDir.resolve("test.properties"); - PropertiesFileContent propertiesContent = new PropertiesFileContent(propertiesFilepath); + PropertiesFileBuilder propertiesContent = new PropertiesFileBuilder(propertiesFilepath); propertiesContent.append(properties); Properties readProperties = new Properties();