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 -->