diff --git a/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java b/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java index b476b6d..bfc717b 100644 --- a/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java +++ b/WEB-INF/src/net/sourceforge/plantuml/servlet/PlantUmlServlet.java @@ -32,171 +32,184 @@ import HTTPClient.ParseException; */ public class PlantUmlServlet extends HttpServlet { - private static final Pattern startumlPattern = Pattern - .compile("/\\w+/uml/startuml/(.*)"); + private static final Pattern startumlPattern = Pattern + .compile("/\\w+/uml/startuml/(.*)"); - private static final Pattern imagePattern = Pattern - .compile("/\\w+/uml/image/(.*)"); + 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 proxyPattern = Pattern + .compile("/\\w+/uml/proxy/((\\d+)/)?(http://.*)"); - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { - final String uri = request.getRequestURI(); - Matcher startumlMatcher = startumlPattern.matcher(uri); - Matcher imageMatcher = imagePattern.matcher(uri); - Matcher proxyMatcher = proxyPattern.matcher(uri); + final String uri = request.getRequestURI(); + Matcher startumlMatcher = startumlPattern.matcher(uri); + Matcher imageMatcher = imagePattern.matcher(uri); + Matcher proxyMatcher = proxyPattern.matcher(uri); - if (startumlMatcher.matches()) { - String source = startumlMatcher.group(1); - handleImage(response, source); - } else if (imageMatcher.matches()) { - String source = imageMatcher.group(1); - handleImageDecompress(response, source); - } else if (proxyMatcher.matches()) { - String num = proxyMatcher.group(2); - String source = proxyMatcher.group(3); - handleImageProxy(response, num, source); - } else { - doPost(request, response); - } - } + if (startumlMatcher.matches()) { + String source = startumlMatcher.group(1); + handleImage(response, source); + } else if (imageMatcher.matches()) { + String source = imageMatcher.group(1); + handleImageDecompress(response, source); + } else if (proxyMatcher.matches()) { + String num = proxyMatcher.group(2); + String source = proxyMatcher.group(3); + handleImageProxy(response, num, source); + } else { + doPost(request, response); + } + } - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse resp) - throws ServletException, IOException { + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse resp) + 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.
"); + 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 text = request.getParameter("text"); + String url = request.getParameter("url"); + String encode = ""; - Transcoder transcoder = getTranscoder(); - if (url != null) { - Pattern p = Pattern.compile(".*/(.*)"); - Matcher m = p.matcher(url); - if (m.find()) { - url = m.group(1); - } - text = transcoder.decode(url); - } - writer.print(""); - writer.print(""); + Transcoder transcoder = getTranscoder(); + if (url != null) { + Pattern p = Pattern.compile(".*/(.*)"); + Matcher m = p.matcher(url); + if (m.find()) { + url = m.group(1); + } + text = transcoder.decode(url); + } + writer + .print("
"); + writer.print(""); - String host = "http://" + request.getServerName()+ ":" + request.getServerPort(); - String total = host + "/plantuml/uml/image/" + encode; + String host = "http://" + request.getServerName() + ":" + + request.getServerPort(); + String total = host + "/plantuml/uml/image/" + encode; - writer.print("
"); + writer + .print(""); - if (text != null) { - writer.print(""); + if (text != null) { + writer.print("
");
- String urlPart = "\"" + total + "\"";
- writer.print("");
- writer.print("");
- writer.print("<img src=" + urlPart + " >");
- 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(); - } + writer.print(""); + writer.print(""); + writer.print(""); + } + writer.print(""); + writer.flush(); + } private Transcoder getTranscoder() { return TranscoderUtil.getDefaultTranscoder(); } - - - private void handleImage(HttpServletResponse response, String source) - throws IOException { - source = URLDecoder.decode(source, "UTF-8"); - StringBuilder plantUmlSource = new StringBuilder(); - StringTokenizer tokenizer = new StringTokenizer(source, "/@"); - while (tokenizer.hasMoreTokens()) { - String token = tokenizer.nextToken(); - plantUmlSource.append(token).append("\n"); - } - sendImage(response, plantUmlSource.toString()); + private void handleImage(HttpServletResponse response, String source) + throws IOException { + source = URLDecoder.decode(source, "UTF-8"); + StringBuilder plantUmlSource = new StringBuilder(); - } + StringTokenizer tokenizer = new StringTokenizer(source, "/@"); + while (tokenizer.hasMoreTokens()) { + String token = tokenizer.nextToken(); + plantUmlSource.append(token).append("\n"); + } + sendImage(response, plantUmlSource.toString()); - private void handleImageDecompress(HttpServletResponse response, - String source) throws IOException { - source = URLDecoder.decode(source, "UTF-8"); - Transcoder transcoder = getTranscoder(); - String text2 = transcoder.decode(source); - sendImage(response, text2); - } + } - private void handleImageProxy(HttpServletResponse response, String num, - String source) throws IOException { - String s = getContent(source); - SourceStringReader reader = new SourceStringReader(s); - int n = num == null ? 0 : Integer.parseInt(num); - // Write the first image to "os" - reader.generateImage(response.getOutputStream(), n); - } + private void handleImageDecompress(HttpServletResponse response, + String source) throws IOException { + source = URLDecoder.decode(source, "UTF-8"); + Transcoder transcoder = getTranscoder(); + String text2 = transcoder.decode(source); + sendImage(response, text2); + } - private void sendImage(HttpServletResponse response, String text) - throws IOException { - StringBuilder plantUmlSource = new StringBuilder(); - plantUmlSource.append("@startuml\n"); - plantUmlSource.append(text); - plantUmlSource.append("\n@enduml"); + private void handleImageProxy(HttpServletResponse response, String num, + String source) throws IOException { + String s = getContent(source); + SourceStringReader reader = new SourceStringReader(s); + int n = num == null ? 0 : Integer.parseInt(num); + // Write the first image to "os" + reader.generateImage(response.getOutputStream(), n); + } - SourceStringReader reader = new SourceStringReader(plantUmlSource - .toString()); - // Write the first image to "os" - response.setContentType("image/png"); - reader.generateImage(response.getOutputStream()); - response.flushBuffer(); - } + private void sendImage(HttpServletResponse response, String text) + throws IOException { + StringBuilder plantUmlSource = new StringBuilder(); + plantUmlSource.append("@startuml\n"); + plantUmlSource.append(text); + plantUmlSource.append("\n@enduml"); - public String getContent(String adress) throws IOException { - // HTTPConnection.setProxyServer("proxy", 8080); - CookieModule.setCookiePolicyHandler(null); + SourceStringReader reader = new SourceStringReader(plantUmlSource + .toString()); + // 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"); + response.setContentType("image/png"); + reader.generateImage(response.getOutputStream()); - final Pattern p = Pattern.compile("http://[^/]+(/?.*)"); - final Matcher m = p.matcher(adress); - if (m.find() == false) { - throw new IOException(adress); - } - final URL url = new URL(adress); - final HTTPConnection httpConnection = new HTTPConnection(url); - try { - final HTTPResponse resp = httpConnection.Get(m.group(1)); - return resp.getText(); - } catch (ModuleException e) { - throw new IOException(e.toString()); - } catch (ParseException e) { - throw new IOException(e.toString()); - } - } + response.flushBuffer(); + } + + public String getContent(String adress) throws IOException { + // HTTPConnection.setProxyServer("proxy", 8080); + CookieModule.setCookiePolicyHandler(null); + + final Pattern p = Pattern.compile("http://[^/]+(/?.*)"); + final Matcher m = p.matcher(adress); + if (m.find() == false) { + throw new IOException(adress); + } + final URL url = new URL(adress); + final HTTPConnection httpConnection = new HTTPConnection(url); + try { + final HTTPResponse resp = httpConnection.Get(m.group(1)); + return resp.getText(); + } catch (ModuleException e) { + throw new IOException(e.toString()); + } catch (ParseException e) { + throw new IOException(e.toString()); + } + } } \ No newline at end of file