Author: lindner
Date: Sat Jun 12 00:50:28 2010
New Revision: 953915

URL: http://svn.apache.org/viewvc?rev=953915&view=rev
Log:
SHINDIG-805 use contributor pattern for features config

Added:
    shindig/trunk/features/src/main/javascript/features/shindig.auth/
    
shindig/trunk/features/src/main/javascript/features/shindig.auth/auth-init.js
      - copied, changed from r953815, 
shindig/trunk/features/src/main/javascript/features/core.auth/auth-init.js
    shindig/trunk/features/src/main/javascript/features/shindig.auth/auth.js
      - copied, changed from r953815, 
shindig/trunk/features/src/main/javascript/features/core.auth/auth.js
    shindig/trunk/features/src/main/javascript/features/shindig.auth/feature.xml
      - copied, changed from r953815, 
shindig/trunk/features/src/main/javascript/features/core.auth/feature.xml
    shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/
    
shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/feature.xml
      - copied, changed from r953815, 
shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml
    
shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/xhrwrapper.js
      - copied, changed from r953815, 
shindig/trunk/features/src/main/javascript/features/xhrwrapper/xhrwrapper.js
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ConfigContributor.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/CoreUtilConfigContributor.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/OsapiServicesConfigContributor.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/XhrwrapperConfigContributor.java
Removed:
    shindig/trunk/features/src/main/javascript/features/core.auth/auth-init.js
    shindig/trunk/features/src/main/javascript/features/core.auth/auth.js
    shindig/trunk/features/src/main/javascript/features/core.auth/feature.xml
    shindig/trunk/features/src/main/javascript/features/xhrwrapper/xhrwrapper.js
Modified:
    shindig/trunk/features/pom.xml
    shindig/trunk/features/src/main/javascript/features/auth-refresh/feature.xml
    shindig/trunk/features/src/main/javascript/features/container/feature.xml
    shindig/trunk/features/src/main/javascript/features/core.io/feature.xml
    shindig/trunk/features/src/main/javascript/features/core/feature.xml
    shindig/trunk/features/src/main/javascript/features/features.txt
    
shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/feature.xml
    shindig/trunk/features/src/main/javascript/features/osapi/feature.xml
    shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml
    
shindig/trunk/features/src/test/javascript/features/xhrwrapper/xhrwrappertest.js
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriterTest.java

Modified: shindig/trunk/features/pom.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/pom.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- shindig/trunk/features/pom.xml (original)
+++ shindig/trunk/features/pom.xml Sat Jun 12 00:50:28 2010
@@ -109,7 +109,7 @@
                 <source>globals/globals.js</source>
                 <source>core.config/config.js</source>
                 <source>core.json/json.js</source>
-                <source>core.auth/auth.js</source>
+                <source>shindig.auth/auth.js</source>
                 <source>core.util/util.js</source>
                 <source>core.prefs/prefs.js</source>
                 <source>core.log/log.js</source>
@@ -121,7 +121,7 @@
                 <source>i18n/numberformat.js</source>
                 <source>setprefs/setprefs.js</source>
                 <source>views/views.js</source>
-                <source>xhrwrapper/xhrwrapper.js</source>
+                <source>shindig.xhrwrapper/xhrwrapper.js</source>
                 <source>xmlutil/xmlutil.js</source>
                 <source>opensocial-data-context/datacontext.js</source>
                 <source>opensocial-data/data.js</source>
@@ -155,7 +155,7 @@
                 <source>osapi/jsonrpctransport.js</source>
                 <source>osapi/peoplehelpers.js</source>
                 
<source>../../../../src/test/javascript/lib/testutils.js</source>
-               <source>oauthpopup/oauthpopup.js</source>
+                <source>oauthpopup/oauthpopup.js</source>
               </sources>
               
<testSourceDirectory>${basedir}/src/test/javascript/features</testSourceDirectory>
               <testSuites>

Modified: 
shindig/trunk/features/src/main/javascript/features/auth-refresh/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/auth-refresh/feature.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/auth-refresh/feature.xml 
(original)
+++ 
shindig/trunk/features/src/main/javascript/features/auth-refresh/feature.xml 
Sat Jun 12 00:50:28 2010
@@ -18,7 +18,7 @@ specific language governing permissions 
 -->
 <feature>
   <name>auth-refresh</name>
-  <dependency>core.auth</dependency>
+  <dependency>shindig.auth</dependency>
   <dependency>rpc</dependency>
   <gadget>
     <script src="auth-refresh.js"/>

