/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.gui.common.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.enterprise.gui.legacy.util.RequestUtils;
/**
* <p>This servlet returns a response that contains the binary data of an image (JPEG or PNG) that can be viewed in a
* web browser.</p>
*
* <p>The navigation map servlet takes the following parameters (any applicable defaults are in <b>bold</b> and required
* parameters are in <i>italics</i>):</p>
*
* <table border="1">
* <tr>
* <th>key</th>
* <th>value</th>
* </tr>
* <tr>
* <td>imageFormat</td>
* <td>(<b>png</b> | jpeg)</td>
* </tr>
* <tr>
* <td>imageWidth</td>
* <td><integer <b>(700)</b>></td>
* </tr>
* <tr>
* <td>imageHeight</td>
* <td><integer <b>(350)</b>></td>
* </tr>
* </table>
*/
public abstract class ImageServlet extends ParameterizedServlet {
/**
* Request parameter for image format.
*/
public static final String IMAGE_FORMAT_PARAM = "imageFormat";
/**
* Request parameter value representing a PNG image.
*/
public static final String IMAGE_FORMAT_PNG = "png";
/**
* Request parameter value representing a JPEG image.
*/
public static final String IMAGE_FORMAT_JPEG = "jpeg";
private static final String[] VALID_IMAGE_FORMATS = { IMAGE_FORMAT_PNG, IMAGE_FORMAT_JPEG };
private static final String PNG_MIME_TYPE = "image/png";
private static final String JPEG_MIME_TYPE = "image/jpeg";
/**
* Request parameter for image width.
*/
public static final String IMAGE_WIDTH_PARAM = "imageWidth";
/**
* Default image width.
*/
public static final int IMAGE_WIDTH_DEFAULT = 700;
/**
* Request parameter for image height.
*/
public static final String IMAGE_HEIGHT_PARAM = "imageHeight";
/**
* Default image height.
*/
public static final int IMAGE_HEIGHT_DEFAULT = 350;
// member data
private Log log = LogFactory.getLog(ImageServlet.class.getName());
private String imageFormat;
private int imageWidth;
private int imageHeight;
public ImageServlet() {
}
@Override
public void init() {
if (log.isDebugEnabled()) {
log.debug("java.awt.headless=" + System.getProperty("java.awt.headless"));
}
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
try {
// parse the parameters
if (log.isDebugEnabled())
log.debug("Parsing parameters.");
parseParameters(request);
Object imgObj = createImage(request);
// render the chart
if (log.isDebugEnabled())
log.debug("Rendering image.");
ServletOutputStream out = response.getOutputStream();
// we _never_ want the result cached by the browser, ever
RequestUtils.bustaCache(request, response);
if (getImageFormat().equals(IMAGE_FORMAT_PNG)) {
response.setContentType(PNG_MIME_TYPE);
renderPngImage(out, imgObj);
} else {
response.setContentType(JPEG_MIME_TYPE);
renderJpegImage(out, imgObj);
}
out.flush();
} catch (IOException e) {
// it's okay to ignore this one
log.debug("Error writing image to response.", e);
} catch (Exception e) {
log.error("Unknown error.", e);
throw new ServletException("Unknown error.", e);
}
}
/**
* Create the image being rendered.
*
* @param request the servlet request
*/
protected abstract Object createImage(HttpServletRequest request) throws ServletException;
/**
* Render a PNG version of the image into the output stream.
*
* @param out the output stream
*/
protected abstract void renderPngImage(ServletOutputStream out, Object imgObj) throws IOException;
/**
* Render a JPEG version of the image into the output stream.
*
* @param out the output stream
*/
protected abstract void renderJpegImage(ServletOutputStream out, Object imgObj) throws IOException;
/**
* This method will be called automatically by the ImageServlet. It should handle the parsing and error-checking of
* any specific parameters for the chart being rendered.
*
* @param request the HTTP request object
*/
protected void parseParameters(HttpServletRequest request) {
// image format
imageFormat = parseStringParameter(request, IMAGE_FORMAT_PARAM, getDefaultImageFormat(), VALID_IMAGE_FORMATS);
// image width
imageWidth = parseIntParameter(request, IMAGE_WIDTH_PARAM, getDefaultImageWidth());
// image height
imageHeight = parseIntParameter(request, IMAGE_HEIGHT_PARAM, getDefaultImageHeight());
_logParameters();
}
/**
* Return the image format.
*
* @return <code>{@link IMAGE_FORMAT_PNG}</code> or <code>{@link IMAGE_FORMAT_JPEG}</code>
*/
protected String getImageFormat() {
return imageFormat;
}
/**
* Return the image height.
*
* @return the height of the image
*
* @see <code>{@link IMAGE_HEIGHT_DEFAULT}</code>
*/
protected int getImageHeight() {
return imageHeight;
}
/**
* Return the image width.
*
* @return the width of the image
*
* @see <code>{@link IMAGE_WIDTH_DEFAULT}</code>
*/
protected int getImageWidth() {
return imageWidth;
}
/**
* Return the default <code>imageFormat</code>.
*/
protected String getDefaultImageFormat() {
return IMAGE_FORMAT_PNG;
}
/**
* Return the default <code>imageWidth</code>.
*/
protected int getDefaultImageWidth() {
return IMAGE_WIDTH_DEFAULT;
}
/**
* Return the default <code>imageHeight</code>.
*/
protected int getDefaultImageHeight() {
return IMAGE_HEIGHT_DEFAULT;
}
//---------------------------------------------------------------
//-- private helpers
//---------------------------------------------------------------
private void _logParameters() {
if (log.isDebugEnabled()) {
StringBuffer sb = new StringBuffer("Parameters:");
sb.append("\n");
sb.append("\t");
sb.append(IMAGE_FORMAT_PARAM);
sb.append(": ");
sb.append(imageFormat);
sb.append("\n");
sb.append("\t");
sb.append(IMAGE_WIDTH_PARAM);
sb.append(": ");
sb.append(imageWidth);
sb.append("\n");
sb.append("\t");
sb.append(IMAGE_HEIGHT_PARAM);
sb.append(": ");
sb.append(imageHeight);
log.debug(sb.toString());
}
}
}