Author: hsaputra
Date: Thu Apr 12 16:46:04 2012
New Revision: 1325372
URL: http://svn.apache.org/viewvc?rev=1325372&view=rev
Log:
Throw SpecRetrievalFailedException exception instead of generic GadgetException
to avoid cache at the AbstractSpecFactory level because it could be cache in
the RequestPipeline with some logic to set the right cache content.
Modified:
shindig/trunk/features/src/main/javascript/features/container.site.gadget/gadget_holder.js
shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractSpecFactory.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java
Modified:
shindig/trunk/features/src/main/javascript/features/container.site.gadget/gadget_holder.js
URL:
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container.site.gadget/gadget_holder.js?rev=1325372&r1=1325371&r2=1325372&view=diff
==============================================================================
---
shindig/trunk/features/src/main/javascript/features/container.site.gadget/gadget_holder.js
(original)
+++
shindig/trunk/features/src/main/javascript/features/container.site.gadget/gadget_holder.js
Thu Apr 12 16:46:04 2012
@@ -261,6 +261,12 @@ osapi.container.GadgetHolder.prototype.g
uri.setFP('view-params', gadgetParamText);
}
+ // add rpctoken fragment to support flash transport if not in the uri
+ if(typeof(uri.getFP('rpctoken')) === 'undefined' ) {
+ var rpcToken = (0x7FFFFFFF * Math.random()) | 0;
+ uri.setFP('rpctoken', rpcToken);
+ }
+
return uri.toString();
};
Modified: shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js
URL:
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js?rev=1325372&r1=1325371&r2=1325372&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js
(original)
+++ shindig/trunk/features/src/main/javascript/features/shindig.uri/uri.js Thu
Apr 12 16:46:04 2012
@@ -149,6 +149,12 @@ shindig.uri = (function() {
function parseParams(str) {
var params = [];
+ // When the string is empty, split returns an array containing one empty
string,
+ // rather than an empty array.
+ if(str === "") {
+ return params;
+ }
+
var pairs = str.split('&');
for (var i = 0, j = pairs.length; i < j; ++i) {
var kv = pairs[i].split('=');
Modified:
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js
URL:
http://svn.apache.org/viewvc/shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js?rev=1325372&r1=1325371&r2=1325372&view=diff
==============================================================================
---
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js
(original)
+++
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js
Thu Apr 12 16:46:04 2012
@@ -58,7 +58,7 @@ GadgetHolderTest.prototype.testNew = fun
GadgetHolderTest.prototype.testRenderWithoutRenderParams = function() {
var element = {};
var gadgetInfo = {
- 'iframeUrls' : {'default' : 'http://shindig/gadgets/ifr?url=gadget.xml'},
+ 'iframeUrls' : {'default' :
'http://shindig/gadgets/ifr?url=gadget.xml#rpctoken=1234'},
'url' : 'gadget.xml'
};
this.setupGadgetsRpcSetupReceiver();
@@ -79,14 +79,14 @@ GadgetHolderTest.prototype.testRenderWit
' id="__gadget_123"' +
' name="__gadget_123"' +
'
src="http://shindig/gadgets/ifr?url=gadget.xml&debug=0&nocache=0&testmode=0' +
- '&view=default&parent=http%3A//container.com&mid=0"' +
+ '&view=default&parent=http%3A//container.com&mid=0#rpctoken=1234"' +
' ></iframe>',
element.innerHTML);
};
GadgetHolderTest.prototype.testRenderWithRenderRequests = function() {
var gadgetInfo = {
- 'iframeUrls' : {'default' : 'http://shindig/gadgets/ifr?url=gadget.xml'},
+ 'iframeUrls' : {'default' :
'http://shindig/gadgets/ifr?url=gadget.xml#rpctoken=1234'},
'url' : 'gadget.xml'
};
var renderParams = {
@@ -120,7 +120,7 @@ GadgetHolderTest.prototype.testRenderWit
' width="222"' +
' name="__gadget_123"' +
'
src="http://shindig/gadgets/ifr?url=gadget.xml&debug=1&nocache=1&testmode=1' +
-
'&view=default&libs=caja&caja=1&parent=http%3A//container.com&mid=0"' +
+
'&view=default&libs=caja&caja=1&parent=http%3A//container.com&mid=0#rpctoken=1234"'
+
' ></iframe>',
element.innerHTML);
};
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractSpecFactory.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractSpecFactory.java?rev=1325372&r1=1325371&r2=1325372&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractSpecFactory.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/AbstractSpecFactory.java
Thu Apr 12 16:46:04 2012
@@ -136,10 +136,7 @@ public abstract class AbstractSpecFactor
// Convert external "internal error" to gateway error:
retcode = HttpResponse.SC_BAD_GATEWAY;
}
- throw new
GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT,
- "Unable to retrieve spec for " + query.specUri
+ ". HTTP error " +
- response.getHttpStatusCode(),
- retcode);
+ throw new SpecRetrievalFailedException(query.specUri, retcode);
}
try {
@@ -217,6 +214,10 @@ public abstract class AbstractSpecFactor
try {
T newSpec = fetchFromNetwork(query);
cache.addElement(query.specUri, newSpec, refresh);
+ } catch (SpecRetrievalFailedException se) {
+ if (LOG.isLoggable(Level.INFO)) {
+ LOG.logp(Level.INFO, classname, "SpecUpdater",
MessageKeys.UPDATE_SPEC_FAILURE_APPLY_NEG_CACHE, new Object[] {query.specUri});
+ }
} catch (GadgetException e) {
if (old != null) {
if (LOG.isLoggable(Level.INFO)) {
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java?rev=1325372&r1=1325371&r2=1325372&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultRequestPipeline.java
Thu Apr 12 16:46:04 2012
@@ -78,30 +78,60 @@ public class DefaultRequestPipeline impl
public HttpResponse execute(HttpRequest request) throws GadgetException {
normalizeProtocol(request);
+
+ HttpResponse cachedResponse = checkCachedResponse(request);
+
HttpResponse invalidatedResponse = null;
HttpResponse staleResponse = null;
- if (!request.getIgnoreCache()) {
- HttpResponse cachedResponse = httpCache.getResponse(request);
- // Note that we don't remove invalidated entries from the cache as we
want them to be
- // available in the event of a backend fetch failure.
- // Note that strict no-cache entries are dummy responses and should not
be used.
- if (cachedResponse != null && !cachedResponse.isStrictNoCache()) {
- if (!cachedResponse.isStale()) {
- if(invalidationService.isValid(request, cachedResponse)) {
- return cachedResponse;
- } else {
- invalidatedResponse = cachedResponse;
- }
+ // Note that we don't remove invalidated entries from the cache as we want
them to be
+ // available in the event of a backend fetch failure.
+ // Note that strict no-cache entries are dummy responses and should not be
used.
+ if (cachedResponse != null && !cachedResponse.isStrictNoCache()) {
+ if (!cachedResponse.isStale()) {
+ if (invalidationService.isValid(request, cachedResponse)) {
+ return cachedResponse;
} else {
- if (!cachedResponse.isError()) {
- // Remember good but stale cached response, to be served if server
unavailable
- staleResponse = cachedResponse;
- }
+ invalidatedResponse = cachedResponse;
+ }
+ } else {
+ if (!cachedResponse.isError()) {
+ // Remember good but stale cached response, to be served if server
unavailable
+ staleResponse = cachedResponse;
}
}
}
+ HttpResponse fetchedResponse = fetchResponse(request);
+ fetchedResponse = fixFetchedResponse(request, fetchedResponse,
invalidatedResponse, staleResponse);
+ return fetchedResponse;
+ }
+
+ protected void normalizeProtocol(HttpRequest request) throws GadgetException
{
+ // Normalize the protocol part of the URI
+ if (request.getUri().getScheme()== null) {
+ throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,
+ "Url " + request.getUri().toString() + " does not include scheme",
+ HttpResponse.SC_BAD_REQUEST);
+ } else if (!"http".equals(request.getUri().getScheme()) &&
+ !"https".equals(request.getUri().getScheme())) {
+ throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,
+ "Invalid request url scheme in url: " +
Utf8UrlCoder.encode(request.getUri().toString()) +
+ "; only \"http\" and \"https\" supported.",
+ HttpResponse.SC_BAD_REQUEST);
+ }
+ }
+
+ protected HttpResponse checkCachedResponse(HttpRequest request) {
+ HttpResponse cachedResponse;
+ if (!request.getIgnoreCache()) {
+ cachedResponse = httpCache.getResponse(request);
+ } else {
+ cachedResponse = null;
+ }
+ return cachedResponse;
+ }
+ protected HttpResponse fetchResponse(HttpRequest request) throws
GadgetException {
HttpResponse fetchedResponse;
switch (request.getAuthType()) {
case NONE:
@@ -117,7 +147,11 @@ public class DefaultRequestPipeline impl
default:
return HttpResponse.error();
}
+ return fetchedResponse;
+ }
+ protected HttpResponse fixFetchedResponse(HttpRequest request, HttpResponse
fetchedResponse,
+ HttpResponse invalidatedResponse, HttpResponse staleResponse) throws
GadgetException {
if (fetchedResponse.isError() && invalidatedResponse != null) {
// Use the invalidated cached response if it is not stale. We don't
update its
// mark so it remains invalidated
@@ -142,6 +176,14 @@ public class DefaultRequestPipeline impl
// Set response hash value in metadata (used for url versioning)
fetchedResponse = HttpResponseMetadataHelper.updateHash(fetchedResponse,
metadataHelper);
+
+ // cache the fetched response if possible
+ fetchedResponse = cacheFetchedResponse(request, fetchedResponse);
+
+ return fetchedResponse;
+ }
+
+ protected HttpResponse cacheFetchedResponse(HttpRequest request,
HttpResponse fetchedResponse) {
if (!request.getIgnoreCache()) {
// Mark the response with invalidation information prior to caching
if (fetchedResponse.getCacheTtl() > 0) {
@@ -149,22 +191,8 @@ public class DefaultRequestPipeline impl
}
httpCache.addResponse(request, fetchedResponse);
}
- return fetchedResponse;
- }
- protected void normalizeProtocol(HttpRequest request) throws GadgetException
{
- // Normalize the protocol part of the URI
- if (request.getUri().getScheme()== null) {
- throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,
- "Url " + request.getUri().toString() + " does not include scheme",
- HttpResponse.SC_BAD_REQUEST);
- } else if (!"http".equals(request.getUri().getScheme()) &&
- !"https".equals(request.getUri().getScheme())) {
- throw new GadgetException(GadgetException.Code.INVALID_PARAMETER,
- "Invalid request url scheme in url: " +
Utf8UrlCoder.encode(request.getUri().toString()) +
- "; only \"http\" and \"https\" supported.",
- HttpResponse.SC_BAD_REQUEST);
- }
+ return fetchedResponse;
}
/**