Introduce parameter object, consolidating directory locations

git-svn-id: https://svn.apache.org/repos/asf/creadur/tentacles/trunk@1462972 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/creadur/tentacles/Main.java b/src/main/java/org/apache/creadur/tentacles/Main.java
index afa6ffd..df1cd82 100644
--- a/src/main/java/org/apache/creadur/tentacles/Main.java
+++ b/src/main/java/org/apache/creadur/tentacles/Main.java
@@ -56,13 +56,10 @@
     private static final org.apache.log4j.Logger log = org.apache.log4j.Logger
             .getLogger(Main.class);
 
-    private final File localRootDirectory;
-    private final File output;
-    private final File repository;
-    private final File contentRootDirectory;
     private final Reports reports;
     private final Map<String, String> licenses;
 
+    private final Layout layout;
     private final Platform platform;
     private final Configuration configuration;
     private final FileSystem fileSystem;
@@ -76,38 +73,28 @@
 
     public Main(final Configuration configuration, final Platform platform)
             throws Exception {
-        this(configuration, platform, new Templates(platform));
+        this(configuration, platform, new Templates(platform), new Layout(
+                platform, configuration));
     }
 
     public Main(final Configuration configuration, final Platform platform,
-            final Templates templates) throws Exception {
+            final Templates templates, final Layout layout) throws Exception {
         this.platform = platform;
         this.configuration = configuration;
+        this.layout = layout;
         this.fileSystem = platform.getFileSystem();
         this.ioSystem = platform.getIoSystem();
         this.tentaclesResources = platform.getTentaclesResources();
         this.templates = templates;
 
-        this.localRootDirectory =
-                new File(this.configuration.getRootDirectoryForLocalOutput());
-
-        this.fileSystem.mkdirs(this.localRootDirectory);
-
-        this.repository = new File(this.localRootDirectory, "repo");
-        this.contentRootDirectory = new File(this.localRootDirectory, "content");
-        this.output = this.localRootDirectory;
-
-        this.fileSystem.mkdirs(this.repository);
-        this.fileSystem.mkdirs(this.contentRootDirectory);
+        this.reports = new Reports();
 
         log.info("Remote repository: "
                 + this.configuration.getStagingRepositoryURI());
-        log.info("Local root directory: " + this.localRootDirectory);
+        log.info("Local root directory: " + this.layout.getLocalRootDirectory());
 
-        this.reports = new Reports();
-
-        this.tentaclesResources.copyTo("legal/style.css", new File(this.output,
-                "style.css"));
+        this.tentaclesResources.copyTo("legal/style.css",
+                new File(this.layout.getOutputDirectory(), "style.css"));
 
         this.licenses = loadLicensesFrom(this.tentaclesResources);
     }
@@ -120,7 +107,7 @@
 
         unpackContents(mirrorRepositoryFrom(this.configuration));
 
-        reportOn(archivesIn(this.repository));
+        reportOn(archivesIn(this.layout.getRepositoryDirectory()));
     }
 
     private List<Archive> archivesIn(final File repository) {
@@ -129,17 +116,19 @@
         final List<Archive> archives = new ArrayList<Archive>();
         for (final File file : jars) {
             final Archive archive =
-                    new Archive(file, this.fileSystem, this.localRootDirectory,
-                            repository);
+                    new Archive(file, this.fileSystem, this.layout);
             archives.add(archive);
         }
         return archives;
     }
 
     private void reportOn(final List<Archive> archives) throws IOException {
-        this.templates.template("legal/archives.vm").add("archives", archives)
+        this.templates
+                .template("legal/archives.vm")
+                .add("archives", archives)
                 .add("reports", this.reports)
-                .write(new File(this.output, "archives.html"));
+                .write(new File(this.layout.getOutputDirectory(),
+                        "archives.html"));
 
         reportLicenses(archives);
         reportNotices(archives);
@@ -151,10 +140,12 @@
             throws IOException {
         initLicenses(archives);
 
-        this.templates.template("legal/licenses.vm")
+        this.templates
+                .template("legal/licenses.vm")
                 .add("licenses", getLicenses(archives))
                 .add("reports", this.reports)
-                .write(new File(this.output, "licenses.html"));
+                .write(new File(this.layout.getOutputDirectory(),
+                        "licenses.html"));
     }
 
     private void initLicenses(final List<Archive> archives) throws IOException {
@@ -200,7 +191,8 @@
                     .template("legal/archive-licenses.vm")
                     .add("archive", archive)
                     .add("reports", this.reports)
-                    .write(new File(this.output, this.reports.licenses(archive)));
+                    .write(new File(this.layout.getOutputDirectory(),
+                            this.reports.licenses(archive)));
         }
 
     }