Modified: 
shindig/trunk/features/src/main/javascript/features/container/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container/feature.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/feature.xml 
(original)
+++ shindig/trunk/features/src/main/javascript/features/container/feature.xml 
Sat Jun 12 00:50:28 2010
@@ -21,6 +21,7 @@ under the License.
   <name>container</name>
   <dependency>globals</dependency>
   <dependency>core.log</dependency>
+  <dependency>shindig.auth</dependency>
   <dependency>core.util</dependency>
   <dependency>osapi</dependency>
   <dependency>rpc</dependency>

Modified: 
shindig/trunk/features/src/main/javascript/features/core.io/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/core.io/feature.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/core.io/feature.xml 
(original)
+++ shindig/trunk/features/src/main/javascript/features/core.io/feature.xml Sat 
Jun 12 00:50:28 2010
@@ -29,7 +29,7 @@
 -->
   <name>core.io</name>
   <dependency>globals</dependency>
-  <dependency>core.auth</dependency>
+  <dependency>shindig.auth</dependency>
   <dependency>core.config</dependency>
   <dependency>core.json</dependency>
   <dependency>core.util</dependency>

Modified: shindig/trunk/features/src/main/javascript/features/core/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/core/feature.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/core/feature.xml 
(original)
+++ shindig/trunk/features/src/main/javascript/features/core/feature.xml Sat 
Jun 12 00:50:28 2010
@@ -24,7 +24,7 @@
     core.* libs.
   -->
   <name>core</name>
-  <dependency>core.auth</dependency>
+  <dependency>shindig.auth</dependency>
   <dependency>core.config</dependency>
   <dependency>core.json</dependency>
   <dependency>core.legacy</dependency>

Modified: shindig/trunk/features/src/main/javascript/features/features.txt
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/features.txt?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/features.txt (original)
+++ shindig/trunk/features/src/main/javascript/features/features.txt Sat Jun 12 
00:50:28 2010
@@ -24,7 +24,6 @@ features/auth-refresh/feature.xml
 features/caja/feature.xml
 features/container/feature.xml
 features/content-rewrite/feature.xml
-features/core.auth/feature.xml
 features/core.config/feature.xml
 features/core.io/feature.xml
 features/core.json/feature.xml
@@ -60,8 +59,10 @@ features/rpc/feature.xml
 features/security-token/feature.xml
 features/setprefs/feature.xml
 features/settitle/feature.xml
+features/shindig.auth/feature.xml
 features/shindig.container/feature.xml
 features/shindig.container-1.0/feature.xml
+features/shindig.xhrwrapper/feature.xml
 features/skins/feature.xml
 features/swfobject/feature.xml
 features/tabs/feature.xml

Modified: 
shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/feature.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/feature.xml
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/feature.xml
 Sat Jun 12 00:50:28 2010
@@ -19,7 +19,7 @@
 -->
 <feature>
   <name>opensocial-jsonrpc</name>
-  <dependency>core.auth</dependency>
+  <dependency>shindig.auth</dependency>
   <dependency>core.prefs</dependency>
   <dependency>core.io</dependency>
   <dependency>core.json</dependency>

Modified: shindig/trunk/features/src/main/javascript/features/osapi/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/osapi/feature.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/osapi/feature.xml 
(original)
+++ shindig/trunk/features/src/main/javascript/features/osapi/feature.xml Sat 
Jun 12 00:50:28 2010
@@ -20,7 +20,7 @@
 <feature>
   <name>osapi</name>
   <dependency>globals</dependency>
-  <dependency>core.auth</dependency>
+  <dependency>shindig.auth</dependency>
   <dependency>core.config</dependency>
   <dependency>core.io</dependency>
   <dependency>core.json</dependency>

Copied: 
shindig/trunk/features/src/main/javascript/features/shindig.auth/auth-init.js 
(from r953815, 
shindig/trunk/features/src/main/javascript/features/core.auth/auth-init.js)
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shindig.auth/auth-init.js?p2=shindig/trunk/features/src/main/javascript/features/shindig.auth/auth-init.js&p1=shindig/trunk/features/src/main/javascript/features/core.auth/auth-init.js&r1=953815&r2=953915&rev=953915&view=diff
==============================================================================
    (empty)

