Author: etnu
Date: Fri Jan 18 12:37:03 2008
New Revision: 613261

URL: http://svn.apache.org/viewvc?rev=613261&view=rev
Log:
Streamlined the feature loading mechanism so that the constructor for 
GadgetFeatureRegistry can load all features at once (and correctly resolve 
dependencies). Also fixed some feature-loading related bugs with the 
experimental libs= override.


Added:
    incubator/shindig/trunk/features/README
Modified:
    incubator/shindig/trunk/features/features.txt
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
    incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml

Added: incubator/shindig/trunk/features/README
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/README?rev=613261&view=auto
==============================================================================
--- incubator/shindig/trunk/features/README (added)
+++ incubator/shindig/trunk/features/README Fri Jan 18 12:37:03 2008
@@ -0,0 +1,30 @@
+You can automatically include new features into your shindig server by adding 
them to this directory. Features should exist in a self-contained directory 
with the following structure:
+
+features
+  |_your-feature-name
+   |_feature.xml
+   |_code-to-run-inside-gadget.js
+   |_code-to-run-inside-container.js
+
+The structure of feature.xml is as follows: TODO: link to xml schema for 
feature.xml
+<?xml version="1.0"?>
+<feature>
+  <name>your-feature-name (required)</name>
+  <dependency>any dependency you have (optional, may have 
multiple)</dependency>
+  <gadget> (optional)
+    <script src="code-to-run-inside-gadget.js"/> (optional, may have multiple, 
may use web resources as well but we strongly encourage bundling your 
javascript with the xml)
+  </gadget>
+  <container> (optional)
+    <script src="code-to-run-inside-container.js"> (same as for <gadget>)
+  </container>
+</feature>
+
+Please always make sure that all files you provide are encoded as utf8. 
+
+When adding new features, your javascript should conform to shindig javascript 
coding conventions. This means that you should not be producing new globals and 
your feature should be compatible with Caja.
+
+When committing a new feature, you should update the features.txt file by 
running the following script in a unix-like environment:
+
+ls -R1a features/**/*.xml > features/features.txt
+
+TODO: Instructions for regenerating features.txt for other operating system 
environments.

Modified: incubator/shindig/trunk/features/features.txt
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/features.txt?rev=613261&r1=613260&r2=613261&view=diff
==============================================================================
--- incubator/shindig/trunk/features/features.txt (original)
+++ incubator/shindig/trunk/features/features.txt Fri Jan 18 12:37:03 2008
@@ -1,10 +1,10 @@
 features/analytics/feature.xml
 features/caja/feature.xml
 features/core/feature.xml
+features/dynamic-height/feature.xml
+features/flash/feature.xml
 features/ifpc/feature.xml
 features/opensocial-reference/feature.xml
 features/opensocial-samplecontainer/feature.xml
 features/setprefs/feature.xml
-features/dynamic-height/feature.xml
 features/settitle/feature.xml
-features/flash/feature.xml

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java?rev=613261&r1=613260&r2=613261&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java
 Fri Jan 18 12:37:03 2008
