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, "&", "&"));
- 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, "&", "&"));
- 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, "&", "&"));
- 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());
}
}