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/08/10 13:32:34 UTC

svn commit: r983934 [3/8] - in /shindig/branches/2.0.x: ./ config/ content/container/ content/samplecontainer/examples/ActivityStreams/ extras/src/main/java/org/apache/shindig/extras/as/core/model/ extras/src/main/java/org/apache/shindig/extras/as/open...

Modified: shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServlet.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServlet.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServlet.java (original)
+++ shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServlet.java Tue Aug 10 11:32:26 2010
@@ -59,7 +59,7 @@ public class DataServiceServlet extends 
       HttpServletResponse servletResponse)
       throws ServletException, IOException {
     try {
-      checkContentTypes(ALLOWED_CONTENT_TYPES, servletRequest.getContentType());
+      ContentTypes.checkContentTypes(ALLOWED_CONTENT_TYPES, servletRequest.getContentType());
       executeRequest(servletRequest, servletResponse);
     } catch (ContentTypes.InvalidContentTypeException icte) {
       sendError(servletResponse,
@@ -79,7 +79,7 @@ public class DataServiceServlet extends 
       HttpServletResponse servletResponse)
       throws ServletException, IOException {
     try {
-      checkContentTypes(ALLOWED_CONTENT_TYPES, servletRequest.getContentType());
+      ContentTypes.checkContentTypes(ALLOWED_CONTENT_TYPES, servletRequest.getContentType());
       executeRequest(servletRequest, servletResponse);
     } catch (ContentTypes.InvalidContentTypeException icte) {
       sendError(servletResponse,

Modified: shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServletFetcher.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServletFetcher.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServletFetcher.java (original)
+++ shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DataServiceServletFetcher.java Tue Aug 10 11:32:26 2010
@@ -17,7 +17,7 @@
  */
 package org.apache.shindig.protocol;
 
-import org.apache.shindig.auth.SecurityTokenDecoder;
+import org.apache.shindig.auth.SecurityTokenCodec;
 import org.apache.shindig.common.servlet.ParameterFetcher;
 
 import com.google.common.collect.ImmutableMap;
@@ -32,7 +32,7 @@ import java.util.Map;
 public class DataServiceServletFetcher implements ParameterFetcher {
 
   public Map<String, String> fetch(HttpServletRequest req) {
-    return ImmutableMap.of(SecurityTokenDecoder.SECURITY_TOKEN_NAME, req.getParameter("st"));
+    return ImmutableMap.of(SecurityTokenCodec.SECURITY_TOKEN_NAME, req.getParameter("st"));
   }
 }
 

Modified: shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DefaultHandlerRegistry.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DefaultHandlerRegistry.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DefaultHandlerRegistry.java (original)
+++ shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/DefaultHandlerRegistry.java Tue Aug 10 11:32:26 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.shindig.protocol;
 
+import com.google.common.base.Preconditions;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.auth.SecurityToken;
@@ -26,6 +27,7 @@ import org.apache.shindig.protocol.conve
 import org.apache.shindig.protocol.conversion.BeanJsonConverter;
 import org.apache.shindig.protocol.multipart.FormDataItem;
 
+import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -101,10 +103,9 @@ public class DefaultHandlerRegistry impl
           }
         };
       }
-      if (!handlerType.isAnnotationPresent(Service.class)) {
-        throw new IllegalStateException("Attempt to bind unannotated service implementation " +
-            handlerType.getName());
-      }
+      Preconditions.checkState(handlerType.isAnnotationPresent(Service.class),
+          "Attempt to bind unannotated service implementation %s",handlerType.getName());
+
       Service service = handlerType.getAnnotation(Service.class);
 
       for (Method m : handlerType.getMethods()) {
@@ -620,6 +621,22 @@ public class DefaultHandlerRegistry impl
       return new RestInvocationWrapper(parsedParams, handler);
     }
 
+    @Override
+    public boolean equals(Object other) {
+      if (other instanceof RestPath) {
+        RestPath that = (RestPath)other;
+        return (this.constCount == that.constCount &&
+            this.lastConstIndex == that.lastConstIndex &&
+            Objects.equal(this.operationPath, that.operationPath));
+      }
+      return false;
+    }
+    
+    @Override
+    public int hashCode() {
+      return this.constCount ^ this.lastConstIndex ^ operationPath.hashCode();
+    }
+    
     /**
      * Rank based on the number of consant parts they accept, where the constant parts occur
      * and lexical ordering.

Modified: shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/JsonRpcServlet.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/JsonRpcServlet.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/JsonRpcServlet.java (original)
+++ shindig/branches/2.0.x/java/common/src/main/java/org/apache/shindig/protocol/JsonRpcServlet.java Tue Aug 10 11:32:26 2010
@@ -147,7 +147,7 @@ public class JsonRpcServlet extends ApiS
       throws ContentTypes.InvalidContentTypeException, IOException {
     String content = null;
 
-    checkContentTypes(ALLOWED_CONTENT_TYPES, request.getContentType());
+    ContentTypes.checkContentTypes(ALLOWED_CONTENT_TYPES, request.getContentType());
 
     if (formParser.isMultipartContent(request)) {
       for (FormDataItem item : formParser.parse(request)) {
@@ -157,7 +157,7 @@ public class JsonRpcServlet extends ApiS
           // field or file item will not be parsed out, but will be exposed via getFormItem
           // method of RequestItem.
           if (!StringUtils.isEmpty(item.getContentType())) {
-            checkContentTypes(ContentTypes.ALLOWED_JSON_CONTENT_TYPES, item.getContentType());
+            ContentTypes.checkContentTypes(ContentTypes.ALLOWED_JSON_CONTENT_TYPES, item.getContentType());
           }
           content = item.getAsString();
         } else {

Modified: shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/common/testing/FakeGadgetToken.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/common/testing/FakeGadgetToken.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/common/testing/FakeGadgetToken.java (original)
+++ shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/common/testing/FakeGadgetToken.java Tue Aug 10 11:32:26 2010
@@ -21,7 +21,7 @@ package org.apache.shindig.common.testin
 import org.apache.shindig.auth.AbstractSecurityToken;
 import org.apache.shindig.auth.AuthenticationMode;
 import org.apache.shindig.auth.SecurityToken;
-import org.apache.shindig.auth.SecurityTokenDecoder;
+import org.apache.shindig.auth.SecurityTokenCodec;
 
 import com.google.common.collect.Maps;
 import org.apache.shindig.auth.SecurityTokenException;
@@ -208,11 +208,11 @@ public class FakeGadgetToken extends Abs
   }
 
   /**
-   * SecurityTokenDecoder for testing - this allows passing around a
+   * SecurityTokenCodec for testing - this allows passing around a
    * security token of format key=value&key2=value2, where key is one of:
    * ownerId, viewerId, domain, appUrl, appId, trustedJson, module
    */
-  public static class Decoder implements SecurityTokenDecoder {
+  public static class Codec implements SecurityTokenCodec {
     public SecurityToken createToken(Map<String, String> tokenParameters)  {
       return FakeGadgetToken.createToken(tokenParameters);
     }

Modified: shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/ExpressionsTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/ExpressionsTest.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/ExpressionsTest.java (original)
+++ shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/ExpressionsTest.java Tue Aug 10 11:32:26 2010
@@ -39,7 +39,7 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.Maps;
 
 public class ExpressionsTest {
-  private Expressions expressions;
+  public Expressions expressions;
   private ELContext context;
   private Map<String, Object> variables;
   
@@ -133,14 +133,13 @@ public class ExpressionsTest {
   
   @Test
   public void booleanCoercionOfNumbers() throws Exception{
+    // Negation tests have been moved to EL subdir
     addVariable("bool", 0);
     assertFalse(evaluate("${bool}", Boolean.class));
-    assertTrue(evaluate("${!bool}", Boolean.class));
 
     addVariable("bool", 1);
     assertTrue(evaluate("${bool}", Boolean.class));
-    assertFalse(evaluate("${!bool}", Boolean.class));
-  }
+  } 
   
   @Test
   public void booleanCoercionOfNull() throws Exception{
@@ -151,6 +150,7 @@ public class ExpressionsTest {
   
   @Test
   public void booleanCoercionOfStrings() throws Exception{
+    // Negation tests for FALSE and any String have been moved El subdir
     addVariable("bool", "");
     assertFalse(evaluate("${bool}", Boolean.class));
     assertTrue(evaluate("${!bool}", Boolean.class));
@@ -162,7 +162,6 @@ public class ExpressionsTest {
     // Case-sensitive coercion:  FALSE is true
     addVariable("bool", "FALSE");
     assertTrue(evaluate("${bool}", Boolean.class));
-    assertFalse(evaluate("${!bool}", Boolean.class));
 
     addVariable("bool", "true");
     assertTrue(evaluate("${bool}", Boolean.class));
@@ -170,8 +169,8 @@ public class ExpressionsTest {
     
     addVariable("bool", "booga");
     assertTrue(evaluate("${bool}", Boolean.class));
-    assertFalse(evaluate("${!bool}", Boolean.class));
-  }
+  } 
+  
   
   @Test
   public void iterableCoercionOfScalar() throws Exception {
@@ -219,12 +218,12 @@ public class ExpressionsTest {
         ImmutableList.copyOf(evaluate("${iter}", Iterable.class)));
   }
   
-  private <T> T evaluate(String expression, Class<T> type) {
+  public <T> T evaluate(String expression, Class<T> type) {
     ValueExpression expr = expressions.parse(expression, type);
     return type.cast(expr.getValue(context));
   }
 
-  private void addVariable(String key, Object value) {
+  public void addVariable(String key, Object value) {
     variables.put(key, value);
   }
 }

Modified: shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/FunctionsTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/FunctionsTest.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/FunctionsTest.java (original)
+++ shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/FunctionsTest.java Tue Aug 10 11:32:26 2010
@@ -70,7 +70,7 @@ public class FunctionsTest extends Asser
 
   @Test
   public void testExpressionEvaluation() {
-    Expressions expressions = new Expressions(functions, null, new ShindigTypeConverter());
+    Expressions expressions = Expressions.forTesting(functions);
     ELContext context = expressions.newELContext();
     ValueExpression expression = expressions.parse("${other:bonjour()}", String.class);
     

Modified: shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/OpensocialFunctionsTest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/OpensocialFunctionsTest.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/OpensocialFunctionsTest.java (original)
+++ shindig/branches/2.0.x/java/common/src/test/java/org/apache/shindig/expressions/OpensocialFunctionsTest.java Tue Aug 10 11:32:26 2010
@@ -19,6 +19,7 @@
 package org.apache.shindig.expressions;
 
 import org.apache.commons.codec.binary.Base64;
+
 import java.util.Map;
 
 import javax.el.ELContext;
@@ -38,7 +39,7 @@ public class OpensocialFunctionsTest ext
   @Before
   public void setUp() {
     Functions functions = new Functions(OpensocialFunctions.class);
-    expressions = new Expressions(functions, null, new ShindigTypeConverter());
+    expressions = Expressions.forTesting(functions);
     context = expressions.newELContext(new RootELResolver(vars));
   }
 

Modified: shindig/branches/2.0.x/java/gadgets/pom.xml
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/pom.xml?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/pom.xml (original)
+++ shindig/branches/2.0.x/java/gadgets/pom.xml Tue Aug 10 11:32:26 2010
@@ -160,10 +160,6 @@
       <artifactId>htmlparser</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.googlecode.json-simple</groupId>
-      <artifactId>json-simple</artifactId>
-    </dependency>
-    <dependency>
       <groupId>net.oauth.core</groupId>
       <artifactId>oauth</artifactId>
     </dependency>
@@ -176,8 +172,12 @@
       <artifactId>oauth-provider</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.google.collections</groupId>
-      <artifactId>google-collections</artifactId>
+      <groupId>com.google.code.findbugs</groupId>
+      <artifactId>jsr305</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
     </dependency>
     <dependency>
       <groupId>com.google.inject</groupId>
@@ -228,13 +228,8 @@
       <artifactId>xml-apis</artifactId>
     </dependency>
     <dependency>
-      <groupId>de.odysseus.juel</groupId>
-      <artifactId>juel-impl</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>de.odysseus.juel</groupId>
-      <artifactId>juel-api</artifactId>
-      <scope>provided</scope>
+        <groupId>org.apache.tomcat</groupId>
+        <artifactId>el-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.httpcomponents</groupId>

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGadgetSpecFactory.java Tue Aug 10 11:32:26 2010
@@ -66,10 +66,6 @@ public class DefaultGadgetSpecFactory ex
       try 
       {
         Uri uri = RAW_GADGET_URI;
-        // For accelerate page, pass in page url instead of fake one:
-        if (HtmlAccelServlet.isAccel(context)) {
-          uri = context.getUrl();
-        }
         return new GadgetSpec(uri, XmlUtil.parse(rawxml), rawxml);
       } catch (XmlException e) {
         throw new SpecParserException(e);

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java Tue Aug 10 11:32:26 2010
@@ -41,6 +41,7 @@ import org.apache.shindig.gadgets.parse.
 import org.apache.shindig.gadgets.preload.PreloadModule;
 import org.apache.shindig.gadgets.render.RenderModule;
 import org.apache.shindig.gadgets.rewrite.RewriteModule;
+import org.apache.shindig.gadgets.servlet.GadgetsHandler;
 import org.apache.shindig.gadgets.servlet.HttpRequestHandler;
 import org.apache.shindig.gadgets.templates.TemplateModule;
 import org.apache.shindig.gadgets.uri.UriModule;
@@ -101,6 +102,7 @@ public class DefaultGuiceModule extends 
     Multibinder<Object> handlerBinder = Multibinder.newSetBinder(binder(), Object.class, Names.named("org.apache.shindig.handlers"));
     handlerBinder.addBinding().to(InvalidationHandler.class);
     handlerBinder.addBinding().to(HttpRequestHandler.class);
+    handlerBinder.addBinding().to(GadgetsHandler.class);
   }
 
   protected void registerConfigContributors() {

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java Tue Aug 10 11:32:26 2010
@@ -17,12 +17,13 @@
  */
 package org.apache.shindig.gadgets;
 
+import com.google.common.base.Preconditions;
 import org.apache.shindig.gadgets.features.FeatureRegistry;
 import org.apache.shindig.gadgets.preload.PreloadedData;
-import org.apache.shindig.gadgets.servlet.ProxyBase;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.LocaleSpec;
 import org.apache.shindig.gadgets.spec.View;
+import org.apache.shindig.gadgets.uri.UriCommon;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -97,12 +98,8 @@ public class Gadget {
   private List<String> allGadgetFeatures;
   public synchronized List<String> getAllFeatures() {
     if (allGadgetFeatures == null) {
-      if (featureRegistry != null) {
-        allGadgetFeatures = featureRegistry.getFeatures(Lists.newArrayList(directFeatureDeps));
-      } else {
-        throw new IllegalStateException(
-            "setGadgetFeatureRegistry must be called before Gadget.getAllFeatures()");
-      }
+      Preconditions.checkState(featureRegistry != null, "setGadgetFeatureRegistry must be called before Gadget.getAllFeatures()");
+      allGadgetFeatures = featureRegistry.getFeatures(Lists.newArrayList(directFeatureDeps));
     }
     return allGadgetFeatures;
   }
@@ -149,6 +146,6 @@ public class Gadget {
   public boolean sanitizeOutput() {
     return (getCurrentView() != null &&
         getCurrentView().getType() == View.ContentType.HTML_SANITIZED) ||
-        "1".equals(getContext().getParameter(ProxyBase.SANITIZE_CONTENT_PARAM));
+        "1".equals(getContext().getParameter(UriCommon.Param.SANITIZE.getKey()));
   }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetContext.java Tue Aug 10 11:32:26 2010
@@ -17,6 +17,7 @@
  */
 package org.apache.shindig.gadgets;
 
+import com.google.common.base.Objects;
 import org.apache.shindig.auth.SecurityToken;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.config.ContainerConfig;

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java Tue Aug 10 11:32:26 2010
@@ -24,7 +24,7 @@ import com.google.inject.Singleton;
 
 import org.apache.shindig.auth.AnonymousSecurityToken;
 import org.apache.shindig.auth.SecurityToken;
-import org.apache.shindig.auth.SecurityTokenDecoder;
+import org.apache.shindig.auth.SecurityTokenCodec;
 import org.apache.shindig.auth.SecurityTokenException;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
@@ -35,10 +35,10 @@ import java.util.Map;
 @Singleton
 public class ShindigAuthConfigContributor implements ConfigContributor {
 
-  private SecurityTokenDecoder securityTokenCodec;
+  private SecurityTokenCodec securityTokenCodec;
 
   @Inject
-  public ShindigAuthConfigContributor(SecurityTokenDecoder codec) {
+  public ShindigAuthConfigContributor(SecurityTokenCodec codec) {
     this.securityTokenCodec = codec;
   }
 

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/encoding/EncodingDetector.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/encoding/EncodingDetector.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/encoding/EncodingDetector.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/encoding/EncodingDetector.java Tue Aug 10 11:32:26 2010
@@ -20,6 +20,7 @@ package org.apache.shindig.gadgets.encod
 
 import java.nio.charset.Charset;
 
+import com.google.common.base.Charsets;
 import com.ibm.icu.text.CharsetDetector;
 import com.ibm.icu.text.CharsetMatch;
 
@@ -31,10 +32,6 @@ import com.ibm.icu.text.CharsetMatch;
 public final class EncodingDetector {
   private EncodingDetector() {}
   
-  private static final Charset UTF_8 = Charset.forName("UTF-8");
-  private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
-
-
   public static class FallbackEncodingDetector {
     public Charset detectEncoding(byte[] input) {
       // Fall back to the incredibly slow ICU. It might be better to just skip this entirely.
@@ -60,11 +57,11 @@ public final class EncodingDetector {
   public static Charset detectEncoding(byte[] input, boolean assume88591IfNotUtf8,
       FallbackEncodingDetector alternateDecoder) {
     if (looksLikeValidUtf8(input)) {
-      return UTF_8;
+      return Charsets.UTF_8;
     }
 
     if (assume88591IfNotUtf8) {
-      return ISO_8859_1;
+      return Charsets.ISO_8859_1;
     }
 
     // Fall back encoding:

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java Tue Aug 10 11:32:26 2010
@@ -17,6 +17,7 @@
  */
 package org.apache.shindig.gadgets.features;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -384,9 +385,7 @@ public class FeatureRegistry {
     if (!problems.isEmpty()) {
       StringBuilder sb = new StringBuilder();
       sb.append("Problems found processing features:\n");
-      for (String problem : problems) {
-        sb.append(problem).append('\n');
-      }
+      Joiner.on('\n').appendTo(sb, problems);
       throw new GadgetException(GadgetException.Code.INVALID_CONFIG, sb.toString());
     }
   }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureResourceLoader.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureResourceLoader.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureResourceLoader.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureResourceLoader.java Tue Aug 10 11:32:26 2010
@@ -17,6 +17,7 @@
  */
 package org.apache.shindig.gadgets.features;
 
+import com.google.common.base.Preconditions;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
@@ -140,9 +141,8 @@ public class FeatureResourceLoader {
     protected DualModeFileResource(String optFilePath, String dbgFilePath) {
       this.optContent = new FileContent(optFilePath);
       this.dbgContent = new FileContent(dbgFilePath);
-      if (optContent.get() == null && dbgContent.get() == null) {
-        throw new IllegalArgumentException("Problems reading resource: " + dbgFilePath);
-      }
+      Preconditions.checkArgument(optContent.get() != null || dbgContent.get() != null,
+        "Problems reading resource: %s", dbgFilePath);
     }
 
     public String getContent() {
@@ -202,9 +202,7 @@ public class FeatureResourceLoader {
     private DualModeStaticResource(String path, String content, String debugContent) {
       this.content = content != null ? content : debugContent;
       this.debugContent = debugContent != null ? debugContent : content;
-      if (this.content == null) {
-        throw new IllegalArgumentException("Problems reading resource: " + path);
-      }
+      Preconditions.checkArgument(this.content != null, "Problems reading resource: %s", path);
     }
 
     public String getContent() {

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/AbstractHttpCache.java Tue Aug 10 11:32:26 2010
@@ -17,6 +17,8 @@
  */
 package org.apache.shindig.gadgets.http;
 
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
 import org.apache.shindig.auth.SecurityToken;
 import org.apache.shindig.gadgets.AuthType;
 import org.apache.shindig.gadgets.uri.UriCommon;
@@ -155,10 +157,9 @@ public abstract class AbstractHttpCache 
   protected static String getOwnerId(HttpRequest request) {
     if (request.getAuthType() != AuthType.NONE &&
         request.getOAuthArguments().getSignOwner()) {
-      if (request.getSecurityToken() == null)
-        throw new IllegalArgumentException("No Security Token set for request");
+      Preconditions.checkState(request.getSecurityToken() != null, "No Security Token set for request");
       String ownerId = request.getSecurityToken().getOwnerId();
-      return ownerId == null ? "" : ownerId;
+      return Objects.firstNonNull(ownerId, "");
     }
     // Requests that don't use authentication can share the result.
     return null;
@@ -167,10 +168,9 @@ public abstract class AbstractHttpCache 
   protected static String getViewerId(HttpRequest request) {
     if (request.getAuthType() != AuthType.NONE &&
         request.getOAuthArguments().getSignViewer()) {
-      if (request.getSecurityToken() == null)
-        throw new IllegalArgumentException("No Security Token set for request");
+      Preconditions.checkState(request.getSecurityToken() != null, "No Security Token set for request");
       String viewerId = request.getSecurityToken().getViewerId();
-      return viewerId == null ? "" : viewerId;
+      return Objects.firstNonNull(viewerId, "");
     }
     // Requests that don't use authentication can share the result.
     return null;

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/BasicHttpFetcher.java Tue Aug 10 11:32:26 2010
@@ -17,10 +17,10 @@
  */
 package org.apache.shindig.gadgets.http;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.google.inject.internal.Preconditions;
 import com.google.inject.name.Named;
 
 import org.apache.commons.lang.StringUtils;
@@ -43,6 +43,8 @@ import org.apache.http.client.methods.Ht
 import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.http.client.params.ClientPNames;
 import org.apache.http.client.params.HttpClientParams;
+import org.apache.http.client.protocol.RequestAddCookies;
+import org.apache.http.client.protocol.ResponseProcessCookies;
 import org.apache.http.conn.ClientConnectionManager;
 import org.apache.http.conn.ConnectionPoolTimeoutException;
 import org.apache.http.conn.HttpHostConnectException;
@@ -64,10 +66,11 @@ import org.apache.http.params.HttpConnec
 import org.apache.http.params.HttpParams;
 import org.apache.http.params.HttpProtocolParams;
 import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.EntityUtils;
+import org.apache.http.util.ByteArrayBuffer;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.gadgets.GadgetException;
 
+import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.ProxySelector;
@@ -83,6 +86,7 @@ import java.util.zip.GZIPInputStream;
 import java.util.zip.Inflater;
 import java.util.zip.InflaterInputStream;
 
+import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletResponse;
 
 /**
@@ -117,7 +121,7 @@ public class BasicHttpFetcher implements
    * @param basicHttpFetcherProxy The http proxy to use.
    */
   @Inject
-  public BasicHttpFetcher(@Named("org.apache.shindig.gadgets.http.basicHttpFetcherProxy")
+  public BasicHttpFetcher(@Nullable @Named("org.apache.shindig.gadgets.http.basicHttpFetcherProxy")
                           String basicHttpFetcherProxy) {
     this(DEFAULT_MAX_OBJECT_SIZE, DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS,
          basicHttpFetcherProxy);
@@ -211,6 +215,10 @@ public class BasicHttpFetcher implements
     });
     client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler() );
 
+    // Disable automatic storage and sending of cookies (see SHINDIG-1382)
+    client.removeRequestInterceptorByClass(RequestAddCookies.class); 
+    client.removeResponseInterceptorByClass(ResponseProcessCookies.class);
+
     // Use Java's built-in proxy logic in case no proxy set via guice.
     if (StringUtils.isEmpty(basicHttpFetcherProxy)) {
       ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
@@ -227,6 +235,7 @@ public class BasicHttpFetcher implements
       super(entity);
     }
 
+    @Override
     public InputStream getContent() throws IOException, IllegalStateException {
       // the wrapped entity's getContent() decides about repeatability
       InputStream wrappedin = wrappedEntity.getContent();
@@ -234,6 +243,7 @@ public class BasicHttpFetcher implements
       return new GZIPInputStream(wrappedin);
     }
 
+    @Override
     public long getContentLength() {
       // length of ungzipped content is not known
       return -1;
@@ -245,6 +255,7 @@ public class BasicHttpFetcher implements
       super(entity);
     }
 
+    @Override
     public InputStream getContent()
         throws IOException, IllegalStateException {
 
@@ -254,13 +265,14 @@ public class BasicHttpFetcher implements
       return new InflaterInputStream(wrappedin, new Inflater(true));
     }
 
+    @Override
     public long getContentLength() {
       // length of ungzipped content is not known
       return -1;
     }
   }
 
-  public HttpResponse fetch(org.apache.shindig.gadgets.http.HttpRequest request) 
+  public HttpResponse fetch(org.apache.shindig.gadgets.http.HttpRequest request)
       throws GadgetException {
     HttpUriRequest httpMethod = null;
     Preconditions.checkNotNull(request);
@@ -362,7 +374,7 @@ public class BasicHttpFetcher implements
 
       LOG.log(Level.INFO, "Got Exception fetching " + request.getUri() + " - " + (now - started) + "ms", e);
 
-      // Separate shindig error from external error 
+      // Separate shindig error from external error
       throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR, e,
           HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
     } finally {
@@ -453,11 +465,77 @@ public class BasicHttpFetcher implements
       return HttpResponse.badrequest("Exceeded maximum number of bytes - " + maxObjSize);
     }
 
-    byte[] responseBytes = (entity == null) ? null : EntityUtils.toByteArray(entity);
+    byte[] responseBytes = (entity == null) ? null : toByteArraySafe(entity);
 
     return builder
         .setHttpStatusCode(response.getStatusLine().getStatusCode())
         .setResponse(responseBytes)
         .create();
   }
+
+  /**
+   * This method is Safe replica version of org.apache.http.util.EntityUtils.toByteArray.
+   * The try block embedding 'instream.read' has a corresponding catch block for 'EOFException'
+   * (that's Ignored) and all other IOExceptions are let pass.
+   *
+   * @param entity
+   * @return byte array containing the entity content. May be empty/null.
+   * @throws IOException if an error occurs reading the input stream
+   */
+  public byte[] toByteArraySafe(final HttpEntity entity) throws IOException {
+    if (entity == null) {
+      return null;
+    }
+
+    InputStream instream = entity.getContent();
+    if (instream == null) {
+      return new byte[] {};
+    }
+    Preconditions.checkArgument(entity.getContentLength() < Integer.MAX_VALUE, "HTTP entity too large to be buffered in memory");
+
+    // The raw data stream (inside JDK) is read in a buffer of size '512'. The original code
+    // org.apache.http.util.EntityUtils.toByteArray reads the unzipped data in a buffer of
+    // 4096 byte. For any data stream that has a compression ratio lesser than 1/8, this may
+    // result in the buffer/array overflow. Increasing the buffer size to '16384'. It's highly
+    // unlikely to get data compression ratios lesser than 1/32 (3%).
+    final int bufferLength = 16384;
+    int i = (int)entity.getContentLength();
+    if (i < 0) {
+      i = bufferLength;
+    }
+    ByteArrayBuffer buffer = new ByteArrayBuffer(i);
+    try {
+      byte[] tmp = new byte[bufferLength];
+      int l;
+      while((l = instream.read(tmp)) != -1) {
+        buffer.append(tmp, 0, l);
+      }
+    } catch (EOFException eofe) {
+      /**
+       * Ref: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4040920
+       * Due to a bug in JDK ZLIB (InflaterInputStream), unexpected EOF error can occur.
+       * In such cases, even if the input stream is finished reading, the
+       * 'Inflater.finished()' call erroneously returns 'false' and
+       * 'java.util.zip.InflaterInputStream.fill' throws the 'EOFException'.
+       * So for such case, ignore the Exception in case Exception Cause is
+       * 'Unexpected end of ZLIB input stream'.
+       *
+       * Also, ignore this exception in case the exception has no message
+       * body as this is the case where {@link GZIPInputStream#readUByte}
+       * throws EOFException with empty message. A bug has been filed with Sun
+       * and will be mentioned here once it is accepted.
+       */
+      if (instream.available() == 0 &&
+          (eofe.getMessage() == null ||
+           eofe.getMessage().equals("Unexpected end of ZLIB input stream"))) {
+        LOG.log(Level.FINE, "EOFException: ", eofe);
+      } else {
+        throw eofe;
+      }
+    }
+    finally {
+      instream.close();
+    }
+    return buffer.toByteArray();
+  }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java Tue Aug 10 11:32:26 2010
@@ -20,7 +20,7 @@ package org.apache.shindig.gadgets.http;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-import com.google.inject.internal.Nullable;
+import javax.annotation.Nullable;
 import com.google.inject.name.Named;
 
 import org.apache.shindig.common.util.Utf8UrlCoder;
@@ -118,7 +118,7 @@ public class DefaultRequestPipeline impl
     
     // Set response hash value in metadata (used for url versioning)
     fetchedResponse = HttpResponseMetadataHelper.updateHash(fetchedResponse, metadataHelper);
-    if (!request.getIgnoreCache() ) {
+    if (!request.getIgnoreCache()) {
       // Mark the response with invalidation information prior to caching
       if (fetchedResponse.getCacheTtl() > 0) {
         fetchedResponse = invalidationService.markResponse(request, fetchedResponse);

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpRequest.java Tue Aug 10 11:32:26 2010
@@ -51,6 +51,10 @@ public class HttpRequest {
   private String method = "GET";
   private Uri uri;
   private final Map<String, List<String>> headers = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
+
+  // Internal parameters which serve as extra information to pass along the
+  // chain of HttpRequest processing.
+  // NOTE: These are not get/post parameter equivalent of HttpServletRequest.
   private final Map<String, String> params = Maps.newHashMap();
 
   private byte[] postBody = ArrayUtils.EMPTY_BYTE_ARRAY;
@@ -65,6 +69,9 @@ public class HttpRequest {
   // Sanitization
   private boolean sanitizationRequested;
 
+  // Caja
+  private boolean cajaRequested;
+
   // Whether to follow redirects
   private boolean followRedirects = true;
 
@@ -216,6 +223,18 @@ public class HttpRequest {
     this.sanitizationRequested = sanitizationRequested;
   }
 
+    /**
+   * Should content fetched in response to this request
+   * be sanitized based on the specified mime-type
+   */
+  public boolean isCajaRequested() {
+    return cajaRequested;
+  }
+
+  public void setCajaRequested(boolean cajaRequested) {
+    this.cajaRequested = cajaRequested;
+  }
+
   /**
    * @param cacheTtl The amount of time to cache the result object for, in seconds. If set to -1,
    * HTTP cache control headers will be honored. Otherwise objects will be cached for the time

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponse.java Tue Aug 10 11:32:26 2010
@@ -18,6 +18,7 @@
 package org.apache.shindig.gadgets.http;
 
 import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.MapMaker;
@@ -28,7 +29,9 @@ import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.shindig.common.servlet.HttpUtil;
 import org.apache.shindig.common.util.DateUtil;
+import org.apache.shindig.common.util.TimeSource;
 import org.apache.shindig.gadgets.encoding.EncodingDetector;
 
 import java.io.ByteArrayInputStream;
@@ -126,6 +129,10 @@ public final class HttpResponse implemen
 
   static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");
 
+  // At what point you don't trust remote server date stamp on response (in milliseconds)
+  // (Should be less then DEFAULT_TTL)
+  static final long DEFAULT_DRIFT_LIMIT_MS = 3L * 60L * 1000L;
+
   @Inject(optional = true) @Named("shindig.cache.http.negativeCacheTtl")
   private static long negativeCacheTtl = DEFAULT_NEGATIVE_CACHE_TTL;
 
@@ -139,7 +146,18 @@ public final class HttpResponse implemen
   @Inject(optional = true)
   private static EncodingDetector.FallbackEncodingDetector customEncodingDetector =
       new EncodingDetector.FallbackEncodingDetector();
-  
+
+  @Inject(optional = true) @Named("shindig.http.date-drift-limit-ms")
+  private static long responseDateDriftLimit = DEFAULT_DRIFT_LIMIT_MS;
+
+  public static void setTimeSource(TimeSource timeSource) {
+    HttpUtil.setTimeSource(timeSource);
+  }
+
+  public static TimeSource getTimeSource() {
+    return HttpUtil.getTimeSource();
+  }
+
   // Holds character sets for fast conversion
   private static final Map<String, Charset> encodingToCharset = new MapMaker().makeMap();
 
@@ -163,11 +181,13 @@ public final class HttpResponse implemen
   HttpResponse(HttpResponseBuilder builder) {
     httpStatusCode = builder.getHttpStatusCode();
     Multimap<String, String> headerCopy = HttpResponse.newHeaderMultimap();
-    headerCopy.putAll(builder.getHeaders());
 
     // Always safe, HttpResponseBuilder won't modify the body.
     responseBytes = builder.getResponse();
 
+    // Copy headers after builder.getResponse(), since that can modify Content-Type.
+    headerCopy.putAll(builder.getHeaders());
+
     Map<String, String> metadataCopy = Maps.newHashMap(builder.getMetadata());
     metadata = Collections.unmodifiableMap(metadataCopy);
 
@@ -195,7 +215,7 @@ public final class HttpResponse implemen
   public static HttpResponse badrequest(String msg) {
     return new HttpResponse(SC_BAD_REQUEST, msg);
   }
-  
+
   public static HttpResponse timeout() {
     return new HttpResponse(SC_GATEWAY_TIMEOUT, "");
   }
@@ -223,6 +243,13 @@ public final class HttpResponse implemen
   }
 
   /**
+   * @return The Charset of the response body's encoding, if we were able to determine it.
+   */
+  public Charset getEncodingCharset() {
+    return encoding;
+  }
+
+  /**
    * @return the content length
    */
   public int getContentLength() {
@@ -247,7 +274,7 @@ public final class HttpResponse implemen
     if (responseString == null) {
       responseString = encoding.decode(ByteBuffer.wrap(responseBytes)).toString();
 
-      // Strip BOM if present
+      // Strip BOM if present.
       if (responseString.length() > 0 && responseString.codePointAt(0) == 0xFEFF) {
         responseString = responseString.substring(1);
       }
@@ -342,7 +369,7 @@ public final class HttpResponse implemen
   public long getCacheTtl() {
     long expiration = getCacheExpiration();
     if (expiration != -1) {
-      return expiration - System.currentTimeMillis();
+      return expiration - getTimeSource().currentTimeMillis();
     }
     return -1;
   }
@@ -434,17 +461,22 @@ public final class HttpResponse implemen
   private static long getAndUpdateDate(Multimap<String, String> headers) {
     // Validate the Date header. Must conform to the HTTP date format.
     long timestamp = -1;
+    long currentTime = getTimeSource().currentTimeMillis();
     Collection<String> dates = headers.get("Date");
 
     if (!dates.isEmpty()) {
       Date d = DateUtil.parseRfc1123Date(dates.iterator().next());
       if (d != null) {
         timestamp = d.getTime();
+        if (Math.abs(currentTime - timestamp) > responseDateDriftLimit) {
+          // Do not trust the date from response if it is too old (server time out of sync)
+          timestamp = -1;
+        }
       }
     }
     if (timestamp == -1) {
-      timestamp = System.currentTimeMillis();
-      headers.put("Date", DateUtil.formatRfc1123Date(timestamp));
+      timestamp = currentTime;
+      headers.replaceValues("Date", ImmutableList.of(DateUtil.formatRfc1123Date(timestamp)));
     }
     return timestamp;
   }
@@ -455,7 +487,7 @@ public final class HttpResponse implemen
    * @return milliseconds of the ttl
    */
   public long getDefaultTtl() {
-    return defaultTtl;  
+    return defaultTtl;
   }
 
   /**
@@ -487,7 +519,7 @@ public final class HttpResponse implemen
           if (charset.length() >= 2 && charset.startsWith("\"") && charset.endsWith("\"")) {
             charset = charset.substring(1, charset.length() - 1);
           }
-          
+
           try {
             return charsetForName(charset);
           } catch (IllegalArgumentException e) {
@@ -520,10 +552,10 @@ public final class HttpResponse implemen
       charset = Charset.forName(encoding);
       encodingToCharset.put(encoding, charset);
     }
-    
+
     return charset;
   }
-  
+
   @Override
   public int hashCode() {
     return httpStatusCode
@@ -591,7 +623,7 @@ public final class HttpResponse implemen
    	 bodyLength -= cnt;
     }
     if (offset != responseBytes.length) {
-    	throw new IOException("Invalid body! Expected length = " + responseBytes.length + ", bytes readed = " + offset + '.'); 
+    	throw new IOException("Invalid body! Expected length = " + responseBytes.length + ", bytes readed = " + offset + '.');
     }
 
     date = getAndUpdateDate(headerCopy);

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpResponseBuilder.java Tue Aug 10 11:32:26 2010
@@ -17,6 +17,7 @@
  */
 package org.apache.shindig.gadgets.http;
 
+import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -94,8 +95,7 @@ public class HttpResponseBuilder extends
    * @param body The response string.  Converted to UTF-8 bytes and copied when set.
    */
   public HttpResponseBuilder setResponseString(String body) {
-    setContentBytes(CharsetUtil.getUtf8Bytes(body));
-    setEncoding(CharsetUtil.UTF8);
+    setContentBytes(CharsetUtil.getUtf8Bytes(body), Charsets.UTF_8);
     return this;
   }
 
@@ -108,10 +108,18 @@ public class HttpResponseBuilder extends
       String[] parts = StringUtils.split(contentType, ';');
       for (String part : parts) {
         if (!part.contains("charset=")) {
-          newContentTypeBuilder.append(part).append("; ");
+          if (newContentTypeBuilder.length() > 0) {
+            newContentTypeBuilder.append("; ");
+          }
+          newContentTypeBuilder.append(part);
         }
       }
-      newContentTypeBuilder.append("charset=").append(charset.name());
+      if (charset != null) {
+        if (newContentTypeBuilder.length() > 0) {
+          newContentTypeBuilder.append("; ");
+        }
+        newContentTypeBuilder.append("charset=").append(charset.name());
+      }
       values.clear();
       String newContentType = newContentTypeBuilder.toString();
       values.add(newContentType);
@@ -268,6 +276,22 @@ public class HttpResponseBuilder extends
     return httpStatusCode;
   }
   
+  /**
+   * Ensures that, when setting content bytes, the bytes' encoding is reflected
+   * in the current Content-Type header.
+   * Note, this method does NOT override existing Content-Type values if newEncoding is null.
+   * This allows charset to be set by header only, along with a byte array -- a very typical,
+   * and important, pattern when creating an HttpResponse in an HttpFetcher.
+   */
+  @Override
+  protected void setContentBytesState(byte[] newBytes, Charset newEncoding) {
+    super.setContentBytesState(newBytes, newEncoding);
+    
+    // Set the new encoding of the raw bytes, in order to ensure that
+    // Content-Type headers are in sync w/ the content's encoding.
+    if (newEncoding != null) setEncoding(newEncoding);
+  }
+  
   private static GadgetHtmlParser unsupportedParser() {
     return new GadgetHtmlParser(null) {
       @Override

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthModule.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthModule.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthModule.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthModule.java Tue Aug 10 11:32:26 2010
@@ -137,7 +137,7 @@ public class OAuthModule extends Abstrac
             "     -out testkey.pem -subj '/CN=mytestkey'\n" +
             "  openssl pkcs8 -in testkey.pem -out oauthkey.pem -topk8 -nocrypt -outform PEM\n" +
             '\n' +
-            "Then edit gadgets.properties and add these lines:\n" +
+            "Then edit shindig.properties and add these lines:\n" +
             OAUTH_SIGNING_KEY_FILE + "=<path-to-oauthkey.pem>\n" +
             OAUTH_SIGNING_KEY_NAME + "=mykey\n");
       }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthRequest.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthRequest.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthRequest.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/OAuthRequest.java Tue Aug 10 11:32:26 2010
@@ -16,6 +16,7 @@
  */
 package org.apache.shindig.gadgets.oauth;
 
+import com.google.common.base.Charsets;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
@@ -32,6 +33,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.auth.OAuthConstants;
 import org.apache.shindig.auth.OAuthUtil;
+import org.apache.shindig.common.crypto.Crypto;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.common.util.CharsetUtil;
@@ -195,9 +197,9 @@ public class OAuthRequest {
       response = fetchWithRetry();
     } catch (OAuthRequestException e) {
       // No data for us.
-      if (OAuthError.UNAUTHENTICATED.toString().equals(e.getError())) {
+      if (OAuthError.UNAUTHENTICATED.name().equals(e.getError())) {
         responseParams.logDetailedInfo("Unauthenticated OAuth fetch", e);
-      } else if (OAuthError.BAD_OAUTH_TOKEN_URL.toString().equals(e.getError())) {
+      } else if (OAuthError.BAD_OAUTH_TOKEN_URL.name().equals(e.getError())) {
         responseParams.logDetailedInfo("Invalid OAuth fetch request", e);
       } else {
         responseParams.logDetailedWarning("OAuth fetch fatal error", e);
@@ -473,6 +475,9 @@ public class OAuthRequest {
     params.add(new Parameter(OAuth.OAUTH_VERSION, OAuth.VERSION_1_0));
     params.add(new Parameter(OAuth.OAUTH_TIMESTAMP,
         Long.toString(fetcherConfig.getClock().currentTimeMillis() / 1000)));
+    // the oauth.net java code uses a clock to generate nonces, which causes nonce collisions
+    // under heavy load.  A random nonce is more reliable.
+    params.add(new Parameter(OAuth.OAUTH_NONCE, String.valueOf(Math.abs(Crypto.RAND.nextLong()))));
   }
 
   static String getAuthorizationHeader(List<Map.Entry<String, String>> oauthParams) {
@@ -529,7 +534,7 @@ public class OAuthRequest {
         try {
           byte[] body = IOUtils.toByteArray(base.getPostBody());
           byte[] hash = DigestUtils.sha(body);
-          String b64 = new String(Base64.encodeBase64(hash), CharsetUtil.UTF8.name());
+          String b64 = new String(Base64.encodeBase64(hash), Charsets.UTF_8.name());
           params.add(new Parameter(OAuthConstants.OAUTH_BODY_HASH, b64));
         } catch (IOException e) {
           throw new OAuthRequestException(OAuthError.UNKNOWN_PROBLEM,

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/testing/FakeOAuthServiceProvider.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/testing/FakeOAuthServiceProvider.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/testing/FakeOAuthServiceProvider.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/oauth/testing/FakeOAuthServiceProvider.java Tue Aug 10 11:32:26 2010
@@ -39,6 +39,9 @@ import org.apache.commons.io.IOUtils;
 import org.apache.shindig.auth.OAuthConstants;
 import org.apache.shindig.auth.OAuthUtil;
 import org.apache.shindig.auth.OAuthUtil.SignatureType;
+import org.apache.shindig.common.cache.LruCache;
+import org.apache.shindig.common.cache.SoftExpiringCache;
+import org.apache.shindig.common.cache.SoftExpiringCache.CachedObject;
 import org.apache.shindig.common.crypto.Crypto;
 import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.common.util.CharsetUtil;
@@ -57,11 +60,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 import java.util.Map.Entry;
+import java.util.concurrent.TimeUnit;
 
 public class FakeOAuthServiceProvider implements HttpFetcher {
 
-
-
   public static final String BODY_ECHO_HEADER = "X-Echoed-Body";
 
   public static final String RAW_BODY_ECHO_HEADER = "X-Echoed-Raw-Body";
@@ -182,6 +184,7 @@ public class FakeOAuthServiceProvider im
   private final OAuthConsumer signedFetchConsumer;
   private final OAuthConsumer oauthConsumer;
   private final TimeSource clock;
+  private final SoftExpiringCache<String, OAuthMessage> nonceCache;
 
   private boolean unauthorized = false;
   private boolean throttled = false;
@@ -222,6 +225,9 @@ public class FakeOAuthServiceProvider im
     tokenState = Maps.newHashMap();
     validParamLocations = Sets.newHashSet();
     validParamLocations.add(OAuthParamLocation.URI_QUERY);
+    nonceCache =
+        new SoftExpiringCache<String, OAuthMessage>(new LruCache<String, OAuthMessage>(10000));
+    nonceCache.setTimeSource(clock);
   }
 
   public void setVagueErrors(boolean vagueErrors) {
@@ -747,6 +753,18 @@ public class FakeOAuthServiceProvider im
           throw new RuntimeException("oauth_body_hash mismatch");
         }
     }
+    
+    // Most OAuth service providers are much laxer than this about checking nonces (rapidly
+    // changing server-side state scales badly), but we are very strict in test cases.
+    String nonceKey = info.message.getConsumerKey() + ','
+        + info.message.getParameter("oauth_nonce");
+    
+    CachedObject<OAuthMessage> previousMessage = nonceCache.getElement(nonceKey);
+    if (previousMessage != null) {
+      throw new RuntimeException("Reused nonce, old message = " + previousMessage.obj
+          + ", new message " + info.message);
+    }
+    nonceCache.addElement(nonceKey, info.message, TimeUnit.SECONDS.toMillis(10 * 60));
   }
 
   private HttpResponse handleNotFoundUrl(HttpRequest request) throws Exception {

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java Tue Aug 10 11:32:26 2010
@@ -66,7 +66,10 @@ public class DefaultHtmlSerializer imple
         break;
       }
       case Node.DOCUMENT_NODE: {
-        serialize(((Document)n).getDocumentElement(), output, xmlMode);
+        NodeList children = ((Document)n).getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+          serialize(children.item(i), output, xmlMode);
+        }
         break;
       }
       case Node.ELEMENT_NODE: {

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/GadgetHtmlParser.java Tue Aug 10 11:32:26 2010
@@ -90,13 +90,14 @@ public abstract class GadgetHtmlParser {
     if (document == null) {
       try {
         document = parseDomImpl(source);
-      } catch (GadgetException e) {
-        throw e;
       } catch (DOMException e) {
         // DOMException is a RuntimeException
         document = errorDom(e);
         HtmlSerialization.attach(document, serializerProvider.get(), source);
         return document;
+      } catch (NullPointerException e) {
+        throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR,
+                                  "Caught exception in parseDomImpl", e);
       }
 
       HtmlSerialization.attach(document, serializerProvider.get(), source);

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssParser.java Tue Aug 10 11:32:26 2010
@@ -19,6 +19,7 @@ package org.apache.shindig.gadgets.parse
 
 import org.apache.shindig.common.cache.Cache;
 import org.apache.shindig.common.cache.CacheProvider;
+import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.util.HashUtil;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpResponse;
@@ -45,19 +46,17 @@ import com.google.inject.Inject;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.net.URI;
 import java.util.Collections;
 
 /** A CSS DOM parser using Caja. */
 public class CajaCssParser {
 
   /**
-   * Dummy URI that is never read from. Needed to construct Caja parser
+   * Fake URI source if one is not provided by the calling context.
    */
-  private static final URI FAKE_SOURCE = URI.create("http://a.dummy.url");
+  private static final Uri FAKE_SOURCE = Uri.parse("http://a.dummy.url");
 
-  // Switch to "parsedCss" once CajaCssLexerParser is removed. See ehCacheConfig
-  private static final String PARSED_CSS = "parsedCssDom";
+  private static final String PARSED_CSS = "parsedCss";
 
   private Cache<String, CssTree.StyleSheet> parsedCssCache;
 
@@ -72,6 +71,12 @@ public class CajaCssParser {
    * @return A parsed stylesheet
    */
   public CssTree.StyleSheet parseDom(String content) throws GadgetException {
+    // Use a fake source if the real source is unknown
+    return parseDom(content, FAKE_SOURCE);
+  }
+  
+  public CssTree.StyleSheet parseDom(String content, Uri source)
+      throws GadgetException {
     CssTree.StyleSheet parsedCss = null;
     boolean shouldCache = shouldCache();
     String key = null;
@@ -82,7 +87,7 @@ public class CajaCssParser {
     }
     if (parsedCss == null) {
       try {
-        parsedCss = parseImpl(content);
+        parsedCss = parseImpl(content, source);
         if (shouldCache) {
           parsedCssCache.addElement(key, parsedCss);
         }
@@ -98,8 +103,9 @@ public class CajaCssParser {
     return parsedCss;
   }
 
-  private CssTree.StyleSheet parseImpl(String css) throws ParseException {
-    InputSource inputSource = new InputSource(FAKE_SOURCE);
+  private CssTree.StyleSheet parseImpl(String css, Uri source)
+      throws ParseException {
+    InputSource inputSource = new InputSource(source.toJavaUri());
     CharProducer producer = CharProducer.Factory.create(new StringReader(css),
         inputSource);
     TokenStream<CssTokenType> lexer = new CssLexer(producer);

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java Tue Aug 10 11:32:26 2010
@@ -75,7 +75,7 @@ public class CajaCssSanitizer {
   public String sanitize(String content, Uri linkContext, ProxyUriManager importRewriter,
       ProxyUriManager imageRewriter) {
     try {
-      CssTree.StyleSheet stylesheet = parser.parseDom(content);
+      CssTree.StyleSheet stylesheet = parser.parseDom(content, linkContext);
       sanitize(stylesheet, linkContext, importRewriter, imageRewriter);
       // Write the rewritten CSS back into the element
       return parser.serialize(stylesheet);
@@ -97,7 +97,8 @@ public class CajaCssSanitizer {
       ProxyUriManager imageRewriter) {
     String content = null;
     try {
-      CssTree.StyleSheet stylesheet = parser.parseDom(styleElem.getTextContent());
+      CssTree.StyleSheet stylesheet =
+        parser.parseDom(styleElem.getTextContent(), linkContext);
       sanitize(stylesheet, linkContext, importRewriter, imageRewriter);
       // Write the rewritten CSS back into the element
       content = parser.serialize(stylesheet);

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/nekohtml/NekoSimplifiedHtmlParser.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/nekohtml/NekoSimplifiedHtmlParser.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/nekohtml/NekoSimplifiedHtmlParser.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/nekohtml/NekoSimplifiedHtmlParser.java Tue Aug 10 11:32:26 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.shindig.gadgets.parse.nekohtml;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.xml.DomUtil;
 import org.apache.shindig.gadgets.GadgetException;
@@ -37,7 +38,6 @@ import org.apache.xerces.xni.parser.XMLI
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.google.inject.internal.ImmutableMap;
 import org.cyberneko.html.HTMLConfiguration;
 import org.cyberneko.html.HTMLElements;
 import org.cyberneko.html.HTMLEntities;

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/preload/PipelineExecutor.java Tue Aug 10 11:32:26 2010
@@ -47,9 +47,9 @@ public class PipelineExecutor {
   private static final int MAX_BATCH_COUNT = 3;
   private static final Logger LOG = Logger.getLogger(PipelineExecutor.class.getName());
 
-  private PipelinedDataPreloader preloader;
-  private PreloaderService preloaderService;
-  private Expressions expressions;
+  private final PipelinedDataPreloader preloader;
+  private final PreloaderService preloaderService;
+  private final Expressions expressions;
 
   @Inject
   public PipelineExecutor(PipelinedDataPreloader preloader,
@@ -59,7 +59,7 @@ public class PipelineExecutor {
     this.preloaderService = preloaderService;
     this.expressions = expressions;
   }
-  
+
   /**
    * Results from a full pipeline execution.
    */
@@ -69,17 +69,17 @@ public class PipelineExecutor {
      * evaluated.
      */
     public final Collection<PipelinedData> remainingPipelines;
-    
+
     /**
      * Results in the form of a full JSON-RPC batch response.
      */
     public final Collection<? extends Object> results;
-    
+
     /**
      * Results in the form of a Map from id to a JSON-serializable object.
      */
     public final Map<String, ? extends Object> keyedResults;
-    
+
     public Results(Collection<PipelinedData> remainingPipelines,
         Collection<? extends Object> results,
         Map<String, ? extends Object> keyedResults) {
@@ -101,13 +101,13 @@ public class PipelineExecutor {
     CompositeELResolver rootObjects = new CompositeELResolver();
     rootObjects.add(new GadgetELResolver(context));
     rootObjects.add(new RootELResolver(elResults));
-    
+
     List<PipelineState> pipelineStates = Lists.newArrayList();
     for (PipelinedData pipeline : pipelines) {
       PipelinedData.Batch batch = pipeline.getBatch(expressions, rootObjects);
       pipelineStates.add(new PipelineState(pipeline, batch));
     }
-    
+
     int batchCount = 0;
     while (true) {
       List<Callable<PreloadedData>> tasks = Lists.newArrayList();
@@ -116,7 +116,7 @@ public class PipelineExecutor {
           tasks.addAll(preloader.createPreloadTasks(context, pipeline.batch));
         }
       }
-      
+
       if (tasks.isEmpty()) {
         break;
       }
@@ -126,10 +126,14 @@ public class PipelineExecutor {
         try {
           for (Object entry : preloaded.toJson()) {
             results.add(entry);
-            
+
             String id = (String) JsonUtil.getProperty(entry, "id");
 
             Object data = JsonUtil.getProperty(entry, "result");
+            if (data == null) {
+              // For backward compatiblity, check maybe return old 'data' field:
+              data = JsonUtil.getProperty(entry, "data");
+            }
             if (data != null) {
               elResults.put(id, data);
             } else {
@@ -151,20 +155,20 @@ public class PipelineExecutor {
           pipeline.batch = pipeline.batch.getNextBatch(rootObjects);
         }
       }
-      
+
       batchCount++;
       if (batchCount == MAX_BATCH_COUNT) {
         break;
       }
     }
-    
+
     List<PipelinedData> remainingPipelines = Lists.newArrayList();
     for (PipelineState pipeline : pipelineStates) {
       if (pipeline.batch != null) {
         remainingPipelines.add(pipeline.pipeline);
       }
     }
-    
+
     return new Results(remainingPipelines, results, elResults);
   }
 
@@ -176,6 +180,6 @@ public class PipelineExecutor {
     }
 
     public final PipelinedData pipeline;
-    public PipelinedData.Batch batch;    
+    public PipelinedData.Batch batch;
   }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/GadgetRewritersProvider.java Tue Aug 10 11:32:26 2010
@@ -34,23 +34,15 @@ import java.util.List;
  *
  */
 public class GadgetRewritersProvider {
-
   private final List<GadgetRewriter> renderRewriters;
-  private final List<GadgetRewriter> accelRewriters;
-  
+
   @Inject
   public GadgetRewritersProvider(
-      @Named("shindig.rewriters.gadget") List<GadgetRewriter> renderRewriters,
-      @Named("shindig.rewriters.accelerate") List<GadgetRewriter> accelRewriters) {
+      @Named("shindig.rewriters.gadget") List<GadgetRewriter> renderRewriters) {
     this.renderRewriters = renderRewriters;
-    this.accelRewriters = accelRewriters;
   }
 
   public List<GadgetRewriter> getRewriters(GadgetContext context) {
-    if (HtmlAccelServlet.isAccel(context)) {
-      return accelRewriters;
-    }
     return renderRewriters;
   }
-  
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderModule.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderModule.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderModule.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderModule.java Tue Aug 10 11:32:26 2010
@@ -50,13 +50,6 @@ public class RenderModule extends Abstra
 
   @Provides
   @Singleton
-  @org.apache.shindig.gadgets.render.old.SanitizingGadgetRewriter.AllowedTags
-  protected Set<String> provideOldAllowedTags() {
-    return provideAllowedTags();
-  }
-
-  @Provides
-  @Singleton
   @SanitizingGadgetRewriter.AllowedAttributes
   protected Set<String> provideAllowedAttributes() {
     return ImmutableSet.of("abbr", "align", "alt", "axis", "bgcolor", "border",
@@ -67,11 +60,4 @@ public class RenderModule extends Abstra
         "src", "start", "style", "summary", "title", "type", "usemap", "valign", "value",
         "vspace", "width");
   }
-
-  @Provides
-  @Singleton
-  @org.apache.shindig.gadgets.render.old.SanitizingGadgetRewriter.AllowedAttributes
-  protected Set<String> provideOldAllowedAttributes() {
-    return provideAllowedAttributes();
-  }
 }
\ No newline at end of file

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java Tue Aug 10 11:32:26 2010
@@ -48,6 +48,7 @@ import org.w3c.dom.NodeList;
 import org.w3c.dom.Text;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -121,7 +122,7 @@ public class RenderingGadgetRewriter imp
   @Inject
   public void setDefaultForcedLibs(@Named("shindig.gadget-rewrite.default-forced-libs")String forcedLibs) {
     if (StringUtils.isNotBlank(forcedLibs)) {
-      defaultExternLibs = ImmutableSortedSet.of(StringUtils.split(forcedLibs, ':'));
+      defaultExternLibs = ImmutableSortedSet.copyOf(StringUtils.split(forcedLibs, ':'));
     }
   }
 
@@ -141,29 +142,21 @@ public class RenderingGadgetRewriter imp
 
       Element head = (Element)DomUtil.getFirstNamedChildNode(document.getDocumentElement(), "head");
 
-      // Remove all the elements currently in head and add them back after we inject content
-      NodeList children = head.getChildNodes();
-      List<Node> existingHeadContent = Lists.newArrayListWithExpectedSize(children.getLength());
-      for (int i = 0; i < children.getLength(); i++) {
-        existingHeadContent.add(children.item(i));
-      }
-
-      for (Node n : existingHeadContent) {
-        head.removeChild(n);
-      }
+      // Insert new content before any of the existing children of the head element
+      Node firstHeadChild = head.getFirstChild();
 
       // Only inject default styles if no doctype was specified.
       if (document.getDoctype() == null) {
         Element defaultStyle = document.createElement("style");
         defaultStyle.setAttribute("type", "text/css");
-        head.appendChild(defaultStyle);
+        head.insertBefore(defaultStyle, firstHeadChild);
         defaultStyle.appendChild(defaultStyle.getOwnerDocument().
             createTextNode(DEFAULT_CSS));
       }
 
       injectBaseTag(gadget, head);
-      injectGadgetBeacon(gadget, head);
-      injectFeatureLibraries(gadget, head);
+      injectGadgetBeacon(gadget, head, firstHeadChild);
+      injectFeatureLibraries(gadget, head, firstHeadChild);
 
       // This can be one script block.
       Element mainScriptTag = document.createElement("script");
@@ -175,17 +168,12 @@ public class RenderingGadgetRewriter imp
       injectPreloads(gadget, mainScriptTag);
 
       // We need to inject our script before any developer scripts.
-      head.appendChild(mainScriptTag);
+      head.insertBefore(mainScriptTag, firstHeadChild);
 
       Element body = (Element)DomUtil.getFirstNamedChildNode(document.getDocumentElement(), "body");
 
       body.setAttribute("dir", bundle.getLanguageDirection());
 
-      // re append head content
-      for (Node node : existingHeadContent) {
-        head.appendChild(node);
-      }
-
       injectOnLoadHandlers(body);
 
       mutableContent.documentChanged();
@@ -215,16 +203,18 @@ public class RenderingGadgetRewriter imp
         "gadgets.util.runOnLoadHandlers();"));
   }
   
-  protected void injectGadgetBeacon(Gadget gadget, Node headTag) throws GadgetException {
+  protected void injectGadgetBeacon(Gadget gadget, Node headTag, Node firstHeadChild)
+          throws GadgetException {
     Element beaconNode = headTag.getOwnerDocument().createElement("script");
     beaconNode.setTextContent(IS_GADGET_BEACON);
-    headTag.appendChild(beaconNode);
+    headTag.insertBefore(beaconNode, firstHeadChild);
   }
 
   /**
    * Injects javascript libraries needed to satisfy feature dependencies.
    */
-  protected void injectFeatureLibraries(Gadget gadget, Node headTag) throws GadgetException {
+  protected void injectFeatureLibraries(Gadget gadget, Node headTag, Node firstHeadChild)
+          throws GadgetException {
     // TODO: If there isn't any js in the document, we can skip this. Unfortunately, that means
     // both script tags (easy to detect) and event handlers (much more complex).
     GadgetContext context = gadget.getContext();
@@ -242,7 +232,7 @@ public class RenderingGadgetRewriter imp
       String jsUrl = jsUriManager.makeExternJsUri(gadget, externForcedLibs).toString();
       Element libsTag = headTag.getOwnerDocument().createElement("script");
       libsTag.setAttribute("src", StringUtils.replace(jsUrl, "&", "&amp;"));
-      headTag.appendChild(libsTag);
+      headTag.insertBefore(libsTag, firstHeadChild);
     }
 
     List<String> unsupported = Lists.newLinkedList();
@@ -284,7 +274,7 @@ public class RenderingGadgetRewriter imp
         String jsUrl = jsUriManager.makeExternJsUri(gadget, externGadgetLibs).toString();
         Element libsTag = headTag.getOwnerDocument().createElement("script");
         libsTag.setAttribute("src", StringUtils.replace(jsUrl, "&", "&amp;"));
-        headTag.appendChild(libsTag);
+        headTag.insertBefore(libsTag, firstHeadChild);
       }
     } else {
       inlineResources.addAll(gadgetResources);
@@ -323,13 +313,13 @@ public class RenderingGadgetRewriter imp
       if (resource.isExternal()) {
         if (inlineJs.length() > 0) {
           Element inlineTag = headTag.getOwnerDocument().createElement("script");
-          headTag.appendChild(inlineTag);
+          headTag.insertBefore(inlineTag, firstHeadChild);
           inlineTag.appendChild(headTag.getOwnerDocument().createTextNode(inlineJs.toString()));
           inlineJs.setLength(0);
         }
         Element referenceTag = headTag.getOwnerDocument().createElement("script");
         referenceTag.setAttribute("src", StringUtils.replace(theContent, "&", "&amp;"));
-        headTag.appendChild(referenceTag);
+        headTag.insertBefore(referenceTag, firstHeadChild);
       } else {
         inlineJs.append(theContent).append(";\n");
       }
@@ -339,7 +329,7 @@ public class RenderingGadgetRewriter imp
 
     if (inlineJs.length() > 0) {
       Element inlineTag = headTag.getOwnerDocument().createElement("script");
-      headTag.appendChild(inlineTag);
+      headTag.insertBefore(inlineTag, firstHeadChild);
       inlineTag.appendChild(headTag.getOwnerDocument().createTextNode(inlineJs.toString()));
     }
   }
@@ -401,7 +391,7 @@ public class RenderingGadgetRewriter imp
    * Injects default values for user prefs into the gadget output.
    */
   protected void injectDefaultPrefs(Gadget gadget, Node scriptTag) {
-    List<UserPref> prefs = gadget.getSpec().getUserPrefs();
+    Collection<UserPref> prefs = gadget.getSpec().getUserPrefs().values();
     Map<String, String> defaultPrefs = Maps.newHashMapWithExpectedSize(prefs.size());
     for (UserPref up : prefs) {
       defaultPrefs.put(up.getName(), up.getDefaultValue());

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyUriManager.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyUriManager.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyUriManager.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/SanitizingProxyUriManager.java Tue Aug 10 11:32:26 2010
@@ -21,8 +21,8 @@ package org.apache.shindig.gadgets.rende
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.uri.UriBuilder;
 import org.apache.shindig.gadgets.GadgetException;
-import org.apache.shindig.gadgets.servlet.ProxyBase;
 import org.apache.shindig.gadgets.uri.ProxyUriManager;
+import org.apache.shindig.gadgets.uri.UriCommon.Param;
 
 import com.google.common.collect.Lists;
 
@@ -52,9 +52,9 @@ public class SanitizingProxyUriManager i
       
     for (Uri origUri : origUris) {
       UriBuilder newUri = new UriBuilder(origUri);
-      newUri.addQueryParameter(ProxyBase.SANITIZE_CONTENT_PARAM, "1");
+      newUri.addQueryParameter(Param.SANITIZE.getKey(), "1");
       if (expectedMime != null) {
-        newUri.addQueryParameter(ProxyBase.REWRITE_MIME_TYPE_PARAM, expectedMime);
+        newUri.addQueryParameter(Param.REWRITE_MIME_TYPE.getKey(), expectedMime);
       }
       sanitizedUris.add(newUri.toUri());
     }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceRewriter.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceRewriter.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceRewriter.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceRewriter.java Tue Aug 10 11:32:26 2010
@@ -26,6 +26,6 @@ import com.google.inject.Inject;
 public class AbsolutePathReferenceRewriter extends DomWalker.Rewriter {
   @Inject
   public AbsolutePathReferenceRewriter() {
-    super(new AbsolutePathReferenceVisitor());
+    super(new AbsolutePathReferenceVisitor(AbsolutePathReferenceVisitor.Tags.RESOURCES));
   }
 }

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceVisitor.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceVisitor.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceVisitor.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/AbsolutePathReferenceVisitor.java Tue Aug 10 11:32:26 2010
@@ -44,13 +44,11 @@ public class AbsolutePathReferenceVisito
   public enum Tags {
     // Resources which would be fetched by the browser when rendering the page.
     RESOURCES(ImmutableMap.<String, String>builder()
+        .put("body", "background")
         .put("img", "src")
         .put("input", "src")
-        .put("body", "background")
-        .put("embed", "src")
         .put("link", "href")
-        .put("script", "src")
-        .put("object", "src").build()),
+        .put("script", "src").build()),
 
     // Hyperlinks that the user clicks on to navigate pages.
     HYPERLINKS(ImmutableMap.<String, String>builder()

Modified: shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java
URL: http://svn.apache.org/viewvc/shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java?rev=983934&r1=983933&r2=983934&view=diff
==============================================================================
--- shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java (original)
+++ shindig/branches/2.0.x/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/BaseTagRemoverRewriter.java Tue Aug 10 11:32:26 2010
@@ -25,6 +25,7 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
+import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
@@ -41,9 +42,9 @@ public class BaseTagRemoverRewriter impl
       Element baseElement = (Element) list.item(i);
       baseElement.getParentNode().removeChild(baseElement);
 
-      if (baseElement.hasAttribute("href")) {
+      if (baseElement.hasAttribute("href") && logger.isLoggable(Level.FINE)) {
         logger.fine("Removing base tag pointing to: "
-                    + baseElement.getAttribute("href") + "for gadget: "
+                    + baseElement.getAttribute("href") + " for gadget: "
                     + gadget.getContext().getUrl().toString());
       }
     }