TemporaryFolderImpl.java

  1. package ch.powerunit.rules.impl;

  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.nio.file.Files;
  5. import java.nio.file.Path;
  6. import java.util.ArrayList;
  7. import java.util.Collection;
  8. import java.util.Collections;

  9. import ch.powerunit.TestSuite;
  10. import ch.powerunit.rules.TemporaryFolder;

  11. public class TemporaryFolderImpl implements TemporaryFolder {

  12.     public TemporaryFolderImpl(InitialFolderEntry root) {
  13.         this.root = root;
  14.     }

  15.     private final InitialFolderEntry root;

  16.     private Path rootFolder;

  17.     @Override
  18.     public void before() {
  19.         try {
  20.             rootFolder = Files.createTempDirectory("powerunit");
  21.             if (root != null) {
  22.                 addInitial(rootFolder, root);
  23.             }
  24.         } catch (IOException e) {
  25.             TestSuite.DSL.fail("Unable to create the rootFolder because of "
  26.                     + e.getMessage(), e);
  27.         }
  28.     }

  29.     private void addInitial(Path current, InitialFolderEntry init)
  30.             throws IOException {
  31.         for (InitialFileEntry f : init.getFiles()) {
  32.             Path p = Files.createFile(new File(current.toFile(), f.getName())
  33.                     .toPath());
  34.             if (f.getData() != null) {
  35.                 Files.write(p, f.getData());
  36.             }
  37.         }
  38.         for (InitialFolderEntry f : init.getFolders()) {
  39.             Path p = Files.createDirectories(new File(current.toFile(), f
  40.                     .getName()).toPath());
  41.             addInitial(p, f);
  42.         }
  43.     }

  44.     @Override
  45.     public void after() {
  46.         if (rootFolder != null) {
  47.             recursiveDelete(rootFolder.toFile());
  48.         }
  49.     }

  50.     private void recursiveDelete(File file) {
  51.         File[] files = file.listFiles();
  52.         if (files != null) {
  53.             for (File each : files) {
  54.                 recursiveDelete(each);
  55.             }
  56.         }
  57.         file.delete();
  58.     }

  59.     @Override
  60.     public Path newFile() throws IOException {
  61.         return Files.createTempFile(rootFolder, "tmp", ".tmp");
  62.     }

  63.     @Override
  64.     public Path newFile(String fileName) throws IOException {
  65.         return Files.createFile(new File(rootFolder.toFile(), fileName)
  66.                 .toPath());
  67.     }

  68.     @Override
  69.     public Path newFile(String fileName, byte[] data) throws IOException {
  70.         Path p = newFile(fileName);
  71.         Files.write(p, data);
  72.         return p;
  73.     }

  74.     @Override
  75.     public Path newFolder() throws IOException {
  76.         return Files.createTempDirectory(rootFolder, "tmp");
  77.     }

  78.     @Override
  79.     public Path newFolder(String folderName) throws IOException {
  80.         return Files.createDirectory(new File(rootFolder.toFile(), folderName)
  81.                 .toPath());
  82.     }

  83.     @Override
  84.     public Path getRootFolder() {
  85.         return rootFolder;
  86.     }

  87.     @Override
  88.     public InitialFolderEntry getInitial() {
  89.         return root;
  90.     }

  91.     public static class TemporaryFolderBuilderImpl implements
  92.             TemporaryFolderBuilder {

  93.         private final InitialFolderEntryImpl root = new InitialFolderEntryImpl(
  94.                 null, null);

  95.         private InitialFolderEntryImpl current = root;

  96.         @Override
  97.         public TemporaryFolderBuilder file(String fileName) {
  98.             return file(fileName, null);
  99.         }

  100.         @Override
  101.         public TemporaryFolderBuilder file(String fileName, byte[] data) {
  102.             current.addFile(new InitialFileEntryImpl(fileName, data));
  103.             return this;
  104.         }

  105.         @Override
  106.         public TemporaryFolderBuilder folder(String folderName) {
  107.             InitialFolderEntryImpl n = new InitialFolderEntryImpl(current,
  108.                     folderName);
  109.             current.addFolder(n);
  110.             current = n;
  111.             return this;
  112.         }

  113.         @Override
  114.         public TemporaryFolderBuilder end() {
  115.             current = current.getParent();
  116.             return this;
  117.         }

  118.         @Override
  119.         public TemporaryFolder build() {
  120.             return new TemporaryFolderImpl(root);
  121.         }

  122.     }

  123.     private static class InitialFolderEntryImpl implements InitialFolderEntry {

  124.         public InitialFolderEntryImpl(InitialFolderEntryImpl parent, String name) {
  125.             this.name = name;
  126.             this.parent = parent;
  127.         }

  128.         private final String name;

  129.         private final InitialFolderEntryImpl parent;

  130.         private final Collection<InitialFileEntry> files = new ArrayList<>();

  131.         private final Collection<InitialFolderEntry> folders = new ArrayList<>();

  132.         @Override
  133.         public String getName() {
  134.             return name;
  135.         }

  136.         @Override
  137.         public Collection<InitialFileEntry> getFiles() {
  138.             return Collections.unmodifiableCollection(files);
  139.         }

  140.         @Override
  141.         public Collection<InitialFolderEntry> getFolders() {
  142.             return Collections.unmodifiableCollection(folders);
  143.         }

  144.         public void addFile(InitialFileEntry file) {
  145.             files.add(file);
  146.         }

  147.         public void addFolder(InitialFolderEntry folder) {
  148.             folders.add(folder);
  149.         }

  150.         public InitialFolderEntryImpl getParent() {
  151.             return parent;
  152.         }

  153.     }

  154.     private static class InitialFileEntryImpl implements InitialFileEntry {

  155.         public InitialFileEntryImpl(String name, byte[] data) {
  156.             this.name = name;
  157.             this.data = data;
  158.         }

  159.         private final String name;

  160.         private final byte[] data;

  161.         @Override
  162.         public String getName() {
  163.             return name;
  164.         }

  165.         @Override
  166.         public byte[] getData() {
  167.             return data;
  168.         }

  169.     }

  170. }