TemporaryFolderImpl.java
package ch.powerunit.rules.impl;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import ch.powerunit.TestSuite;
import ch.powerunit.rules.TemporaryFolder;
public class TemporaryFolderImpl implements TemporaryFolder {
public TemporaryFolderImpl(InitialFolderEntry root) {
this.root = root;
}
private final InitialFolderEntry root;
private Path rootFolder;
@Override
public void before() {
try {
rootFolder = Files.createTempDirectory("powerunit");
if (root != null) {
addInitial(rootFolder, root);
}
} catch (IOException e) {
TestSuite.DSL.fail("Unable to create the rootFolder because of "
+ e.getMessage(), e);
}
}
private void addInitial(Path current, InitialFolderEntry init)
throws IOException {
for (InitialFileEntry f : init.getFiles()) {
Path p = Files.createFile(new File(current.toFile(), f.getName())
.toPath());
if (f.getData() != null) {
Files.write(p, f.getData());
}
}
for (InitialFolderEntry f : init.getFolders()) {
Path p = Files.createDirectories(new File(current.toFile(), f
.getName()).toPath());
addInitial(p, f);
}
}
@Override
public void after() {
if (rootFolder != null) {
recursiveDelete(rootFolder.toFile());
}
}
private void recursiveDelete(File file) {
File[] files = file.listFiles();
if (files != null) {
for (File each : files) {
recursiveDelete(each);
}
}
file.delete();
}
@Override
public Path newFile() throws IOException {
return Files.createTempFile(rootFolder, "tmp", ".tmp");
}
@Override
public Path newFile(String fileName) throws IOException {
return Files.createFile(new File(rootFolder.toFile(), fileName)
.toPath());
}
@Override
public Path newFile(String fileName, byte[] data) throws IOException {
Path p = newFile(fileName);
Files.write(p, data);
return p;
}
@Override
public Path newFolder() throws IOException {
return Files.createTempDirectory(rootFolder, "tmp");
}
@Override
public Path newFolder(String folderName) throws IOException {
return Files.createDirectory(new File(rootFolder.toFile(), folderName)
.toPath());
}
@Override
public Path getRootFolder() {
return rootFolder;
}
@Override
public InitialFolderEntry getInitial() {
return root;
}
public static class TemporaryFolderBuilderImpl implements
TemporaryFolderBuilder {
private final InitialFolderEntryImpl root = new InitialFolderEntryImpl(
null, null);
private InitialFolderEntryImpl current = root;
@Override
public TemporaryFolderBuilder file(String fileName) {
return file(fileName, null);
}
@Override
public TemporaryFolderBuilder file(String fileName, byte[] data) {
current.addFile(new InitialFileEntryImpl(fileName, data));
return this;
}
@Override
public TemporaryFolderBuilder folder(String folderName) {
InitialFolderEntryImpl n = new InitialFolderEntryImpl(current,
folderName);
current.addFolder(n);
current = n;
return this;
}
@Override
public TemporaryFolderBuilder end() {
current = current.getParent();
return this;
}
@Override
public TemporaryFolder build() {
return new TemporaryFolderImpl(root);
}
}
private static class InitialFolderEntryImpl implements InitialFolderEntry {
public InitialFolderEntryImpl(InitialFolderEntryImpl parent, String name) {
this.name = name;
this.parent = parent;
}
private final String name;
private final InitialFolderEntryImpl parent;
private final Collection<InitialFileEntry> files = new ArrayList<>();
private final Collection<InitialFolderEntry> folders = new ArrayList<>();
@Override
public String getName() {
return name;
}
@Override
public Collection<InitialFileEntry> getFiles() {
return Collections.unmodifiableCollection(files);
}
@Override
public Collection<InitialFolderEntry> getFolders() {
return Collections.unmodifiableCollection(folders);
}
public void addFile(InitialFileEntry file) {
files.add(file);
}
public void addFolder(InitialFolderEntry folder) {
folders.add(folder);
}
public InitialFolderEntryImpl getParent() {
return parent;
}
}
private static class InitialFileEntryImpl implements InitialFileEntry {
public InitialFileEntryImpl(String name, byte[] data) {
this.name = name;
this.data = data;
}
private final String name;
private final byte[] data;
@Override
public String getName() {
return name;
}
@Override
public byte[] getData() {
return data;
}
}
}