Mercurial > hg > digilib-old
changeset 189:7bb273c51e88
Servlet version 1.18b3 new Raster servlet
- new Raster servlet for rastering SVG graphics into PNG
- new SVGFile class and accompanying changes
- fixes in DocuDirectory for better handling of other file classes
author | robcast |
---|---|
date | Fri, 28 Nov 2003 13:19:37 +0100 |
parents | dde98eaf97ff |
children | 9efc5eca878f |
files | servlet/src/digilib/servlet/DigilibConfiguration.java servlet/src/digilib/servlet/Raster.java servlet/src/digilib/servlet/Scaler.java |
diffstat | 3 files changed, 302 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/servlet/src/digilib/servlet/DigilibConfiguration.java Fri Nov 28 13:19:37 2003 +0100 +++ b/servlet/src/digilib/servlet/DigilibConfiguration.java Fri Nov 28 13:19:37 2003 +0100 @@ -48,8 +48,7 @@ * denyImgFileName: image file to send if access is denied. <br>baseDirs: * array of base directories in order of preference (prescaled versions first). * <br>useAuth: use authentication information. <br>authConfPath: - * authentication configuration file. <br>authOp: AuthOps instance for - * authentication. <br>... <br> + * authentication configuration file.<br>... <br> * * @author casties * @@ -237,7 +236,7 @@ DOMConfigurator.configure(logConfPath); // directory cache String[] bd = (String[]) getValue("basedir-list"); - int[] fcs = { FileOps.CLASS_IMAGE, FileOps.CLASS_TEXT }; + int[] fcs = { FileOps.CLASS_IMAGE, FileOps.CLASS_TEXT, FileOps.CLASS_SVG }; DocuDirCache dirCache; if (getAsBoolean("use-mapping")) { // with mapping file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servlet/src/digilib/servlet/Raster.java Fri Nov 28 13:19:37 2003 +0100 @@ -0,0 +1,296 @@ +/* + * Raster -- Servlet for displaying rasterized SVG graphics + * + * Digital Image Library servlet components + * + * Copyright (C) 2003 Robert Casties (robcast@mail.berlios.de) + * + * 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; either version 2 of the License, or (at your option) + * any later version. + * + * Please read license.txt for the full details. A copy of the GPL may be found + * at http://www.gnu.org/copyleft/lgpl.html 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., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Created on 25.11.2003 by casties + */ + +package digilib.servlet; + +import java.awt.geom.Rectangle2D; +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.SAXParserFactory; + +import org.apache.batik.dom.svg.SAXSVGDocumentFactory; +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.apache.batik.util.XMLResourceDescriptor; +import org.apache.log4j.Logger; +import org.w3c.dom.svg.SVGDocument; +import org.w3c.dom.svg.SVGSVGElement; + +import digilib.auth.AuthOps; +import digilib.io.DocuDirCache; +import digilib.io.FileOpException; +import digilib.io.FileOps; +import digilib.io.SVGFile; + +/** + * Servlet for displaying SVG graphics + * + * @author casties + * + */ +public class Raster extends HttpServlet { + + /** Servlet version */ + public static String servletVersion = "0.1b1"; + /** DigilibConfiguration instance */ + DigilibConfiguration dlConfig = null; + /** general logger */ + Logger logger = Logger.getLogger("digilib.raster"); + /** AuthOps instance */ + AuthOps authOp; + /** DocuDirCache instance */ + DocuDirCache dirCache; + /** SVG document factory */ + SAXSVGDocumentFactory docFactory; + + /** use authentication */ + boolean useAuthentication = false; + + /* + * (non-Javadoc) + * + * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig) + */ + public void init(ServletConfig config) throws ServletException { + super.init(config); + + System.out.println( + "***** Digital Image Library SVG Render Servlet (version " + + servletVersion + + ") *****"); + + // get our ServletContext + ServletContext context = config.getServletContext(); + // see if there is a Configuration instance + dlConfig = + (DigilibConfiguration) context.getAttribute( + "digilib.servlet.configuration"); + if (dlConfig == null) { + // create new Configuration + try { + dlConfig = new DigilibConfiguration(config); + context.setAttribute("digilib.servlet.configuration", dlConfig); + } catch (Exception e) { + throw new ServletException(e); + } + } + // say hello in the log file + logger.info( + "***** Digital Image Library SVG Render Servlet (version " + + servletVersion + + ") *****"); + + // set our AuthOps + useAuthentication = dlConfig.getAsBoolean("use-authorization"); + authOp = (AuthOps) dlConfig.getValue("servlet.auth.op"); + // DocuDirCache instance + dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache"); + // parser name as a String (I hate you for not using JAXP, Batik!) + String parserName = null; + try { + // try the proper JAXP way + parserName = SAXParserFactory.newInstance().newSAXParser().getXMLReader().getClass().getName(); + } catch (Exception e) { + // fall back to Batik's hack + parserName = XMLResourceDescriptor.getXMLParserClassName(); + } + logger.debug("parser name: "+parserName); + docFactory = new SAXSVGDocumentFactory(parserName); + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + protected void doGet( + HttpServletRequest request, + HttpServletResponse response) + throws ServletException, IOException { + // create new request with defaults + DigilibRequest dlReq = new DigilibRequest(); + // set with request parameters + dlReq.setWithRequest(request); + // add DigilibRequest to ServletRequest + request.setAttribute("digilib.servlet.request", dlReq); + // do the processing + processRequest(request, response); + } + + /* + */ + protected void doPost( + HttpServletRequest request, + HttpServletResponse response) + throws ServletException, IOException { + // create new request with defaults + DigilibRequest dlReq = new DigilibRequest(); + // set with request parameters + dlReq.setWithRequest(request); + // add DigilibRequest to ServletRequest + request.setAttribute("digilib.servlet.request", dlReq); + // do the processing + processRequest(request, response); + } + + protected void processRequest( + HttpServletRequest request, + HttpServletResponse response) + throws ServletException, IOException { + + logger.debug("request: "+request.getQueryString()); + // time for benchmarking + long startTime = System.currentTimeMillis(); + + /* + * request parameters + */ + DigilibRequest dlRequest = + (DigilibRequest) request.getAttribute("digilib.servlet.request"); + + // destination image width + int paramDW = dlRequest.getAsInt("dw"); + // destination image height + int paramDH = dlRequest.getAsInt("dh"); + // relative area x_offset (0..1) + float paramWX = dlRequest.getAsFloat("wx"); + // relative area y_offset + float paramWY = dlRequest.getAsFloat("wy"); + // relative area width (0..1) + double paramWW = dlRequest.getAsFloat("ww"); + // relative area height + double paramWH = dlRequest.getAsFloat("wh"); + + try { + + /* + * find the file to load/send + */ + + // get PathInfo + String loadPathName = dlRequest.getFilePath(); + // find the file(set) + SVGFile fileToLoad = + (SVGFile) dirCache.getFile( + loadPathName, + dlRequest.getAsInt("pn"), + FileOps.CLASS_SVG); + if (fileToLoad == null) { + throw new FileOpException( + "File " + + loadPathName + + "(" + + dlRequest.getAsString("pn") + + ") not found."); + } + + /* + * read the SVG document + */ + + // read the document + SVGDocument doc = + docFactory.createSVGDocument( + fileToLoad.getFile().toURI().toString()); + // extract the SVG root + SVGSVGElement svgroot = doc.getRootElement(); + // get document width and height + float imgWidth = svgroot.getWidth().getBaseVal().getValue(); + float imgHeight = svgroot.getHeight().getBaseVal().getValue(); + + /* + * set up the transcoder + */ + + // create a PNG transcoder + PNGTranscoder transcoder = new PNGTranscoder(); + // create the transcoder input + //InputStream is = new FileInputStream(fileToLoad.getFile()); + TranscoderInput input = new TranscoderInput(doc); + logger.info("Loading: " + fileToLoad.getFile()); + // create the transcoder output + TranscoderOutput output = + new TranscoderOutput(response.getOutputStream()); + // output is image/png + response.setContentType("image/png"); + + // area of interest + Rectangle2D aoi = + new Rectangle2D.Double( + paramWX * imgWidth, + paramWY * imgHeight, + paramWW * imgWidth, + paramWH * imgHeight); + transcoder.addTranscodingHint(PNGTranscoder.KEY_AOI, aoi); + + // destination image dimensions + if (paramDW > 0) { + transcoder.addTranscodingHint( + PNGTranscoder.KEY_WIDTH, + new Float(paramDW)); + } + if (paramDH > 0) { + transcoder.addTranscodingHint( + PNGTranscoder.KEY_HEIGHT, + new Float(paramDH)); + } + + /* + * transcode + */ + + transcoder.transcode(input, output); + + logger.info( + "Done in " + (System.currentTimeMillis() - startTime) + "ms"); + + /* + * error handling + */ + + } catch (FileOpException e) { + logger.error("ERROR: File IO Error: ", e); + try { + ServletOps.htmlMessage("ERROR: File IO Error: " + e, response); + } catch (Exception ex) { + } // so we don't get a loop + } catch (TranscoderException e) { + logger.error("ERROR: SVG encoder error: ", e); + try { + ServletOps.htmlMessage( + "ERROR: SVG encoder error: " + e, + response); + } catch (Exception ex) { + } // so we don't get a loop + } + + } + +}
--- a/servlet/src/digilib/servlet/Scaler.java Fri Nov 28 13:19:37 2003 +0100 +++ b/servlet/src/digilib/servlet/Scaler.java Fri Nov 28 13:19:37 2003 +0100 @@ -59,7 +59,7 @@ public class Scaler extends HttpServlet { // digilib servlet version (for all components) - public static final String dlVersion = "1.18b2"; + public static final String dlVersion = "1.18b3"; // logger for accounting requests Logger accountlog = Logger.getLogger("account.request"); @@ -107,7 +107,7 @@ //TCTool tctool = new TCTool(); System.out.println( - "***** Digital Image Library Servlet (version " + "***** Digital Image Library Image Scaler Servlet (version " + dlVersion + ") *****"); @@ -127,7 +127,7 @@ } } // say hello in the log file - logger.info("***** Digital Image Library Servlet (version " + logger.info("***** Digital Image Library Image Scaler Servlet (version " + dlVersion + ") *****"); // set our AuthOps @@ -181,6 +181,7 @@ throws ServletException, IOException { accountlog.debug("request: "+request.getQueryString()); + logger.debug("request: "+request.getQueryString()); // time for benchmarking long startTime = System.currentTimeMillis();