/*
* Meviz - Various tools collection to work with multimedia.
- * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * Copyright (C) 2012 -- 2019, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
*
* This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public License
- * as published by the Free Software Foundation.
- */
+ * modify it under the terms of version 3 of the GNU Lesser General Public License
+ * or later as published by the Free Software Foundation.
+*/
package eu.svjatoslav.meviz.htmlindexer.metadata;
+import eu.svjatoslav.commons.file.FilePathParser;
+import eu.svjatoslav.meviz.htmlindexer.FileSortComparator;
+import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.*;
+
import java.io.File;
-import java.io.IOException;
import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
+import java.util.*;
-import eu.svjatoslav.commons.file.FilePathParser;
-import eu.svjatoslav.meviz.htmlindexer.AbstractIndexer;
-import eu.svjatoslav.meviz.htmlindexer.FileSortComparator;
-import eu.svjatoslav.meviz.htmlindexer.ImageFormatError;
-import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.AbstractFile;
-import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.DirectoryFile;
-import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.GeneralFile;
-import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.MevizSpecialFile;
-import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture;
+import static eu.svjatoslav.meviz.htmlindexer.AbstractIndexer.isImage;
+import static eu.svjatoslav.meviz.htmlindexer.AbstractIndexer.isVideo;
/**
* Corresponds to single filesystem directory.
*/
public class DirectoryMetadata implements Serializable {
- private static final long serialVersionUID = 3526489102725366334L;
+ private static final long serialVersionUID = 3526489102725366334L;
+
+ private final HashMap<String, AbstractFile> fileNameToFileMap = new HashMap<>();
+
+ public transient boolean changed;
+
+ /**
+ * Performs cleanup of directory model. In particular removes metadata for
+ * images that no longer exist in the filesystem.
+ */
+ public void cleanup() {
+ final Iterator<AbstractFile> fileIterator = fileNameToFileMap.values()
+ .iterator();
+
+ while (fileIterator.hasNext()) {
+ final AbstractFile file = fileIterator.next();
- private final HashMap<String, AbstractFile> fileNameToFileMap = new HashMap<String, AbstractFile>();
+ if (!file.isMetadataVerified())
+ fileIterator.remove();
+ }
+ }
- public transient boolean changed;
+ public void ensureFileMetadataIsUpToDate(final File parentDirectory,
+ final File file) throws Exception {
- /**
- * Performs cleanup of directory model. In particular removes metadata for
- * images that no longer exist in the filesystem.
- */
- public void cleanup() {
- final Iterator<AbstractFile> fileIterator = fileNameToFileMap.values()
- .iterator();
+ final String fileName = file.getName();
- while (fileIterator.hasNext()) {
- final AbstractFile file = fileIterator.next();
+ if (fileNameToFileMap.containsKey(fileName)) {
+ final boolean metadataUpdated = fileNameToFileMap.get(fileName)
+ .ensureFileMetadataIsUpToDate(parentDirectory);
- if (!file.isMetaInfoVerified())
- fileIterator.remove();
- }
- }
+ if (metadataUpdated)
+ changed = true;
+ } else
+ registerFile(parentDirectory, file);
- public void ensureFileMetainfoIsUpToDate(final File parentDirectory,
- final File file) throws Exception {
+ }
- final String fileName = file.getName();
+ private AbstractFile getAbstractFile(final File parentDirectory,
+ final File file, final String fileName) throws Exception {
- if (fileNameToFileMap.containsKey(fileName)) {
- final boolean metainfoUpdated = fileNameToFileMap.get(fileName)
- .ensureFileMetainfoIsUpToDate(parentDirectory);
+ if (file.isDirectory())
+ return new DirectoryFile(parentDirectory, fileName);
- if (metainfoUpdated)
- changed = true;
- } else
- registerFile(parentDirectory, file);
+ final String fileExtension = FilePathParser.getFileExtension(fileName)
+ .toLowerCase();
- }
+ if (isImage(fileExtension))
+ try {
+ return new Picture(parentDirectory, fileName);
+ } catch (final Exception exception) {
+ // in case image decoding failed, handle image as general file
+ return new GeneralFile(parentDirectory, fileName);
+ }
- private AbstractFile getAbstractFile(final File parentDirectory,
- final File file, final String fileName) throws Exception {
+ if (isVideo(fileExtension))
+ try {
+ return new Video(parentDirectory, fileName);
+ } catch (final Exception exception) {
+ // in case video decoding failed, handle it as general file
+ return new GeneralFile(parentDirectory, fileName);
+ }
- if (file.isDirectory())
- return new DirectoryFile(parentDirectory, fileName);
+ if (fileName.endsWith(".meviz.org"))
+ return new MevizSpecialFile(parentDirectory, fileName);
- final String fileExtension = FilePathParser.getFileExtension(fileName)
- .toLowerCase();
+ if (fileName.endsWith(".meviz.html"))
+ return new MevizSpecialFile(parentDirectory, fileName);
- if (AbstractIndexer.isImage(fileExtension))
- try {
- return new Picture(parentDirectory, fileName);
- } catch (final Exception exception) {
- // in case image decoding failed, handle image as general file
- return new GeneralFile(parentDirectory, fileName);
- }
+ return new GeneralFile(parentDirectory, fileName);
+ }
- if (fileExtension.equals("meviz"))
- return new MevizSpecialFile(parentDirectory, fileName);
+ private AbstractFile getFile(final String fileName) {
+ return fileNameToFileMap.get(fileName);
+ }
- return new GeneralFile(parentDirectory, fileName);
- }
+ public Collection<AbstractFile> getFiles() {
- public AbstractFile getFile(final String fileName) throws IOException {
- return fileNameToFileMap.get(fileName);
- }
+ final ArrayList<AbstractFile> files = new ArrayList<>(
+ fileNameToFileMap.values());
- public Collection<AbstractFile> getFiles() {
+ Collections.sort(files, new FileSortComparator());
- final ArrayList<AbstractFile> files = new ArrayList<AbstractFile>(
- fileNameToFileMap.values());
+ return files;
+ }
- Collections.sort(files, new FileSortComparator());
+ public String getHeaderMevizMetadataHtml() {
+ final AbstractFile headerFile = getFile("header.meviz.html");
+ if (headerFile == null)
+ return "";
- return files;
- }
+ final MevizSpecialFile mevizSpecialFile = (MevizSpecialFile) headerFile;
+ return mevizSpecialFile.getFileContent();
+ }
- public Dimension getImageDimensions(final String fileName)
- throws IOException, ImageFormatError {
+ public Dimension getImageDimensions(final String fileName) {
- return ((Picture) getFile(fileName)).getDimensions();
- }
+ return ((Picture) getFile(fileName)).getDimensions();
+ }
- public AbstractFile registerFile(final File parentDirectory, final File file)
- throws Exception {
+ private AbstractFile registerFile(final File parentDirectory, final File file)
+ throws Exception {
- final String fileName = file.getName();
+ final String fileName = file.getName();
- final AbstractFile abstractFile = getAbstractFile(parentDirectory,
- file, fileName);
+ final AbstractFile abstractFile = getAbstractFile(parentDirectory,
+ file, fileName);
- fileNameToFileMap.put(fileName, abstractFile);
+ fileNameToFileMap.put(fileName, abstractFile);
- changed = true;
+ changed = true;
- return abstractFile;
- }
+ return abstractFile;
+ }
- public void removeUnusedMetadataEntries() {
+ public void removeUnusedMetadataEntries() {
- for (final String key : new HashSet<String>(fileNameToFileMap.keySet()))
- if (!fileNameToFileMap.get(key).isMetaInfoVerified()) {
- fileNameToFileMap.remove(key);
- changed = true;
- }
+ new HashSet<>(fileNameToFileMap.keySet()).stream().filter(key -> !fileNameToFileMap.get(key).isMetadataVerified()).forEach(key -> {
+ fileNameToFileMap.remove(key);
+ changed = true;
+ });
- }
+ }
}