@@ -276,7 +268,8 @@
                     .template("legal/archive-notices.vm")
                     .add("archive", archive)
                     .add("reports", this.reports)
-                    .write(new File(this.output, this.reports.notices(archive)));
+                    .write(new File(this.layout.getOutputDirectory(),
+                            this.reports.notices(archive)));
         }
     }
 
@@ -301,9 +294,12 @@
             }
         }
 
-        this.templates.template("legal/notices.vm")
-                .add("notices", notices.values()).add("reports", this.reports)
-                .write(new File(this.output, "notices.html"));
+        this.templates
+                .template("legal/notices.vm")
+                .add("notices", notices.values())
+                .add("reports", this.reports)
+                .write(new File(this.layout.getOutputDirectory(),
+                        "notices.html"));
     }
 
     private void unpackContents(final Set<File> files) throws IOException {
@@ -346,8 +342,7 @@
             final ZipInputStream zip = this.ioSystem.unzip(archive);
 
             final File contents =
-                    contents(new Archive(archive, this.fileSystem,
-                            this.localRootDirectory, this.repository));
+                    contents(new Archive(archive, this.fileSystem, this.layout));
 
             try {
                 ZipEntry entry = null;
@@ -524,7 +519,8 @@
         final File archiveDocument = archive.getFile();
         String path =
                 archiveDocument.getAbsolutePath().substring(
-                        this.localRootDirectory.getAbsolutePath().length() + 1);
+                        this.layout.getLocalRootDirectory().getAbsolutePath()
+                                .length() + 1);
 
         if (path.startsWith("repo/")) {
             path = path.substring("repo/".length());
@@ -533,7 +529,9 @@
             path = path.substring("content/".length());
         }
 
-        final File contents = new File(this.contentRootDirectory, path + ".contents");
+        final File contents =
+                new File(this.layout.getContentRootDirectory(), path
+                        + ".contents");
         this.fileSystem.mkdirs(contents);
         return contents;
     }
@@ -554,7 +552,7 @@
 
     public class Archive {
 
-        private final File localRootDirectory;
+        private final Layout layout;
         private final FileSystem fileSystem;
         private final URI uri;
         private final File file;
@@ -571,10 +569,12 @@
         private Map<URI, URI> others;
 
         public Archive(final File file, final FileSystem fileSystem,
-                final File localRootDirectory, final File repository) {
+                final Layout layout) {
             this.fileSystem = fileSystem;
-            this.localRootDirectory = localRootDirectory;
-            this.uri = repository.toURI().relativize(file.toURI());
+            this.layout = layout;
+            this.uri =
+                    layout.getRepositoryDirectory().toURI()
+                            .relativize(file.toURI());
             this.file = file;
             this.map = map();
         }
@@ -636,7 +636,7 @@
             for (final File file : legal) {
                 final URI name = jarContents.toURI().relativize(file.toURI());
                 final URI link =
-                        this.localRootDirectory.toURI()
+                        this.layout.getLocalRootDirectory().toURI()
                                 .relativize(file.toURI());
 
                 map.put(name, link);
@@ -663,7 +663,7 @@
                         .replace(
                                 this.configuration.getStagingRepositoryURI()
                                         .toString(), "").replaceFirst("^/", "");
-        return new File(this.repository, name);
+        return new File(this.layout.getRepositoryDirectory(), name);
     }
 
 }