+ You can enter here a previously generated URL: + + <% if ( !imgurl.isEmpty()) { %> +
+
You can use the following URL:
+
+ <img src="<%=imgurl %>" />
+
+
+
diff --git a/.gitignore b/.gitignore index d90f5b8..7d2c56a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ - +/user.property /WEB-INF/classes -/plantuml.war \ No newline at end of file +/plantuml.war +/.settings diff --git a/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java b/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java index bfc717b..ca77de9 100644 --- a/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java +++ b/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java @@ -1,21 +1,23 @@ package net.sourceforge.plantuml.servlet; import java.io.IOException; -import java.io.PrintWriter; import java.net.URL; import java.net.URLDecoder; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sourceforge.plantuml.SourceStringReader; +import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.code.Transcoder; import net.sourceforge.plantuml.code.TranscoderUtil; + import HTTPClient.CookieModule; import HTTPClient.HTTPConnection; import HTTPClient.HTTPResponse; @@ -32,15 +34,14 @@ import HTTPClient.ParseException; */ public class PlantUmlServlet extends HttpServlet { - private static final Pattern startumlPattern = Pattern - .compile("/\\w+/uml/startuml/(.*)"); - - private static final Pattern imagePattern = Pattern - .compile("/\\w+/uml/image/(.*)"); - - private static final Pattern proxyPattern = Pattern - .compile("/\\w+/uml/proxy/((\\d+)/)?(http://.*)"); + private static final Pattern startumlPattern = Pattern.compile("/\\w+/start/(.*)"); + private static final Pattern imagePattern = Pattern.compile("/\\w+/img/(.*)"); + private static final Pattern proxyPattern = Pattern.compile("/\\w+/proxy/((\\d+)/)?(http://.*)"); + private static final Pattern oldStartumlPattern = Pattern.compile("/\\w+/uml/startuml/(.*)"); + private static final Pattern oldImagePattern = Pattern.compile("/\\w+/uml/image/(.*)"); + private static final Pattern oldProxyPattern = Pattern.compile("/\\w+/uml/proxy/((\\d+)/)?(http://.*)"); + @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { @@ -48,7 +49,9 @@ public class PlantUmlServlet extends HttpServlet { Matcher startumlMatcher = startumlPattern.matcher(uri); Matcher imageMatcher = imagePattern.matcher(uri); Matcher proxyMatcher = proxyPattern.matcher(uri); - + Matcher oldStartumlMatcher = oldStartumlPattern.matcher(uri); + Matcher oldImageMatcher = oldImagePattern.matcher(uri); + Matcher oldProxyMatcher = oldProxyPattern.matcher(uri); if (startumlMatcher.matches()) { String source = startumlMatcher.group(1); handleImage(response, source); @@ -59,79 +62,51 @@ public class PlantUmlServlet extends HttpServlet { String num = proxyMatcher.group(2); String source = proxyMatcher.group(3); handleImageProxy(response, num, source); + } else if (oldStartumlMatcher.matches()) { + String source = oldStartumlMatcher.group(1); + handleImage(response, source); + } else if (oldImageMatcher.matches()) { + String source = oldImageMatcher.group(1); + handleImageDecompress(response, source); + } else if (oldProxyMatcher.matches()) { + String num = oldProxyMatcher.group(2); + String source = oldProxyMatcher.group(3); + handleImageProxy(response, num, source); } else { doPost(request, response); } } @Override - protected void doPost(HttpServletRequest request, HttpServletResponse resp) + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - PrintWriter writer = resp.getWriter(); - writer.print(""); - writer.print("
"); - writer - .print(""); - writer.print(""); - writer.print(""); - writer - .print(""); - writer - .print(""); - writer.print(""); - writer.print(""); - writer - .print("This application provides a servlet which serves images createdby PlantUML.
"); - String text = request.getParameter("text"); String url = request.getParameter("url"); - String encode = ""; + String encoded = ""; Transcoder transcoder = getTranscoder(); - if (url != null) { + // the URL form has been submitted + if ((url != null) && (!url.trim().isEmpty())) { + // TODO Verify the url is correct Pattern p = Pattern.compile(".*/(.*)"); Matcher m = p.matcher(url); if (m.find()) { url = m.group(1); + text = transcoder.decode(url); } - text = transcoder.decode(url); } - writer - .print(""); - writer.print(""); - String host = "http://" + request.getServerName() + ":" - + request.getServerPort(); - String total = host + "/plantuml/uml/image/" + encode; - - writer - .print("
"); - - if (text != null) { - writer.print("");
-
- String urlPart = "\"" + total + "\"";
- writer.print("");
- writer.print("");
- writer.print("<img src=" + urlPart + " >");
- writer.print("
");
-
- writer.print("");
- writer.print("");
- writer.print("");
- }
- writer.print("");
- writer.flush();
+ request.setAttribute("net.sourceforge.plantuml.servlet.decoded", text);
+ request.setAttribute("net.sourceforge.plantuml.servlet.encoded", encoded);
+
+ // forward to index.jsp
+ RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
+ dispatcher.forward(request, response);
}
private Transcoder getTranscoder() {
@@ -162,8 +137,7 @@ public class PlantUmlServlet extends HttpServlet {
private void handleImageProxy(HttpServletResponse response, String num,
String source) throws IOException {
- String s = getContent(source);
- SourceStringReader reader = new SourceStringReader(s);
+ SourceStringReader reader = new SourceStringReader( getContent(source));
int n = num == null ? 0 : Integer.parseInt(num);
// Write the first image to "os"
reader.generateImage(response.getOutputStream(), n);
@@ -175,16 +149,18 @@ public class PlantUmlServlet extends HttpServlet {
plantUmlSource.append("@startuml\n");
plantUmlSource.append(text);
plantUmlSource.append("\n@enduml");
-
- SourceStringReader reader = new SourceStringReader(plantUmlSource
- .toString());
+ final String uml = plantUmlSource.toString();
+ SourceStringReader reader = new SourceStringReader(uml);
// Write the first image to "os"
long today = System.currentTimeMillis();
- 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");
+ 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("image/png");
reader.generateImage(response.getOutputStream());
diff --git a/WEB-INF/web.xml b/WEB-INF/web.xml
index 06353fe..c4f6dbe 100644
--- a/WEB-INF/web.xml
+++ b/WEB-INF/web.xml
@@ -5,11 +5,36 @@
+Sorry, but things didn't work out as planned. +
+This application provides a servlet which serves images created by PlantUML.
+You can use the following URL:
+
+ <img src="<%=imgurl %>" />
+
+
+