/*
* $Id: SVGFilter.java,v 1.9 2008/11/05 16:40:02 laddi Exp $
* Created on 18.7.2004 by Tryggvi Larusson
*
* Copyright (C) 2004-2005 Idega Software hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf.
* Use is subject to license terms.
*/
package com.idega.graphics.filter;
import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* <p>
* Filter that acts as a renderer of SVG files and uses Batik to render either a PNG or JPEG image.<br>
* This filter is mapped by default on urls with the patterns *.psvg and *.jsvg , and the default behaviour is to try
* to render the image out to PNG even if the browser accepts viewing svg.
* </p>
* Last modified: $Date: 2008/11/05 16:40:02 $ by $Author: laddi $
*
* @author <a href="mailto:tryggvil@idega.com">Tryggvi Larusson</a>
* @version $Revision: 1.9 $
*/
public class SVGFilter implements Filter {
public static final String FORMAT_PNG = "png";
public static final String FORMAT_SVG = "svg";
public static final String FORMAT_JPEG = "jpg";
public static final String BATIK_USERAGENT_START="Batik";
public static final String JAVA_USERAGENT_START="Java";
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
Logger.getLogger(this.getClass().getName()).info("[idegaWebApp] : Starting SVGFilter");
}
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if (req instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String outputFormat = getOutputFormatForClient(request);
if(outputFormat.equals(FORMAT_SVG)){
//just bypass this filter to do the default handing:
response.setContentType("image/svg+xml");
chain.doFilter(req,res);
response.setContentType("image/svg+xml");
}
else{
//else wrap the response:
SVGFilterResponseWrapper wrappedResponse = new SVGFilterResponseWrapper(response,request,outputFormat);
chain.doFilter(req, wrappedResponse);
wrappedResponse.finishResponse();
}
}
}
/**
* @param req
* @return
*/
private String getOutputFormatForClient(HttpServletRequest request) {
// TODO implement better client detection
//String userAgent = request.getHeader("User-agent");
String accept = request.getHeader("Accept");
/*Enumeration enumeration = request.getHeaderNames();
System.out.println("SVGFilter: Printing out headers:");
while (enum.hasMoreElements()) {
String header = (String) enum.nextElement();
System.out.println("Header: "+header+": "+request.getHeader(header));
}*/
if(accept.indexOf("svg")!=-1){
//if(true){
//if(userAgent.startsWith(BATIK_USERAGENT_START)){
//Special case for not rendering out to png when Batik itself is fetching the file.
return FORMAT_SVG;
}
//else if(userAgent.startsWith(JAVA_USERAGENT_START)){
//Special case for not rendering out to png when Batik itself is fetching the file.
// return FORMAT_SVG;
//}
/*else if(accept.indexOf("png")!=-1){
return FORMAT_PNG;
}
else{
return FORMAT_JPEG;
}*/
return FORMAT_PNG;
}
}