Significant update for WEB interface in particular.

Now we show the directory page with JPEG images in them.
This commit is contained in:
knut 2008-03-17 00:56:56 +00:00
parent 642399cd0b
commit f1bf243e76

View file

@ -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<Entry> 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<Entry> 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