package org.jboss.seam.example.seamspace; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.swing.ImageIcon; import org.jboss.seam.Component; /** * Serves images and other member content * * @author Shane Bryzak */ public class ContentServlet extends HttpServlet { private static final long serialVersionUID = -8461940507242022217L; private static final String IMAGES_PATH = "/images"; /** * The maximum width allowed for image rescaling */ private static final int MAX_IMAGE_WIDTH = 1024; private byte[] noImage; public ContentServlet() { InputStream in = getClass().getResourceAsStream("/images/no_image.png"); if (in != null) { ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[512]; try { int read = in.read(buffer); while (read != -1) { out.write(buffer, 0, read); read = in.read(buffer); } noImage = out.toByteArray(); } catch (IOException e) { } } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (IMAGES_PATH.equals(request.getPathInfo())) { ContentAction contentAction = (ContentAction) Component.getInstance(ContentAction.class); String id = request.getParameter("id"); MemberImage mi = (id != null && !"".equals(id)) ? contentAction.getImage(Integer.parseInt(id)) : null; String contentType = null; byte[] data = null; if (mi != null && mi.getData() != null && mi.getData().length > 0) { contentType = mi.getContentType(); data = mi.getData(); } else if (noImage != null) { contentType = "image/png"; data = noImage; } if (data != null) { response.setContentType(contentType); boolean rescale = false; int width = 0; ImageIcon icon = null; // Check if the image needs to be rescaled if (request.getParameter("width") != null) { width = Math.min(MAX_IMAGE_WIDTH, Integer.parseInt(request .getParameter("width"))); icon = new ImageIcon(data); if (width > 0 && width != icon.getIconWidth()) rescale = true; } // Rescale the image if required if (rescale) { double ratio = (double) width / icon.getIconWidth(); int height = (int) (icon.getIconHeight() * ratio); int imageType = "image/png".equals(contentType) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB; BufferedImage bImg = new BufferedImage(width, height, imageType); Graphics2D g2d = bImg.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g2d.drawImage(icon.getImage(), 0, 0, width, height, null); g2d.dispose(); String formatName = ""; if (contentType != null && contentType.indexOf("png") != -1) formatName = "png"; else if (contentType != null && (contentType.indexOf("jpg") != -1) || contentType.indexOf("jpeg") != -1) formatName = "jpeg"; ImageIO.write(bImg, formatName, response.getOutputStream()); } else { response.getOutputStream().write(data); } } response.getOutputStream().flush(); } } }