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();
+ }
+}