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

Reply via email to