@@ -64,14 +64,16 @@
    * @param featurePath Path to the directory that contains feature xml files.
    */
   public void registerFeatures(String featurePath) throws GadgetException {
-    if (featurePath == null) return;
+    if (featurePath == null) {
+      return;
+    }
 
     List<String> coreDeps = new LinkedList<String>();
     JsFeatureLoader loader = new JsFeatureLoader();
-    List<Entry> coreJs = loader.loadFeatures(featurePath, this);
+    List<Entry> jsFeatures = loader.loadFeatures(featurePath, this);
 
     if (!coreDone) {
-      for (Entry entry : coreJs) {
+      for (Entry entry : jsFeatures) {
         if (entry.name.startsWith("core")) {
           coreDeps.add(entry.getName());
           core.put(entry.getName(), entry);
@@ -87,6 +89,14 @@
           register(FEAT_MODULE, coreDeps, new ModuleSubstituter()));
       core.put(FEAT_USER_PREF_SUBST,
           register(FEAT_USER_PREF_SUBST, coreDeps, new UserPrefSubstituter()));
+
+      // Make sure non-core features depend on core.
+      for (Entry entry : jsFeatures) {
+        if (!entry.name.startsWith("core")) {
+          entry.deps.addAll(core.values());
+        }
+      }
+
       coreDone = true;
     }
   }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java?rev=613261&r1=613260&r2=613261&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
 Fri Jan 18 12:37:03 2008
@@ -23,7 +23,6 @@
 import org.apache.shindig.gadgets.GadgetServer;
 import org.apache.shindig.gadgets.GadgetSpec;
 import org.apache.shindig.gadgets.GadgetView;
-import org.apache.shindig.gadgets.JsFeatureLoader;
 import org.apache.shindig.gadgets.JsLibrary;
 import org.apache.shindig.gadgets.MessageBundle;
 import org.apache.shindig.gadgets.ProcessingOptions;
@@ -79,20 +78,15 @@
   @SuppressWarnings("unchecked")
   public void init(ServletConfig config) {
     ServletContext context = config.getServletContext();
-    String coreFeatures = context.getInitParameter("core-js-features");
-    String otherFeatures = context.getInitParameter("other-js-features");
+    String features = context.getInitParameter("features");
     String jsPath = context.getInitParameter("js-service-path");
     if (jsPath == null) {
       jsPath = DEFAULT_JS_SERVICE_PATH;
     }
     jsServicePath = jsPath;
     try {
-      registry = new GadgetFeatureRegistry(coreFeatures);
+      registry = new GadgetFeatureRegistry(features);
       gadgetServer.setGadgetFeatureRegistry(registry);
-      if (otherFeatures != null) {
-        JsFeatureLoader jsLoader = new JsFeatureLoader();
-        jsLoader.loadFeatures(otherFeatures, registry);
-      }
     } catch (GadgetException e) {
       e.printStackTrace();
       System.exit(1);
@@ -229,17 +223,24 @@
     String externFmt = "<script src=\"%s\"></script>\n";
 
     for (JsLibrary library : gadget.getJsLibraries()) {
-      if (library.getType() == JsLibrary.Type.URL) {
+      JsLibrary.Type type = library.getType();
+      if (type == JsLibrary.Type.URL) {
         // TODO: This case needs to be handled more gracefully by the js
         // servlet. We should probably inline external JS as well.
         externJs.append(String.format(externFmt, library.getContent()));
-      } else if (options.forceJsLibs == null) {
+      } else if (type == JsLibrary.Type.INLINE) {
         inlineJs.append(library.getContent()).append("\n");
+      } else {
+        // FILE or RESOURCE
+        if (options.forceJsLibs == null) {
+          inlineJs.append(library.getContent()).append("\n");
+        } // otherwise it was already included by options.forceJsLibs.
       }
     }
 
+    // Forced libs first.
     if (options.forceJsLibs != null) {
-      externJs.append(String.format(externFmt,
+      markup.append(String.format(externFmt,
           DEFAULT_JS_SERVICE_PATH + options.forceJsLibs + JS_FILE_SUFFIX));
     }
 

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java?rev=613261&r1=613260&r2=613261&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
 Fri Jan 18 12:37:03 2008
@@ -16,7 +16,6 @@
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.GadgetFeatureFactory;
 import org.apache.shindig.gadgets.GadgetFeatureRegistry;
-import org.apache.shindig.gadgets.JsFeatureLoader;
 import org.apache.shindig.gadgets.JsLibrary;
 import org.apache.shindig.gadgets.JsLibraryFeatureFactory;
 import org.apache.shindig.gadgets.RenderingContext;
@@ -42,15 +41,10 @@
   @Override
   public void init(ServletConfig config) {
     ServletContext context = config.getServletContext();
-    String coreFeatures = context.getInitParameter("core-js-features");
-    String otherFeatures = context.getInitParameter("other-js-features");
+    String features = context.getInitParameter("features");
     String jsPath = context.getInitParameter("js-service-path");
     try {
-      registry = new GadgetFeatureRegistry(coreFeatures);
-      if (otherFeatures != null) {
-        JsFeatureLoader jsLoader = new JsFeatureLoader();
-        jsLoader.loadFeatures(otherFeatures, registry);
-      }
+      registry = new GadgetFeatureRegistry(features);
     } catch (GadgetException e) {
       e.printStackTrace();
       throw new RuntimeException(e);

Modified: incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml?rev=613261&r1=613260&r2=613261&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml 
(original)
+++ incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml Fri 
Jan 18 12:37:03 2008
@@ -21,11 +21,7 @@
 <web-app>
   <!-- configuration -->
   <context-param>
-    <param-name>core-js-features</param-name>
-    <param-value>res://features/core-features.txt</param-value>
-  </context-param>
-  <context-param>
-    <param-name>other-js-features</param-name>
+    <param-name>features</param-name>
     <param-value>res://features/features.txt</param-value>
   </context-param>
   <!-- Render a Gadget -->


Reply via email to