Updated copyright message.
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / metadata / DirectoryMetadata.java
1 /*
2  * Meviz - Various tools collection to work with multimedia.
3  * Copyright (C) 2012 -- 2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public License
7  * as published by the Free Software Foundation.
8  */
9
10 package eu.svjatoslav.meviz.htmlindexer.metadata;
11
12 import eu.svjatoslav.commons.file.FilePathParser;
13 import eu.svjatoslav.meviz.htmlindexer.AbstractIndexer;
14 import eu.svjatoslav.meviz.htmlindexer.FileSortComparator;
15 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.*;
16
17 import java.io.File;
18 import java.io.Serializable;
19 import java.util.*;
20
21 /**
22  * Corresponds to single filesystem directory.
23  */
24 public class DirectoryMetadata implements Serializable {
25
26     private static final long serialVersionUID = 3526489102725366334L;
27
28     private final HashMap<String, AbstractFile> fileNameToFileMap = new HashMap<>();
29
30     public transient boolean changed;
31
32     /**
33      * Performs cleanup of directory model. In particular removes metadata for
34      * images that no longer exist in the filesystem.
35      */
36     public void cleanup() {
37         final Iterator<AbstractFile> fileIterator = fileNameToFileMap.values()
38                 .iterator();
39
40         while (fileIterator.hasNext()) {
41             final AbstractFile file = fileIterator.next();
42
43             if (!file.isMetaInfoVerified())
44                 fileIterator.remove();
45         }
46     }
47
48     public void ensureFileMetainfoIsUpToDate(final File parentDirectory,
49                                              final File file) throws Exception {
50
51         final String fileName = file.getName();
52
53         if (fileNameToFileMap.containsKey(fileName)) {
54             final boolean metainfoUpdated = fileNameToFileMap.get(fileName)
55                     .ensureFileMetainfoIsUpToDate(parentDirectory);
56
57             if (metainfoUpdated)
58                 changed = true;
59         } else
60             registerFile(parentDirectory, file);
61
62     }
63
64     private AbstractFile getAbstractFile(final File parentDirectory,
65                                          final File file, final String fileName) throws Exception {
66
67         if (file.isDirectory())
68             return new DirectoryFile(parentDirectory, fileName);
69
70         final String fileExtension = FilePathParser.getFileExtension(fileName)
71                 .toLowerCase();
72
73         if (AbstractIndexer.isImage(fileExtension))
74             try {
75                 return new Picture(parentDirectory, fileName);
76             } catch (final Exception exception) {
77                 // in case image decoding failed, handle image as general file
78                 return new GeneralFile(parentDirectory, fileName);
79             }
80
81         if (fileName.endsWith(".meviz.org"))
82             return new MevizSpecialFile(parentDirectory, fileName);
83
84         if (fileName.endsWith(".meviz.html"))
85             return new MevizSpecialFile(parentDirectory, fileName);
86
87         return new GeneralFile(parentDirectory, fileName);
88     }
89
90     private AbstractFile getFile(final String fileName) {
91         return fileNameToFileMap.get(fileName);
92     }
93
94     public Collection<AbstractFile> getFiles() {
95
96         final ArrayList<AbstractFile> files = new ArrayList<>(
97                 fileNameToFileMap.values());
98
99         Collections.sort(files, new FileSortComparator());
100
101         return files;
102     }
103
104     public String getHeaderMevizMetadataHtml() {
105         final AbstractFile headerFile = getFile("header.meviz.html");
106         if (headerFile == null)
107             return "";
108
109         final MevizSpecialFile mevizSpecialFile = (MevizSpecialFile) headerFile;
110         return mevizSpecialFile.getFileContent();
111     }
112
113     public Dimension getImageDimensions(final String fileName) {
114
115         return ((Picture) getFile(fileName)).getDimensions();
116     }
117
118     private AbstractFile registerFile(final File parentDirectory, final File file)
119             throws Exception {
120
121         final String fileName = file.getName();
122
123         final AbstractFile abstractFile = getAbstractFile(parentDirectory,
124                 file, fileName);
125
126         fileNameToFileMap.put(fileName, abstractFile);
127
128         changed = true;
129
130         return abstractFile;
131     }
132
133     public void removeUnusedMetadataEntries() {
134
135         new HashSet<>(fileNameToFileMap.keySet()).stream().filter(key -> !fileNameToFileMap.get(key).isMetaInfoVerified()).forEach(key -> {
136             fileNameToFileMap.remove(key);
137             changed = true;
138         });
139
140     }
141 }