Author: zhoresh
Date: Mon Jun 21 21:51:14 2010
New Revision: 956714

URL: http://svn.apache.org/viewvc?rev=956714&view=rev
Log:
Adding a response rewriter that can remove base tag from html content
http://codereview.appspot.com/1630042/show

Added:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriterTest.java

Added: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java?rev=956714&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java
 Mon Jun 21 21:51:14 2010
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.shindig.gadgets.rewrite;
+
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import java.util.logging.Logger;
+
+/**
+ * Simple rewriter that deletes the base tag from the html document.
+ */
+public class BaseTagRemoverRewriter implements GadgetRewriter, 
ResponseRewriter {
+  private static Logger logger = 
Logger.getLogger(BaseTagRemoverRewriter.class.getName());
+
+  public void rewrite(Gadget gadget, MutableContent mc) {
+    Document doc = mc.getDocument();
+
+    NodeList list = doc.getElementsByTagName("base");
+    for (int i = 0; i < list.getLength(); i++) {
+      Element baseElement = (Element) list.item(i);
+      baseElement.getParentNode().removeChild(baseElement);
+
+      if (baseElement.hasAttribute("href")) {
+        logger.fine("Removing base tag pointing to: "
+                    + baseElement.getAttribute("href") + "for gadget: "
+                    + gadget.getContext().getUrl().toString());
+      }
+    }
+
+    mc.documentChanged();
+  }
+
+  public void rewrite(HttpRequest request, HttpResponseBuilder response) {
+    if (RewriterUtils.isHtml(request, response)) {
+      Gadget context = DomWalker.makeGadget(request);
+      rewrite(context, response);
+    }
+  }
+}
\ No newline at end of file

Added: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriterTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriterTest.java?rev=956714&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriterTest.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriterTest.java
 Mon Jun 21 21:51:14 2010
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.shindig.gadgets.rewrite;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.apache.shindig.gadgets.parse.ParseModule;
+import org.apache.shindig.gadgets.parse.caja.CajaHtmlParser;
+import static org.junit.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test case for BaseTagRemoverRewriter.
+ */
+public class BaseTagRemoverRewriterTest {
+  BaseTagRemoverRewriter rewriter;
+
+  CajaHtmlParser parser;
+  ParseModule.DOMImplementationProvider domImpl;
+
+  @Before
+  public void setUp() {
+    rewriter = new BaseTagRemoverRewriter();
+    domImpl = new ParseModule.DOMImplementationProvider();
+    parser = new CajaHtmlParser(domImpl.get());
+  }
+
+  @Test
+  public void testRemoveBaseTag() throws Exception {
+    String content = "<html><head><base href='http://www.ppq.com/'>"
+                     + "</head><body>"
+                     + "<img src='/img1.png'>" 
+                     + "</body></html>";
+    String expected = "<html><head>"
+                     + "</head><body>"
+                     + "<img src=\"/img1.png\">" 
+                     + "</body></html>";
+
+    HttpRequest req = new HttpRequest(Uri.parse("http://www.google.com/";));
+    HttpResponse resp = new HttpResponseBuilder()
+        .setHttpStatusCode(200)
+        .setHeader("Content-Type", "text/html")
+        .setResponse(content.getBytes())
+        .create();
+    HttpResponseBuilder builder = new HttpResponseBuilder(parser, resp);
+
+    rewriter.rewrite(req, builder);
+
+    assertEquals(StringUtils.deleteWhitespace(expected),
+                 StringUtils.deleteWhitespace(builder.getContent()));
+  }
+
+  @Test
+  public void testNoBaseTag() throws Exception {
+    String content = "<html><head>"
+                     + "</head><body>"
+                     + "<img src='/img1.png'>"
+                     + "</body></html>";
+    String expected = "<html><head>"
+                     + "</head><body>"
+                     + "<img src=\"/img1.png\">"
+                     + "</body></html>";
+
+    HttpRequest req = new HttpRequest(Uri.parse("http://www.google.com/";));
+    HttpResponse resp = new HttpResponseBuilder()
+        .setHttpStatusCode(200)
+        .setHeader("Content-Type", "text/html")
+        .setResponse(content.getBytes())
+        .create();
+    HttpResponseBuilder builder = new HttpResponseBuilder(parser, resp);
+
+    rewriter.rewrite(req, builder);
+
+    assertEquals(StringUtils.deleteWhitespace(expected),
+                 StringUtils.deleteWhitespace(builder.getContent()));
+  }
+
+  @Test
+  public void testContentTypeString() throws Exception {
+    String content = "Hello world. My name is gagan<html><head>"
+                     + "<base href='http://hello.com/'></head><body>"
+                     + "<img src='/img1.png'>"
+                     + "</body></html>";
+    String expected = "Hello world. My name is gagan<html><head>"
+                     + "<base href='http://hello.com/'></head><body>"
+                     + "<img src='/img1.png'>"
+                     + "</body></html>";
+
+    HttpRequest req = new HttpRequest(Uri.parse("http://www.google.com/";));
+    HttpResponse resp = new HttpResponseBuilder()
+        .setHttpStatusCode(200)
+        .setHeader("Content-Type", "text/plain")
+        .setResponse(content.getBytes())
+        .create();
+    HttpResponseBuilder builder = new HttpResponseBuilder(parser, resp);
+
+    rewriter.rewrite(req, builder);
+
+    assertEquals(StringUtils.deleteWhitespace(expected),
+                 StringUtils.deleteWhitespace(builder.getContent()));
+  }
+
+  @Test
+  public void testContentTypeXml() throws Exception {
+    String content = "Hello world. My name is gagan<html><head>"
+                     + "<base href='http://hello.com/'></head><body>"
+                     + "<img src='/img1.png'>"
+                     + "</body></html>";
+    String expected = "Hello world. My name is gagan<html><head>"
+                     + "<base href='http://hello.com/'></head><body>"
+                     + "<img src='/img1.png'>"
+                     + "</body></html>";
+
+    HttpRequest req = new HttpRequest(Uri.parse("http://www.google.com/";));
+    HttpResponse resp = new HttpResponseBuilder()
+        .setHttpStatusCode(200)
+        .setHeader("Content-Type", "text/xml")
+        .setResponse(content.getBytes())
+        .create();
+    HttpResponseBuilder builder = new HttpResponseBuilder(parser, resp);
+
+    rewriter.rewrite(req, builder);
+
+    assertEquals(StringUtils.deleteWhitespace(expected),
+                 StringUtils.deleteWhitespace(builder.getContent()));
+  }
+}


Reply via email to