Package de.laures.cewolf.taglib.tags

Source Code of de.laures.cewolf.taglib.tags.ChartImgTag

/* ================================================================
* Cewolf : Chart enabling Web Objects Framework
* ================================================================
*
* Project Info:  http://cewolf.sourceforge.net
* Project Lead:  Guido Laures (guido@laures.de);
*
* (C) Copyright 2002, by Guido Laures
*
* This library is free software; you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Foundation;
* either version 2.1 of
* the License, or (at your option) any later version.
*
* This library 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/

package de.laures.cewolf.taglib.tags;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.BodyContent;

import org.jfree.chart.ChartRenderingInfo;

import de.laures.cewolf.CewolfException;
import de.laures.cewolf.ChartHolder;
import de.laures.cewolf.ChartImage;
import de.laures.cewolf.Configuration;
import de.laures.cewolf.Storage;
import de.laures.cewolf.WebConstants;
import de.laures.cewolf.taglib.ChartImageDefinition;
import de.laures.cewolf.taglib.TaglibConstants;
import de.laures.cewolf.taglib.html.HTMLImgTag;
import de.laures.cewolf.taglib.util.MIMEExtensionHelper;
import de.laures.cewolf.taglib.util.PageUtils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* This is the tag implementation of the <img> tag. This tag inputs the
* proper <img> tag into the HTML page delivered to the client. It therefor
* determines the chart ID which will be used by the rendering servlet to retrieve the chart.
*
* @author glaures
* @see de.laures.cewolf.ChartImage
*/

public class ChartImgTag extends HTMLImgTag implements CewolfRootTag, Mapped
{
    private static final Log log = LogFactory.getLog(ChartImgTag.class);

  static final long serialVersionUID = 6176973400519372326L;

  private static final String  DEFAULT_MIME_TYPE = WebConstants.MIME_PNG;
  private static final String  TAG_NAME_SVG      = "EMBED";
  private static final int     DEFAULT_TIMEOUT   = 300;

  private String               chartId           = null;
  private String               renderer;
  private String               mimeType          = DEFAULT_MIME_TYPE;
  private int                  timeout           = DEFAULT_TIMEOUT;
  protected String             sessionKey        = null;

  private ChartImageDefinition chartImageDefinition;

  public int doStartTag() throws JspException
  {
    final ChartHolder chartHolder = PageUtils.getChartHolder(chartId, pageContext);
    this.chartImageDefinition = new ChartImageDefinition(chartHolder, width, height, ChartImage.IMG_TYPE_CHART, mimeType, timeout);
    Storage storage = Configuration.getInstance(pageContext.getServletContext()).getStorage();
    try
    {
      this.sessionKey = storage.storeChartImage(chartImageDefinition, pageContext);
    }
    catch (CewolfException cwex)
    {
      throw new JspException(cwex.getMessage());
    }
    return EVAL_PAGE;
  }

  public int doAfterBody() throws JspException
  {
    try
    {
      // double checking for null as Resin had problems with that
      final BodyContent body = getBodyContent();
      if (body != null)
      {
        final JspWriter writer = getPreviousOut();
        if (writer != null)
        {
          body.writeOut(writer);
        }
      }

    }
    catch (IOException ioex)
    {
    log.error("ChartImgTag.doAfterBody: "+ioex.getMessage());
      throw new JspException(ioex.getMessage());
    }
    return SKIP_BODY;
  }

  public int doEndTag() throws JspException
  {
    super.doStartTag();
    final StringBuffer buffer = new StringBuffer(" src=\"");
    buffer.append(getImgURL());
    buffer.append("\"");
    try
    {
      pageContext.getOut().write(buffer.toString());
    }
    catch (IOException ioex)
    {
      reset();
    log.error("ChartImgTag.doEndTag: "+ioex.getMessage());
      throw new JspException(ioex.getMessage());
    }
    return super.doEndTag();
  }

  /**
   * Fix an absolute url given as attribute by adding the full application url path to it.
   * It is considered absolute url (not relative) when it starts with "/"
   * @param url The url to fix
   * @param request The http request
   * @return Fixed url contains the full path
   */
  public static String fixAbsolutURL(String url, HttpServletRequest request) {
    if (url.startsWith("/"))
    {
      //final HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
      final String context = request.getContextPath();
      url = context + url;
    }
    return url;
  }
 
  /**
   * Same as the other fixAbsolutURL, convinience only.
   * @param url The url to fix
   * @param pageContext The page context
   * @return Fixed url contains the full path
   */
  public static String fixAbsolutURL(String url, PageContext pageContext) {
    return fixAbsolutURL(url, (HttpServletRequest) pageContext.getRequest());
  }

