You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by et...@apache.org on 2009/02/11 01:39:04 UTC

svn commit: r743180 - in /incubator/shindig/trunk/java: common/src/main/java/org/apache/shindig/common/uri/ gadgets/src/main/java/org/apache/shindig/gadgets/ gadgets/src/main/java/org/apache/shindig/gadgets/render/ gadgets/src/test/java/org/apache/shin...

Author: etnu
Date: Wed Feb 11 00:39:03 2009
New Revision: 743180

URL: http://svn.apache.org/viewvc?rev=743180&view=rev
Log:
Server side patch for SHINDIG-750. Adds support for the 'path' parameter, which is used for relative resolution in requestNavigateTo. This requires container support ensure that when requestNavigateTo(string, string) is called, "path" is passed to the gadget renderer as a query string instead of passing view parameters.


Modified:
    incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/Uri.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java

Modified: incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/Uri.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/Uri.java?rev=743180&r1=743179&r2=743180&view=diff
==============================================================================
--- incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/Uri.java (original)
+++ incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/Uri.java Wed Feb 11 00:39:03 2009
@@ -18,8 +18,8 @@
  */
 package org.apache.shindig.common.uri;
 
-import com.google.common.collect.Maps;
 import com.google.common.base.Objects;
+import com.google.common.collect.Maps;
 
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -132,7 +132,7 @@
    * @return True if the Uri is absolute.
    */
   public boolean isAbsolute() {
-    return scheme != null;
+    return scheme != null && authority != null;
   }
 
   /**

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java?rev=743180&r1=743179&r2=743180&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java Wed Feb 11 00:39:03 2009
@@ -31,96 +31,105 @@
  * actually serving as abstraction over different request types.
  */
 public class GadgetContext {
+  private final GadgetContext delegate;
+
+  public GadgetContext() {
+    this(null);
+  }
+
+  public GadgetContext(GadgetContext delegate) {
+    this.delegate = delegate;
+  }
 
   /**
    * @param name The parameter to get data for.
    * @return The parameter set under the given name, or null.
    */
   public String getParameter(String name) {
-    return null;
+    return delegate == null ? null : delegate.getParameter(name);
   }
 
   /**
    * @return The url for this gadget.
    */
   public URI getUrl() {
-    return null;
+    return delegate == null ? null : delegate.getUrl();
   }
 
   /**
    * @return The module id for this request.
    */
   public int getModuleId() {
-    return 0;
+    return delegate == null ? 0 : delegate.getModuleId();
   }
 
   /**
    * @return The locale for this request.
    */
   public Locale getLocale() {
-    return GadgetSpec.DEFAULT_LOCALE;
+    return delegate == null ? GadgetSpec.DEFAULT_LOCALE : delegate.getLocale();
   }
 
   /**
    * @return The rendering context for this request.
    */
   public RenderingContext getRenderingContext() {
-    return RenderingContext.GADGET;
+    return delegate == null ? RenderingContext.GADGET : delegate.getRenderingContext();
   }
 
   /**
    * @return Whether or not to bypass caching behavior for the current request.
    */
   public boolean getIgnoreCache() {
-    return false;
+    return delegate == null ? false : delegate.getIgnoreCache();
   }
 
   /**
    * @return The container of the current request.
    */
   public String getContainer() {
-    return ContainerConfig.DEFAULT_CONTAINER;
+    return delegate == null ? ContainerConfig.DEFAULT_CONTAINER : delegate.getContainer();
   }
 
   /**
    * @return The host for which the current request is being made.
    */
   public String getHost() {
-    return null;
+    return delegate == null ? null : delegate.getHost();
   }
 
   /**
    * @return The IP Address for the current user.
    */
   public String getUserIp() {
-    return null;
+    return delegate == null ? null : delegate.getUserIp();
   }
 
   /**
    * @return Whether or not to show debug output.
    */
   public boolean getDebug() {
-    return false;
+    return delegate == null ? false : delegate.getDebug();
   }
 
   /**
    * @return Name of view to show
    */
   public String getView() {
-    return GadgetSpec.DEFAULT_VIEW;
+    return delegate == null ? GadgetSpec.DEFAULT_VIEW : delegate.getView();
   }
 
   /**
    * @return The user prefs for the current request.
    */
   public UserPrefs getUserPrefs() {
-    return UserPrefs.EMPTY;
+    return delegate == null ? UserPrefs.EMPTY : delegate.getUserPrefs();
   }
 
   /**
    * @return The token associated with this request
    */
   public SecurityToken getToken() {
-    return null;
+    return delegate == null ? null : delegate.getToken();
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java?rev=743180&r1=743179&r2=743180&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/HtmlRenderer.java Wed Feb 11 00:39:03 2009
@@ -19,6 +19,7 @@
 package org.apache.shindig.gadgets.render;
 
 import org.apache.shindig.common.JsonSerializer;
+import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
@@ -49,14 +50,15 @@
  * Handles producing output markup for a gadget based on the provided context.
  */
 public class HtmlRenderer {
+  public static final String PATH_PARAM = "path";
+  private static final Charset UTF8 = Charset.forName("UTF-8");
+  private static final Logger logger = Logger.getLogger(HtmlRenderer.class.getName());
+
   private final RequestPipeline requestPipeline;
   private final HttpCache httpCache;
   private final PreloaderService preloader;
   private final ContentRewriterRegistry rewriter;
 
-  private static final Charset UTF8 = Charset.forName("UTF-8");
-  private static final Logger logger = Logger.getLogger(HtmlRenderer.class.getName());
-
   /**
    * @param requestPipeline Used for performing the proxy request. Always ignores caching because
    *                        we want to skip preloading when the object is in the cache.
@@ -103,7 +105,21 @@
       if (view.getHref() == null) {
         content = view.getContent();
       } else {
-        UriBuilder uri = new UriBuilder(view.getHref());
+        Uri href = view.getHref();
+        String path = context.getParameter(PATH_PARAM);
+        if (path != null) {
+          try {
+            Uri relative = Uri.parse(path);
+            if (!relative.isAbsolute()) {
+              href = href.resolve(relative);
+            }
+          } catch (IllegalArgumentException e) {
+            // TODO: Spec does not say what to do for an invalid relative path.
+            // Just ignoring for now.
+          }
+        }
+
+        UriBuilder uri = new UriBuilder(href);
         uri.addQueryParameter("lang", context.getLocale().getLanguage());
         uri.addQueryParameter("country", context.getLocale().getCountry());
 

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java?rev=743180&r1=743179&r2=743180&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java Wed Feb 11 00:39:03 2009
@@ -114,6 +114,53 @@
   }
 
   @Test
+  public void renderProxiedRelative() throws Exception {
+    Uri base = EXPECTED_PROXIED_HTML_HREF;
+    final Uri relative = Uri.parse("/some/path?foo=bar");
+    Uri resolved = new UriBuilder(base.resolve(relative))
+      .addQueryParameter("lang", GadgetSpec.DEFAULT_LOCALE.getLanguage())
+      .addQueryParameter("country", GadgetSpec.DEFAULT_LOCALE.getCountry())
+      .toUri();
+
+    HttpRequest request = new HttpRequest(resolved);
+    HttpResponse response = new HttpResponse(PROXIED_HTML_CONTENT);
+
+    pipeline.plainResponses.put(resolved, response);
+
+    Gadget gadget = makeHrefGadget("none");
+    gadget.setContext(new GadgetContext(gadget.getContext()) {
+      @Override
+      public String getParameter(String name) {
+        return name.equals(HtmlRenderer.PATH_PARAM) ? relative.toString() : null;
+      }
+    });
+
+    String content = renderer.render(gadget);
+    assertEquals(PROXIED_HTML_CONTENT, content);
+    assertEquals(response, cache.getResponse(request));
+  }
+
+  @Test
+  public void renderProxiedRelativeBadPath() throws Exception {
+    HttpRequest request = new HttpRequest(EXPECTED_PROXIED_HTML_HREF);
+    HttpResponse response = new HttpResponse(PROXIED_HTML_CONTENT);
+    pipeline.plainResponses.put(EXPECTED_PROXIED_HTML_HREF, response);
+
+    Gadget gadget = makeHrefGadget("none");
+    gadget.setContext(new GadgetContext(gadget.getContext()) {
+      @Override
+      public String getParameter(String name) {
+        return name.equals(HtmlRenderer.PATH_PARAM) ? "$(^)$" : null;
+      }
+    });
+
+    String content = renderer.render(gadget);
+
+    assertEquals(PROXIED_HTML_CONTENT, content);
+    assertEquals(response, cache.getResponse(request));
+  }
+
+  @Test
   public void renderProxiedFromCache() throws Exception {
     HttpRequest request = new HttpRequest(EXPECTED_PROXIED_HTML_HREF);
     HttpResponse response = new HttpResponse(PROXIED_HTML_CONTENT);