You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by li...@apache.org on 2010/06/02 11:05:02 UTC

svn commit: r950443 [4/7] - in /shindig/branches/2.0.x: ./ config/ content/samplecontainer/ content/samplecontainer/examples/ content/samplecontainer/examples/ActivityStreams/ content/sampledata/ extras/src/main/java/org/apache/shindig/extras/ extras/s...

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java Wed Jun  2 09:04:51 2010
@@ -35,6 +35,7 @@ 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.rewrite.ResponseRewriter;
 import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageIOOutputter;
 import org.apache.shindig.gadgets.rewrite.image.BaseOptimizer.ImageOutputter;
 import org.apache.shindig.gadgets.uri.UriCommon.Param;
@@ -45,7 +46,6 @@ import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -59,8 +59,15 @@ import javax.imageio.ImageWriter;
  * <p>Security Note: Uses the Sanselan library to parse image content and metadata to avoid security
  * issues in the ImageIO library. Uses ImageIO for output.
  */
-public class BasicImageRewriter implements ImageRewriter {
+public class BasicImageRewriter implements ResponseRewriter {
 
+  static final String
+      CONTENT_TYPE_AND_EXTENSION_MISMATCH =
+        "Content is not an image but file extension asserts it is";
+  static final String
+      CONTENT_TYPE_AND_MIME_MISMATCH =
+          "Content is not an image but mime type asserts it is";
+    
   private static final String CONTENT_TYPE_IMAGE_PNG = "image/png";
   /** Returned as the output message if a huge image is submitted to be scaled */
   private static final String RESIZE_IMAGE_TOO_LARGE = "The image is too large to resize";
@@ -68,21 +75,15 @@ public class BasicImageRewriter implemen
   private static final String RESIZE_OUTPUT_FORMAT = "png";
 
   private static final String CONTENT_LENGTH = "Content-Length";
+
   /** Parameter used to request image rendering quality */
-  public static final String PARAM_RESIZE_QUALITY = Param.RESIZE_QUALITY.getKey();
+  private static final String PARAM_RESIZE_QUALITY = Param.RESIZE_QUALITY.getKey();
   /** Parameter used to request image width change */
-  public static final String PARAM_RESIZE_WIDTH = Param.RESIZE_WIDTH.getKey();
+  private static final String PARAM_RESIZE_WIDTH = Param.RESIZE_WIDTH.getKey();
   /** Parameter used to request image height change */
-  public static final String PARAM_RESIZE_HEIGHT = Param.RESIZE_HEIGHT.getKey();
+  private static final String PARAM_RESIZE_HEIGHT = Param.RESIZE_HEIGHT.getKey();
   /** Parameter used to request resizing will not expand image */
-  public static final String PARAM_NO_EXPAND = Param.NO_EXPAND.getKey();
-
-  public static final String
-      CONTENT_TYPE_AND_EXTENSION_MISMATCH =
-        "Content is not an image but file extension asserts it is";
-  public static final String
-      CONTENT_TYPE_AND_MIME_MISMATCH =
-          "Content is not an image but mime type asserts it is";
+  private static final String PARAM_NO_EXPAND = Param.NO_EXPAND.getKey();
 
   private static final int DEFAULT_QUALITY = 100;
   private static final int BITS_PER_BYTE = 8;
@@ -98,21 +99,16 @@ public class BasicImageRewriter implemen
 
   private final OptimizerConfig config;
 
-  private final AtomicLong totalSourceImageSize = new AtomicLong();
-  private final AtomicLong totalRewrittenImageBytes = new AtomicLong();
-
   @Inject
   public BasicImageRewriter(OptimizerConfig config) {
     this.config = config;
   }
 
-  public HttpResponse rewrite(HttpRequest request, HttpResponse response) {
-    if (request == null || response == null)
-      return response;
+  public void rewrite(HttpRequest request, HttpResponseBuilder response) {
+    if (request == null || response == null) return;
     
     Uri uri = request.getUri();
-    if (null == uri)
-      return response;
+    if (null == uri) return;
     
     try {
       // Check resizing
@@ -123,28 +119,29 @@ public class BasicImageRewriter implemen
 
       // If the path or MIME type don't match, continue
       if (!isSupportedContent(response) && !isImage(uri)) {
-        return response;
+        return;
       }
       if (!isUsableParameter(requestedWidth) || !isUsableParameter(requestedHeight) ||
           !isUsableParameter(resizeQuality)) {
-        return response;
+        return;
       }
 
       // Content header checking is fast so this is fine to do for every response.
       ImageFormat imageFormat = Sanselan
-          .guessFormat(new ByteSourceInputStream(response.getResponse(), uri.getPath()));
+          .guessFormat(new ByteSourceInputStream(response.getContentBytes(), uri.getPath()));
 
       if (imageFormat == ImageFormat.IMAGE_FORMAT_UNKNOWN) {
-        return enforceUnreadableImageRestrictions(uri, response);
+        enforceUnreadableImageRestrictions(uri, response);
+        return;
       }
 
       // Don't handle very small images, but check after parsing format to
       // detect attacks.
       if (response.getContentLength() < config.getMinThresholdBytes()) {
-        return response;
+        return;
       }
 
-      ImageInfo imageInfo = Sanselan.getImageInfo(response.getResponse(), uri.getPath());
+      ImageInfo imageInfo = Sanselan.getImageInfo(response.getContentBytes(), uri.getPath());
       
       boolean noExpand = "1".equals(request.getParam(PARAM_NO_EXPAND));
       if (noExpand &&
@@ -156,20 +153,17 @@ public class BasicImageRewriter implemen
 
       boolean isOversizedImage = isImageTooLarge(imageInfo);
       if (isResizeRequested && isOversizedImage) {
-        HttpResponseBuilder rejectedResponseBuilder = new HttpResponseBuilder()
-            .setHttpStatusCode(HttpResponse.SC_FORBIDDEN)
-            .setResponseString(RESIZE_IMAGE_TOO_LARGE);
-        return rejectedResponseBuilder.create();
+        errorResponse(response, HttpResponse.SC_FORBIDDEN, RESIZE_IMAGE_TOO_LARGE);
+        return;
       }
 
       // Don't handle animations.
       // TODO: This doesn't work as current Sanselan doesn't return accurate image counts.
       // See animated GIF detection below.
       if (imageInfo.getNumberOfImages() > 1 || isOversizedImage) {
-        return response;
+        return;
       }
-      int originalContentSize = response.getContentLength();
-      totalSourceImageSize.addAndGet(originalContentSize);
+      
       BufferedImage image = readImage(imageFormat, response);
 
       if (isResizeRequested) {
@@ -219,11 +213,10 @@ public class BasicImageRewriter implemen
         if (isResizeRequired(requestedWidth, requestedHeight, imageInfo)
             && !isTargetImageTooLarge(requestedWidth, requestedHeight, imageInfo)) {
           image = resizeImage(image, requestedWidth, requestedHeight, widthDelta, heightDelta);
-          response = updateResponse(response, image);
+          updateResponse(response, image);
         }
       }
-      response = getOptimizer(response, imageFormat, image);
-      totalRewrittenImageBytes.addAndGet(response.getContentLength());
+      applyOptimizer(response, imageFormat, image);
     } catch (IOException ioe) {
       log.log(Level.WARNING, "IO Error rewriting image " + request.toString() + " - " + ioe.getMessage());
     } catch (RuntimeException re) {
@@ -233,7 +226,6 @@ public class BasicImageRewriter implemen
     } catch (ImageReadException ire) {
       log.log(Level.INFO, "Failed to read image. Skipping " + request.toString(), ire.getMessage());
     }
-    return response;
   }
 
   /**
@@ -245,16 +237,15 @@ public class BasicImageRewriter implemen
    * @param image the resized image that needs to be substituted for the original image from
    *        the response
    */
-  private HttpResponse updateResponse(HttpResponse response, BufferedImage image)
+  private void updateResponse(HttpResponseBuilder response, BufferedImage image)
       throws IOException {
     ImageWriter imageWriter = ImageIO.getImageWritersByFormatName(RESIZE_OUTPUT_FORMAT).next();
     ImageOutputter outputter = new ImageIOOutputter(imageWriter, null);
     byte[] imageBytes = outputter.toBytes(image);
-    HttpResponseBuilder newResponseBuilder = new HttpResponseBuilder(response)
+    response
         .setResponse(imageBytes)
         .setHeader(CONTENT_TYPE, CONTENT_TYPE_IMAGE_PNG)
         .setHeader(CONTENT_LENGTH, String.valueOf(imageBytes.length));
-    return newResponseBuilder.create();
   }
 
   private boolean isUsableParameter(Integer parameterValue) {
@@ -267,9 +258,8 @@ public class BasicImageRewriter implemen
   /** Gets the feasible resize ratio. */
   private double getResizeRatio(int requestedWidth, int requestedHeight, int origWidth,
       int origHeight) {
-    double ratio = min(requestedWidth / (double) origWidth,
-        requestedHeight / (double) origHeight);
-    return ratio;
+    return min(requestedWidth / (double) origWidth,
+              requestedHeight / (double) origHeight);
   }
 
   /**
@@ -329,24 +319,22 @@ public class BasicImageRewriter implemen
     g2d.setComposite(AlphaComposite.SrcOver);
   }
 
-  private HttpResponse getOptimizer(HttpResponse response, ImageFormat imageFormat,
+  private void applyOptimizer(HttpResponseBuilder response, ImageFormat imageFormat,
       BufferedImage image) throws IOException {
-
     if (imageFormat == ImageFormat.IMAGE_FORMAT_GIF) {
       // Detecting the existence of the NETSCAPE2.0 extension by string comparison
       // is not exactly clean but is good enough to determine if a GIF is animated
       // Remove once Sanselan returns image count
-      if (!response.getResponseAsString().contains("NETSCAPE2.0")) {
-        response = new GIFOptimizer(config, response).rewrite(image);
+      if (!response.create().getResponseAsString().contains("NETSCAPE2.0")) {
+        new GIFOptimizer(config, response).rewrite(image);
       }
     } else if (imageFormat == ImageFormat.IMAGE_FORMAT_PNG) {
-      response = new PNGOptimizer(config, response).rewrite(image);
+      new PNGOptimizer(config, response).rewrite(image);
     } else if (imageFormat == ImageFormat.IMAGE_FORMAT_JPEG) {
-      response = new JPEGOptimizer(config, response).rewrite(image);
+      new JPEGOptimizer(config, response).rewrite(image);
     } else if (imageFormat == ImageFormat.IMAGE_FORMAT_BMP) {
-      response = new BMPOptimizer(config, response).rewrite(image);
+      new BMPOptimizer(config, response).rewrite(image);
     }
-    return response;
   }
 
   private boolean isImageTooLarge(ImageInfo imageInfo) {
@@ -367,7 +355,7 @@ public class BasicImageRewriter implemen
     return imageSizeBits > config.getMaxInMemoryBytes() * BITS_PER_BYTE;
   }
 
-  private boolean isSupportedContent(HttpResponse response) {
+  private boolean isSupportedContent(HttpResponseBuilder response) {
     return SUPPORTED_MIME_TYPES.contains(response.getHeader(CONTENT_TYPE));
   }
 
@@ -397,17 +385,16 @@ public class BasicImageRewriter implemen
    * MIME-type indicate that image content should be available but we failed to read it, then return
    * an error response.
    */
-  HttpResponse enforceUnreadableImageRestrictions(Uri uri, HttpResponse original) {
-    String contentType = original.getHeader(CONTENT_TYPE);
+  void enforceUnreadableImageRestrictions(Uri uri, HttpResponseBuilder response) {
+    String contentType = response.getHeader(CONTENT_TYPE);
     if (contentType != null) {
       contentType = contentType.toLowerCase();
       for (String expected : SUPPORTED_MIME_TYPES) {
         if (contentType.contains(expected)) {
           // MIME type says its a supported image but we can't read it. Reject.
-          return new HttpResponseBuilder(original)
-              .setHttpStatusCode(HttpResponse.SC_UNSUPPORTED_MEDIA_TYPE)
-              .setResponseString(CONTENT_TYPE_AND_MIME_MISMATCH)
-              .create();
+          errorResponse(response, HttpResponse.SC_UNSUPPORTED_MEDIA_TYPE,
+              CONTENT_TYPE_AND_MIME_MISMATCH);
+          return;
         }
       }
     }
@@ -416,26 +403,18 @@ public class BasicImageRewriter implemen
     for (String supportedExtension : SUPPORTED_FILE_EXTENSIONS) {
       if (path.endsWith(supportedExtension)) {
         // The file extension says its a supported image but we can't read it. Reject.
-        return new HttpResponseBuilder(original)
-            .setHttpStatusCode(HttpResponse.SC_UNSUPPORTED_MEDIA_TYPE)
-            .setResponseString(CONTENT_TYPE_AND_EXTENSION_MISMATCH)
-            .create();
+        errorResponse(response, HttpResponse.SC_UNSUPPORTED_MEDIA_TYPE,
+            CONTENT_TYPE_AND_EXTENSION_MISMATCH);
+        return;
       }
     }
-    return original;
-  }
-
-  public long getOriginalImageBytes() {
-    // Thread-safe?
-    return totalSourceImageSize.get();
   }
-
-  public long getRewrittenImageBytes() {
-    // Thread-safe?
-    return totalRewrittenImageBytes.get();
+  
+  private void errorResponse(HttpResponseBuilder response, int status, String msg) {
+    response.clearAllHeaders().setHttpStatusCode(status).setResponseString(msg);
   }
 
-  protected BufferedImage readImage(ImageFormat imageFormat, HttpResponse response)
+  protected BufferedImage readImage(ImageFormat imageFormat, HttpResponseBuilder response)
       throws ImageReadException, IOException{
     if (imageFormat == ImageFormat.IMAGE_FORMAT_GIF) {
       return readGif(response);
@@ -454,19 +433,19 @@ public class BasicImageRewriter implemen
   // implement additional security constraints or use their own more efficient
   // image reading mechanisms
 
-  protected BufferedImage readBmp(HttpResponse response) throws ImageReadException, IOException {
-    return BMPOptimizer.readBmp(response.getResponse());
+  protected BufferedImage readBmp(HttpResponseBuilder response) throws ImageReadException, IOException {
+    return BMPOptimizer.readBmp(response.getContentBytes());
   }
 
-  protected BufferedImage readPng(HttpResponse response) throws ImageReadException, IOException {
-    return PNGOptimizer.readPng(response.getResponse());
+  protected BufferedImage readPng(HttpResponseBuilder response) throws ImageReadException, IOException {
+    return PNGOptimizer.readPng(response.getContentBytes());
   }
 
-  protected BufferedImage readGif(HttpResponse response) throws ImageReadException, IOException {
-    return GIFOptimizer.readGif(response.getResponse());
+  protected BufferedImage readGif(HttpResponseBuilder response) throws ImageReadException, IOException {
+    return GIFOptimizer.readGif(response.getContentBytes());
   }
 
-  protected BufferedImage readJpeg(HttpResponse response) throws ImageReadException, IOException {
-    return JPEGOptimizer.readJpeg(response.getResponse());
+  protected BufferedImage readJpeg(HttpResponseBuilder response) throws ImageReadException, IOException {
+    return JPEGOptimizer.readJpeg(response.getContentBytes());
   }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java Wed Jun  2 09:04:51 2010
@@ -19,7 +19,7 @@ package org.apache.shindig.gadgets.rewri
 
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.Sanselan;
-import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
@@ -38,8 +38,8 @@ public class GIFOptimizer extends PNGOpt
 
   private boolean usePng;
 
-  public GIFOptimizer(OptimizerConfig config, HttpResponse original) {
-    super(config, original);
+  public GIFOptimizer(OptimizerConfig config, HttpResponseBuilder response) {
+    super(config, response);
   }
 
   @Override

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/ImageUtils.java Wed Jun  2 09:04:51 2010
@@ -31,8 +31,8 @@ import java.util.Map;
 /**
  * Utility functions for image processing and introspection.
  */
-public class ImageUtils {
-
+public final class ImageUtils {
+  private ImageUtils() {}
   /**
    * Convert an image to a palletized one. Will not create a palette above a fixed
    * number of entries

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java Wed Jun  2 09:04:51 2010
@@ -20,7 +20,7 @@ package org.apache.shindig.gadgets.rewri
 import org.apache.commons.io.IOUtils;
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.Sanselan;
-import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 
 import javax.imageio.ImageIO;
 import java.awt.color.ICC_Profile;
@@ -53,8 +53,8 @@ public class JPEGOptimizer extends BaseO
 
   private boolean usePng;
 
-  public JPEGOptimizer(OptimizerConfig config, HttpResponse original) {
-    super(config, original);
+  public JPEGOptimizer(OptimizerConfig config, HttpResponseBuilder response) {
+    super(config, response);
   }
 
   @Override
@@ -65,7 +65,7 @@ public class JPEGOptimizer extends BaseO
         config.getMinThresholdBytes());
 
     // Output the image as PNG
-    PNGOptimizer pngOptimizer = new PNGOptimizer(pngConfig, originalResponse);
+    PNGOptimizer pngOptimizer = new PNGOptimizer(pngConfig, response);
     pngOptimizer.rewriteImpl(image);
 
     int pngLength = Integer.MAX_VALUE;

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java Wed Jun  2 09:04:51 2010
@@ -19,7 +19,7 @@ package org.apache.shindig.gadgets.rewri
 
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.Sanselan;
-import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageWriteParam;
@@ -41,8 +41,8 @@ class PNGOptimizer extends BaseOptimizer
 
   private boolean useJpeg;
 
-  public PNGOptimizer(OptimizerConfig config, HttpResponse original) {
-    super(config, original);
+  public PNGOptimizer(OptimizerConfig config, HttpResponseBuilder response) {
+    super(config, response);
   }
 
   @Override

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java Wed Jun  2 09:04:51 2010
@@ -23,10 +23,10 @@ import org.apache.shindig.common.uri.Uri
 import org.apache.shindig.gadgets.GadgetException;
 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.caja.CajaCssLexerParser;
 import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
-import org.apache.shindig.gadgets.rewrite.MutableContent;
-import org.apache.shindig.gadgets.rewrite.RequestRewriter;
+import org.apache.shindig.gadgets.rewrite.ResponseRewriter;
 import org.apache.shindig.gadgets.rewrite.RewriterUtils;
 import org.apache.shindig.gadgets.rewrite.RewritingException;
 import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
@@ -50,7 +50,7 @@ import com.google.inject.Inject;
 /**
  * Rewrite links to referenced content in a stylesheet
  */
-public class CssRequestRewriter implements RequestRewriter {
+public class CssRequestRewriter implements ResponseRewriter {
 
   private static final Logger logger = Logger.getLogger(CssRequestRewriter.class.getName());
 
@@ -67,20 +67,18 @@ public class CssRequestRewriter implemen
     this.proxyingLinkRewriterFactory = proxyingLinkRewriterFactory;
   }
 
-  public boolean rewrite(HttpRequest request, HttpResponse original,
-      MutableContent content) throws RewritingException {
-    if (!RewriterUtils.isCss(request, original)) {
-      return false;
+  public void rewrite(HttpRequest request, HttpResponseBuilder response)
+      throws RewritingException {
+    if (!RewriterUtils.isCss(request, response)) {
+      return;
     }
     ContentRewriterFeature.Config feature = rewriterFeatureFactory.get(request);
-    String css = content.getContent();
+    String css = response.getContent();
     StringWriter sw = new StringWriter((css.length() * 110) / 100);
     rewrite(new StringReader(css), request.getUri(),
         proxyingLinkRewriterFactory.create(request.getGadget(), feature,
             request.getContainer(), false, request.getIgnoreCache()), sw, false);
-    content.setContent(sw.toString());
-
-    return true;
+    response.setContent(sw.toString());
   }
 
   /**

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriter.java
            ('svn:mergeinfo' removed)

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriter.java Wed Jun  2 09:04:51 2010
@@ -21,11 +21,11 @@ import org.apache.shindig.common.uri.Uri
 import org.apache.shindig.common.xml.DomUtil;
 import org.apache.shindig.gadgets.Gadget;
 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.rewrite.ContentRewriterFeature;
 import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
-import org.apache.shindig.gadgets.rewrite.RequestRewriter;
+import org.apache.shindig.gadgets.rewrite.ResponseRewriter;
 import org.apache.shindig.gadgets.rewrite.RewriterUtils;
 import org.apache.shindig.gadgets.rewrite.RewritingException;
 import org.apache.shindig.gadgets.spec.View;
@@ -52,7 +52,7 @@ import com.google.inject.Inject;
  * - Moving all style into head and converting @imports into links
  * - Proxying referred content of images and embeds
  */
-public class HTMLContentRewriter implements GadgetRewriter, RequestRewriter {
+public class HTMLContentRewriter implements GadgetRewriter, ResponseRewriter {
   
   private final static String JS_MIME_TYPE = "text/javascript";
 
@@ -79,15 +79,12 @@ public class HTMLContentRewriter impleme
     this.proxyingLinkRewriterFactory = proxyingLinkRewriterFactory;
   }
 
-  public boolean rewrite(HttpRequest request, HttpResponse original,
-      MutableContent content) throws RewritingException {
-    if (RewriterUtils.isHtml(request, original)) {
+  public void rewrite(HttpRequest request, HttpResponseBuilder response) throws RewritingException {
+    if (RewriterUtils.isHtml(request, response)) {
       ContentRewriterFeature.Config feature = rewriterFeatureFactory.get(request);
-      return rewriteImpl(feature, request.getGadget(), request.getUri(), content,
+      rewriteImpl(feature, request.getGadget(), request.getUri(), response,
           request.getContainer(), false, request.getIgnoreCache());
     }
-    
-    return false;
   }
 
   public void rewrite(Gadget gadget, MutableContent content) throws RewritingException {

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java Wed Jun  2 09:04:51 2010
@@ -18,21 +18,18 @@
  */
 package org.apache.shindig.gadgets.servlet;
 
+import com.google.caja.lexer.CharProducer;
 import com.google.caja.lexer.ExternalReference;
 import com.google.caja.lexer.InputSource;
 import com.google.caja.lexer.escaping.Escaping;
 import com.google.caja.opensocial.DefaultGadgetRewriter;
 import com.google.caja.opensocial.GadgetRewriteException;
-import com.google.caja.opensocial.UriCallback;
-import com.google.caja.opensocial.UriCallbackException;
-import com.google.caja.parser.html.Nodes;
-import com.google.caja.render.Concatenator;
+import com.google.caja.plugin.PluginEnvironment;
 import com.google.caja.reporting.BuildInfo;
 import com.google.caja.reporting.Message;
 import com.google.caja.reporting.MessageContext;
 import com.google.caja.reporting.MessageLevel;
 import com.google.caja.reporting.MessageQueue;
-import com.google.caja.reporting.RenderContext;
 import com.google.caja.reporting.SimpleMessageQueue;
 import com.google.caja.reporting.SnippetProducer;
 import com.google.caja.util.Pair;
@@ -42,141 +39,150 @@ import com.google.inject.Inject;
 import org.apache.shindig.common.cache.Cache;
 import org.apache.shindig.common.cache.CacheProvider;
 import org.apache.shindig.common.util.HashUtil;
+import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.RequestPipeline;
 import org.apache.shindig.gadgets.parse.HtmlSerialization;
 import org.apache.shindig.gadgets.parse.HtmlSerializer;
+import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
 import java.net.URI;
 import java.util.Map;
 import java.util.logging.Logger;
 
-public class CajaContentRewriter implements org.apache.shindig.gadgets.rewrite.GadgetRewriter {
+public class CajaContentRewriter implements GadgetRewriter {
   public static final String CAJOLED_DOCUMENTS = "cajoledDocuments";
 
-  private final Logger logger = Logger.getLogger(CajaContentRewriter.class.getName());
-  private Cache<String, Element> cajoledCache;
+  private static final Logger logger = Logger.getLogger(CajaContentRewriter.class.getName());
+  
+  private final Cache<String, Element> cajoledCache;
+  private final RequestPipeline requestPipeline;
+  private final HtmlSerializer htmlSerializer;
 
   @Inject
-  public void setCacheProvider(CacheProvider cacheProvider) {
-    cajoledCache = cacheProvider.createCache(CAJOLED_DOCUMENTS);
+  public CajaContentRewriter(CacheProvider cacheProvider, RequestPipeline requestPipeline,
+      HtmlSerializer htmlSerializer) {
+    this.cajoledCache = cacheProvider.createCache(CAJOLED_DOCUMENTS);
     logger.info("Cajoled cache created" + cajoledCache);
+    this.requestPipeline = requestPipeline;
+    this.htmlSerializer = htmlSerializer;
   }
 
-  public void rewrite(Gadget gadget, MutableContent content) {
-    if (gadget.getSpec().getModulePrefs().getFeatures().containsKey("caja") ||
-        "1".equals(gadget.getContext().getParameter("caja"))) {
-
-      final URI retrievedUri = gadget.getContext().getUrl().toJavaUri();
-      UriCallback cb = new UriCallback() {
-        public Reader retrieve(ExternalReference externalReference, String string)
-            throws UriCallbackException {
-          logger.info("Retrieving " + externalReference.toString());
-          Reader in = null;
-          try {
-            URI resourceUri = retrievedUri.resolve(externalReference.getUri());
-            in = new InputStreamReader(
-                resourceUri.toURL().openConnection().getInputStream(), "UTF-8");
-            char[] buf = new char[4096];
-            StringBuilder sb = new StringBuilder();
-            for (int n; (n = in.read(buf)) > 0;) {
-              sb.append(buf, 0, n);
-            }
-            return new StringReader(sb.toString());
-          } catch (java.net.MalformedURLException ex) {
-            throw new UriCallbackException(externalReference, ex);
-          } catch (IOException ex) {
-            throw new UriCallbackException(externalReference, ex);
-          } finally {
-            try {
-              in.close();
-            } catch (IOException e) {
-              // Not sure what else we can do here
-              throw new RuntimeException(e);
-            }
-          }
-        }
-
-        public URI rewrite(ExternalReference externalReference, String mimeType) {
-          URI uri = externalReference.getUri();
-          if (uri.getScheme().equalsIgnoreCase("https") ||
-              uri.getScheme().equalsIgnoreCase("http")) {
-            return retrievedUri.resolve(uri);
-          } else if ("javascript".equalsIgnoreCase(uri.getScheme())) {
-              // Commonly used javascript url for links with onclick handlers
-              return uri.toString().equals("javascript:void(0)") ? uri : null;
-          } else {
-            return null;
-          }
-        }
-      };
-      String key = HashUtil.rawChecksum(content.getContent().getBytes());
-      Document doc = content.getDocument();
-      Node root = doc.createDocumentFragment();
-      root.appendChild(doc.getDocumentElement());
-      Element cajoledOutput = null;
-      if (null != cajoledCache) {
-        cajoledOutput = cajoledCache.getElement(key);
-        if (null != cajoledOutput) {
-          createContainerFor(doc, doc.adoptNode(cajoledOutput));
-          content.documentChanged();
-          HtmlSerialization.attach(doc, new CajaHtmlSerializer(), null);
-          return;
-        }
+  public void rewrite(Gadget gadget, MutableContent mc) {
+    if (!cajaEnabled(gadget)) return;
+      
+    Document doc = mc.getDocument();
+    
+    // Serialize outside of MutableContent, to prevent a re-parse.
+    String docContent = HtmlSerialization.serialize(doc);
+    String cacheKey = HashUtil.rawChecksum(docContent.getBytes());
+    Node root = doc.createDocumentFragment();
+    root.appendChild(doc.getDocumentElement());
+    
+    Node cajoledData = null;
+    if (cajoledCache != null) {
+      Element cajoledOutput = cajoledCache.getElement(cacheKey);
+      if (cajoledOutput != null) {
+        cajoledData = doc.adoptNode(cajoledOutput);
+        createContainerFor(doc, cajoledData);
+        mc.documentChanged();        
       }
+    }
+    
+    if (cajoledData == null) {
+      PluginEnvironment pluginEnv = makePluginEnv(gadget);
+      URI javaGadgetUri = gadget.getContext().getUrl().toJavaUri();
       MessageQueue mq = new SimpleMessageQueue();
       BuildInfo bi = BuildInfo.getInstance();
       DefaultGadgetRewriter rw = new DefaultGadgetRewriter(bi, mq);
-      InputSource is = new InputSource(retrievedUri);
+      InputSource is = new InputSource(javaGadgetUri);
       boolean safe = false;
-      
+    
       try {
-        Pair<Node, Element> htmlAndJs = rw.rewriteContent(retrievedUri, root, cb);
+        Pair<Node, Element> htmlAndJs = rw.rewriteContent(javaGadgetUri, root, pluginEnv, null);
         Node html = htmlAndJs.a;
         Element script = htmlAndJs.b;
-        
-        cajoledOutput = doc.createElement("div");
+      
+        Element cajoledOutput = doc.createElement("div");
         cajoledOutput.setAttribute("id", "cajoled-output");
         cajoledOutput.setAttribute("classes", "g___");
         cajoledOutput.setAttribute("style", "position: relative;");
-        
+      
         cajoledOutput.appendChild(doc.adoptNode(html));
         cajoledOutput.appendChild(tameCajaClientApi(doc));
         cajoledOutput.appendChild(doc.adoptNode(script));
-        
-        Element messagesNode = formatErrors(doc, is, content.getContent(), mq, 
-          /* visible */ false);
+      
+        Element messagesNode = formatErrors(doc, is, docContent, mq, 
+            /* is invisible */ false);
         cajoledOutput.appendChild(messagesNode);
         if (cajoledCache != null) {
-          cajoledCache.addElement(key, cajoledOutput);
+          cajoledCache.addElement(cacheKey, cajoledOutput);
         }
-        createContainerFor(doc, cajoledOutput);
-        content.documentChanged();
         safe = true;
-        HtmlSerialization.attach(doc, new CajaHtmlSerializer(), null);
+        cajoledData = cajoledOutput;
+        createContainerFor(doc, cajoledData);
+        mc.documentChanged();
+        safe = true;
+        HtmlSerialization.attach(doc, htmlSerializer, null);
       } catch (GadgetRewriteException e) {
         // There were cajoling errors
         // Content is only used to produce useful snippets with error messages
         createContainerFor(doc, 
-          formatErrors(doc, is, content.getContent(), mq, true /* visible */));
+            formatErrors(doc, is, docContent, mq, true /* visible */));
         logException(e, mq);
         safe = true;
       } finally {
         if (!safe) {
           // Fail safe
-          content.setContent("");
+          mc.setContent("");
+          return;
         }
       }
     }
   }
+  
+  private boolean cajaEnabled(Gadget gadget) {
+    return (gadget.getAllFeatures().contains("caja") ||
+        "1".equals(gadget.getContext().getParameter("caja")));
+  }
+  
+  private PluginEnvironment makePluginEnv(Gadget gadget) {
+    final Uri gadgetUri = gadget.getContext().getUrl();
+    final String container = gadget.getContext().getContainer();
+
+    return new PluginEnvironment() {
+      public CharProducer loadExternalResource(
+          ExternalReference externalReference, String string) {
+        logger.info("Retrieving " + externalReference.toString());
+        Uri resourceUri = gadgetUri.resolve(Uri.fromJavaUri(externalReference.getUri()));
+        HttpRequest request =
+            new HttpRequest(resourceUri).setContainer(container).setGadget(gadgetUri);
+        try {
+          HttpResponse response = requestPipeline.execute(request);
+          return CharProducer.Factory.fromString(response.getResponseAsString(), externalReference.getReferencePosition());
+        } catch (GadgetException e) {
+          logger.info("Failed to retrieve: " + externalReference.toString());
+          return null;
+        }
+      }
+
+      public String rewriteUri(ExternalReference externalReference, String mimeType) {
+        URI uri = externalReference.getUri();
+        if (uri.getScheme().equalsIgnoreCase("https") ||
+            uri.getScheme().equalsIgnoreCase("http")) {
+          return gadgetUri.resolve(Uri.fromJavaUri(uri)).toString();
+        }
+        return null;
+      }
+    };
+  }
 
   private void createContainerFor(Document doc, Node el) {
     Element docEl = doc.createElement("html");
@@ -240,11 +246,4 @@ public class CajaContentRewriter impleme
     }
     logger.info("Unable to cajole gadget: " + errbuilder);
   }
-
-  private static class CajaHtmlSerializer implements HtmlSerializer {
-    public String serialize(Document doc) {
-      StringWriter sw = HtmlSerialization.createWriter(doc);
-      return Nodes.render(doc, new RenderContext(new Concatenator(sw, null)).asXml());
-    }
-  }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ConcatProxyServlet.java Wed Jun  2 09:04:51 2010
@@ -30,7 +30,7 @@ import org.apache.shindig.gadgets.Gadget
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.RequestPipeline;
-import org.apache.shindig.gadgets.rewrite.RequestRewriterRegistry;
+import org.apache.shindig.gadgets.rewrite.ResponseRewriterRegistry;
 import org.apache.shindig.gadgets.rewrite.RewritingException;
 import org.apache.shindig.gadgets.uri.ConcatUriManager;
 import org.apache.shindig.gadgets.uri.UriCommon.Param;
@@ -63,7 +63,7 @@ public class ConcatProxyServlet extends 
 
   private RequestPipeline requestPipeline;
   private ConcatUriManager concatUriManager;
-  private RequestRewriterRegistry contentRewriterRegistry;
+  private ResponseRewriterRegistry contentRewriterRegistry;
 
   @Inject
   public void setRequestPipeline(RequestPipeline requestPipeline) {
@@ -76,7 +76,7 @@ public class ConcatProxyServlet extends 
   }
 
   @Inject
-  public void setContentRewriterRegistry(RequestRewriterRegistry contentRewriterRegistry) {
+  public void setContentRewriterRegistry(ResponseRewriterRegistry contentRewriterRegistry) {
     this.contentRewriterRegistry = contentRewriterRegistry;
   }
 

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HtmlAccelServlet.java Wed Jun  2 09:04:51 2010
@@ -211,8 +211,7 @@ public class HtmlAccelServlet extends Ga
         .setIgnoreCache(context.getIgnoreCache())
         .setContainer(context.getContainer());
 
-    HttpResponse results = requestPipeline.execute(request);
-    return results;
+    return requestPipeline.execute(request);
   }
   
   private void respondVerbatim(HttpResponse results, HttpServletResponse response) 
@@ -255,9 +254,9 @@ public class HtmlAccelServlet extends Ga
     String paramsStr = null;
     String accelUrl = null;
     // Check for chain param style request:
-    if (path.startsWith(accelServletPrefix + "/")) {
+    if (path.startsWith(accelServletPrefix + '/')) {
       int startQuery = accelServletPrefix.length() + 1;
-      int endQuery = path.indexOf("/", startQuery);
+      int endQuery = path.indexOf('/', startQuery);
       if (endQuery >= startQuery) {
         paramsStr = path.substring(startQuery, endQuery);
         accelUrl = path.substring(endQuery + 1); // + "?" + req.getQueryString();

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpGadgetContext.java Wed Jun  2 09:04:51 2010
@@ -260,7 +260,7 @@ public class HttpGadgetContext extends G
     if (c == null) {
       return null;
     }
-    return c.equals("1") ? RenderingContext.CONTAINER : RenderingContext.GADGET;
+    return "1".equals(c) ? RenderingContext.CONTAINER : RenderingContext.GADGET;
   }
 
   /**

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/HttpRequestHandler.java Wed Jun  2 09:04:51 2010
@@ -29,7 +29,7 @@ import org.apache.shindig.gadgets.http.H
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.RequestPipeline;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
-import org.apache.shindig.gadgets.rewrite.RequestRewriterRegistry;
+import org.apache.shindig.gadgets.rewrite.ResponseRewriterRegistry;
 import org.apache.shindig.gadgets.rewrite.RewritingException;
 import org.apache.shindig.protocol.BaseRequestItem;
 import org.apache.shindig.protocol.Operation;
@@ -85,7 +85,7 @@ import com.google.inject.Inject;
  * in the above format. The RPC itself succeeded in these cases. If an RPC error occurred the client
  * should introspect the error message for information as to the cause.
  * 
- * TODO: send errors using "data", not plain content
+ * TODO: send errors using "result", not plain content
  *
  * @see MakeRequestHandler
  */
@@ -95,11 +95,11 @@ public class HttpRequestHandler {
   static final Set<String> BAD_HEADERS = ImmutableSet.of("HOST", "ACCEPT-ENCODING");
 
   private final RequestPipeline requestPipeline;
-  private final RequestRewriterRegistry contentRewriterRegistry;
+  private final ResponseRewriterRegistry contentRewriterRegistry;
 
   @Inject
   public HttpRequestHandler(RequestPipeline requestPipeline,
-      RequestRewriterRegistry contentRewriterRegistry) {
+      ResponseRewriterRegistry contentRewriterRegistry) {
     this.requestPipeline = requestPipeline;
     this.contentRewriterRegistry = contentRewriterRegistry;
   }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java Wed Jun  2 09:04:51 2010
@@ -20,6 +20,8 @@ package org.apache.shindig.gadgets.servl
 import com.google.common.collect.ImmutableSet;
 
 import com.google.common.collect.Maps;
+
+import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.common.servlet.HttpUtil;
@@ -38,6 +40,7 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import java.util.regex.Pattern;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -47,6 +50,13 @@ import javax.servlet.http.HttpServletRes
  * Used by type=URL gadgets in loading JavaScript resources.
  */
 public class JsServlet extends InjectedServlet {
+  static final String ONLOAD_JS_TPL = "(function() {" +
+      "var nm='%s';" +
+      "if (typeof window[nm]==='function') {" +
+      "window[nm]();" +
+      '}' +
+      "})();";
+  private static final Pattern ONLOAD_FN_PATTERN = Pattern.compile("[a-zA-Z0-9_]+");
 
   private FeatureRegistry registry;
   @Inject
@@ -148,6 +158,16 @@ public class JsServlet extends InjectedS
       }
     }
     
+    String onloadStr = req.getParameter("onload");
+    if (onloadStr != null) {
+      if (!ONLOAD_FN_PATTERN.matcher(onloadStr).matches()) {
+        resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid onload callback: " +
+            onloadStr);
+        return;
+      }
+      jsData.append(String.format(ONLOAD_JS_TPL, StringEscapeUtils.escapeJavaScript(onloadStr)));
+    }
+    
     if (jsData.length() == 0) {
       resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
       return;

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java Wed Jun  2 09:04:51 2010
@@ -36,7 +36,7 @@ import org.apache.shindig.gadgets.http.H
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.RequestPipeline;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
-import org.apache.shindig.gadgets.rewrite.RequestRewriterRegistry;
+import org.apache.shindig.gadgets.rewrite.ResponseRewriterRegistry;
 import org.apache.shindig.gadgets.rewrite.RewritingException;
 
 import java.io.IOException;
@@ -68,11 +68,11 @@ public class MakeRequestHandler extends 
   public static final String AUTHZ_PARAM = "authz";
 
   private final RequestPipeline requestPipeline;
-  private final RequestRewriterRegistry contentRewriterRegistry;
+  private final ResponseRewriterRegistry contentRewriterRegistry;
 
   @Inject
   public MakeRequestHandler(RequestPipeline requestPipeline,
-      RequestRewriterRegistry contentRewriterRegistry) {
+      ResponseRewriterRegistry contentRewriterRegistry) {
     this.requestPipeline = requestPipeline;
     this.contentRewriterRegistry = contentRewriterRegistry;
   }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyBase.java Wed Jun  2 09:04:51 2010
@@ -203,6 +203,6 @@ public abstract class ProxyBase {
     if (ignoreCache == null) {
       return false;
     }
-    return !ignoreCache.equals("0");
+    return !"0".equals(ignoreCache);
   }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java Wed Jun  2 09:04:51 2010
@@ -31,7 +31,7 @@ import org.apache.shindig.gadgets.Locked
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.RequestPipeline;
-import org.apache.shindig.gadgets.rewrite.RequestRewriterRegistry;
+import org.apache.shindig.gadgets.rewrite.ResponseRewriterRegistry;
 import org.apache.shindig.gadgets.rewrite.RewritingException;
 import org.apache.shindig.gadgets.uri.ProxyUriManager;
 
@@ -55,13 +55,13 @@ public class ProxyHandler extends ProxyB
   
   private final RequestPipeline requestPipeline;
   private final LockedDomainService lockedDomainService;
-  private final RequestRewriterRegistry contentRewriterRegistry;
+  private final ResponseRewriterRegistry contentRewriterRegistry;
   private final ProxyUriManager proxyUriManager;
 
   @Inject
   public ProxyHandler(RequestPipeline requestPipeline,
                       LockedDomainService lockedDomainService,
-                      RequestRewriterRegistry contentRewriterRegistry,
+                      ResponseRewriterRegistry contentRewriterRegistry,
                       ProxyUriManager proxyUriManager) {
     this.requestPipeline = requestPipeline;
     this.lockedDomainService = lockedDomainService;

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/RpcServlet.java Wed Jun  2 09:04:51 2010
@@ -42,7 +42,6 @@ public class RpcServlet extends Injected
   static final String GET_REQUEST_REQ_PARAM = "req";
   static final String GET_REQUEST_CALLBACK_PARAM = "callback";
 
-  private static final int POST_REQUEST_MAX_SIZE = 1024 * 128;
   private static final Logger logger = Logger.getLogger("org.apache.shindig.gadgets");
 
   private JsonRpcHandler jsonHandler;

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/OAuthService.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/OAuthService.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/OAuthService.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/OAuthService.java Wed Jun  2 09:04:51 2010
@@ -55,17 +55,17 @@ public class OAuthService {
         continue;
       }
       String childName = child.getNodeName();
-      if (childName.equals("Request")) {
+      if ("Request".equals(childName)) {
         if (requestUrl != null) {
           throw new SpecParserException("Multiple OAuth/Service/Request elements");
         }
         requestUrl = parseEndPoint("OAuth/Service/Request", (Element)child, base);
-      } else if (childName.equals("Authorization")) {
+      } else if ("Authorization".equals(childName)) {
         if (authorizationUrl != null) {
           throw new SpecParserException("Multiple OAuth/Service/Authorization elements");
         }
         authorizationUrl = parseAuthorizationUrl((Element)child, base);
-      } else if (childName.equals("Access")) {
+      } else if ("Access".equals(childName)) {
         if (accessUrl != null) {
           throw new SpecParserException("Multiple OAuth/Service/Access elements");
         }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/PipelinedData.java Wed Jun  2 09:04:51 2010
@@ -21,7 +21,6 @@ import org.apache.shindig.common.uri.Uri
 import org.apache.shindig.common.xml.XmlException;
 import org.apache.shindig.expressions.Expressions;
 import org.apache.shindig.gadgets.AuthType;
-import org.apache.shindig.gadgets.GadgetELResolver;
 import org.apache.shindig.gadgets.variables.Substitutions;
 
 import java.util.Collections;
@@ -165,7 +164,7 @@ public class PipelinedData {
    *
    * @param rootObjects an ELResolver that can evaluate currently available
    *     root objects.
-   * @see GadgetELResolver
+   * @see org.apache.shindig.gadgets.GadgetELResolver
    * @return a batch, or null if no batch could be created
    */
   public Batch getBatch(Expressions expressions, ELResolver rootObjects) {

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateProcessor.java
            ('svn:mergeinfo' removed)

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/NullTemplateLibrary.java Wed Jun  2 09:04:51 2010
@@ -27,7 +27,7 @@ import com.google.common.collect.Immutab
 /**
  * Null object implementation of TemplateLibrary.
  */
-public class NullTemplateLibrary implements TemplateLibrary {
+public final class NullTemplateLibrary implements TemplateLibrary {
   public static final TemplateLibrary INSTANCE = new NullTemplateLibrary();
 
   private final TagRegistry registry = new DefaultTagRegistry(ImmutableSet.<TagHandler>of());

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagHandler.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/AbstractTagRegistry.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/CompositeTagRegistry.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/DefaultTagRegistry.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/HtmlTagHandler.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/IfTagHandler.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RenderTagHandler.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/RepeatTagHandler.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TagHandler.java
            ('svn:mergeinfo' removed)

Propchange: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/TemplateBasedTagHandler.java
            ('svn:mergeinfo' removed)

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ConcatUriManager.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ConcatUriManager.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ConcatUriManager.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ConcatUriManager.java Wed Jun  2 09:04:51 2010
@@ -189,7 +189,7 @@ public interface ConcatUriManager {
     
     /**
      * Validate the version of the resource list.
-     * @param resourceUri Uri of a proxied resource
+     * @param resourceUris Uris of a proxied resource
      * @param container Container requesting the resource
      * @param value Version value to validate.
      * @return Status of the version.

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultIframeUriManager.java Wed Jun  2 09:04:51 2010
@@ -23,6 +23,9 @@ import com.google.inject.ImplementedBy;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
+import org.apache.shindig.auth.SecurityToken;
+import org.apache.shindig.auth.SecurityTokenDecoder;
+import org.apache.shindig.auth.SecurityTokenException;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.config.ContainerConfig;
@@ -53,13 +56,18 @@ public class DefaultIframeUriManager imp
   
   private final ContainerConfig config;
   private final LockedDomainPrefixGenerator ldGen;
+  private final SecurityTokenDecoder securityTokenCodec;
+
   private final List<String> ldSuffixes;
-  
+
   @Inject
   public DefaultIframeUriManager(ContainerConfig config,
-                                 LockedDomainPrefixGenerator ldGen) {
+                                 LockedDomainPrefixGenerator ldGen,
+                                 SecurityTokenDecoder securityTokenCodec) {
     this.config = config;
     this.ldGen = ldGen;
+    this.securityTokenCodec = securityTokenCodec;
+    
     Collection<String> containers = config.getContainers();
     List<String> ldSuffixes = Lists.newArrayListWithCapacity(containers.size());
     for (String container : containers) {
@@ -141,7 +149,7 @@ public class DefaultIframeUriManager imp
       boolean upInFragment = !view.needsUserPrefSubstitution();
       addParam(uri, UriCommon.USER_PREF_PREFIX + up.getName(), data, useTpl, upInFragment);
     }
-    
+
     if (versioner != null) {
       // Added on the query string, obviously not templated.
       addParam(uri, Param.VERSION.getKey(),
@@ -151,7 +159,8 @@ public class DefaultIframeUriManager imp
     if (gadget.getAllFeatures().contains(SECURITY_TOKEN_FEATURE_NAME) ||
         config.getBool(container, SECURITY_TOKEN_ALWAYS_KEY)) {
       boolean securityTokenOnQuery = isTokenNeededForRendering(gadget);
-      String securityToken = null;  // Always templated at the moment, can ignore.
+      
+      String securityToken = wantsSecurityToken(gadget) ? generateSecurityToken(gadget) : null;
       addParam(uri, Param.SECURITY_TOKEN.getKey(), securityToken, true, !securityTokenOnQuery);
     }
     
@@ -159,6 +168,24 @@ public class DefaultIframeUriManager imp
     
     return uri.toUri();
   }
+
+  protected String generateSecurityToken(Gadget gadget) {
+    // Find a security token in the context
+    try {
+      SecurityToken token = gadget.getContext().getToken();
+
+      if (securityTokenCodec != null && token != null) {
+        return securityTokenCodec.encodeToken(token);
+      }
+    } catch (SecurityTokenException e) {
+      // ignore -- no security token
+    }
+    return null;
+  }
+
+  protected boolean wantsSecurityToken(Gadget gadget) {
+    return true;
+  }
   
   // This method should be overridden to provide better caching characteristics
   // for rendering Uris. In particular, it should return true only when the gadget
@@ -223,7 +250,7 @@ public class DefaultIframeUriManager imp
     return versioner.validate(gadgetUri, container, version);
   }
   
-  public static final String tplKey(String key) {
+  public static String tplKey(String key) {
     return '%' + key + '%';
   }
   

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultProxyUriManager.java Wed Jun  2 09:04:51 2010
@@ -138,6 +138,7 @@ public class DefaultProxyUriManager impl
     return uri.toUri();
   }
   
+  @SuppressWarnings("deprecation")
   public ProxyUri process(Uri uriIn) throws GadgetException {
     UriStatus status = UriStatus.BAD_URI;
     Uri uri = null;
@@ -162,9 +163,9 @@ public class DefaultProxyUriManager impl
       int start = path.indexOf(containerStr);
       if (start > 0) {
         start += containerStr.length();
-        int end = path.indexOf("&", start);
+        int end = path.indexOf('&', start);
         if (end < start) {
-          end = path.indexOf("/", start);
+          end = path.indexOf('/', start);
         }
         if (end > start) {
           // Looks like chained proxy syntax. Pull out params.

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/HashShaLockedDomainPrefixGenerator.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/HashShaLockedDomainPrefixGenerator.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/HashShaLockedDomainPrefixGenerator.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/HashShaLockedDomainPrefixGenerator.java Wed Jun  2 09:04:51 2010
@@ -25,7 +25,6 @@ import org.apache.shindig.common.uri.Uri
 public class HashShaLockedDomainPrefixGenerator implements LockedDomainPrefixGenerator {
   public String getLockedDomainPrefix(Uri gadgetUri) {
     byte[] sha1 = DigestUtils.sha(gadgetUri.toString());
-    String hash = new String(Base32.encodeBase32(sha1));
-    return hash;
+    return new String(Base32.encodeBase32(sha1)); // a hash
   }
 }
\ No newline at end of file

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java Wed Jun  2 09:04:51 2010
@@ -64,7 +64,7 @@ public interface JsUriManager {
   @ImplementedBy(DefaultJsVersioner.class)
   public interface Versioner {
     /**
-     * @param gadget Gadget for which extern Uri was generated.
+     * @param gadgeUri Gadget for which extern Uri was generated.
      * @param extern Collection of libs externed.
      * @return Version string for the Uri.
      */

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ProxyUriBase.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ProxyUriBase.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ProxyUriBase.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/ProxyUriBase.java Wed Jun  2 09:04:51 2010
@@ -242,10 +242,7 @@ public class ProxyUriBase {
   }
 
   protected static boolean getBooleanValue(String str) {
-    if (str != null && "1".equals(str)) {
-      return true;
-    }
-    return false;
+    return str != null && "1".equals(str);
   }
   
   protected static Integer getIntegerValue(String str) {

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactoryTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactoryTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactoryTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactoryTest.java Wed Jun  2 09:04:51 2010
@@ -19,7 +19,7 @@
 package org.apache.shindig.gadgets;
 
 import static org.easymock.EasyMock.expect;
-import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.EasyMock.replay;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.shindig.common.cache.CacheProvider;

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultMessageBundleFactoryTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultMessageBundleFactoryTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultMessageBundleFactoryTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultMessageBundleFactoryTest.java Wed Jun  2 09:04:51 2010
@@ -21,7 +21,7 @@ package org.apache.shindig.gadgets;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isA;
 import static org.easymock.EasyMock.verify;
-import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.EasyMock.replay;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/encoding/EncodingDetectorTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/encoding/EncodingDetectorTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/encoding/EncodingDetectorTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/encoding/EncodingDetectorTest.java Wed Jun  2 09:04:51 2010
@@ -18,12 +18,12 @@
  */
 package org.apache.shindig.gadgets.encoding;
 
-import static org.easymock.classextension.EasyMock.expect;
-import static org.easymock.classextension.EasyMock.replay;
-import static org.easymock.classextension.EasyMock.verify;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
 import static org.junit.Assert.assertEquals;
 
-import org.easymock.classextension.EasyMock;
+import org.easymock.EasyMock;
 import org.junit.Test;
 
 import java.nio.charset.Charset;
@@ -44,7 +44,7 @@ public class EncodingDetectorTest {
     byte[] data = "Hello, world".getBytes("US-ASCII");
     assertEquals("UTF-8", EncodingDetector.detectEncoding(data, true, null).name());
   }
- 
+
   @Test
   public void detectedUtf8WithByteOrderMark() {
     byte[] data = {
@@ -57,7 +57,14 @@ public class EncodingDetectorTest {
   @Test
   public void assumeLatin1OnInvalidUtf8() throws Exception {
     byte[] data = "\u4F60\u597D".getBytes("BIG5");
-    
+
+    assertEquals("ISO-8859-1", EncodingDetector.detectEncoding(data, true, null).name());
+  }
+
+  @Test
+  public void badStreamEnd() throws Exception {
+    byte[] data = { 'd', 'u',  (byte)0xC0 };
+
     assertEquals("ISO-8859-1", EncodingDetector.detectEncoding(data, true, null).name());
   }
 
@@ -68,13 +75,13 @@ public class EncodingDetectorTest {
                    "\u8FBE\u4E0D\u51FA\uFF0C\u6709\u611F\u60C5\u65E0\u6CD5\u503E\u5410")
                    .getBytes("GB18030");
 
-    EncodingDetector.FallbackEncodingDetector detector = 
+    EncodingDetector.FallbackEncodingDetector detector =
       newMockFallbackEncoding(data, "GB18030");
 
     assertEquals("GB18030", EncodingDetector.detectEncoding(data, false, detector).name());
     verify(detector);
   }
-  
+
   // Test the fallback detector:
   @Test
   public void doNotAssumeLatin1OnInvalidUtf8() throws Exception {
@@ -111,7 +118,7 @@ public class EncodingDetectorTest {
 
     assertEquals("UTF-8", detector.detectEncoding(data).name());
   }
-  
+
   @Test(expected=NullPointerException.class)
   public void nullCustomDetector() throws Exception {
     byte[] data = "\u4F60\u597D".getBytes("BIG5");

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java Wed Jun  2 09:04:51 2010
@@ -68,7 +68,7 @@ public class FeatureRegistryTest {
   private static int resourceIdx = 0;
   private FeatureResourceLoader resourceLoader;
   private ResourceMock resourceMock;
-  FeatureRegistry registry;
+  private FeatureRegistry registry;
   private Map<String, String> lastAttribs;
 
   @Before

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureResourceLoaderTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureResourceLoaderTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureResourceLoaderTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureResourceLoaderTest.java Wed Jun  2 09:04:51 2010
@@ -19,10 +19,10 @@ package org.apache.shindig.gadgets.featu
 
 import com.google.common.collect.Maps;
 
-import static org.easymock.classextension.EasyMock.createMock;
-import static org.easymock.classextension.EasyMock.eq;
-import static org.easymock.classextension.EasyMock.expect;
-import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpCacheTest.java Wed Jun  2 09:04:51 2010
@@ -18,7 +18,7 @@
 package org.apache.shindig.gadgets.http;
 
 import static org.easymock.EasyMock.expect;
-import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.EasyMock.replay;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -30,12 +30,10 @@ import com.google.common.collect.Maps;
 import org.apache.shindig.auth.BasicSecurityToken;
 import org.apache.shindig.auth.SecurityToken;
 import org.apache.shindig.common.uri.Uri;
-import org.apache.shindig.common.util.FakeTimeSource;
-import org.apache.shindig.common.util.TimeSource;
 import org.apache.shindig.gadgets.AuthType;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
 import org.apache.shindig.gadgets.spec.RequestAuthenticationInfo;
-import org.easymock.classextension.EasyMock;
+import org.easymock.EasyMock;
 import org.junit.Test;
 
 import java.util.Map;
@@ -225,7 +223,6 @@ public class AbstractHttpCacheTest {
   @Test
   public void getResponseNotCacheable() {
     HttpRequest request = new HttpRequest(DEFAULT_URI);
-    String key = cache.createKey(request);
     HttpResponse response = new HttpResponseBuilder().setStrictNoCache().create();
     cache.addResponse(request, response);
 
@@ -348,10 +345,6 @@ public class AbstractHttpCacheTest {
         .create();
     cache.map.put(key, response);
 
-    TimeSource fakeClock = new FakeTimeSource(expiration + 60L);
-
-    cache.setClock(fakeClock);
-
     // The cache itself still hold and return staled value, 
     // caller responsible to decide what to do about it 
     assertEquals(response, cache.removeResponse(request));

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/AbstractHttpFetcherTest.java Wed Jun  2 09:04:51 2010
@@ -57,7 +57,7 @@ public abstract class AbstractHttpFetche
     Uri uri = Uri.parse("http://a:b:c/");
     HttpRequest request = new HttpRequest(uri);
     try {
-      HttpResponse response = fetcher.fetch(request);
+      fetcher.fetch(request);
       fail("Expected GadgetException");
     } catch (GadgetException e) {
       assertEquals(400, e.getHttpStatusCode());
@@ -69,7 +69,7 @@ public abstract class AbstractHttpFetche
     Uri uri = Uri.parse("http://a:b/");
     HttpRequest request = new HttpRequest(uri);
     try {
-      HttpResponse response = fetcher.fetch(request);
+      fetcher.fetch(request);
       fail("Expected GadgetException");
     } catch (GadgetException e) {
       assertEquals(400, e.getHttpStatusCode());
@@ -81,7 +81,7 @@ public abstract class AbstractHttpFetche
     Uri uri = Uri.parse("host/data");
     HttpRequest request = new HttpRequest(uri);
     try {
-      HttpResponse response = fetcher.fetch(request);
+      fetcher.fetch(request);
       fail("Expected GadgetException");
     } catch (GadgetException e) {
       assertEquals(400, e.getHttpStatusCode());
@@ -93,7 +93,7 @@ public abstract class AbstractHttpFetche
     Uri uri = Uri.parse("//host/data");
     HttpRequest request = new HttpRequest(uri);
     try {
-      HttpResponse response = fetcher.fetch(request);
+      fetcher.fetch(request);
       fail("Expected GadgetException");
     } catch (GadgetException e) {
       assertEquals(400, e.getHttpStatusCode());

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultInvalidationServiceTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultInvalidationServiceTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultInvalidationServiceTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultInvalidationServiceTest.java Wed Jun  2 09:04:51 2010
@@ -24,7 +24,7 @@ import org.apache.shindig.common.testing
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.AuthType;
 import org.apache.shindig.gadgets.oauth.OAuthArguments;
-import org.apache.shindig.gadgets.rewrite.image.NoOpImageRewriter;
+import org.apache.shindig.gadgets.rewrite.DefaultResponseRewriterRegistry;
 import org.easymock.EasyMock;
 import org.easymock.IMocksControl;
 import org.junit.Assert;
@@ -80,8 +80,9 @@ public class DefaultInvalidationServiceT
 
     fetcher = new DefaultRequestPipelineTest.FakeHttpFetcher();
     oauth = new DefaultRequestPipelineTest.FakeOAuthRequestProvider();
-    requestPipeline = new DefaultRequestPipeline(fetcher, cache, oauth, new NoOpImageRewriter(),
-        service, new HttpResponseMetadataHelper());
+    requestPipeline = new DefaultRequestPipeline(fetcher, cache, oauth,
+        new DefaultResponseRewriterRegistry(null, null), service,
+        new HttpResponseMetadataHelper());
   }
 
   @Test

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultRequestPipelineTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultRequestPipelineTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultRequestPipelineTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/DefaultRequestPipelineTest.java Wed Jun  2 09:04:51 2010
@@ -26,7 +26,7 @@ import org.apache.shindig.common.uri.Uri
 import org.apache.shindig.gadgets.AuthType;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.oauth.OAuthRequest;
-import org.apache.shindig.gadgets.rewrite.image.NoOpImageRewriter;
+import org.apache.shindig.gadgets.rewrite.DefaultResponseRewriterRegistry;
 import org.junit.Test;
 
 import java.util.Map;
@@ -45,7 +45,7 @@ public class DefaultRequestPipelineTest 
     }
   };
   private final RequestPipeline pipeline = new DefaultRequestPipeline(fetcher, cache, oauth,
-      new NoOpImageRewriter(), new NoOpInvalidationService(), helper);
+      new DefaultResponseRewriterRegistry(null, null), new NoOpInvalidationService(), helper);
 
   @Test
   public void authTypeNoneNotCached() throws Exception {
@@ -75,7 +75,7 @@ public class DefaultRequestPipelineTest 
     fetcher.response = new HttpResponse("response");
 
     RequestPipeline pipeline = new DefaultRequestPipeline(fetcher, cache, oauth,
-        new NoOpImageRewriter(), new NoOpInvalidationService(),
+        new DefaultResponseRewriterRegistry(null, null), new NoOpInvalidationService(),
         new HttpResponseMetadataHelper());
     HttpResponse response = pipeline.execute(request);
     assertEquals(1, response.getMetadata().size());

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/HttpResponseBuilderTest.java Wed Jun  2 09:04:51 2010
@@ -203,6 +203,33 @@ public class HttpResponseBuilderTest {
 
     // Insure that headers are stored in the order they are added
     assertEquals(Joiner.on(",").join(resp.getHeaders("Soup")), Joiner.on(",").join(soupList));
-
+  }
+  
+  @Test
+  public void noModsReturnsSameResponse() {
+    HttpResponseBuilder builder = new HttpResponseBuilder();
+    builder.setHttpStatusCode(HttpResponse.SC_BAD_GATEWAY);
+    builder.setResponseString("foo");
+    HttpResponse response = builder.create();
+    assertSame(response, builder.create());
+  }
+  
+  @Test
+  public void noModsReturnsSameResponseBuilderCtor() {
+    HttpResponseBuilder builder = new HttpResponseBuilder();
+    builder.setHttpStatusCode(HttpResponse.SC_OK);
+    HttpResponseBuilder nextBuilder = new HttpResponseBuilder(builder);
+    assertSame(builder.create(), nextBuilder.create());
+  }
+  
+  @Test
+  public void noModsReturnsSameResponseBaseCtor() {
+    HttpResponse response = new HttpResponse("foo");
+    HttpResponseBuilder builder = new HttpResponseBuilder(response);
+    assertSame(response, builder.create());
+    builder.setHttpStatusCode(HttpResponse.SC_BAD_GATEWAY);
+    HttpResponse newResponse = builder.create();
+    assertNotSame(response, newResponse);
+    assertSame(newResponse, builder.create());
   }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/GadgetOAuthCallbackGeneratorTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/GadgetOAuthCallbackGeneratorTest.java?rev=950443&r1=950442&r2=950443&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/GadgetOAuthCallbackGeneratorTest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/test/java/org/apache/shindig/gadgets/oauth/GadgetOAuthCallbackGeneratorTest.java Wed Jun  2 09:04:51 2010
@@ -33,12 +33,11 @@ import org.apache.shindig.gadgets.Gadget
 import org.apache.shindig.gadgets.LockedDomainService;
 import org.apache.shindig.gadgets.UrlGenerator;
 import org.apache.shindig.gadgets.http.HttpRequest;
-import org.apache.shindig.gadgets.oauth.OAuthResponseParams.OAuthRequestException;
 import org.apache.shindig.gadgets.process.ProcessingException;
 import org.apache.shindig.gadgets.process.Processor;
 import org.easymock.IArgumentMatcher;
-import org.easymock.classextension.EasyMock;
-import org.easymock.classextension.IMocksControl;
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -94,7 +93,7 @@ public class GadgetOAuthCallbackGenerato
       getGenerator().generateCallback(fetcherConfig, "base", request, responseParams);
       fail("Should have thrown");
     } catch (OAuthRequestException e) {
-      assertEquals(OAuthError.UNKNOWN_PROBLEM.toString(), responseParams.getError());
+      assertEquals(OAuthError.UNKNOWN_PROBLEM.name(), e.getError());
     }
     
     control.verify();
@@ -114,7 +113,7 @@ public class GadgetOAuthCallbackGenerato
       getGenerator().generateCallback(fetcherConfig, "base", request, responseParams);
       fail("Should have thrown");
     } catch (OAuthRequestException e) {
-      assertEquals(OAuthError.UNKNOWN_PROBLEM.toString(), responseParams.getError());
+      assertEquals(OAuthError.UNKNOWN_PROBLEM.name(), e.getError());
     }
     
     control.verify();
@@ -246,7 +245,7 @@ public class GadgetOAuthCallbackGenerato
   }
 
     public void appendTo(StringBuffer buffer) {
-      buffer.append("GadgetContextMatcher(" + securityToken + ", " + arguments + ')');
+      buffer.append("GadgetContextMatcher(").append(securityToken).append(", ").append(arguments).append(')');
     }
   }
 }