FEAT DirectoryBuilder
de.nclazz/java-commons/pipeline/head This commit looks good Details

pull/1/head
Niclas Thobaben 2020-12-01 02:38:43 +01:00
parent db3d60a42b
commit d955b03bb5
3 changed files with 152 additions and 2 deletions

View File

@ -0,0 +1,87 @@
package de.nclazz.commons.io;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import lombok.SneakyThrows;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DirectoryBuilder {
private static final Pattern PATH_REGEX = Pattern.compile("(?:(.*/[^/]+)/)?([a-zA-Z_\\-\\.]+$)");
@AllArgsConstructor
private static class FileExporter {
String path;
Consumer<Writer> fileWriter;
}
private final File directory;
private final List<FileExporter> exporters = new ArrayList<>();
protected DirectoryBuilder(File directory) {
this.directory = directory;
}
public DirectoryBuilder addFile(@NonNull String path, @NonNull Consumer<Writer> fileWriter) {
this.exporters.add(new FileExporter(path, fileWriter));
return this;
}
public File build() {
for(FileExporter exporter : this.exporters) {
File file = createFile(exporter.path);
FileUtils.writeFile(file, exporter.fileWriter);
}
return this.directory;
}
@SneakyThrows
private File createFile(String path) {
path = path.startsWith("/") ? path.substring(1) : path;
Matcher matcher = PATH_REGEX.matcher(path);
if(!matcher.matches()) {
throw new IllegalArgumentException(String.format("Invalid path '%s'!", path));
}
String dirs = matcher.group(1);
String filename = matcher.group(2);
File file = new File(mkdirs(dirs), filename);
file.createNewFile();
return file;
}
private File mkdirs(String dirs) {
if(dirs == null) return this.directory;
File dir = new File(this.directory, dirs);
dir.mkdirs();
return dir;
}
public static DirectoryBuilder create(@NonNull String path) {
return create(new File(path));
}
public static DirectoryBuilder create(@NonNull File directory) {
if(directory.exists() && !directory.isDirectory()) {
throw new IllegalArgumentException(String.format("File '%s' exists but is not a directory!",
directory.getAbsolutePath()));
}
if(!directory.exists()) {
directory.mkdirs();
}
DirectoryBuilder builder = new DirectoryBuilder(directory);
return builder;
}
}

View File

@ -4,10 +4,11 @@ import lombok.NonNull;
import lombok.SneakyThrows;
import java.io.File;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileAttribute;
import java.util.function.Consumer;
public abstract class FileUtils {
@ -81,4 +82,26 @@ public abstract class FileUtils {
}
}
/**
* Creates the specified file and passes a {@link FileWriter} to the
* {@code Consumer} to write the file content.
*
* @param file
* @param writerConsumer
* @return created File
*/
@SneakyThrows
public static File writeFile(File file, Consumer<Writer> writerConsumer) {
if(!file.exists()) file.createNewFile();
try(FileWriter writer = new FileWriter(file);) {
writerConsumer.accept(writer);
}catch(Exception e) {
throw e;
}
return file;
}
}

View File

@ -0,0 +1,40 @@
package de.nclazz.commons.io;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.Writer;
import java.util.function.Consumer;
import static org.junit.jupiter.api.Assertions.*;
public class DirectoryBuilderTests {
@Test
void testDirectoryBuilder() {
File dir = DirectoryBuilder.create("test-dir")
.addFile("hello.txt", write("Hello World!"))
.addFile("bye.txt", write("Bye World!"))
.addFile("files/data/subdirfile.txt", write("In subdir!"))
.build();
assertTrue(dir.exists());
assertTrue(dir.isDirectory());
assertTrue(new File(dir, "files/data/subdirfile.txt").exists());
FileUtils.deleteDirectoryRecursively(dir);
}
Consumer<Writer> write(String value) {
return writer -> {
try {
writer.append(value);
}catch(Exception e) {
}
};
}
}