Commit Diff


commit - 2ce6b28b221bde671d1b0e3fa38206b5236dba70
commit + d62310388e98a99aed5c22aa3299b846ceddf559
blob - dd2bef600f4c05da08c6afa9fff7c21240ed815e
blob + 6171455cc05eefce4e5f3eb6bdf5012cc4582b09
--- src/org/snipsnap/net/CommentStoreServlet.java
+++ src/org/snipsnap/net/CommentStoreServlet.java
@@ -100,6 +100,9 @@ public class CommentStoreServlet extends HttpServlet {
   }
 
   private String sanitize(String parameter) {
-    return parameter.split("[\r\n]")[0];
+    if(parameter != null) {
+      return parameter.split("[\r\n]")[0];
+    }
+    return parameter;
   }
 }
blob - 252e4c2e2683dc139feb79112e0636ed1302ed48
blob + c00c0a82f7c408644783f1da0699f8331cf940da
--- src/org/snipsnap/net/LoginServlet.java
+++ src/org/snipsnap/net/LoginServlet.java
@@ -95,7 +95,10 @@ public class LoginServlet extends HttpServlet {
   }
 
   private String sanitize(String parameter) {
-    return parameter.split("[\r\n]")[0];
+    if(parameter != null) {
+      return parameter.split("[\r\n]")[0];
+    }
+    return parameter;
   }
 
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
blob - cfddca598f3dbee5d31ec023db4c6a485c66a2fd
blob + 4919d42a1ff71b796379ee57aeb708361755bf54
--- src/org/snipsnap/net/NewUserServlet.java
+++ src/org/snipsnap/net/NewUserServlet.java
@@ -148,6 +148,9 @@ public class NewUserServlet extends HttpServlet {
   }
 
   private String sanitize(String parameter) {
-    return parameter.split("[\r\n]")[0];
+    if(parameter != null) {
+      return parameter.split("[\r\n]")[0];
+    }
+    return parameter;
   }
 }
blob - 6a77592a4284ad8a3b3d9c1ff50a98f9531ea313
blob + cd7665ca1cf187acd6b0d93afa804cd9b1f131d5
--- src/org/snipsnap/net/RenderServlet.java
+++ src/org/snipsnap/net/RenderServlet.java
@@ -27,16 +27,24 @@ package org.snipsnap.net;
 import org.radeox.util.Service;
 import org.snipsnap.graph.ContentRenderer;
 import org.snipsnap.graph.HorizontalContentRenderer;