Copied: 
shindig/trunk/features/src/main/javascript/features/shindig.auth/auth.js (from 
r953815, shindig/trunk/features/src/main/javascript/features/core.auth/auth.js)
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shindig.auth/auth.js?p2=shindig/trunk/features/src/main/javascript/features/shindig.auth/auth.js&p1=shindig/trunk/features/src/main/javascript/features/core.auth/auth.js&r1=953815&r2=953915&rev=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/core.auth/auth.js 
(original)
+++ shindig/trunk/features/src/main/javascript/features/shindig.auth/auth.js 
Sat Jun 12 00:50:28 2010
@@ -155,10 +155,7 @@ shindig.Auth = function() {
     }
   }
 
-  // old incorrect way
   gadgets.config.register("shindig.auth", null, init);
-  // correct way
-  gadgets.config.register("core.auth", null, init);
 
   return /** @scope shindig.auth */ {
 

Copied: 
shindig/trunk/features/src/main/javascript/features/shindig.auth/feature.xml 
(from r953815, 
shindig/trunk/features/src/main/javascript/features/core.auth/feature.xml)
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shindig.auth/feature.xml?p2=shindig/trunk/features/src/main/javascript/features/shindig.auth/feature.xml&p1=shindig/trunk/features/src/main/javascript/features/core.auth/feature.xml&r1=953815&r2=953915&rev=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/core.auth/feature.xml 
(original)
+++ 
shindig/trunk/features/src/main/javascript/features/shindig.auth/feature.xml 
Sat Jun 12 00:50:28 2010
@@ -17,7 +17,7 @@
   specific language governing permissions and limitations under the License.
 -->
 <feature>
-  <name>core.auth</name>
+  <name>shindig.auth</name>
   <dependency>core.config</dependency>
   <dependency>core.util</dependency>
   <gadget>

Copied: 
shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/feature.xml
 (from r953815, 
shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml)
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/feature.xml?p2=shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/feature.xml&p1=shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml&r1=953815&r2=953915&rev=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml 
(original)
+++ 
shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/feature.xml
 Sat Jun 12 00:50:28 2010
@@ -17,7 +17,7 @@ KIND, either express or implied. See the
 specific language governing permissions and limitations under the License.
 -->
 <feature>
-  <name>xhrwrapper</name>
+  <name>shindig.xhrwrapper</name>
   <dependency>core.io</dependency>
   <dependency>xmlutil</dependency>
   <gadget>

Copied: 
shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/xhrwrapper.js
 (from r953815, 
shindig/trunk/features/src/main/javascript/features/xhrwrapper/xhrwrapper.js)
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/xhrwrapper.js?p2=shindig/trunk/features/src/main/javascript/features/shindig.xhrwrapper/xhrwrapper.js&p1=shindig/trunk/features/src/main/javascript/features/xhrwrapper/xhrwrapper.js&r1=953815&r2=953915&rev=953915&view=diff
==============================================================================
    (empty)

Modified: 
shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml 
(original)
+++ shindig/trunk/features/src/main/javascript/features/xhrwrapper/feature.xml 
Sat Jun 12 00:50:28 2010
@@ -18,9 +18,6 @@ specific language governing permissions 
 -->
 <feature>
   <name>xhrwrapper</name>
-  <dependency>core.io</dependency>
-  <dependency>xmlutil</dependency>
-  <gadget>
-    <script src="xhrwrapper.js"/>
-  </gadget>
+  <!-- deprecated usage -->
+  <dependency>shindig.xhrwrapper</dependency>
 </feature>

Modified: 
shindig/trunk/features/src/test/javascript/features/xhrwrapper/xhrwrappertest.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/test/javascript/features/xhrwrapper/xhrwrappertest.js?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- 
shindig/trunk/features/src/test/javascript/features/xhrwrapper/xhrwrappertest.js
 (original)
+++ 
shindig/trunk/features/src/test/javascript/features/xhrwrapper/xhrwrappertest.js
 Sat Jun 12 00:50:28 2010
@@ -234,4 +234,4 @@ XhrWrapperTest.prototype.checkOAuth = fu
   this.assertEquals('OAUTH', this.madeRequest.params['AUTHORIZATION']);
   this.assertEquals(service, this.madeRequest.params['OAUTH_SERVICE_NAME']);
   this.assertEquals(opt_token, this.madeRequest.params['OAUTH_TOKEN_NAME']);
-};
\ No newline at end of file
+};

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultGuiceModule.java
 Sat Jun 12 00:50:28 2010
@@ -23,12 +23,18 @@ import com.google.common.collect.Immutab
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 import com.google.inject.Singleton;
+import com.google.inject.multibindings.MapBinder;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Named;
 import com.google.inject.name.Names;
 
 import org.apache.commons.lang.StringUtils;
 
