import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Graphics2D; import java.awt.Color; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringReader; import java.io.Writer; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.batik.svggen.SVGGraphics2D; import org.apache.batik.dom.GenericDOMImplementation; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.apache.batik.transcoder.image.JPEGTranscoder; import org.apache.batik.transcoder.image.PNGTranscoder; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.w3c.dom.Document; import org.w3c.dom.DOMImplementation; import org.w3c.dom.svg.SVGDocument; public class ArtMaker extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Cache-Control", "post-check=0, pre-check=0"); String agent = request.getHeader("User-Agent").toLowerCase(); /* netscape chokes on Pragma no-cache so only send it to explorer */ if (agent.indexOf("explorer") > -1){ response.setHeader("Pragma", "no-cache"); } response.setHeader("Expires", "Thu, 01 Dec 1994 16:00:00 GMT"); /* * Get parameters from HTML form */ String picType = request.getParameter( "picType" ); String colorScheme = request.getParameter( "scheme" ); String imgType = request.getParameter( "imgType" ); Artist mondrian = null; int width; int height; int palette; if (picType.equals("landscape")) { width = 400; height = 300; } else if (picType.equals("portrait")) { width = 200; height = 300; } else { width = 250; height = 250; } palette = (colorScheme.equals("bright")) ? Artist.BRIGHT : Artist.PASTEL; /* * Create an artist with the appropriate parameters */ mondrian = new Artist( width, height, palette ); /* * Create an SVG document */ DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation(); String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; Document document = domImpl.createDocument(svgNS, "svg", null); /* * And an SVG 2D graphics environment... */ SVGGraphics2D svgGraphicsEnvironment = new SVGGraphics2D(document); svgGraphicsEnvironment.setSVGCanvasSize( new Dimension(width+10, height+10) ); /* * into which the artist paints the picture */ mondrian.paint( svgGraphicsEnvironment ); /* * Stream out SVG to a byte array using UTF-8 * character to byte encoding; using CSS style * attributes (second parameter to "stream") */ ByteArrayOutputStream baos = new ByteArrayOutputStream( 8192 ); Writer svgOutput = new OutputStreamWriter(baos, "UTF-8"); svgGraphicsEnvironment.stream(svgOutput, true); if (imgType.equals("svg")) { emitSVG( request, response, baos.toString() ); } else { /* determine if PNG is accepted */ if (request.getHeader("Accept").indexOf("png") >= 0) { emitPNG( request, response, baos.toString() ); } else { emitJPG( request, response, baos.toString() ); } } } catch (Exception e) { PrintWriter out = response.getWriter(); response.setContentType("text/html"); out.println(""); out.println(""); out.println("
Unable to create painting.
"); out.println(""); e.printStackTrace(out); out.println(""); out.println(""); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doPost( request, response ); } public void emitSVG( HttpServletRequest request, HttpServletResponse response, String svgString ) { response.setContentType( "image/svg+xml" ); try { response.getWriter().write( svgString ); response.getWriter().flush(); } catch (Exception e) { e.printStackTrace(); } } public void emitJPG( HttpServletRequest request, HttpServletResponse response, String svgString ) { response.setContentType("image/jpeg"); JPEGTranscoder t = new JPEGTranscoder(); t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8)); TranscoderInput input = new TranscoderInput( new StringReader(svgString) ); try { TranscoderOutput output = new TranscoderOutput(response.getOutputStream()); t.transcode(input, output); response.getOutputStream().close(); } catch (Exception e) { e.printStackTrace(); } } public void emitPNG ( HttpServletRequest request, HttpServletResponse response, String svgString ) { response.setContentType("image/png"); PNGTranscoder t = new PNGTranscoder(); TranscoderInput input = new TranscoderInput( new StringReader(svgString) ); try { TranscoderOutput output = new TranscoderOutput(response.getOutputStream()); t.transcode(input, output); response.getOutputStream().close(); } catch (Exception e) { e.printStackTrace(); } } }