fixed links generation for local files
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / FilesystemIndexer.java
index 0edea71..51d3504 100755 (executable)
@@ -1,7 +1,7 @@
 /*
  * Meviz - Various tools collection to work with multimedia.
  * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
- * 
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of version 2 of the GNU General Public License
  * as published by the Free Software Foundation.
@@ -9,12 +9,9 @@
 
 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;
@@ -22,14 +19,10 @@ import java.util.List;
 import org.apache.log4j.Logger;
 
 import eu.svjatoslav.commons.file.IOHelper;
-import eu.svjatoslav.commons.network.UrlParamEncoder;
-import eu.svjatoslav.meviz.htmlindexer.layouts.MixedLayout;
 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
 import eu.svjatoslav.meviz.htmlindexer.metadata.DirectoryMetadata;
 import eu.svjatoslav.meviz.htmlindexer.metadata.MetadadaHelper;
 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.AbstractFile;
-import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.DirectoryFile;
-import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.GeneralFile;
 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture;
 
 /**
@@ -45,8 +38,6 @@ public class FilesystemIndexer extends AbstractIndexer {
 
        private final File directoryToIndex;
 
-       private String thumbnailsPath;
-
        private File metadataFile;
 
        private DirectoryMetadata metadata;
@@ -59,8 +50,7 @@ public class FilesystemIndexer extends AbstractIndexer {
 
        public FilesystemIndexer(final File directoryToIndex,
                        final CommandlineHandler commandlineHandler,
-                       final List<String> pathElements) throws IOException,
-                       ImageFormatError {
+                       final List<String> pathElements) throws Exception {
 
                this.directoryToIndex = directoryToIndex;
                this.commandlineHandler = commandlineHandler;
@@ -92,64 +82,30 @@ 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 (!indexFile.exists())
+                       return true;
 
-                                       if (line == null)
-                                               break parseFile;
-
-                                       if (line.contains(Constants.HTML_MAGIC_STRING)) {
-                                               canWriteIndexFile = true;
-                                               break parseFile;
-                                       }
-                               }
-                       }
-
-                       reader.close();
-                       fileReader.close();
-               } else
-                       canWriteIndexFile = true;
-               return canWriteIndexFile;
-       }
-
-       public void cleanupUnusedMetadataFiles() {
-               final File thumbnailsDirectory = new File(thumbnailsPath);
-
-               for (final File file : thumbnailsDirectory.listFiles())
-                       if (!validMetadataFiles.contains(file.getName()))
-                               file.delete();
+               return Utils.isMevizGeneratedIndexFile(indexFile);
        }
 
        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);
+                                       compileHtml(layout, metadata);
 
                                        IOHelper.overwriteFileIfContentDiffers(indexFile, layout
-                                                       .getHtml(true, true).getBytes());
+                                                       .getHtml(true, true, metadata).getBytes());
                                }
                        } catch (final Exception e) {
-                               logger.error("Error writing index file to:" + indexFilePath, e);
+                               logger.error("Error writing index file. ", e);
                        }
-               }
        }
 
        public List<String> getChildPath(final File file) {
@@ -164,7 +120,7 @@ public class FilesystemIndexer extends AbstractIndexer {
        @Override
        public String getDirectoryUrl(final AbstractFile directory,
                        final IndexingContext context) {
-               return directory.fileName + "/index.html";
+               return Utils.urlEncode(directory.fileName) + "/index.html";
        }
 
        @Override
@@ -185,7 +141,9 @@ public class FilesystemIndexer extends AbstractIndexer {
                                .getRelativeThumbnailFileName(desiredDimension);
 
                validMetadataFiles.add(thumbnailFileName);
-               final File thumbnailFile = new File(thumbnailsPath + thumbnailFileName);
+               final File thumbnailFile = new File(
+                               Utils.getThumbnailsDirectoryPath(directoryToIndex)
+                                               + thumbnailFileName);
 
                if (!thumbnailFile.exists()) {
 
@@ -197,30 +155,12 @@ public class FilesystemIndexer extends AbstractIndexer {
                                        desiredDimension.getAwtDimension());
                }
                return Constants.THUMBNAILS_DIRECTORY_NAME + "/"
-                               + UrlParamEncoder.encode(thumbnailFileName);
-       }
-
-       public void indexForLayout(final Layout layout)
-                       throws UnsupportedEncodingException {
-
-               for (final AbstractFile abstractFile : metadata.getFiles())
-                       if (abstractFile instanceof GeneralFile) {
-
-                               if (isOgv(abstractFile.getFileExtension()))
-                                       layout.enlistOgv(abstractFile);
-                               else
-                                       layout.enlistFile(abstractFile);
-
-                       } else if (abstractFile instanceof Picture)
-                               layout.enlistImage(abstractFile);
-                       else if (abstractFile instanceof DirectoryFile)
-                               layout.enlistDirectory(abstractFile);
-
+                               + Utils.urlEncode(thumbnailFileName);
        }
 
        public void initializeLayouts() {
-               layouts = new HashSet<Layout>();
-               layouts.add(new MixedLayout());
+
+               layouts = Utils.getLayouts();
 
                final String galleryTitle = commandlineHandler.getGalleryTitle();
 
@@ -230,37 +170,34 @@ public class FilesystemIndexer extends AbstractIndexer {
        }
 
        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();
        }
 
        public void loadOrCreateMetadata() {
-               metadataFile = new File(thumbnailsPath + Constants.METADATA_FILE_NAME);
+
+               metadataFile = new File(
+                               Utils.getThumbnailsDirectoryPath(directoryToIndex)
+                                               + Constants.METADATA_FILE_NAME);
 
                metadata = MetadadaHelper.initDirectoryMetadata(metadataFile);
        }
 
        private void removeUnusedThumbnailFiles() {
 
-               final File thumbnailsDirectory = new File(thumbnailsPath);
-
-               for (final File file : thumbnailsDirectory.listFiles())
+               for (final File file : Utils.getThumbnailsDirectory(directoryToIndex)
+                               .listFiles())
                        if (!validMetadataFiles.contains(file.getName()))
                                file.delete();
 
        }
 
-       public void updateMetadata() throws IOException, ImageFormatError {
-
-               final File[] directoryContent = directoryToIndex.listFiles();
+       public void updateMetadata() throws Exception {
 
-               for (final File file : directoryContent)
+               for (final File file : directoryToIndex.listFiles())
                        if (shallFileBeIndexed(file)) {
 
                                metadata.ensureFileMetainfoIsUpToDate(directoryToIndex, file);