+import org.apache.shindig.gadgets.config.ConfigContributor;
+import org.apache.shindig.gadgets.config.CoreUtilConfigContributor;
+import org.apache.shindig.gadgets.config.OsapiServicesConfigContributor;
+import org.apache.shindig.gadgets.config.ShindigAuthConfigContributor;
+import org.apache.shindig.gadgets.config.XhrwrapperConfigContributor;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.InvalidationHandler;
 import org.apache.shindig.gadgets.parse.ParseModule;
@@ -83,6 +89,7 @@ public class DefaultGuiceModule extends 
     requestStaticInjection(HttpResponse.class);
 
     registerGadgetHandlers();
+    registerConfigContributors();
     registerFeatureHandlers();
   }
 
@@ -95,6 +102,14 @@ public class DefaultGuiceModule extends 
     handlerBinder.addBinding().to(HttpRequestHandler.class);
   }
 
+  protected void registerConfigContributors() {
+    MapBinder<String, ConfigContributor> configBinder = 
MapBinder.newMapBinder(binder(), String.class, ConfigContributor.class);
+    configBinder.addBinding("core.util").to(CoreUtilConfigContributor.class);
+    configBinder.addBinding("osapi").to(OsapiServicesConfigContributor.class);
+    
configBinder.addBinding("shindig.auth").to(ShindigAuthConfigContributor.class);
+    
configBinder.addBinding("shindig.xhrwrapper").to(XhrwrapperConfigContributor.class);
+
+  }
   /**
    * Sets up the multibinding for extended feature resources
    */

Added: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ConfigContributor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ConfigContributor.java?rev=953915&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ConfigContributor.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ConfigContributor.java
 Sat Jun 12 00:50:28 2010
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+
+package org.apache.shindig.gadgets.config;
+
+import org.apache.shindig.gadgets.Gadget;
+
+import java.util.Map;
+
+public interface ConfigContributor {
+  /**
+   * Contribute configuration values for a specific gadget in an iframe.
+   * @param config The config mapping of feature to value.
+   * @param gadget The gadget to contribute for.
+   */
+  public void contribute(Map<String,Object> config, Gadget gadget);
+
+  /**
+   * Contribute configuration for the container specific javascript. This 
interface
+   * should only support params used by JsServlet
+   *
+   * @param config The config to add to.
+   * @param container The container.
+   * @param host The hostname
+   */
+  public void contribute(Map<String,Object> config, String container, String 
host);
+}

Added: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/CoreUtilConfigContributor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/CoreUtilConfigContributor.java?rev=953915&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/CoreUtilConfigContributor.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/CoreUtilConfigContributor.java
 Sat Jun 12 00:50:28 2010
@@ -0,0 +1,48 @@
+package org.apache.shindig.gadgets.config;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Singleton;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.spec.Feature;
+import org.apache.shindig.gadgets.spec.ModulePrefs;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Populates the core.util configuration, which at present includes the list
+ * of features that are supported.
+ */
+...@singleton
+public class CoreUtilConfigContributor implements ConfigContributor {
+
+  /** {...@inheritdoc} */
+  public void contribute(Map<String, Object> config, Gadget gadget) {
+    // Add gadgets.util support. This is calculated dynamically based on 
request inputs.
+    ModulePrefs prefs = gadget.getSpec().getModulePrefs();
+    Collection<Feature> features = prefs.getFeatures().values();
+    Map<String, Map<String, Object>> featureMap = 
Maps.newHashMapWithExpectedSize(features.size());
+    for (Feature feature : features) {
+
+      // Flatten out the multimap a bit for backwards compatibility:  map keys
+      // with just 1 value into the string, treat others as arrays
+      Map<String, Object> paramFeaturesInConfig = Maps.newHashMap();
+      for (String paramName : feature.getParams().keySet()) {
+        Collection<String> paramValues = feature.getParams().get(paramName);
+        if (paramValues.size() == 1) {
+          paramFeaturesInConfig.put(paramName, paramValues.iterator().next());
+        } else {
+          paramFeaturesInConfig.put(paramName, paramValues);
+        }
+      }
+
+      featureMap.put(feature.getName(), paramFeaturesInConfig);
+    }
+    config.put("core.util", featureMap);
+  }
+
+  /** {...@inheritdoc} */
+  public void contribute(Map<String,Object> config, String container, String 
host) {
+    // not used for container configuration
+  }
+}
\ No newline at end of file

