Updated copyright message.
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / metadata / DirectoryMetadata.java
index 110f2bd..d6e65fc 100755 (executable)
@@ -1,6 +1,6 @@
 /*
  * Meviz - Various tools collection to work with multimedia.
- * Copyright (C) 2012, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * Copyright (C) 2012 -- 2018, 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
 
 package eu.svjatoslav.meviz.htmlindexer.metadata;
 
-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 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 eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.*;
+
+import java.io.File;
+import java.io.Serializable;
+import java.util.*;
 
 /**
  * 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();
 
-       private final HashMap<String, AbstractFile> fileNameToFileMap = new HashMap<String, AbstractFile>();
+        while (fileIterator.hasNext()) {
+            final AbstractFile file = fileIterator.next();
 
-       public transient boolean changed;
+            if (!file.isMetaInfoVerified())
+                fileIterator.remove();
+        }
+    }
 
-       /**
-        * 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();
+    public void ensureFileMetainfoIsUpToDate(final File parentDirectory,
+                                             final File file) throws Exception {
 
-               while (fileIterator.hasNext()) {
-                       final AbstractFile file = fileIterator.next();
+        final String fileName = file.getName();
 
-                       if (!file.isMetaInfoVerified())
-                               fileIterator.remove();
-               }
-       }
+        if (fileNameToFileMap.containsKey(fileName)) {
+            final boolean metainfoUpdated = fileNameToFileMap.get(fileName)
+                    .ensureFileMetainfoIsUpToDate(parentDirectory);
 
-       public void ensureFileMetainfoIsUpToDate(final File parentDirectory,
-                       final File file) throws IOException, ImageFormatError {
+            if (metainfoUpdated)
+                changed = true;
+        } else
+            registerFile(parentDirectory, file);
 
-               final String fileName = file.getName();
+    }
 
-               if (fileNameToFileMap.containsKey(fileName)) {
-                       final boolean metainfoUpdated = fileNameToFileMap.get(fileName)
-                                       .ensureFileMetainfoIsUpToDate(parentDirectory);
+    private AbstractFile getAbstractFile(final File parentDirectory,
+                                         final File file, final String fileName) throws Exception {
 
-                       if (metainfoUpdated)
-                               changed = true;
-               } else
-                       registerFile(parentDirectory, file);
+        if (file.isDirectory())
+            return new DirectoryFile(parentDirectory, fileName);
 
-       }
+        final String fileExtension = FilePathParser.getFileExtension(fileName)
+                .toLowerCase();
 
-       private AbstractFile getAbstractFile(final File parentDirectory,
-                       final File file, final String fileName) throws IOException,
-                       ImageFormatError {
+        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);
+            }
 
-               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))
-                       return new Picture(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 IOException, ImageFormatError {
+    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).isMetaInfoVerified()).forEach(key -> {
+            fileNameToFileMap.remove(key);
+            changed = true;
+        });
 
-       }
+    }
 }