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.metadata;
12 import eu.svjatoslav.commons.file.FilePathParser;
13 import eu.svjatoslav.meviz.htmlindexer.FileSortComparator;
14 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.*;
17 import java.io.Serializable;
20 import static eu.svjatoslav.meviz.htmlindexer.AbstractIndexer.isImage;
21 import static eu.svjatoslav.meviz.htmlindexer.AbstractIndexer.isVideo;
24 * Corresponds to single filesystem directory.
26 public class DirectoryMetadata implements Serializable {
28 private static final long serialVersionUID = 3526489102725366334L;
30 private final HashMap<String, AbstractFile> fileNameToFileMap = new HashMap<>();
32 public transient boolean changed;
35 * Performs cleanup of directory model. In particular removes metadata for
36 * images that no longer exist in the filesystem.
38 public void cleanup() {
39 final Iterator<AbstractFile> fileIterator = fileNameToFileMap.values()
42 while (fileIterator.hasNext()) {
43 final AbstractFile file = fileIterator.next();
45 if (!file.isMetadataVerified())
46 fileIterator.remove();
50 public void ensureFileMetadataIsUpToDate(final File parentDirectory,
51 final File file) throws Exception {
53 final String fileName = file.getName();
55 if (fileNameToFileMap.containsKey(fileName)) {
56 final boolean metadataUpdated = fileNameToFileMap.get(fileName)
57 .ensureFileMetadataIsUpToDate(parentDirectory);
62 registerFile(parentDirectory, file);
66 private AbstractFile getAbstractFile(final File parentDirectory,
67 final File file, final String fileName) throws Exception {
69 if (file.isDirectory())
70 return new DirectoryFile(parentDirectory, fileName);
72 final String fileExtension = FilePathParser.getFileExtension(fileName)
75 if (isImage(fileExtension))
77 return new Picture(parentDirectory, fileName);
78 } catch (final Exception exception) {
79 // in case image decoding failed, handle image as general file
80 return new GeneralFile(parentDirectory, fileName);
83 if (isVideo(fileExtension))
85 return new Video(parentDirectory, fileName);
86 } catch (final Exception exception) {
87 // in case video decoding failed, handle it as general file
88 return new GeneralFile(parentDirectory, fileName);
91 if (fileName.endsWith(".meviz.org"))
92 return new MevizSpecialFile(parentDirectory, fileName);
94 if (fileName.endsWith(".meviz.html"))
95 return new MevizSpecialFile(parentDirectory, fileName);
97 return new GeneralFile(parentDirectory, fileName);
100 private AbstractFile getFile(final String fileName) {
101 return fileNameToFileMap.get(fileName);
104 public Collection<AbstractFile> getFiles() {
106 final ArrayList<AbstractFile> files = new ArrayList<>(
107 fileNameToFileMap.values());
109 Collections.sort(files, new FileSortComparator());
114 public String getHeaderMevizMetadataHtml() {
115 final AbstractFile headerFile = getFile("header.meviz.html");
116 if (headerFile == null)
119 final MevizSpecialFile mevizSpecialFile = (MevizSpecialFile) headerFile;
120 return mevizSpecialFile.getFileContent();
123 public Dimension getImageDimensions(final String fileName) {
125 return ((Picture) getFile(fileName)).getDimensions();
128 private AbstractFile registerFile(final File parentDirectory, final File file)
131 final String fileName = file.getName();
133 final AbstractFile abstractFile = getAbstractFile(parentDirectory,
136 fileNameToFileMap.put(fileName, abstractFile);
143 public void removeUnusedMetadataEntries() {
145 new HashSet<>(fileNameToFileMap.keySet()).stream().filter(key -> !fileNameToFileMap.get(key).isMetadataVerified()).forEach(key -> {
146 fileNameToFileMap.remove(key);