2 * Meviz - Various tools collection to work with multimedia.
3 * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of version 2 of the GNU General Public License
7 * as published by the Free Software Foundation.
10 package eu.svjatoslav.meviz.htmlindexer;
13 import java.io.FileNotFoundException;
14 import java.io.IOException;
15 import java.util.ArrayList;
16 import java.util.HashSet;
17 import java.util.List;
19 import org.apache.log4j.Logger;
21 import eu.svjatoslav.commons.file.IOHelper;
22 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
23 import eu.svjatoslav.meviz.htmlindexer.metadata.DirectoryMetadata;
24 import eu.svjatoslav.meviz.htmlindexer.metadata.MetadadaHelper;
25 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.AbstractFile;
26 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture;
29 * Main class of HTML indexer.
32 public class FilesystemIndexer extends AbstractIndexer {
34 public static final Logger logger = Logger
35 .getLogger(FilesystemIndexer.class);
37 private final HashSet<String> validMetadataFiles = new HashSet<String>();
39 private final File directoryToIndex;
41 private File metadataFile;
43 private DirectoryMetadata metadata;
45 private final List<String> pathElements;
47 private HashSet<Layout> layouts;
49 private final CommandlineHandler commandlineHandler;
51 public FilesystemIndexer(final File directoryToIndex,
52 final CommandlineHandler commandlineHandler,
53 final List<String> pathElements) throws Exception {
55 this.directoryToIndex = directoryToIndex;
56 this.commandlineHandler = commandlineHandler;
57 this.pathElements = pathElements;
59 if (!directoryToIndex.canRead())
62 validMetadataFiles.add(Constants.METADATA_FILE_NAME);
64 initializeThumbnailsDirectory();
65 loadOrCreateMetadata();
71 metadata.removeUnusedMetadataEntries();
73 generateHtmlFromMetadata(layouts);
75 removeUnusedThumbnailFiles();
77 // save directory metadata
79 MetadadaHelper.saveDirectoryMetadata(metadataFile, metadata);
83 public boolean canWriteIndexFile(final File indexFile)
84 throws FileNotFoundException, IOException {
86 if (!indexFile.exists())
89 return Utils.isMevizGeneratedIndexFile(indexFile);
92 public void generateHtmlFromMetadata(final HashSet<Layout> layouts) {
93 // Generate HTML from metadata
94 for (final Layout layout : layouts)
96 final File indexFile = Utils.getLayoutIndexFile(layout,
99 if (canWriteIndexFile(indexFile)) {
101 compileHtml(layout, metadata);
103 IOHelper.overwriteFileIfContentDiffers(indexFile, layout
104 .getHtml(true, true, metadata).getBytes());
106 } catch (final Exception e) {
107 logger.error("Error writing index file. ", e);
111 public List<String> getChildPath(final File file) {
113 final List<String> result = new ArrayList<String>();
114 result.addAll(pathElements);
115 result.add(file.getName());
121 public String getDirectoryUrl(final AbstractFile directory,
122 final IndexingContext context) {
123 return directory.fileName + "/index.html";
127 public String getParentDirectoryUrl(final IndexingContext context) {
128 return "../index.html";
132 public String getThumbnailUrl(final Picture picture,
133 final Dimension desiredDimension, final IndexingContext context) {
135 // in case thumbnail size was equal to original, then return original
137 if (picture.getDimensions().equals(desiredDimension))
138 return picture.fileName;
140 final String thumbnailFileName = picture
141 .getRelativeThumbnailFileName(desiredDimension);
143 validMetadataFiles.add(thumbnailFileName);
144 final File thumbnailFile = new File(
145 Utils.getThumbnailsDirectoryPath(directoryToIndex)
146 + thumbnailFileName);
148 if (!thumbnailFile.exists()) {
150 final File originalFile = new File(
151 directoryToIndex.getAbsolutePath() + "/" + picture.fileName);
153 // generate new thumbnail
154 Picture.makeThumbnail(originalFile, thumbnailFile,
155 desiredDimension.getAwtDimension());
157 return Constants.THUMBNAILS_DIRECTORY_NAME + "/"
158 + Utils.urlEncode(thumbnailFileName);
161 public void initializeLayouts() {
163 layouts = Utils.getLayouts();
165 final String galleryTitle = commandlineHandler.getGalleryTitle();
167 for (final Layout layout : layouts)
168 layout.init(galleryTitle, pathElements, this, new IndexingContext(
172 public void initializeThumbnailsDirectory() {
173 final File thumbnailsDirectory = Utils
174 .getThumbnailsDirectory(directoryToIndex);
176 if (!thumbnailsDirectory.exists())
177 thumbnailsDirectory.mkdirs();
180 public void loadOrCreateMetadata() {
182 metadataFile = new File(
183 Utils.getThumbnailsDirectoryPath(directoryToIndex)
184 + Constants.METADATA_FILE_NAME);
186 metadata = MetadadaHelper.initDirectoryMetadata(metadataFile);
189 private void removeUnusedThumbnailFiles() {
191 for (final File file : Utils.getThumbnailsDirectory(directoryToIndex)
193 if (!validMetadataFiles.contains(file.getName()))
198 public void updateMetadata() throws Exception {
200 for (final File file : directoryToIndex.listFiles())
201 if (shallFileBeIndexed(file)) {
203 metadata.ensureFileMetainfoIsUpToDate(directoryToIndex, file);
205 if (file.isDirectory())
206 new FilesystemIndexer(file, commandlineHandler,