possibility to remove artifacts generated by meviz index
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / FilesystemIndexer.java
index 9c8c877..d9726dd 100755 (executable)
@@ -9,18 +9,18 @@
 
 package eu.svjatoslav.meviz.htmlindexer;
 
-import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.FileReader;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 
 import org.apache.log4j.Logger;
 
 import eu.svjatoslav.commons.file.IOHelper;
-import eu.svjatoslav.meviz.htmlindexer.layouts.MixedLayout;
+import eu.svjatoslav.commons.network.UrlParamEncoder;
 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
 import eu.svjatoslav.meviz.htmlindexer.metadata.DirectoryMetadata;
 import eu.svjatoslav.meviz.htmlindexer.metadata.MetadadaHelper;
@@ -48,18 +48,19 @@ public class FilesystemIndexer extends AbstractIndexer {
 
        private DirectoryMetadata metadata;
 
-       private final IndexingOptions indexingOptions;
-
-       private final String[] pathElements;
+       private final List<String> pathElements;
 
        private HashSet<Layout> layouts;
 
+       private final CommandlineHandler commandlineHandler;
+
        public FilesystemIndexer(final File directoryToIndex,
-                       final IndexingOptions indexingOptions, final String[] pathElements)
-                       throws IOException, ImageFormatError {
+                       final CommandlineHandler commandlineHandler,
+                       final List<String> pathElements) throws IOException,
+                       ImageFormatError {
 
                this.directoryToIndex = directoryToIndex;
-               this.indexingOptions = indexingOptions;
+               this.commandlineHandler = commandlineHandler;
                this.pathElements = pathElements;
 
                if (!directoryToIndex.canRead())
@@ -88,33 +89,11 @@ public class FilesystemIndexer extends AbstractIndexer {
 
        public boolean canWriteIndexFile(final File indexFile)
                        throws FileNotFoundException, IOException {
-               boolean canWriteIndexFile = false;
-
-               if (indexFile.exists()) {
-                       // if file already exists, make sure that we can overwrite
-                       // it
-                       final FileReader fileReader = new FileReader(indexFile);
-                       final BufferedReader reader = new BufferedReader(fileReader);
-
-                       parseFile: {
-                               while (true) {
-                                       final String line = reader.readLine();
-
-                                       if (line == null)
-                                               break parseFile;
 
-                                       if (line.contains(Constants.HTML_MAGIC_STRING)) {
-                                               canWriteIndexFile = true;
-                                               break parseFile;
-                                       }
-                               }
-                       }
+               if (!indexFile.exists())
+                       return true;
 
-                       reader.close();
-                       fileReader.close();
-               } else
-                       canWriteIndexFile = true;
-               return canWriteIndexFile;
+               return Utils.isMevizGeneratedIndexFile(indexFile);
        }
 
        public void cleanupUnusedMetadataFiles() {
@@ -127,41 +106,46 @@ public class FilesystemIndexer extends AbstractIndexer {
 
        public void generateHtmlFromMetadata(final HashSet<Layout> layouts) {
                // Generate HTML from metadata
-               for (final Layout layout : layouts) {
-
-                       final String indexFilePath = directoryToIndex.getAbsolutePath()
-                                       + "/index" + layout.getFileNameSuffix() + ".html";
-
+               for (final Layout layout : layouts)
                        try {
+                               final File indexFile = Utils.getLayoutIndexFile(layout,
+                                               directoryToIndex);
 
-                               final File indexFile = new File(indexFilePath);
                                if (canWriteIndexFile(indexFile)) {
 
                                        indexForLayout(layout);
 
                                        IOHelper.overwriteFileIfContentDiffers(indexFile, layout
-                                                       .getHtml().getBytes());
+                                                       .getHtml(true, true).getBytes());
                                }
                        } catch (final Exception e) {
-                               logger.error("Error writing index file to:" + indexFilePath, e);
+                               logger.error("Error writing index file. ", e);
                        }
-               }
        }
 
-       public String[] getSubPath(final File file) {
+       public List<String> getChildPath(final File file) {
 
-               final String[] subPath = new String[pathElements.length + 1];
+               final List<String> result = new ArrayList<String>();
+               result.addAll(pathElements);
+               result.add(file.getName());
 
-               for (int i = 0; i < pathElements.length; i++)
-                       subPath[i] = pathElements[i];
+               return result;
+       }
 
-               subPath[pathElements.length] = file.getName();
-               return subPath;
+       @Override
+       public String getDirectoryUrl(final AbstractFile directory,
+                       final IndexingContext context) {
+               return directory.fileName + "/index.html";
        }
 
        @Override
-       public String getThumbnailPath(final Picture picture,
-                       final Dimension desiredDimension) {
+       public String getParentDirectoryUrl(final IndexingContext context) {
+               return "../index.html";
+       }
+
+       @Override
+       public String getThumbnailUrl(final Picture picture,
+                       final Dimension desiredDimension, final IndexingContext context) {
 
                // in case thumbnail size was equal to original, then return original
                // file path
@@ -183,7 +167,8 @@ public class FilesystemIndexer extends AbstractIndexer {
                        Picture.makeThumbnail(originalFile, thumbnailFile,
                                        desiredDimension.getAwtDimension());
                }
-               return Constants.THUMBNAILS_DIRECTORY_NAME + "/" + thumbnailFileName;
+               return Constants.THUMBNAILS_DIRECTORY_NAME + "/"
+                               + UrlParamEncoder.encode(thumbnailFileName);
        }
 
        public void indexForLayout(final Layout layout)
@@ -205,20 +190,20 @@ public class FilesystemIndexer extends AbstractIndexer {
        }
 
        public void initializeLayouts() {
-               layouts = new HashSet<Layout>();
-               layouts.add(new MixedLayout());
+
+               layouts = Utils.getLayouts();
+
+               final String galleryTitle = commandlineHandler.getGalleryTitle();
 
                for (final Layout layout : layouts)
-                       layout.init(indexingOptions.galleryTitle, pathElements, this);
+                       layout.init(galleryTitle, pathElements, this, new IndexingContext(
+                                       "", "."));
        }
 
        public void initializeThumbnailsDirectory() {
-               // initialize thumbnails directory
-               thumbnailsPath = directoryToIndex.getAbsolutePath() + "/"
-                               + Constants.THUMBNAILS_DIRECTORY_NAME + "/";
+               final File thumbnailsDirectory = Utils
+                               .getThumbnailsDirectory(directoryToIndex);
 
-               // ensure thumbnails directory exists
-               final File thumbnailsDirectory = new File(thumbnailsPath);
                if (!thumbnailsDirectory.exists())
                        thumbnailsDirectory.mkdirs();
        }
@@ -249,8 +234,8 @@ public class FilesystemIndexer extends AbstractIndexer {
                                metadata.ensureFileMetainfoIsUpToDate(directoryToIndex, file);
 
                                if (file.isDirectory())
-                                       new FilesystemIndexer(file, indexingOptions,
-                                                       getSubPath(file));
+                                       new FilesystemIndexer(file, commandlineHandler,
+                                                       getChildPath(file));
                        }
        }
 }