Significant update for WEB interface in particular.
Now we show the directory page with JPEG images in them.
This commit is contained in:
parent
642399cd0b
commit
f1bf243e76
1 changed files with 160 additions and 0 deletions
160
src/org/forkalsrud/album/web/AlbumServlet.java
Normal file
160
src/org/forkalsrud/album/web/AlbumServlet.java
Normal 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
|
||||
Loading…
Add table
Reference in a new issue