You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by hs...@apache.org on 2012/04/12 18:46:05 UTC

svn commit: r1325372 - in /shindig/trunk: features/src/main/javascript/features/container.site.gadget/ features/src/main/javascript/features/shindig.uri/ features/src/test/javascript/features/container/ java/gadgets/src/main/java/org/apache/shindig/gad...

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;
   }
 
   /**