From f1bf243e7651e49e3652a4409bf4a9ca76f3e68e Mon Sep 17 00:00:00 2001 From: knut Date: Mon, 17 Mar 2008 00:56:56 +0000 Subject: [PATCH] Significant update for WEB interface in particular. Now we show the directory page with JPEG images in them. --- .../forkalsrud/album/web/AlbumServlet.java | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 src/org/forkalsrud/album/web/AlbumServlet.java diff --git a/src/org/forkalsrud/album/web/AlbumServlet.java b/src/org/forkalsrud/album/web/AlbumServlet.java new file mode 100644 index 0000000..0aad1e6 --- /dev/null +++ b/src/org/forkalsrud/album/web/AlbumServlet.java @@ -0,0 +1,160 @@ +package org.forkalsrud.album.web; + +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.io.*; +import java.text.ParseException; +import java.util.*; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReadParam; +import javax.imageio.ImageReader; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageInputStream; +import javax.imageio.stream.ImageOutputStream; +import javax.servlet.*; +import javax.servlet.http.*; + +import org.forkalsrud.album.exif.Dimension; +import org.forkalsrud.album.exif.Entry; +import org.forkalsrud.album.exif.EntryDao; + +import com.drew.imaging.jpeg.JpegProcessingException; +import com.drew.metadata.MetadataException; + +public class AlbumServlet + extends HttpServlet +{ + EntryDao dao; + + @Override + public void init() + throws ServletException + { + System.out.println("in init of Album"); + dao = new EntryDao(); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) + throws ServletException, IOException + { + System.out.println("pathInfo: " + req.getPathInfo()); + System.out.println("pathXlat: " + req.getPathTranslated()); + System.out.println("queryString: " + req.getQueryString()); + System.out.println("requestUri: " + req.getRequestURI()); + System.out.println("servletPath: " + req.getServletPath()); + + String path = req.getPathTranslated(); + + System.out.println("file: " + path); + + File file = new File(path); + if (file == null) { + res.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + + if (!file.exists()) { + res.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + + if (!file.canRead()) { + res.setStatus(HttpServletResponse.SC_FORBIDDEN); + return; + } + + if (file.isDirectory()) { + try { + List entries = dao.read(file); + res.setContentType("text/html"); + req.setAttribute("directory", file.getName()); + req.setAttribute("path", req.getServletPath()); + req.setAttribute("entries", entries); + RequestDispatcher rd = req.getRequestDispatcher("/WEB-INF/velocity/directory.vm"); + rd.forward(req, res); + + } catch (Exception e) { + throw new ServletException("sadness", e); + } + } else if (req.getParameter("size") != null) { + + try { + res.setContentType("image/jpeg"); + scaleImage(req, res, file, Integer.parseInt(req.getParameter("size"))); + } catch (Exception e) { + throw new RuntimeException("sadness", e); + } + } else { + res.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } + + + void scaleImage(HttpServletRequest req, HttpServletResponse res, File file, int size) throws IOException, JpegProcessingException, MetadataException, ParseException { + + List entries = dao.read(file.getParentFile()); + Entry entry = null; + String myName = file.getName(); + for (Entry e : entries) { + if (myName.equals(e.getName())) { + entry = e; + break; + } + } + Dimension orig = entry.getSize(); + Dimension outd = orig.scaled(size); + if (entry.getOrientation() == 6) { + outd = outd.flip(); + } + + Iterator readers = ImageIO.getImageReadersByFormatName("jpg"); + ImageReader reader = (ImageReader)readers.next(); + ImageInputStream iis = ImageIO.createImageInputStream(file); + reader.setInput(iis, true); + ImageReadParam param = reader.getDefaultReadParam(); + if (true /* subsampling */) { + double subSampleScale = (double)outd.getWidth() / orig.getWidth(); + int subSampling = (int)Math.floor(0.25d/subSampleScale); + param.setSourceSubsampling(subSampling, subSampling, 0, 0); + } + BufferedImage img = reader.read(0, param); + + // Recalculate scale after subsampling was applied + double scale; + AffineTransform xform; + if (entry.getOrientation() == 6) { + xform = AffineTransform.getTranslateInstance(outd.getWidth() / 2d, outd.getHeight() / 2d); + xform.rotate(Math.PI / 2); + scale = (double)outd.getHeight() / img.getWidth(); + xform.scale(scale, scale); + xform.translate(-img.getWidth() / 2d, -img.getHeight() / 2d); + + } else { + scale = (double)outd.getWidth() / img.getWidth(); + xform = AffineTransform.getScaleInstance(scale, scale); + } + BufferedImage buf2 = new BufferedImage(outd.getWidth(), outd.getHeight(), img.getType()); + Graphics2D g2 = buf2.createGraphics(); + g2.transform(xform); + g2.drawImage(img, 0, 0, null); + + Iterator writers = ImageIO.getImageWritersByFormatName("jpg"); + ImageWriter writer = (ImageWriter)writers.next(); + ImageOutputStream ios = ImageIO.createImageOutputStream(res.getOutputStream()); + writer.setOutput(ios); + writer.write(buf2); + } + + + @Override + public String getServletInfo() { + return "Display a directory as an org.forkalsrud.album"; + } + +} + +// eof