  /**
   * Build the image url
   * @param renderer the url of the renderer
   * @param pageContext Page context
   * @param sessionKey The session key for the image stored.
   * @param width The width
   * @param height The height
   * @param mimeType the mime-type (for example png) of it
   * @return The full url
   */
  public static String buildImgURL (String renderer, PageContext pageContext, String sessionKey, int width,
                  int height, String mimeType, boolean forceSessionId, boolean removeAfterRender) {
  renderer = fixAbsolutURL(renderer, pageContext);
  final HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
  StringBuffer url = new StringBuffer(response.encodeURL(renderer));
  if (url.toString().indexOf(WebConstants.SESSIONID_KEY) == -1)
  {
    if (forceSessionId)
    {
        final String sessionId = pageContext.getSession().getId();
        url.append(";" + WebConstants.SESSIONID_KEY + "=" + sessionId);     
    }
  }
  url.append("?" + WebConstants.IMG_PARAM + "=" + sessionKey);
  url.append(WebConstants.AMPERSAND + WebConstants.WIDTH_PARAM + "=" + width);
  url.append(WebConstants.AMPERSAND + WebConstants.HEIGHT_PARAM + "=" + height);
  if (removeAfterRender)
  {
    url.append(WebConstants.AMPERSAND + WebConstants.REMOVE_AFTER_RENDERING + "=true");   
  }
  url.append(WebConstants.AMPERSAND + "iehack=" + MIMEExtensionHelper.getExtensionForMimeType(mimeType));
  return url.toString();   
  }
 
  /**
   * To enable further server side scriptings on JSP output the session ID is
   * always encoded into the image URL even if cookies are enabled on the client side.
   */
  protected String getImgURL()
  {
    return buildImgURL(renderer, pageContext, sessionKey, width, height, mimeType, forceSessionId, removeAfterRender);
  }

  public ChartRenderingInfo getRenderingInfo() throws CewolfException
  {
    return chartImageDefinition.getRenderingInfo();
  }

  protected String getMimeType()
  {
    return mimeType;
  }

  protected void reset()
  {
    this.mimeType = DEFAULT_MIME_TYPE;
    // as of a weird JSP compiler in resin a reused tag's attribute is only set if
    // it changes. So width and height may not be unset to ensure correct values.
    int lHeight = this.height;
    int lWidth = this.width;
    int lTimeout = this.timeout;
    super.reset();
    this.height = lHeight;
    this.width = lWidth;
    this.timeout = lTimeout;
  }

  public void enableMapping()
  {
    setUsemap("#" + chartId);
  }

  public String getChartId()
  {
    return getChartid();
  }

  public void setChartid (String id)
  {
    this.chartId = id;
  }

  public String getChartid()
  {
    return chartId;
  }

  public void setRenderer (String renderer)
  {
    this.renderer = renderer;
  }

  protected String getRenderer()
  {
    return this.renderer;
  }

  public int getWidth()
  {
    return this.width;
  }

  public int getHeight()
  {
    return height;
  }

  /**
   * Sets the mimeType.
   *
   * @param mimeType The mimeType to set
   */
  public void setMime (String mimeType)
  {
    this.mimeType = mimeType;
  }

  /**
   * @see de.laures.cewolf.taglib.html.AbstractHTMLBaseTag#getTagName()
   */
  protected String getTagName()
  {
    if (WebConstants.MIME_SVG.equals(mimeType))
    {
      return TAG_NAME_SVG;
    }
    return super.getTagName();
  }

  /**
   * @see de.laures.cewolf.taglib.html.AbstractHTMLBaseTag#writeAttributes(Writer)
   */
  public void writeAttributes (Writer wr)
  {
    super.writeAttributes(wr);
    if (WebConstants.MIME_SVG.equals(mimeType))
    {
      try
      {
        appendAttributeDeclaration(wr, "http://www.adobe.com/svg/viewer/install/", "PLUGINSPAGE");
      }
      catch (IOException ioex)
      {
        ioex.printStackTrace();
      }
    }
  }

  /**
   * @return Returns the timeout.
   */
  public int getTimeout()
  {
    return timeout;
  }
  /**
   * @param timeout The timeout to set.
   */
  public void setTimeout (int timeout)
  {
    this.timeout = timeout;
  }
}
TOP

Related Classes of de.laures.cewolf.taglib.tags.ChartImgTag

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.