2 * Meviz - Various tools collection to work with multimedia.
3 * Copyright (C) 2012 -- 2019, 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 3 of the GNU Lesser General Public License
7 * or later as published by the Free Software Foundation.
10 package eu.svjatoslav.meviz.htmlindexer.indexer;
12 import eu.svjatoslav.commons.file.IOHelper;
13 import eu.svjatoslav.meviz.htmlindexer.*;
14 import eu.svjatoslav.meviz.htmlindexer.layouts.Layout;
15 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
16 import eu.svjatoslav.meviz.htmlindexer.metadata.DirectoryMetadata;
17 import eu.svjatoslav.meviz.htmlindexer.metadata.MetadadaHelper;
18 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.AbstractFile;
19 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture;
20 import org.apache.log4j.Logger;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.HashSet;
26 import java.util.List;
29 * Main class of HTML indexer.
32 public class FilesystemIndexer extends AbstractIndexer {
34 private static final Logger logger = Logger
35 .getLogger(FilesystemIndexer.class);
37 private final HashSet<String> validMetadataFiles = new HashSet<>();
39 private final File directoryToIndex;
40 private final List<String> pathElements;
41 private final CommandlineHandler commandlineHandler;
42 private File metadataFile;
43 private DirectoryMetadata metadata;
44 private HashSet<Layout> layouts;
46 public FilesystemIndexer(final File directoryToIndex,
47 final CommandlineHandler commandlineHandler,
48 final List<String> pathElements) throws Exception {
50 this.directoryToIndex = directoryToIndex;
51 this.commandlineHandler = commandlineHandler;
52 this.pathElements = pathElements;
54 if (!directoryToIndex.canRead())
57 validMetadataFiles.add(Constants.METADATA_FILE_NAME);
59 initializeThumbnailsDirectory();
60 loadOrCreateMetadata();
66 metadata.removeUnusedMetadataEntries();
68 generateHtmlFromMetadata(layouts);
70 removeUnusedThumbnailFiles();
72 // save directory metadata
74 MetadadaHelper.saveDirectoryMetadata(metadataFile, metadata);
78 private boolean canWriteIndexFile(final File indexFile)
81 return !indexFile.exists() || Utils.isMevizGeneratedIndexFile(indexFile);
85 private void generateHtmlFromMetadata(final HashSet<Layout> layouts) {
86 // Generate HTML from metadata
87 for (final Layout layout : layouts)
89 final File indexFile = Utils.getLayoutIndexFile(layout,
92 if (canWriteIndexFile(indexFile)) {
94 compileHtml(layout, metadata);
96 IOHelper.overwriteFileIfContentDiffers(indexFile, layout
97 .getHtml(true, true, metadata).getBytes());
99 } catch (final Exception e) {
100 logger.error("Error writing index file. ", e);
104 private List<String> getChildPath(final File file) {
106 final List<String> result = new ArrayList<>();
107 result.addAll(pathElements);
108 result.add(file.getName());
114 public String getDirectoryUrl(final AbstractFile directory,
115 final IndexingContext context) {
116 return Utils.urlEncode(directory.fileName) + "/index.html";
120 public String getParentDirectoryUrl(final IndexingContext context) {
121 return "../index.html";
125 public String getThumbnailUrl(final Picture picture,
126 final Dimension desiredDimension, final IndexingContext context) {
128 // in case thumbnail size was equal to original, then return original
130 if (picture.getDimensions().equals(desiredDimension))
131 return picture.fileName;
133 final String thumbnailFileName = picture
134 .getRelativeThumbnailFileName(desiredDimension);
136 validMetadataFiles.add(thumbnailFileName);
137 final File thumbnailFile = new File(
138 Utils.getThumbnailsDirectoryPath(directoryToIndex)
139 + thumbnailFileName);
141 if (!thumbnailFile.exists()) {
143 final File originalFile = new File(
144 directoryToIndex.getAbsolutePath() + "/" + picture.fileName);
146 // generate new thumbnail
147 Picture.makeThumbnail(originalFile, thumbnailFile,
148 desiredDimension.getAwtDimension());
150 return Constants.THUMBNAILS_DIRECTORY_NAME + "/"
151 + Utils.urlEncode(thumbnailFileName);
154 private void initializeLayouts() {
156 layouts = Utils.getLayouts();
158 final String galleryTitle = commandlineHandler.getGalleryTitle();
160 for (final Layout layout : layouts)
161 layout.init(galleryTitle, pathElements, this, new IndexingContext(
165 private void initializeThumbnailsDirectory() {
166 final File thumbnailsDirectory = Utils
167 .getThumbnailsDirectory(directoryToIndex);
169 if (!thumbnailsDirectory.exists())
170 thumbnailsDirectory.mkdirs();
173 private void loadOrCreateMetadata() {
175 metadataFile = new File(
176 Utils.getThumbnailsDirectoryPath(directoryToIndex)
177 + Constants.METADATA_FILE_NAME);
179 metadata = MetadadaHelper.initDirectoryMetadata(metadataFile);
182 private void removeUnusedThumbnailFiles() {
184 for (final File file : Utils.getThumbnailsDirectory(directoryToIndex)
186 if (!validMetadataFiles.contains(file.getName()))
191 private void updateMetadata() throws Exception {
193 for (final File file : directoryToIndex.listFiles())
194 if (shallFileBeIndexed(file)) {
196 metadata.ensureFileMetadataIsUpToDate(directoryToIndex, file);
198 if (file.isDirectory())
199 new FilesystemIndexer(file, commandlineHandler,