Added: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/OsapiServicesConfigContributor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/OsapiServicesConfigContributor.java?rev=953915&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/OsapiServicesConfigContributor.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/OsapiServicesConfigContributor.java
 Sat Jun 12 00:50:28 2010
@@ -0,0 +1,51 @@
+package org.apache.shindig.gadgets.config;
+
+import com.google.common.collect.Multimap;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.render.RpcServiceLookup;
+
+import java.util.Map;
+
+/**
+ * Populates the osapi.services configuration, which includes
+ * the osapi endpoints this container supports.
+ *
+ * TODO osapi.services as a configuration parameter does not
+ * match a specific feature.  It would be better to store this as
+ * 'osapi:{services: {...}}}
+ */
+...@singleton
+public class OsapiServicesConfigContributor implements ConfigContributor {
+
+  protected final RpcServiceLookup rpcServiceLookup;
+
+  @Inject
+  public OsapiServicesConfigContributor(RpcServiceLookup rpcServiceLookup) {
+    this.rpcServiceLookup = rpcServiceLookup;
+  }
+
+  /** {...@inheritdoc} */
+  public void contribute(Map<String, Object> config, Gadget gadget) {
+    GadgetContext ctx = gadget.getContext();
+    addServicesConfig(config, ctx.getContainer(), ctx.getHost());
+  }
+
+  /** {...@inheritdoc} */
+  public void contribute(Map<String,Object> config, String container, String 
host) {
+    addServicesConfig(config, container, host);
+  }
+
+  /**
+   * Add osapi.services to the config
+   * @param config config map to add it to.
+   */
+  private void addServicesConfig(Map<String,Object> config, String container, 
String host) {
+    if (rpcServiceLookup != null) {
+      Multimap<String, String> endpoints = 
rpcServiceLookup.getServicesFor(container, host);
+      config.put("osapi.services", endpoints);
+    }
+  }
+}
\ No newline at end of file

Added: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java?rev=953915&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/ShindigAuthConfigContributor.java
 Sat Jun 12 00:50:28 2010
@@ -0,0 +1,59 @@
+package org.apache.shindig.gadgets.config;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Inject;
+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.SecurityTokenException;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.config.ConfigContributor;
+
+import java.util.Map;
+
+...@singleton
+public class ShindigAuthConfigContributor implements ConfigContributor {
+
+  private SecurityTokenDecoder securityTokenCodec;
+
+  @Inject
+  public ShindigAuthConfigContributor(SecurityTokenDecoder codec) {
+    this.securityTokenCodec = codec;
+  }
+
+  /** {...@inheritdoc} */
+  public void contribute(Map<String,Object> config, Gadget gadget) {
+    final GadgetContext context = gadget.getContext();
+    final SecurityToken authToken = context.getToken();
+    if (authToken != null) {
+      Map<String, String> authConfig = Maps.newHashMapWithExpectedSize(2);
+      String updatedToken = authToken.getUpdatedToken();
+      if (updatedToken != null) {
+        authConfig.put("authToken", updatedToken);
+      }
+      String trustedJson = authToken.getTrustedJson();
+      if (trustedJson != null) {
+        authConfig.put("trustedJson", trustedJson);
+      }
+      config.put("shindig.auth", authConfig);
+    }
+  }
+
+  /** {...@inheritdoc} */
+  public void contribute(Map<String,Object> config, String container, String 
host) {
+    // Inject an anonymous security token TODO set TTL based on cachability of 
this JS?
+    SecurityToken containerToken = new AnonymousSecurityToken(container, 
0,"*", 1000L * 60 * 60 * 24);
+    Map<String, String> authConfig = Maps.newHashMapWithExpectedSize(2);
+
+    try {
+      config.put("shindig.auth", authConfig);
+      authConfig.put("authToken", 
securityTokenCodec.encodeToken(containerToken));
+
+    } catch (SecurityTokenException e) {
+      // ignore
+    }
+  }
+}

Added: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/XhrwrapperConfigContributor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/XhrwrapperConfigContributor.java?rev=953915&view=auto
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/XhrwrapperConfigContributor.java
 (added)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/config/XhrwrapperConfigContributor.java
 Sat Jun 12 00:50:28 2010
