Updated copyright message.
[meviz.git] / src / main / java / eu / svjatoslav / meviz / htmlindexer / layouts / MixedLayout.java
index f7eee2c..acc3c4e 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.layouts;
 
-import java.io.UnsupportedEncodingException;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
 import eu.svjatoslav.commons.file.FilePathParser;
-import eu.svjatoslav.commons.network.UrlParamEncoder;
-import eu.svjatoslav.meviz.htmlindexer.AbstractIndexer;
-import eu.svjatoslav.meviz.htmlindexer.Constants;
-import eu.svjatoslav.meviz.htmlindexer.IndexingContext;
-import eu.svjatoslav.meviz.htmlindexer.Layout;
+import eu.svjatoslav.meviz.htmlindexer.*;
 import eu.svjatoslav.meviz.htmlindexer.metadata.Dimension;
+import eu.svjatoslav.meviz.htmlindexer.metadata.DirectoryMetadata;
 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.AbstractFile;
 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.GeneralFile;
 import eu.svjatoslav.meviz.htmlindexer.metadata.fileTypes.Picture;
+import org.apache.log4j.Logger;
 
-public class MixedLayout implements Layout {
-
-       Logger logger = Logger.getLogger(MixedLayout.class);
-
-       StringBuffer dirHtml = new StringBuffer();
-
-       StringBuffer filesHtml = new StringBuffer();
-
-       String galleryTitle;
-
-       List<String> path;
-
-       public static final String encoding = "UTF-8";
-
-       private AbstractIndexer indexer;
-
-       private IndexingContext indexingContext;
-
-       @Override
-       public void enlistDirectory(final AbstractFile directory) {
-               dirHtml.append("<TR>");
-               dirHtml.append("<TD><b><a href=\""
-                               + indexer.getDirectoryUrl(directory, indexingContext)
-                               + "\"><h2> ==&gt; " + directory.fileName + "</h2></a></b></TD>");
-               dirHtml.append("</TR>\n");
+import java.io.IOException;
+import java.util.List;
 
-       }
+public class MixedLayout implements Layout {
 
-       @Override
-       public void enlistFile(final AbstractFile file) {
+    public static final String encoding = "UTF-8";
 
-               final String fullFileName = file.fileName;
+    private final Logger logger = Logger.getLogger(MixedLayout.class);
 
-               filesHtml.append("<div style=\"clear: both;\"><a href=\""
-                               + indexingContext.getGlobalUrl()
-                               + UrlParamEncoder.encode(indexingContext.getLocalUrl() + "/"
-                                               + fullFileName) + "\">" + fullFileName + "</a>\n");
-               filesHtml.append("&nbsp;&nbsp;("
-                               + FilePathParser.getFileSizeDescription(file.getFileLength())
-                               + ")</div><br/>\n");
+    private StringBuffer dirHtml = new StringBuffer();
 
-       }
+    private StringBuffer filesHtml = new StringBuffer();
 
-       @Override
-       public void enlistImage(final Picture picture) {
-               try {
+    private String galleryTitle;
 
-                       final Dimension imageSize = picture.getDimensions();
+    private List<String> path;
 
-                       final List<Dimension> recommendedDimensions = Picture
-                                       .getThumbnailDimensions(imageSize);
+    private AbstractIndexer indexer;
 
-                       Dimension listingDimension = new Dimension(1500, 450);
-
-                       if (listingDimension.width > imageSize.width)
-                               if (listingDimension.height > imageSize.height)
-                                       listingDimension = imageSize;
-
-                       final String listingThumbnailUrl = indexer.getThumbnailUrl(picture,
-                                       listingDimension, indexingContext);
-
-                       filesHtml.append("<div style=\"float:left; margin: 10px;\">");
-                       filesHtml.append("<a href=\""
-                                       + indexingContext.getGlobalUrl()
-                                       + UrlParamEncoder.encode(indexingContext.getLocalUrl()
-                                                       + "/" + picture.fileName) + "\">\n");
-
-                       filesHtml.append("<img border=\"0\" src=\"" + listingThumbnailUrl
-                                       + "\"/></a>\n");
-                       filesHtml.append("<br/><b>"
-                                       + FilePathParser
-                                                       .getFileNameWithoutExtension(picture.fileName)
-                                       + "</b><br/>(");
-
-                       int count = 0;
-                       for (final Dimension dimension : recommendedDimensions) {
-                               count++;
-                               if (count > 1)
-                                       filesHtml.append(", ");
-                               filesHtml.append("<a href=\""
-                                               + indexer.getThumbnailUrl(picture, dimension,
-                                                               indexingContext) + "\">");
-                               filesHtml.append(dimension.width + "x" + dimension.height);
-                               filesHtml.append("</a>");
-                       }
-
-                       filesHtml.append(")\n");
-                       filesHtml.append("</div>");
-
-               } catch (final Exception e) {
-                       logger.error(
-                                       "Error generating thumbnails for image file: "
-                                                       + e.toString()
-                                                       + ", thumbnail generation skipped, enlisting as ordinary file instead.",
-                                       e);
-                       enlistFile(picture);
-               }
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public void enlistOgv(final AbstractFile abstractFile)
-                       throws UnsupportedEncodingException {
-
-               final GeneralFile file = (GeneralFile) abstractFile;
-
-               filesHtml
-                               .append("<div style=\"margin: 30px; clear: both;\">"
-                                               + "<video preload=\"metadata\" controls=\"controls\" tabindex=\"0\">\n");
-               filesHtml
-                               .append("<source type=\"video/ogg\" codecs=\"theora, vorbis\" src=\""
-                                               + indexingContext.getGlobalUrl()
-                                               + UrlParamEncoder.encode(indexingContext.getLocalUrl()
-                                                               + "/" + file.fileName) + "\">\n");
-               filesHtml.append("</source>\n");
-
-               filesHtml.append("</video>\n");
-
-               filesHtml.append("<br/>\n");
-
-               filesHtml
-                               .append("Video: <b>"
-                                               + FilePathParser
-                                                               .getFileNameWithoutExtension(file.fileName)
-                                               + "<b/>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
-               filesHtml.append("<a href=\""
-                               + indexingContext.getGlobalUrl()
-                               + UrlParamEncoder.encode(indexingContext.getLocalUrl() + "/"
-                                               + file.fileName) + "\">download as OGV</a></div>\n");
-
-               filesHtml.append("\n");
-
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public String getFileNameSuffix() {
-               return "";
-       }
-
-       /** {@inheritDoc} */
-       @Override
-       public String getHtml(final boolean showTitle,
-                       final boolean doHtmlHeaderAndFooter) {
-
-               // assemble final page HTML
-               final StringBuffer finalHtml = new StringBuffer();
-
-               if (doHtmlHeaderAndFooter) {
-                       // page header
-                       finalHtml.append("<HTML>\n");
-                       finalHtml.append("<HEAD>\n");
-                       finalHtml
-                                       .append("    <meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\"/>\n");
-                       finalHtml.append("</HEAD>\n");
-                       finalHtml
-                                       .append("<BODY bgcolor=\"#000000\" alink=\"#50ffff\" link=\"#50ffff\" vlink=\"#ff50ff\" text=\"#ffffff\">\n");
-                       finalHtml.append("<!-- " + Constants.HTML_MAGIC_STRING + " -->\n");
-                       finalHtml.append("<!-- " + Constants.HTML_MEMO + " -->\n");
-                       finalHtml.append("<font color=\"#ffffff\">\n");
-               }
-
-               if (showTitle)
-                       finalHtml
-                                       .append("<CENTER><H1>" + galleryTitle + "</H1></CENTER>\n");
-
-               showCurrentPath(finalHtml);
-
-               listDirectories(finalHtml);
-
-               finalHtml.append(filesHtml.toString());
-
-               if (doHtmlHeaderAndFooter)
-                       finalHtml.append("</font></BODY></HTML>\n");
-
-               return finalHtml.toString();
-       }
-
-       @Override
-       public void init(final String galleryTitle, final List<String> path,
-                       final AbstractIndexer indexer, final IndexingContext indexingContext) {
-
-               this.indexer = indexer;
-               this.galleryTitle = galleryTitle;
-               this.path = path;
-               this.indexingContext = indexingContext;
-
-               dirHtml = new StringBuffer();
-               filesHtml = new StringBuffer();
-       }
-
-       private void listDirectories(final StringBuffer finalHtml) {
-               finalHtml.append("<TABLE>\n");
-
-               if (path.size() > 0) {
-                       finalHtml.append("<TR>");
-                       finalHtml.append("<TD><b><a href=\""
-                                       + indexer.getParentDirectoryUrl(indexingContext)
-                                       + "\"><h2> &lt;== parent directory</h2></a></b></TD>");
-                       finalHtml.append("</TR>\n");
-               }
-
-               finalHtml.append(dirHtml.toString());
-               finalHtml.append("\n<TR><TD><br></TD></TR>\n");
-               finalHtml.append("</TABLE>\n");
-       }
-
-       private void showCurrentPath(final StringBuffer finalHtml) {
-               finalHtml.append("<CENTER><H2>");
-               for (final String p : path)
-                       finalHtml.append(" / " + p);
-               finalHtml.append("</H2></CENTER>\n");
-       }
+    private IndexingContext indexingContext;
 
+    @Override
+    public void enlistDirectory(final AbstractFile directory,
+                                final DirectoryMetadata parentDirectoryMetadata) {
+        dirHtml.append("<TR>");
+        dirHtml.append("<TD><b><a href=\""
+                + indexer.getDirectoryUrl(directory, indexingContext)
+                + "\"><h2> ==&gt; " + directory.fileName + "</h2></a></b></TD>");
+        dirHtml.append("</TR>\n");
+
+    }
+
+    @Override
+    public void enlistFile(final AbstractFile file,
+                           final DirectoryMetadata parentDirectoryMetadata) {
+
+        final String fullFileName = file.fileName;
+
+        filesHtml.append("<div style=\"clear: both;\"><a href=\""
+                + indexingContext.getGlobalUrl()
+                + Utils.urlEncode(indexingContext.getLocalUrl() + "/"
+                + fullFileName) + "\">" + fullFileName + "</a>\n");
+        filesHtml.append("&nbsp;&nbsp;("
+                + FilePathParser.getFileSizeDescription(file.getFileLength())
+                + ")</div><br/>\n");
+
+    }
+
+    @Override
+    public void enlistImage(final Picture picture,
+                            final DirectoryMetadata parentDirectoryMetadata) {
+        try {
+            enlistImageInternal(picture);
+        } catch (final Exception e) {
+            logger.error(
+                    "Error generating thumbnails for image file: "
+                            + e.toString()
+                            + ", thumbnail generation skipped, enlisting as ordinary file instead.",
+                    e);
+            enlistFile(picture, parentDirectoryMetadata);
+        }
+    }
+
+    private String enlistImageDimensions(final Picture picture) {
+        final StringBuilder html = new StringBuilder();
+
+        final List<Dimension> recommendedDimensions = Picture
+                .getThumbnailDimensions(picture.getDimensions());
+
+        int count = 0;
+        for (final Dimension dimension : recommendedDimensions) {
+            count++;
+            if (count > 1)
+                html.append(", ");
+            html.append("<a href=\""
+                    + indexer.getThumbnailUrl(picture, dimension,
+                    indexingContext) + "\">");
+            html.append(dimension.width + "x" + dimension.height);
+            html.append("</a>");
+        }
+
+        return html.toString();
+    }
+
+    private void enlistImageInternal(final Picture picture) {
+
+        filesHtml.append("<div style=\"float:left; margin: 10px;\">");
+
+        // clickable image thumbnail
+        filesHtml.append("<a href=\""
+                + indexingContext.getGlobalUrl()
+                + Utils.urlEncode(indexingContext.getLocalUrl() + "/"
+                + picture.fileName) + "\">\n");
+
+        filesHtml.append("<img border=\"0\" src=\""
+                + getImageThumbnailUrl(picture) + "\"/></a><br/>\n");
+
+        // file name
+        filesHtml.append("<b>"
+                + FilePathParser.getFileNameWithoutExtension(picture.fileName)
+                + "</b><br/>");
+
+        // links to thumbnails of various sizes
+        filesHtml.append("(" + enlistImageDimensions(picture) + ")\n");
+
+        filesHtml.append("</div>");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void enlistOgv(final AbstractFile abstractFile,
+                          final DirectoryMetadata parentDirectoryMetadata) {
+
+        final GeneralFile file = (GeneralFile) abstractFile;
+
+        filesHtml.append("<div style=\"margin: 30px; clear: both;\">");
+
+        // watchable video
+        filesHtml
+                .append("<video preload=\"metadata\" controls=\"controls\" tabindex=\"0\">\n");
+        filesHtml
+                .append("<source type=\"video/ogg\" codecs=\"theora, vorbis\" src=\""
+                        + indexingContext.getGlobalUrl()
+                        + Utils.urlEncode(indexingContext.getLocalUrl() + "/"
+                        + file.fileName) + "\">\n");
+        filesHtml.append("</source>\n");
+        filesHtml.append("</video>\n");
+        filesHtml.append("<br/>\n");
+
+        // video title
+        filesHtml
+                .append("Video: <b>"
+                        + FilePathParser
+                        .getFileNameWithoutExtension(file.fileName)
+                        + "<b/>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
+
+        // video download link
+        filesHtml.append("<a href=\""
+                + indexingContext.getGlobalUrl()
+                + Utils.urlEncode(indexingContext.getLocalUrl() + "/"
+                + file.fileName) + "\">download as OGV file</a>");
+
+        filesHtml.append("</div>\n");
+
+        filesHtml.append("\n");
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getFileNameSuffix() {
+        return "";
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws IOException
+     */
+    @Override
+    public String getHtml(final boolean showTitle,
+                          final boolean doHtmlHeaderAndFooter,
+                          final DirectoryMetadata directory) {
+
+        // assemble final page HTML
+        final StringBuilder html = new StringBuilder();
+
+        if (doHtmlHeaderAndFooter)
+            appendHtmlHeader(html);
+
+        if (showTitle)
+            html.append("<CENTER><H1>" + galleryTitle + "</H1></CENTER>\n");
+
+        html.append(showCurrentPath());
+        html.append(listDirectories());
+        html.append(directory.getHeaderMevizMetadataHtml());
+        html.append(filesHtml.toString());
+
+        if (doHtmlHeaderAndFooter)
+            appendHtmlFooter(html);
+
+        return html.toString();
+    }
+
+    private void appendHtmlFooter(StringBuilder html) {
+        html.append("</font></BODY></HTML>\n");
+    }
+
+    private void appendHtmlHeader(StringBuilder html) {
+        // page header
+        html.append("<HTML>\n");
+        html.append("<HEAD>\n");
+        html.append("    <meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\"/>\n");
+        html.append("</HEAD>\n");
+        html.append("<BODY bgcolor=\"#000000\" alink=\"#50ffff\" link=\"#50ffff\" vlink=\"#ff50ff\" text=\"#ffffff\">\n");
+        html.append("<!-- " + Constants.HTML_MAGIC_STRING + " -->\n");
+        html.append("<!-- " + Constants.HTML_MEMO + " -->\n");
+        html.append("<font color=\"#ffffff\">\n");
+    }
+
+    private String getImageThumbnailUrl(final Picture picture) {
+        final Dimension imageSize = picture.getDimensions();
+
+        Dimension listingDimension = new Dimension(1500, 450);
+
+        if (listingDimension.width > imageSize.width)
+            if (listingDimension.height > imageSize.height)
+                listingDimension = imageSize;
+
+        return indexer.getThumbnailUrl(picture, listingDimension,
+                indexingContext);
+    }
+
+    @Override
+    public void init(final String galleryTitle, final List<String> path,
+                     final AbstractIndexer indexer, final IndexingContext indexingContext) {
+
+        this.indexer = indexer;
+        this.galleryTitle = galleryTitle;
+        this.path = path;
+        this.indexingContext = indexingContext;
+
+        dirHtml = new StringBuffer();
+        filesHtml = new StringBuffer();
+    }
+
+    private String listDirectories() {
+        final StringBuilder html = new StringBuilder();
+        html.append("<TABLE>\n");
+
+        if (path.size() > 0) {
+            html.append("<TR>");
+            html.append("<TD><b><a href=\""
+                    + indexer.getParentDirectoryUrl(indexingContext)
+                    + "\"><h2> &lt;== parent directory</h2></a></b></TD>");
+            html.append("</TR>\n");
+        }
+
+        html.append(dirHtml.toString());
+        html.append("\n<TR><TD><br></TD></TR>\n");
+        html.append("</TABLE>\n");
+
+        return html.toString();
+    }
+
+    private String showCurrentPath() {
+        final StringBuilder html = new StringBuilder();
+        html.append("<CENTER><H2>");
+        for (final String p : path)
+            html.append(" / " + p);
+        html.append("</H2></CENTER>\n");
+
+        return html.toString();
+    }
+
+    @Override
+    public void enlistWebm(AbstractFile abstractFile,
+                           DirectoryMetadata directory) {
+        final GeneralFile file = (GeneralFile) abstractFile;
+
+        filesHtml.append("<div style=\"margin: 30px; clear: both;\">");
+
+        // watchable video
+
+        String fileUrl = indexingContext.getGlobalUrl()
+                + Utils.urlEncode(indexingContext.getLocalUrl() + "/"
+                + file.fileName);
+
+        filesHtml.append("<video controls>\n");
+        filesHtml.append("  <source src=\"" + fileUrl
+                + "\" type='video/webm;codecs=\"vp8, opus\"'/>\n");
+        filesHtml.append("</video>\n");
+        filesHtml.append("<br/>\n");
+
+        // video title
+        filesHtml
+                .append("Video: <b>"
+                        + FilePathParser
+                        .getFileNameWithoutExtension(file.fileName)
+                        + "<b/>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
+
+        // video download link
+        filesHtml.append("<a href=\""
+                + indexingContext.getGlobalUrl()
+                + Utils.urlEncode(indexingContext.getLocalUrl() + "/"
+                + file.fileName) + "\">download as WebM file</a>");
+
+        filesHtml.append("</div>\n");
+
+        filesHtml.append("\n");
+    }
 }