MaxSem has uploaded a new change for review. https://gerrit.wikimedia.org/r/178970
Change subject: Initial commit ...................................................................... Initial commit Change-Id: I94c007ee876049083d875d2eb2ae44e8b53ce9c8 --- A .gitignore A WebContent/META-INF/MANIFEST.MF A WebContent/WEB-INF/web.xml A src/jsesh/Server/PngRenderer.java A src/jsesh/Server/Renderer.java A src/jsesh/Server/RenderingServlet.java A src/jsesh/Server/RequestInfo.java A src/jsesh/Server/SvgRenderer.java 8 files changed, 194 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/hierator refs/changes/70/178970/1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f343987 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.jar +*.class +build diff --git a/WebContent/META-INF/MANIFEST.MF b/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml new file mode 100644 index 0000000..af4db60 --- /dev/null +++ b/WebContent/WEB-INF/web.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> + <display-name>Hierator</display-name> +</web-app> diff --git a/src/jsesh/Server/PngRenderer.java b/src/jsesh/Server/PngRenderer.java new file mode 100644 index 0000000..4a19df8 --- /dev/null +++ b/src/jsesh/Server/PngRenderer.java @@ -0,0 +1,24 @@ +package jsesh.Server; + +import javax.imageio.ImageIO; +import java.io.*; +import java.awt.image.* ; +import jsesh.mdcDisplayer.draw.*; + +public class PngRenderer implements Renderer { + + @Override + public String getContentType() { + return "image/png"; + } + + @Override + public byte[] render(String text, int size) throws Exception { + MDCDrawingFacade drawing = new MDCDrawingFacade(); + drawing.setCadratHeight(size); + BufferedImage img = drawing.createImage(text); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + ImageIO.write(img, "png", stream); + return stream.toByteArray(); + } +} diff --git a/src/jsesh/Server/Renderer.java b/src/jsesh/Server/Renderer.java new file mode 100644 index 0000000..f555779 --- /dev/null +++ b/src/jsesh/Server/Renderer.java @@ -0,0 +1,6 @@ +package jsesh.Server; + +public interface Renderer { + String getContentType(); + byte[] render(String text, int size) throws Exception; +} diff --git a/src/jsesh/Server/RenderingServlet.java b/src/jsesh/Server/RenderingServlet.java new file mode 100644 index 0000000..4d8df37 --- /dev/null +++ b/src/jsesh/Server/RenderingServlet.java @@ -0,0 +1,107 @@ +package jsesh.Server; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.IllegalArgumentException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Servlet implementation class RenderingServlet + */ +@WebServlet("/") +public class RenderingServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public RenderingServlet() { + super(); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + protected Renderer makeRenderer(String format) throws IllegalArgumentException { + if (format.equals("png")) { + return new PngRenderer(); + } else if (format.equals("svg")) { + return new SvgRenderer(); + } + throw new IllegalArgumentException("Unrecognized output format: " + format); + } + + protected RequestInfo parseRequest(HttpServletRequest request) throws Exception { + // Remove leading slash + String[] parts = request.getServletPath().substring(1).split("/"); + if (parts.length == 0) { + throw new Exception("No text to render specified"); + } + String format = parts[0]; + String text = ""; + int size = 38; + int index = 1; + if (parts.length > 1 && parts[1].matches("^\\d+px$")) { + size = Integer.parseInt(parts[1].replace("px", "")); + index++; + } + String[] hieroParts = new String[parts.length - index]; + System.arraycopy(parts, index, hieroParts, 0, hieroParts.length); + String delim = ""; + for (String s : hieroParts) { + text = text + delim + s; + delim = "/"; + } + if (text.length() == 0) { + text = request.getParameter("text"); + } + text = java.net.URLDecoder.decode(text, "UTF-8"); + System.out.println(text); + + return new RequestInfo(format, text, size); + } + + protected String exceptionToString(Exception ex) { + StringWriter sw = new StringWriter(); + ex.printStackTrace(new PrintWriter(sw)); + return sw.toString(); + } + + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { + try { + response.setContentType("text/plain"); // For exceptions + RequestInfo info = parseRequest(request); + Renderer renderer = makeRenderer(info.format); + long time = System.currentTimeMillis(); + byte[] image = renderer.render(info.text, info.size); + time = System.currentTimeMillis() - time; + response.setContentType(renderer.getContentType()); + response.getOutputStream().write(image); + response.setHeader("X-Processing-Time", Long.toString(time)); + } catch (Exception ex) { + response.getOutputStream().println(exceptionToString(ex)); + + int status = ex instanceof jsesh.mdc.MDCSyntaxError + ? HttpServletResponse.SC_BAD_REQUEST + : HttpServletResponse.SC_INTERNAL_SERVER_ERROR; + response.setStatus(status); + } + } +} diff --git a/src/jsesh/Server/RequestInfo.java b/src/jsesh/Server/RequestInfo.java new file mode 100644 index 0000000..f1a8510 --- /dev/null +++ b/src/jsesh/Server/RequestInfo.java @@ -0,0 +1,13 @@ +package jsesh.Server; + +public final class RequestInfo { + public final String format; + public final String text; + public final int size; + + public RequestInfo(String format, String text, int size) { + this.format = format; + this.text = text; + this.size = size; + } +} diff --git a/src/jsesh/Server/SvgRenderer.java b/src/jsesh/Server/SvgRenderer.java new file mode 100644 index 0000000..df3ab51 --- /dev/null +++ b/src/jsesh/Server/SvgRenderer.java @@ -0,0 +1,34 @@ +package jsesh.Server; + +import java.awt.geom.Rectangle2D; +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; + +import org.qenherkhopeshef.graphics.svg.SVGGraphics2D; + +import jsesh.mdcDisplayer.draw.MDCDrawingFacade; +import jsesh.utils.DoubleDimensions; + +public class SvgRenderer implements Renderer { + + @Override + public String getContentType() { + return "image/svg+xml"; + } + + @Override + public byte[] render(String text, int size) throws Exception { + MDCDrawingFacade facade = new MDCDrawingFacade(); + facade.setCadratHeight(size); + Rectangle2D dims = facade.getBounds(text, 0, 0); + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + Writer writer = new OutputStreamWriter(stream); + SVGGraphics2D g = new SVGGraphics2D(writer, new DoubleDimensions(dims.getWidth(), dims.getHeight())); + facade.draw(text, g, 0, 0); + g.dispose(); + return stream.toByteArray(); + } + +} -- To view, visit https://gerrit.wikimedia.org/r/178970 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I94c007ee876049083d875d2eb2ae44e8b53ce9c8 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/services/hierator Gerrit-Branch: master Gerrit-Owner: MaxSem <[email protected]> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