@@ -0,0 +1,53 @@
+package org.apache.shindig.gadgets.config;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Singleton;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.AuthType;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.oauth.OAuthArguments;
+import org.apache.shindig.gadgets.spec.View;
+
+import java.util.Map;
+
+/**
+ * Provides config support for the xhrwrapper feature.
+ */
+
+...@singleton
+public class XhrwrapperConfigContributor implements ConfigContributor {
+  /** {...@inheritdoc} */
+  public void contribute(Map<String,Object> config, Gadget gadget) {
+    Map<String, String> xhrWrapperConfig = Maps.newHashMapWithExpectedSize(2);
+    View view = gadget.getCurrentView();
+    Uri contentsUri = view.getHref();
+    xhrWrapperConfig.put("contentUrl", contentsUri == null ? "" : 
contentsUri.toString());
+    if (AuthType.OAUTH.equals(view.getAuthType())) {
+      addOAuthConfig(xhrWrapperConfig, view);
+    } else if (AuthType.SIGNED.equals(view.getAuthType())) {
+      xhrWrapperConfig.put("authorization", "signed");
+    }
+    config.put("shindig.xhrwrapper", xhrWrapperConfig);
+  }
+
+  /** {...@inheritdoc} */
+  private void addOAuthConfig(Map<String, String> xhrWrapperConfig, View view) 
{
+    Map<String, String> oAuthConfig = Maps.newHashMapWithExpectedSize(3);
+    try {
+      OAuthArguments oAuthArguments = new OAuthArguments(view);
+      oAuthConfig.put("authorization", "oauth");
+      oAuthConfig.put("oauthService", oAuthArguments.getServiceName());
+      if (!"".equals(oAuthArguments.getTokenName())) {
+        oAuthConfig.put("oauthTokenName", oAuthArguments.getTokenName());
+      }
+      xhrWrapperConfig.putAll(oAuthConfig);
+    } catch (GadgetException e) {
+      // Do not add any OAuth configuration if an exception was thrown
+    }
+  }
+  
+  public void contribute(Map<String,Object> config, String container, String 
host) {
+    // no-op, no container specific configuration
+  }
+}

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java
 Sat Jun 12 00:50:28 2010
@@ -18,20 +18,18 @@
  */
 package org.apache.shindig.gadgets.render;
 
-import org.apache.shindig.auth.SecurityToken;
 import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.xml.DomUtil;
 import org.apache.shindig.config.ContainerConfig;
-import org.apache.shindig.gadgets.AuthType;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.MessageBundleFactory;
 import org.apache.shindig.gadgets.UnsupportedFeatureException;
+import org.apache.shindig.gadgets.config.ConfigContributor;
 import org.apache.shindig.gadgets.features.FeatureRegistry;
 import org.apache.shindig.gadgets.features.FeatureResource;
-import org.apache.shindig.gadgets.oauth.OAuthArguments;
 import org.apache.shindig.gadgets.preload.PreloadException;
 import org.apache.shindig.gadgets.preload.PreloadedData;
 import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
@@ -39,7 +37,6 @@ import org.apache.shindig.gadgets.rewrit
 import org.apache.shindig.gadgets.rewrite.RewritingException;
 import org.apache.shindig.gadgets.spec.Feature;
 import org.apache.shindig.gadgets.spec.MessageBundle;
-import org.apache.shindig.gadgets.spec.ModulePrefs;
 import org.apache.shindig.gadgets.spec.UserPref;
 import org.apache.shindig.gadgets.spec.View;
 import org.apache.shindig.gadgets.uri.JsUriManager;
@@ -51,7 +48,6 @@ 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;
@@ -62,7 +58,6 @@ import com.google.common.collect.Immutab
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
@@ -100,7 +95,9 @@ public class RenderingGadgetRewriter imp
   protected final ContainerConfig containerConfig;
   protected final FeatureRegistry featureRegistry;
   protected final JsUriManager jsUriManager;
-  protected final RpcServiceLookup rpcServiceLookup;
+  protected final Map<String, ConfigContributor> configContributors;
+
+
   protected Set<String> defaultExternLibs = ImmutableSet.of();
 
   protected Boolean externalizeFeatures = false;
@@ -113,12 +110,12 @@ public class RenderingGadgetRewriter imp
                                  ContainerConfig containerConfig,
                                  FeatureRegistry featureRegistry,
                                  JsUriManager jsUriManager,
-                                 RpcServiceLookup rpcServiceLookup) {
+                                 Map<String, ConfigContributor> 
configContributors) {
     this.messageBundleFactory = messageBundleFactory;
     this.containerConfig = containerConfig;
     this.featureRegistry = featureRegistry;
     this.jsUriManager = jsUriManager;
-    this.rpcServiceLookup = rpcServiceLookup;
+    this.configContributors = configContributors;
   }
 
   @Inject
