2 * Meviz - Various tools collection to work with multimedia. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
7 package eu.svjatoslav.meviz.htmlindexer.metadata;
9 import eu.svjatoslav.commons.file.FilePathParser;
10 import eu.svjatoslav.meviz.htmlindexer.FileSortComparator;
11 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.*;
14 import java.io.Serializable;
17 import static eu.svjatoslav.meviz.htmlindexer.indexer.AbstractIndexer.isImage;
18 import static eu.svjatoslav.meviz.htmlindexer.indexer.AbstractIndexer.isVideo;
21 * Corresponds to single filesystem directory.
23 public class DirectoryMetadata implements Serializable {
25 private static final long serialVersionUID = 3526489102725366334L;
27 private final HashMap<String, AbstractFile> fileNameToFileMap = new HashMap<>();
29 public transient boolean changed;
32 * Performs cleanup of directory model. In particular removes metadata for
33 * images that no longer exist in the filesystem.
35 public void cleanup() {
36 final Iterator<AbstractFile> fileIterator = fileNameToFileMap.values()
39 while (fileIterator.hasNext()) {
40 final AbstractFile file = fileIterator.next();
42 if (!file.isMetadataVerified())
43 fileIterator.remove();
47 public void ensureFileMetadataIsUpToDate(final File parentDirectory,
48 final File file) throws Exception {
50 final String fileName = file.getName();
52 if (fileNameToFileMap.containsKey(fileName)) {
53 final boolean metadataUpdated = fileNameToFileMap.get(fileName)
54 .ensureFileMetadataIsUpToDate(parentDirectory);
59 registerFile(parentDirectory, file);
63 private AbstractFile getAbstractFile(final File parentDirectory,
64 final File file, final String fileName) throws Exception {
66 if (file.isDirectory())
67 return new DirectoryFile(parentDirectory, fileName);
69 final String fileExtension = FilePathParser.getFileExtension(fileName)
72 if (isImage(fileExtension))
74 return new Picture(parentDirectory, fileName);
75 } catch (final Exception exception) {
76 System.out.println("Failed to decode image \"" + fileName +"\" indexing as normal file instead.");
78 // in case image decoding failed, handle image as general file
79 return new GeneralFile(parentDirectory, fileName);
82 if (isVideo(fileExtension))
84 return new Video(parentDirectory, fileName);
85 } catch (final Exception exception) {
86 // in case video decoding failed, handle it as general file
87 return new GeneralFile(parentDirectory, fileName);
90 if (fileName.endsWith(".meviz.org"))
91 return new MevizSpecialFile(parentDirectory, fileName);
93 if (fileName.endsWith(".meviz.html"))
94 return new MevizSpecialFile(parentDirectory, fileName);
96 return new GeneralFile(parentDirectory, fileName);
99 private AbstractFile getFile(final String fileName) {
100 return fileNameToFileMap.get(fileName);
103 public Collection<AbstractFile> getFiles() {
105 final ArrayList<AbstractFile> files = new ArrayList<>(
106 fileNameToFileMap.values());
108 Collections.sort(files, new FileSortComparator());
113 public String getHeaderMevizMetadataHtml() {
114 final AbstractFile headerFile = getFile("header.meviz.html");
115 if (headerFile == null)
118 final MevizSpecialFile mevizSpecialFile = (MevizSpecialFile) headerFile;
119 return mevizSpecialFile.getFileContent();
122 public Dimension getImageDimensions(final String fileName) {
124 return ((Picture) getFile(fileName)).getDimensions();
127 private AbstractFile registerFile(final File parentDirectory, final File file)
130 final String fileName = file.getName();
132 final AbstractFile abstractFile = getAbstractFile(parentDirectory,
135 fileNameToFileMap.put(fileName, abstractFile);
142 public void removeUnusedMetadataEntries() {
144 new HashSet<>(fileNameToFileMap.keySet()).stream().filter(key -> !fileNameToFileMap.get(key).isMetadataVerified()).forEach(key -> {
145 fileNameToFileMap.remove(key);