From 90fe8924f752b467d4a21e47c1ca4915d90932a9 Mon Sep 17 00:00:00 2001 From: Maxime Sinclair Date: Tue, 9 Jul 2013 16:53:45 +0200 Subject: [PATCH] Code formatted, encoded text checked and warning added The old url syntax is announced as deprecated. --- .../plantuml/servlet/PlantUmlServlet.java | 298 +++++++++--------- 1 file changed, 152 insertions(+), 146 deletions(-) diff --git a/src/main/java/net/sourceforge/plantuml/servlet/PlantUmlServlet.java b/src/main/java/net/sourceforge/plantuml/servlet/PlantUmlServlet.java index 7fbfe29..5bc2f27 100644 --- a/src/main/java/net/sourceforge/plantuml/servlet/PlantUmlServlet.java +++ b/src/main/java/net/sourceforge/plantuml/servlet/PlantUmlServlet.java @@ -57,184 +57,190 @@ import HTTPClient.ParseException; * * Modified by Arnaud Roques * Modified by Pablo Lalloni - * Packaged by Maxime Sinclair + * Modified by Maxime Sinclair * */ @SuppressWarnings("serial") public class PlantUmlServlet extends HttpServlet { - private static final Pattern startumlPattern = Pattern.compile("/\\w+/start/(.*)"); + private static final Pattern urlPattern = Pattern.compile(".*/(.*)"); // Last part of the URL + private static final Pattern encodedPattern = Pattern.compile("^[a-zA-Z0-9\\-\\_]+$"); // Format of a compressed diagram + private static final Pattern startumlPattern = Pattern.compile("/\\w+/start/(.*)"); private static final Pattern proxyPattern = Pattern.compile("/\\w+/proxy/((\\d+)/)?((\\w+)/)?(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 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+)/)?((\\w+)/)?(http://.*)"); - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - final String uri = request.getRequestURI(); - Matcher startumlMatcher = startumlPattern.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, uri); - } else if (proxyMatcher.matches()) { - String num = proxyMatcher.group(2); + final String uri = request.getRequestURI(); + Matcher startumlMatcher = startumlPattern.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, uri); + } else if (proxyMatcher.matches()) { + String num = proxyMatcher.group(2); String format = proxyMatcher.group(4); String source = proxyMatcher.group(5); handleImageProxy(response, num, source, format, uri); - } else if (oldStartumlMatcher.matches()) { - String source = oldStartumlMatcher.group(1); - handleImage(response, source, uri); - } else if (oldImageMatcher.matches()) { - String source = oldImageMatcher.group(1); - handleImageDecompress(response, source, uri); - } else if (oldProxyMatcher.matches()) { - String num = oldProxyMatcher.group(2); + } else if (oldStartumlMatcher.matches()) { + System.out.println("PlantUML WARNING This URL syntax is deprecated, please delete the '/uml/' part."); + String source = oldStartumlMatcher.group(1); + handleImage(response, source, uri); + } else if (oldImageMatcher.matches()) { + System.out.println("PlantUML WARNING This URL syntax is deprecated, please delete the '/uml/' part."); + String source = oldImageMatcher.group(1); + handleImageDecompress(response, source, uri); + } else if (oldProxyMatcher.matches()) { + System.out.println("PlantUML WARNING This URL syntax is deprecated, please delete the '/uml/' part."); + String num = oldProxyMatcher.group(2); String format = oldProxyMatcher.group(4); String source = oldProxyMatcher.group(5); handleImageProxy(response, num, source, format, uri); - } else { - doPost(request, response); - } - } + } else { + doPost(request, response); + } + } + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + request.setCharacterEncoding("UTF-8"); + String text = request.getParameter("text"); + String url = request.getParameter("url"); + String encoded = ""; - request.setCharacterEncoding("UTF-8"); - String text = request.getParameter("text"); - String url = request.getParameter("url"); - String encoded = ""; + Transcoder transcoder = getTranscoder(); + // the URL form has been submitted + if (url != null && !url.trim().isEmpty()) { + // Catch the last part of the URL + Matcher m1 = urlPattern.matcher(url); + if (m1.find()) { + // Check it's a valid compressed text + url = m1.group(1); + Matcher m2 = encodedPattern.matcher(url); + if (m2.find()) { + url = m2.group(0); + text = transcoder.decode(url); + } else { + System.out.println("PlantUML ERROR Not a valid compressed string : " + url); + } + } + } + // the Text form has been submitted + if (text != null && !text.trim().isEmpty()) { + encoded = transcoder.encode(text); + } - Transcoder transcoder = getTranscoder(); - // 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); - } - } - // the Text form has been submitted - if (text != null && !text.trim().isEmpty()) { - encoded = transcoder.encode(text); - } + request.setAttribute("net.sourceforge.plantuml.servlet.decoded", text); + request.setAttribute("net.sourceforge.plantuml.servlet.encoded", encoded); - 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); + return; + } - // forward to index.jsp - RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp"); - dispatcher.forward(request, response); - return; - } + private Transcoder getTranscoder() { + return TranscoderUtil.getDefaultTranscoder(); + } - private Transcoder getTranscoder() { - return TranscoderUtil.getDefaultTranscoder(); - } + private void handleImage(HttpServletResponse response, String source, String uri) throws IOException { + source = URLDecoder.decode(source, "UTF-8"); + StringBuilder plantUmlSource = new StringBuilder(); - private void handleImage(HttpServletResponse response, String source, String uri) - 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(), uri); - StringTokenizer tokenizer = new StringTokenizer(source, "/@"); - while (tokenizer.hasMoreTokens()) { - String token = tokenizer.nextToken(); - plantUmlSource.append(token).append("\n"); - } - sendImage(response, plantUmlSource.toString(), uri); + } - } + private void handleImageDecompress(HttpServletResponse response, String source, String uri) throws IOException { + source = URLDecoder.decode(source, "UTF-8"); + Transcoder transcoder = getTranscoder(); + String text2 = transcoder.decode(source); + sendImage(response, text2, uri); + } - private void handleImageDecompress(HttpServletResponse response, - String source, String uri) throws IOException { - source = URLDecoder.decode(source, "UTF-8"); - Transcoder transcoder = getTranscoder(); - String text2 = transcoder.decode(source); - sendImage(response, text2, uri); - } + private void handleImageProxy(HttpServletResponse response, String num, String source, String format, String uri) + throws IOException { + SourceStringReader reader = new SourceStringReader(getContent(source)); + int n = num == null ? 0 : Integer.parseInt(num); - private void handleImageProxy(HttpServletResponse response, String num, - String source, String format, String uri) throws IOException { - SourceStringReader reader = new SourceStringReader( getContent(source)); - int n = num == null ? 0 : Integer.parseInt(num); - reader.generateImage(response.getOutputStream(), n, getFormat(format)); - } - - private FileFormatOption getFormat(String f) { - if (f==null) { - return new FileFormatOption(FileFormat.PNG); - } - if (f.equals("svg")) { - return new FileFormatOption(FileFormat.SVG); - } + } + + private FileFormatOption getFormat(String f) { + if (f == null) { + return new FileFormatOption(FileFormat.PNG); + } + if (f.equals("svg")) { + return new FileFormatOption(FileFormat.SVG); + } if (f.equals("txt")) { return new FileFormatOption(FileFormat.ATXT); } - return new FileFormatOption(FileFormat.PNG); - } - - private void sendImage(HttpServletResponse response, String text, String uri) - throws IOException { - final String uml; - if (text.startsWith("@startuml")) { - uml = text; - } else { - StringBuilder plantUmlSource = new StringBuilder(); - plantUmlSource.append("@startuml\n"); - plantUmlSource.append(text); - if (text.endsWith("\n") == false) { - plantUmlSource.append("\n"); - } - plantUmlSource.append("@enduml"); - uml = plantUmlSource.toString(); - } - // Write the first image to "os" - 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("image/png"); - SourceStringReader reader = new SourceStringReader(uml); - reader.generateImage(response.getOutputStream(), new FileFormatOption(FileFormat.PNG)); - response.flushBuffer(); - } + return new FileFormatOption(FileFormat.PNG); + } - private String getContent(String adress) throws IOException { - // HTTPConnection.setProxyServer("proxy", 8080); - CookieModule.setCookiePolicyHandler(null); + private void sendImage(HttpServletResponse response, String text, String uri) throws IOException { + final String uml; + if (text.startsWith("@startuml")) { + uml = text; + } else { + StringBuilder plantUmlSource = new StringBuilder(); + plantUmlSource.append("@startuml\n"); + plantUmlSource.append(text); + if (text.endsWith("\n") == false) { + plantUmlSource.append("\n"); + } + plantUmlSource.append("@enduml"); + uml = plantUmlSource.toString(); + } + // Write the first image to "os" + 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("image/png"); + SourceStringReader reader = new SourceStringReader(uml); + reader.generateImage(response.getOutputStream(), new FileFormatOption(FileFormat.PNG)); + response.flushBuffer(); + } - 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()); - } - } + private 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()); + } + } }