From 01a16339be5353a99b218f1eefc327e446d31f3f Mon Sep 17 00:00:00 2001 From: Maxime Sinclair Date: Tue, 29 Mar 2011 18:15:53 +0200 Subject: [PATCH] New servlet structure with a dedicated class UmlDiagramService to produce diagram from a compressed source. --- content/WEB-INF/web.xml | 14 ++++- .../plantuml/servlet/DiagramResponse.java | 54 +++++++++++++++++++ .../plantuml/servlet/ImgServlet.java | 27 ++++++++++ .../plantuml/servlet/PlantUmlServlet.java | 4 +- .../plantuml/servlet/SvgServlet.java | 27 ++++++++++ .../plantuml/servlet/UmlDiagramService.java | 46 ++++++++++++++++ 6 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 src/net/sourceforge/plantuml/servlet/DiagramResponse.java create mode 100644 src/net/sourceforge/plantuml/servlet/ImgServlet.java create mode 100644 src/net/sourceforge/plantuml/servlet/SvgServlet.java create mode 100644 src/net/sourceforge/plantuml/servlet/UmlDiagramService.java diff --git a/content/WEB-INF/web.xml b/content/WEB-INF/web.xml index e24540f..1ffbfe6 100644 --- a/content/WEB-INF/web.xml +++ b/content/WEB-INF/web.xml @@ -9,6 +9,14 @@ welcome net.sourceforge.plantuml.servlet.Welcome + + imgservlet + net.sourceforge.plantuml.servlet.ImgServlet + + + svgservlet + net.sourceforge.plantuml.servlet.SvgServlet + welcome @@ -23,9 +31,13 @@ /form - plantumlservlet + imgservlet /img/* + + svgservlet + /svg/* + plantumlservlet /start/* diff --git a/src/net/sourceforge/plantuml/servlet/DiagramResponse.java b/src/net/sourceforge/plantuml/servlet/DiagramResponse.java new file mode 100644 index 0000000..889187d --- /dev/null +++ b/src/net/sourceforge/plantuml/servlet/DiagramResponse.java @@ -0,0 +1,54 @@ +package net.sourceforge.plantuml.servlet; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; +import net.sourceforge.plantuml.SourceStringReader; +import net.sourceforge.plantuml.StringUtils; + + +class DiagramResponse { + private HttpServletResponse response; + private FileFormat format; + private static final Map contentType; + static { + Map map = new HashMap(); + map.put(FileFormat.PNG, "image/png"); + map.put(FileFormat.SVG, "image/svg+xml"); + contentType = Collections.unmodifiableMap(map); + } + + DiagramResponse( HttpServletResponse r, FileFormat f) { + response = r; + format = f; + } + + + void sendDiagram( String uml) throws IOException { + long today = System.currentTimeMillis(); + if ( StringUtils.isDiagramCacheable( uml)) { + // Add http headers to force the browser to cache the image + response.addDateHeader( "Expires", today + 31536000000L); + // today + 1 year + response.addDateHeader( "Last-Modified", 1261440000000L); + // 2009 dec 22 constant date in the past + response.addHeader( "Cache-Control", "public"); + } + response.setContentType( getContentType()); + SourceStringReader reader = new SourceStringReader( uml); + reader.generateImage( response.getOutputStream(), new FileFormatOption(format)); + response.flushBuffer(); + } + + private String getContentType() { + return contentType.get( format); + } + + +} diff --git a/src/net/sourceforge/plantuml/servlet/ImgServlet.java b/src/net/sourceforge/plantuml/servlet/ImgServlet.java new file mode 100644 index 0000000..8587b72 --- /dev/null +++ b/src/net/sourceforge/plantuml/servlet/ImgServlet.java @@ -0,0 +1,27 @@ +package net.sourceforge.plantuml.servlet; + +import net.sourceforge.plantuml.FileFormat; + +/* + * SVG servlet of the webapp. + * TODO. + */ +@SuppressWarnings("serial") +public class ImgServlet extends UmlDiagramService { + + @Override + public String getSource( String uri) { + String[] result = uri.split("/img/", 2); + if (result.length != 2) { + return ""; + } else { + return result[1]; + } + } + + @Override + FileFormat getOutputFormat() { + return FileFormat.PNG; + } + +} diff --git a/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java b/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java index ee0a45c..104890e 100644 --- a/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java +++ b/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java @@ -13,6 +13,8 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.SourceStringReader; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.code.Transcoder; @@ -166,7 +168,7 @@ public class PlantUmlServlet extends HttpServlet { } response.setContentType("image/png"); SourceStringReader reader = new SourceStringReader(uml); - reader.generateImage(response.getOutputStream()); + reader.generateImage(response.getOutputStream(), new FileFormatOption(FileFormat.PNG)); response.flushBuffer(); } diff --git a/src/net/sourceforge/plantuml/servlet/SvgServlet.java b/src/net/sourceforge/plantuml/servlet/SvgServlet.java new file mode 100644 index 0000000..cad7317 --- /dev/null +++ b/src/net/sourceforge/plantuml/servlet/SvgServlet.java @@ -0,0 +1,27 @@ +package net.sourceforge.plantuml.servlet; + +import net.sourceforge.plantuml.FileFormat; + +/* + * SVG servlet of the webapp. + * TODO. + */ +@SuppressWarnings("serial") +public class SvgServlet extends UmlDiagramService { + + @Override + public String getSource( String uri) { + String[] result = uri.split("/svg/", 2); + if (result.length != 2) { + return ""; + } else { + return result[1]; + } + } + + @Override + FileFormat getOutputFormat() { + return FileFormat.SVG; + } + +} diff --git a/src/net/sourceforge/plantuml/servlet/UmlDiagramService.java b/src/net/sourceforge/plantuml/servlet/UmlDiagramService.java new file mode 100644 index 0000000..764fa65 --- /dev/null +++ b/src/net/sourceforge/plantuml/servlet/UmlDiagramService.java @@ -0,0 +1,46 @@ +package net.sourceforge.plantuml.servlet; + +import java.io.IOException; +import java.net.URLDecoder; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.code.Transcoder; +import net.sourceforge.plantuml.code.TranscoderUtil; + +@SuppressWarnings("serial") +public abstract class UmlDiagramService extends HttpServlet { + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + + // build the uml source from the compressed request parameter + String text = URLDecoder.decode( getSource( request.getRequestURI()), "UTF-8"); + Transcoder transcoder = getTranscoder(); + text = transcoder.decode(text); + StringBuilder plantUmlSource = new StringBuilder(); + plantUmlSource.append("@startuml\n"); + plantUmlSource.append( text); + if (text.endsWith("\n") == false) { + plantUmlSource.append("\n"); + } + plantUmlSource.append("@enduml"); + final String uml = plantUmlSource.toString(); + + // generate the response + DiagramResponse dr = new DiagramResponse( response, getOutputFormat()); + dr.sendDiagram( uml); + } + + abstract public String getSource( String uri); + abstract FileFormat getOutputFormat(); + + private Transcoder getTranscoder() { + return TranscoderUtil.getDefaultTranscoder(); + } +}