From 9ca32c8d220ba0b480bfe5bbac5d9aa10d1809e8 Mon Sep 17 00:00:00 2001 From: maximesinclair Date: Fri, 7 Feb 2014 00:08:25 +0100 Subject: [PATCH] [FEATURE] Draft of the Check Syntax service --- .../plantuml/servlet/CheckSyntaxServlet.java | 74 +++++++++++++++++++ .../plantuml/servlet/DiagramResponse.java | 9 +++ src/main/webapp/WEB-INF/web.xml | 8 ++ .../plantuml/servlet/TestCheck.java | 44 +++++++++++ 4 files changed, 135 insertions(+) create mode 100644 src/main/java/net/sourceforge/plantuml/servlet/CheckSyntaxServlet.java create mode 100644 src/test/java/net/sourceforge/plantuml/servlet/TestCheck.java diff --git a/src/main/java/net/sourceforge/plantuml/servlet/CheckSyntaxServlet.java b/src/main/java/net/sourceforge/plantuml/servlet/CheckSyntaxServlet.java new file mode 100644 index 0000000..dd096c2 --- /dev/null +++ b/src/main/java/net/sourceforge/plantuml/servlet/CheckSyntaxServlet.java @@ -0,0 +1,74 @@ +/* ======================================================================== + * 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 javax.imageio.IIOException; +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.servlet.utility.UmlExtractor; + +/* + * Check servlet of the webapp. + * This servlet checks the syntax of the diagram and send a report in TEXT format. + */ +@SuppressWarnings("serial") +public class CheckSyntaxServlet extends HttpServlet { + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + + // build the UML source from the compressed request parameter + String uml = UmlExtractor.getUmlSource(getSource(request.getRequestURI())); + + // generate the response + DiagramResponse dr = new DiagramResponse(response, getOutputFormat()); + try { + dr.sendCheck(uml); + } catch (IIOException iioe) { + // Browser has closed the connection, do nothing + } + dr = null; + } + + public String getSource(String uri) { + String[] result = uri.split("/check/", 2); + if (result.length != 2) { + return ""; + } else { + return result[1]; + } + } + + public FileFormat getOutputFormat() { + return FileFormat.UTXT; + } + +} diff --git a/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java b/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java index c69785b..e2e0a5e 100644 --- a/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java +++ b/src/main/java/net/sourceforge/plantuml/servlet/DiagramResponse.java @@ -35,6 +35,7 @@ import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.SourceStringReader; import net.sourceforge.plantuml.StringUtils; +import net.sourceforge.plantuml.core.DiagramDescription; import net.sourceforge.plantuml.servlet.utility.NullOutputStream; /** @@ -81,6 +82,14 @@ class DiagramResponse { } } + void sendCheck(String uml) throws IOException { + response.setContentType(getContentType()); + SourceStringReader reader = new SourceStringReader(uml); + DiagramDescription desc = reader.generateDiagramDescription( + new NullOutputStream(), new FileFormatOption(FileFormat.PNG, false)); + PrintWriter httpOut = response.getWriter(); + httpOut.print(desc.getDescription()); + } private void addHeaderForCache() { long today = System.currentTimeMillis(); // Add http headers to force the browser to cache the image diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 1523ca5..4155298 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -38,6 +38,10 @@ mapservlet net.sourceforge.plantuml.servlet.MapServlet + + + checkservlet + net.sourceforge.plantuml.servlet.CheckSyntaxServlet @@ -68,6 +72,10 @@ asciiservlet /txt/* + + checkservlet + /check/* + mapservlet /map/* diff --git a/src/test/java/net/sourceforge/plantuml/servlet/TestCheck.java b/src/test/java/net/sourceforge/plantuml/servlet/TestCheck.java new file mode 100644 index 0000000..88ca721 --- /dev/null +++ b/src/test/java/net/sourceforge/plantuml/servlet/TestCheck.java @@ -0,0 +1,44 @@ +package net.sourceforge.plantuml.servlet; + +import com.meterware.httpunit.GetMethodWebRequest; +import com.meterware.httpunit.WebConversation; +import com.meterware.httpunit.WebRequest; +import com.meterware.httpunit.WebResponse; + +public class TestCheck extends WebappTestCase { + /** + * Verifies the generation of a syntax check for the following sample: + * Bob -> Alice : hello + */ + public void testCorrectSequenceDiagram() throws Exception { + WebConversation conversation = new WebConversation(); + WebRequest request = new GetMethodWebRequest(getServerUrl() + + "check/" + TestUtils.SEQBOB); + WebResponse response = conversation.getResource(request); + // Analyze response + // Verifies the Content-Type header + assertEquals("Response content type is not TEXT PLAIN", "text/plain", response.getContentType()); + assertEquals("Response character set is not UTF-8", "UTF-8", response.getCharacterSet()); + // Get the content, check its first characters and verify its size + String checkResult = response.getText(); + assertTrue("Response content is not starting with (2 participants)", + checkResult.startsWith("(2 participants)")); + int checkLen = checkResult.length(); + assertTrue(checkLen > 1); + assertTrue(checkLen < 100); + } + + /** + * Check the syntax of an invalid sequence diagram : + * Bob - + */ + public void testWrongDiagramSyntax() throws Exception { + WebConversation conversation = new WebConversation(); + WebRequest request = new GetMethodWebRequest(getServerUrl() + "check/SyfFKj050000"); + WebResponse response = conversation.getResource(request); + // Analyze response + String checkResult = response.getText(); + assertTrue("Response is not an error", checkResult.startsWith("(Error)")); + } + +}