Had fight with maven. It decided to block HTTP repositories.
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / indexer / FilesystemIndexer.java
1 /*
2  * Meviz - Various tools collection to work with multimedia. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5
6
7 package eu.svjatoslav.meviz.htmlindexer.indexer;
8
9 import eu.svjatoslav.meviz.htmlindexer.CommandlineHandler;
10 import eu.svjatoslav.meviz.htmlindexer.Constants;
11 import eu.svjatoslav.meviz.htmlindexer.IndexingContext;
12 import eu.svjatoslav.meviz.htmlindexer.Utils;
13 import eu.svjatoslav.meviz.htmlindexer.layouts.Layout;
14 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
15 import eu.svjatoslav.meviz.htmlindexer.metadata.DirectoryMetadata;
16 import eu.svjatoslav.meviz.htmlindexer.metadata.MetadadaHelper;
17 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.AbstractFile;
18 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture;
19 import org.apache.log4j.Logger;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.HashSet;
25 import java.util.List;
26
27 import static eu.svjatoslav.commons.file.IOHelper.overwriteFileIfContentDiffers;
28 import static eu.svjatoslav.meviz.htmlindexer.Constants.THUMBNAILS_DIRECTORY_NAME;
29 import static eu.svjatoslav.meviz.htmlindexer.Utils.getThumbnailsDirectoryPath;
30 import static eu.svjatoslav.meviz.htmlindexer.Utils.urlEncode;
31 import static eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture.makeThumbnail;
32
33 /**
34  * Main class of HTML indexer.
35  */
36
37 public class FilesystemIndexer extends AbstractIndexer {
38
39     private static final Logger logger = Logger
40             .getLogger(FilesystemIndexer.class);
41
42     private final HashSet<String> validMetadataFiles = new HashSet<>();
43
44     private final File directoryToIndex;
45     private final List<String> pathElements;
46     private final CommandlineHandler commandlineHandler;
47     private File metadataFile;
48     private DirectoryMetadata metadata;
49     private HashSet<Layout> layouts;
50
51     public FilesystemIndexer(final File directoryToIndex,
52                              final CommandlineHandler commandlineHandler,
53                              final List<String> pathElements) throws Exception {
54
55         this.directoryToIndex = directoryToIndex;
56         this.commandlineHandler = commandlineHandler;
57         this.pathElements = pathElements;
58
59         if (!directoryToIndex.canRead())
60             return;
61
62         validMetadataFiles.add(Constants.METADATA_FILE_NAME);
63
64         initializeThumbnailsDirectory();
65         loadOrCreateMetadata();
66
67         initializeLayouts();
68
69         updateMetadata();
70
71         metadata.removeUnusedMetadataEntries();
72
73         generateHtmlFromMetadata(layouts);
74
75         removeUnusedThumbnailFiles();
76
77         // save directory metadata
78         if (metadata.changed)
79             MetadadaHelper.saveDirectoryMetadata(metadataFile, metadata);
80
81     }
82
83     private boolean canWriteIndexFile(final File indexFile)
84             throws IOException {
85
86         return !indexFile.exists() || Utils.isMevizGeneratedIndexFile(indexFile);
87
88     }
89
90     private void generateHtmlFromMetadata(final HashSet<Layout> layouts) {
91         for (final Layout layout : layouts)
92             try {
93                 final File indexFile = Utils.getLayoutIndexFile(layout,
94                         directoryToIndex);
95
96                 if (canWriteIndexFile(indexFile)) {
97
98                     compileHtml(layout, metadata);
99
100                     overwriteFileIfContentDiffers(indexFile, layout
101                             .getHtml(true, true, metadata).getBytes());
102                 }
103             } catch (final Exception e) {
104                 logger.error("Error writing index file. ", e);
105             }
106     }
107
108     private List<String> getChildPath(final File file) {
109
110         final List<String> result = new ArrayList<>(pathElements);
111         result.add(file.getName());
112
113         return result;
114     }
115
116     @Override
117     public String getDirectoryUrl(final AbstractFile directory,
118                                   final IndexingContext context) {
119         return urlEncode(directory.fileName) + "/index.html";
120     }
121
122     @Override
123     public String getParentDirectoryUrl(final IndexingContext context) {
124         return "../index.html";
125     }
126
127     @Override
128     public String getThumbnailUrl(final Picture picture,
129                                   final Dimension desiredDimension, final IndexingContext context) {
130
131         // in case thumbnail size was equal to original, then return original
132         // file path
133         if (picture.getDimensions().equals(desiredDimension))
134             return picture.fileName;
135
136         final String thumbnailFileName = picture
137                 .getRelativeThumbnailFileName(desiredDimension);
138
139         validMetadataFiles.add(thumbnailFileName);
140         final File thumbnailFile = new File(
141                 getThumbnailsDirectoryPath(directoryToIndex) + thumbnailFileName);
142
143         if (!thumbnailFile.exists()) {
144
145             final File originalFile = new File(
146                     directoryToIndex.getAbsolutePath() + "/" + picture.fileName);
147
148             makeThumbnail(originalFile, thumbnailFile, desiredDimension.getAwtDimension());
149         }
150         return THUMBNAILS_DIRECTORY_NAME + "/" + urlEncode(thumbnailFileName);
151     }
152
153     private void initializeLayouts() {
154
155         layouts = Utils.getLayouts();
156
157         final String galleryTitle = commandlineHandler.getGalleryTitle();
158
159         for (final Layout layout : layouts)
160             layout.init(galleryTitle, pathElements, this, new IndexingContext(
161                     "", "."));
162     }
163
164     private void initializeThumbnailsDirectory() {
165         final File thumbnailsDirectory = Utils
166                 .getThumbnailsDirectory(directoryToIndex);
167
168         if (!thumbnailsDirectory.exists())
169             thumbnailsDirectory.mkdirs();
170     }
171
172     private void loadOrCreateMetadata() {
173
174         metadataFile = new File(
175                 getThumbnailsDirectoryPath(directoryToIndex)
176                         + Constants.METADATA_FILE_NAME);
177
178         metadata = MetadadaHelper.initDirectoryMetadata(metadataFile);
179     }
180
181     private void removeUnusedThumbnailFiles() {
182
183         for (final File file : Utils.getThumbnailsDirectory(directoryToIndex)
184                 .listFiles())
185             if (!validMetadataFiles.contains(file.getName()))
186                 file.delete();
187
188     }
189
190     private void updateMetadata() throws Exception {
191
192         for (final File file : directoryToIndex.listFiles())
193             if (shallFileBeIndexed(file)) {
194
195                 metadata.ensureFileMetadataIsUpToDate(directoryToIndex, file);
196
197                 if (file.isDirectory())
198                     new FilesystemIndexer(file, commandlineHandler,
199                             getChildPath(file));
200             }
201     }
202 }