@@ -375,93 +372,16 @@ public class RenderingGadgetRewriter imp
         if (conf != null) {
           config.put(name, conf);
         }
-      }
-    }
-
-    addHasFeatureConfig(gadget, config);
-    addOsapiSystemListMethodsConfig(context.getContainer(), config, 
context.getHost());
-    addSecurityTokenConfig(context, config);
-    addXhrWrapperConfig(gadget, config);
-    return "gadgets.config.init(" + JsonSerializer.serialize(config) + ");\n";
-  }
-
-  private void addXhrWrapperConfig(Gadget gadget, Map<String, Object> config) {
-    boolean isUsingXhrWrapper = gadget.getAllFeatures().contains("xhrwrapper");
-    if (isUsingXhrWrapper) {
-      Map<String, String> xhrWrapperConfig = 
Maps.newHashMapWithExpectedSize(2);
-      View view = gadget.getCurrentView();
-      Uri contentsUri = view.getHref();
-      xhrWrapperConfig.put("contentUrl", contentsUri == null ? "" : 
contentsUri.toString());
-      if (AuthType.OAUTH.equals(view.getAuthType())) {
-        addOAuthConfig(xhrWrapperConfig, view);
-      } else if (AuthType.SIGNED.equals(view.getAuthType())) {
-        xhrWrapperConfig.put("authorization", "signed");
-      }
-      config.put("shindig.xhrwrapper", xhrWrapperConfig);
-    }
-  }
-
-  private void addOAuthConfig(Map<String, String> xhrWrapperConfig, View view) 
{
-    Map<String, String> oAuthConfig = Maps.newHashMapWithExpectedSize(3);
-    try {
-      OAuthArguments oAuthArguments = new OAuthArguments(view);
-      oAuthConfig.put("authorization", "oauth");
-      oAuthConfig.put("oauthService", oAuthArguments.getServiceName());
-      if (!"".equals(oAuthArguments.getTokenName())) {
-        oAuthConfig.put("oauthTokenName", oAuthArguments.getTokenName());
-      }
-      xhrWrapperConfig.putAll(oAuthConfig);
-    } catch (GadgetException e) {
-      // Do not add any OAuth configuration if an exception was thrown
-    }
-  }
-
-  private void addSecurityTokenConfig(GadgetContext context, Map<String, 
Object> config) {
-    SecurityToken authToken = context.getToken();
-    if (authToken != null) {
-      Map<String, String> authConfig = Maps.newHashMapWithExpectedSize(2);
-      String updatedToken = authToken.getUpdatedToken();
-      if (updatedToken != null) {
-        authConfig.put("authToken", updatedToken);
-      }
-      String trustedJson = authToken.getTrustedJson();
-      if (trustedJson != null) {
-        authConfig.put("trustedJson", trustedJson);
-      }
-      config.put("shindig.auth", authConfig);
-    }
-  }
-
-  private void addHasFeatureConfig(Gadget gadget, Map<String, Object> config) {
-    // Add gadgets.util support. This is calculated dynamically based on 
request inputs.
-    ModulePrefs prefs = gadget.getSpec().getModulePrefs();
-    Collection<Feature> features = prefs.getFeatures().values();
-    Map<String, Map<String, Object>> featureMap = 
Maps.newHashMapWithExpectedSize(features.size());
-    for (Feature feature : features) {
-      
-      // Flatten out the multimap a bit for backwards compatibility:  map keys
-      // with just 1 value into the string, treat others as arrays
-      Map<String, Object> paramFeaturesInConfig = Maps.newHashMap();
-      for (String paramName : feature.getParams().keySet()) {
-        Collection<String> paramValues = feature.getParams().get(paramName);
-        if (paramValues.size() == 1) {
-          paramFeaturesInConfig.put(paramName, paramValues.iterator().next());
-        } else {
-          paramFeaturesInConfig.put(paramName, paramValues);
+        
+        // See if this feature has configuration data
+        ConfigContributor contributor = configContributors.get(name);
+        if (contributor != null) {
+          contributor.contribute(config, gadget);
         }
       }
-      
-      featureMap.put(feature.getName(), paramFeaturesInConfig);
     }
-    config.put("core.util", featureMap);
-  }
 
-  private void addOsapiSystemListMethodsConfig(String container, Map<String, 
Object> config, 
-      String host) {
-    if (rpcServiceLookup != null) {
-      Multimap<String, String> endpoints = 
rpcServiceLookup.getServicesFor(container, host);
-      config.put("osapi.services", endpoints);
-    }
+    return "gadgets.config.init(" + JsonSerializer.serialize(config) + ");\n";
   }
 
   /**

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
 Sat Jun 12 00:50:28 2010
@@ -30,6 +30,7 @@ import org.apache.shindig.common.uri.Uri
 import org.apache.shindig.config.ContainerConfig;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.RenderingContext;
+import org.apache.shindig.gadgets.config.ConfigContributor;
 import org.apache.shindig.gadgets.features.FeatureRegistry;
 import org.apache.shindig.gadgets.features.FeatureResource;
 import org.apache.shindig.gadgets.uri.JsUriManager;
@@ -77,6 +78,12 @@ public class JsServlet extends InjectedS
     this.containerConfig = containerConfig;
   }
 
+  private Map<String, ConfigContributor> configContributors;
+  @Inject
+  public void setConfigContributors(Map<String, ConfigContributor> 
configContributors) {
+    this.configContributors = configContributors;
+  }
+
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
       throws IOException {
@@ -143,16 +150,21 @@ public class JsServlet extends InjectedS
     if (context == RenderingContext.CONTAINER) {
       // Append some container specific things
 
-      Map<String, Object> features = 
containerConfig.getMap(ctx.getContainer(), "gadgets.features");
+      Map<String, Object> features = containerConfig.getMap(container, 
"gadgets.features");
       Map<String, Object> config = Maps.newHashMapWithExpectedSize(features == 
null ? 2 : features.size() + 2);
 
       if (features != null) {
         // Discard what we don't care about.
         for (String name : registry.getFeatures(needed)) {
           Object conf = features.get(name);
+          // Add from containerConfig
           if (conf != null) {
             config.put(name, conf);
           }
+          ConfigContributor contributor = configContributors.get(name);
+          if (contributor != null) {
+            contributor.contribute(config, container, req.getHeader("Host"));
+          }
         }
         
jsData.append("gadgets.config.init(").append(JsonSerializer.serialize(config)).append(");\n");
       }

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriterTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriterTest.java?rev=953915&r1=953914&r2=953915&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriterTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriterTest.java
 Sat Jun 12 00:50:28 2010
@@ -41,6 +41,9 @@ import org.apache.shindig.config.Abstrac
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.config.ConfigContributor;
+import org.apache.shindig.gadgets.config.CoreUtilConfigContributor;
+import org.apache.shindig.gadgets.config.XhrwrapperConfigContributor;
 import org.apache.shindig.gadgets.features.FeatureRegistry;
 import org.apache.shindig.gadgets.features.FeatureResource;
 import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
@@ -105,8 +108,12 @@ public class RenderingGadgetRewriterTest
   @Before
   public void setUp() throws Exception {
     featureRegistry = createMock(FeatureRegistry.class);
+    Map<String, ConfigContributor> configContributors = 
ImmutableMap.<String,ConfigContributor>of(
+        "core.util", new CoreUtilConfigContributor(),
+        "shindig.xhrwrapper", new XhrwrapperConfigContributor()
+    );
     rewriter
-        = new RenderingGadgetRewriter(messageBundleFactory, config, 
featureRegistry, jsUriManager, null);
+        = new RenderingGadgetRewriter(messageBundleFactory, config, 
featureRegistry, jsUriManager, configContributors);
     Injector injector = Guice.createInjector(new ParseModule(), new 
PropertiesModule());
     parser = injector.getInstance(GadgetHtmlParser.class);
   }
@@ -546,6 +553,7 @@ public class RenderingGadgetRewriterTest
   public void gadgetsUtilConfigInjected() throws Exception {
     String gadgetXml =
       "<Module><ModulePrefs title=''>" +
+      "  <Require feature='core.util'/>" +
       "  <Require feature='foo'>" +
       "    <Param name='bar'>baz</Param>" +
       "  </Require>" +
@@ -659,7 +667,7 @@ public class RenderingGadgetRewriterTest
 
     String gadgetXml =
       "<Module><ModulePrefs title=''>" +
-      "  <Require feature='xhrwrapper' />" +
+      "  <Require feature='shindig.xhrwrapper' />" +
       oAuthBlock +
       "</ModulePrefs>" +
       "<Content type='html' href='http://foo.com/bar/baz.html'" + authzAttr + 
" />" +


Reply via email to