+import org.snipsnap.graph.builder.StringTreeBuilder;
+import org.snipsnap.graph.builder.TreeBuilder;
+import org.snipsnap.graph.context.UrlContext;
+import org.snipsnap.graph.renderer.HtmlMapRenderer;
+import org.snipsnap.graph.renderer.Renderer;
+import snipsnap.api.app.Application;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.util.Collections;
-import java.util.Map;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.io.IOException;
+import java.util.Map;
 
 /**
  * Render special content added to a temporary store. This is used for the
@@ -47,14 +55,30 @@ import java.io.IOException;
  * @version $Id$
  */
 public class RenderServlet extends HttpServlet {
+  private final static String RENDER_ID = "__render_id";
+
   private static Map contentMap = Collections.synchronizedMap(new HashMap());
-  private Map handlers = new HashMap();
+  private static Map handlers = new HashMap();
   private final static ContentRenderer DEFAULT_HANDLER = new HorizontalContentRenderer();
 
   /**
+   * Initialize the render servlet by loading the content handlers.
+   */
+  static {
+    Iterator contentRenderer =
+            Service.providers(org.snipsnap.graph.ContentRenderer.class);
+    while (contentRenderer.hasNext()) {
+      ContentRenderer renderer = (ContentRenderer) contentRenderer.next();
+      handlers.put(renderer.getName(), renderer);
+    }
+  }
+
+
+  /**
    * Add content to the temporary store and return an id that can be used to select
    * the content later. The graph macro uses this to store the graph description
    * here which is then handed over to the rendering handler to translate to an image.
+   * The id will persist until content for the same name is added.
    * <p/>
    * Example:
    * &lt;img src="/exec/render?id=XXXX&handler=YYYY"/&gt;
@@ -62,40 +86,59 @@ public class RenderServlet extends HttpServlet {
    * @param content the textual content to be rendered
    * @return an it to add to the url for retrieving the rendered content
    */
-  public static String addContent(String content) {
-    String key = null;
+  public static String addContent(String name, String content) {
+    Application app = Application.get();
+    String baseId = RENDER_ID + name;
+    String renderId = null;
     synchronized (contentMap) {
+      String key = null;
       int add = 0;
-      int hashCode = content.hashCode();
       do {
-        key = String.valueOf(hashCode + add++);
-      } while (contentMap.containsKey(key));
-      contentMap.put(key, content);
+        key = String.valueOf(baseId + add++);
+      } while (app.getObject(key) != null);
+      // store a dummy to ensure the id is taken
+      app.storeObject(key, "");
+      // store content with corresponding id
+      renderId = Integer.toHexString(key.hashCode());
+      contentMap.put(renderId, content);
     }
-    return key;
+    return renderId;
   }
 
-  /**
-   * Initialize the render servlet by loading the content handlers.
-   *
-   * @throws ServletException
-   */
-  public void init() throws ServletException {
-    Iterator contentRenderer =
-            Service.providers(org.snipsnap.graph.ContentRenderer.class);
-    while (contentRenderer.hasNext()) {
-      ContentRenderer renderer = (ContentRenderer) contentRenderer.next();
-      handlers.put(renderer.getName(), renderer);
+  public static String getImageMap(String renderId, String handler) {
+    HtmlMapRenderer mapRenderer = new HtmlMapRenderer();
+    TreeBuilder builder = new StringTreeBuilder((String) contentMap.get(renderId));
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+    Renderer renderer = ((ContentRenderer) handlers.get(handler)).getRenderer();
+    if (null != renderer) {
+      UrlContext context = new UrlContext(renderId, renderer);
+      mapRenderer.render(builder.build(), out, context);
+      try {
+        out.flush();
+        out.close();
+      } catch (IOException e) {
+        // ignore as this is unlikely to happen
+        e.printStackTrace();
+      }
+      try {
+        return out.toString(Application.get().getConfiguration().getEncoding());
+      } catch (UnsupportedEncodingException e) {
+        return out.toString();
+      }
+    } else {
+      // we can't render the image map, so return comment
+      return "<!-- image map not possible, missing renderer for handler: " + handler + " -->";
     }
   }
 
+
   public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws IOException, ServletException {
 
     String handler = request.getParameter("handler");
     String id = request.getParameter("id");
     String content = (String) contentMap.get(id);
-    contentMap.remove(id);
 
     ContentRenderer renderer = (ContentRenderer) handlers.get(handler);
     if (null == renderer) {
blob - ccda977a3cdadfd903feedc6a7a00fc43b69d367
blob + 1b3faeea18196d44917f6f498b87830c665d161e
--- src/org/snipsnap/net/SnipEditServlet.java
+++ src/org/snipsnap/net/SnipEditServlet.java
@@ -26,17 +26,15 @@ package org.snipsnap.net;
 
 import org.radeox.util.Encoder;
 import org.radeox.util.logging.Logger;
-import snipsnap.api.app.Application;
-import snipsnap.api.container.Components;
 import org.snipsnap.security.AccessController;
-import snipsnap.api.snip.Snip;
-import snipsnap.api.snip.SnipSpace;
-import snipsnap.api.label.Label;
-import snipsnap.api.label.Labels;
 import org.snipsnap.snip.label.TypeLabel;
-import org.snipsnap.user.Permissions;
 import org.snipsnap.user.Roles;
 import org.snipsnap.user.Security;
+import snipsnap.api.app.Application;
+import snipsnap.api.container.Components;
+import snipsnap.api.label.Label;
+import snipsnap.api.label.Labels;
+import snipsnap.api.snip.Snip;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -182,6 +180,9 @@ public class SnipEditServlet extends HttpServlet {
   }
 
   private String sanitize(String parameter) {
-    return parameter.split("[\r\n]")[0];
+    if (parameter != null) {
+      return parameter.split("[\r\n]")[0];
+    }
+    return parameter;
   }
 }
blob - f2f7b94c1adb26059ae36ae8f78dbf6ea5b823c2
blob + 98681ba8a7d60edabf3b3c90ca8404eef28263f3
--- src/org/snipsnap/net/SnipStoreServlet.java
+++ src/org/snipsnap/net/SnipStoreServlet.java
@@ -25,19 +25,13 @@
 package org.snipsnap.net;
 
 import org.radeox.util.logging.Logger;
-import snipsnap.api.app.Application;
-import snipsnap.api.config.Configuration;
-import snipsnap.api.container.Components;
 import org.snipsnap.net.filter.MultipartWrapper;
 import org.snipsnap.security.AccessController;
-import snipsnap.api.snip.Snip;
 import org.snipsnap.snip.SnipFormatter;
+import org.snipsnap.user.AuthenticationService;
 import snipsnap.api.snip.SnipLink;
 import snipsnap.api.snip.SnipSpace;
 import snipsnap.api.snip.SnipSpaceFactory;
-import org.snipsnap.user.AuthenticationService;
-import org.snipsnap.user.Permissions;
-import org.snipsnap.user.Security;
 import snipsnap.api.user.User;
 
 import javax.servlet.RequestDispatcher;
@@ -160,6 +154,9 @@ public class SnipStoreServlet extends HttpServlet {
   }
 
   private String sanitize(String parameter) {
-    return parameter.split("[\r\n]")[0];
+    if (parameter != null) {
+      return parameter.split("[\r\n]")[0];
+    }
+    return parameter;
   }
 }