From d7ecaaa992d8addb5efbc9d7cc16e756f350b009 Mon Sep 17 00:00:00 2001 From: Maxime Sinclair Date: Tue, 9 Jul 2013 15:44:36 +0200 Subject: [PATCH] Refactoring of the Proxy service --- .../plantuml/servlet/ProxyServlet.java | 120 ++++++++++++++++++ .../sourceforge/plantuml/servlet/package.html | 4 +- src/main/webapp/WEB-INF/web.xml | 6 +- 3 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/sourceforge/plantuml/servlet/ProxyServlet.java diff --git a/src/main/java/net/sourceforge/plantuml/servlet/ProxyServlet.java b/src/main/java/net/sourceforge/plantuml/servlet/ProxyServlet.java new file mode 100644 index 0000000..55ed241 --- /dev/null +++ b/src/main/java/net/sourceforge/plantuml/servlet/ProxyServlet.java @@ -0,0 +1,120 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * Project Info: http://plantuml.sourceforge.net + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ +package net.sourceforge.plantuml.servlet; + +import java.io.IOException; +import java.net.URL; +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 HTTPClient.CookieModule; +import HTTPClient.HTTPConnection; +import HTTPClient.HTTPResponse; +import HTTPClient.ModuleException; +import HTTPClient.ParseException; + +import net.sourceforge.plantuml.FileFormat; +import net.sourceforge.plantuml.FileFormatOption; +import net.sourceforge.plantuml.SourceStringReader; + +/* + * Proxy servlet of the webapp. + * This servlet retrieves the diagram source of a web resource (web html page) + * and renders it. + */ +@SuppressWarnings("serial") +public class ProxyServlet extends HttpServlet { + + private static final Pattern proxyPattern = Pattern.compile("/\\w+/proxy/((\\d+)/)?((\\w+)/)?(http://.*)"); + private String format; + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + + final String uri = request.getRequestURI(); + + Matcher proxyMatcher = proxyPattern.matcher(uri); + if (proxyMatcher.matches()) { + String num = proxyMatcher.group(2); // Optional number of the diagram source + format = proxyMatcher.group(4); // Expected format of the generated diagram + String sourceURL = proxyMatcher.group(5); + handleImageProxy(response, num, sourceURL); + } else { + request.setAttribute("net.sourceforge.plantuml.servlet.decoded", "ERROR Invalid proxy syntax : " + uri); + request.removeAttribute("net.sourceforge.plantuml.servlet.encoded"); + + // forward to index.jsp + RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp"); + dispatcher.forward(request, response); + } + } + + private void handleImageProxy(HttpServletResponse response, String num, String source) throws IOException { + SourceStringReader reader = new SourceStringReader(getSource(source)); + int n = num == null ? 0 : Integer.parseInt(num); + + reader.generateImage(response.getOutputStream(), n, new FileFormatOption(getOutputFormat())); + } + + private String getSource( String uri) throws IOException { + CookieModule.setCookiePolicyHandler(null); + + final Pattern p = Pattern.compile("http://[^/]+(/?.*)"); + final Matcher m = p.matcher(uri); + if (m.find() == false) { + throw new IOException(uri); + } + final URL url = new URL(uri); + 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 FileFormat getOutputFormat() { + if (format==null) { + return FileFormat.PNG; + } + if (format.equals("svg")) { + return FileFormat.SVG; + } + if (format.equals("txt")) { + return FileFormat.ATXT; + } + return FileFormat.PNG; + } + +} diff --git a/src/main/java/net/sourceforge/plantuml/servlet/package.html b/src/main/java/net/sourceforge/plantuml/servlet/package.html index b286d4c..c7d8428 100644 --- a/src/main/java/net/sourceforge/plantuml/servlet/package.html +++ b/src/main/java/net/sourceforge/plantuml/servlet/package.html @@ -3,10 +3,10 @@

This package is in charge of the JEE PlantUml Server.

there are 2 kind of servlets in this package :
- Interactive servlets : Welcome, PlantUmlServlet that are in charge of the web pages dedicated to human users.
-- Service servlets : ImgServlet, SvgServlet that only produce a diagram as output.
+- Service servlets : ImgServlet, SvgServlet, AsciiServlet, ProxyServlet that only produce a diagram as output.

Structure of the service part of the PlantUmlServer:
- +

\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 240841c..a50f451 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -27,6 +27,10 @@ asciiservlet net.sourceforge.plantuml.servlet.AsciiServlet + + proxyservlet + net.sourceforge.plantuml.servlet.ProxyServlet + welcome @@ -57,7 +61,7 @@ /start/* - plantumlservlet + proxyservlet /proxy/*