FEAT DirectoryBuilder
de.nclazz/java-commons/pipeline/head This commit looks good
Details
de.nclazz/java-commons/pipeline/head This commit looks good
Details
parent
db3d60a42b
commit
d955b03bb5
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue