Author: etnu
Date: Fri Feb 1 03:05:01 2008
New Revision: 617472
URL: http://svn.apache.org/viewvc?rev=617472&view=rev
Log:
Fixed features/views to actually use the current view data. requestNavigateTo
is currently a NOOP. It should just use gadgets.rpc, but technically this
feature should be core-views -- in other words, it should not be an explicit
feature according to the gadgets API spec. I have petitioned for a spec change
(the "views" javascript should not be a part of core), but if that doesn't
happen then this will need to be moved to core, which means that IFPC /
gadgets.rpc will always be delivered to every gadget. This is extraordinarily
wasteful. One possible ugly solution would be to only serve views when we see
an actual reference to "gadgets.views" in the content section, but this is
hacky, and really there's no reason for views to be in the core spec anyway.
Takes data in the following form:
views.getParams() -- Assumes that any parameter named "view-<name>" is a key
that belongs in this. When Cajoled this won't make sense, so we should probably
add a check for whether or not we're rendering in an iframe or not first.
views.getCurrentView() -- Assumes that the current view is named in the "view"
query string parameter, which is what GadgetRenderingServlet uses to
discriminate between views.
May be initialized by calling gadgets.views.init and passing in all of the
supported views for this container and whether or not they're the "only
visible" gadget at render time.
Also fixed a possible NPE with GadgetSpecParser and removed a dead file.
Removed:
incubator/shindig/trunk/features/core-features.txt
Modified:
incubator/shindig/trunk/features/core/util.js
incubator/shindig/trunk/features/views/feature.xml
incubator/shindig/trunk/features/views/views.js
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
Modified: incubator/shindig/trunk/features/core/util.js
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core/util.js?rev=617472&r1=617471&r2=617472&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core/util.js (original)
+++ incubator/shindig/trunk/features/core/util.js Fri Feb 1 03:05:01 2008
@@ -114,6 +114,23 @@
},
/**
+ * Utility function for generating an "enum" from an array.
+ *
+ * @param {Array.<String>} values The values to generate.
+ * @return {Map<String,String>} An object with member fields to
handle
+ * the enum.
+ *
+ * @private Implementation detail.
+ */
+ makeEnum : function (values) {
+ var obj = {};
+ for (var i = 0, v; v = values[i]; ++i) {
+ obj[v] = v;
+ }
+ return obj;
+ },
+
+ /**
* Gets the feature parameters.
*
* @param {String} feature The feature to get parameters for
Modified: incubator/shindig/trunk/features/views/feature.xml
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/views/feature.xml?rev=617472&r1=617471&r2=617472&view=diff
==============================================================================
--- incubator/shindig/trunk/features/views/feature.xml (original)
+++ incubator/shindig/trunk/features/views/feature.xml Fri Feb 1 03:05:01 2008
@@ -18,7 +18,12 @@
-->
<feature>
<name>views</name>
+ <!-- <dependency>ifpc</dependency> -->
<gadget>
<script src="views.js"/>
+ <!-- TODO: Clean this up and unify the configuration model -->
+ <script>
+ gadgets.views.init({"default" : false});
+ </script>
</gadget>
</feature>
Modified: incubator/shindig/trunk/features/views/views.js
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/views/views.js?rev=617472&r1=617471&r2=617472&view=diff
==============================================================================
--- incubator/shindig/trunk/features/views/views.js (original)
+++ incubator/shindig/trunk/features/views/views.js Fri Feb 1 03:05:01 2008
@@ -24,126 +24,86 @@
var gadgets = gadgets || {};
/**
- * @static
- * @class Provides operations for dealing with Views.
- * @name gadgets.views
+ * Implements the gadgets.views API spec. See
+ * http://code.google.com/apis/gadgets/docs/reference/gadgets.views.html
*/
-gadgets.views = gadgets.views || {};
+gadgets.views = function() {
-/**
- * Attempts to navigate to this gadget in a different view. If the container
- * supports parameters will pass the optional parameters along to the gadget in
- * the new view.
- *
- * @param {gadgets.views.View} view The view to navigate to
- * @param {Map.<String, String>} opt_params Parameters to pass to the
- * gadget after it has been navigated to on the surface
- *
- * @member gadgets.views
- */
-gadgets.views.requestNavigateTo = function(surface, opt_params) {
- return opensocial.Container.get().requestNavigateTo(surface, opt_params);
-};
-
-/**
- * Returns the current view.
- *
- * @return {gadgets.views.View} The current view
- * @member gadgets.views
- */
-gadgets.views.getCurrentView = function() {
- return this.surface;
+ /**
+ * Reference to the current view object.
+ */
+ var currentView = null;
+
+ /**
+ * Map of all supported views for this container.
+ */
+ var supportedViews = {};
+
+ /**
+ * Map of parameters passed to the current request.
+ */
+ var params = {};
+
+ return {
+ requestNavigateTo : function(view, opt_params) {
+ // TODO: Actually implementing this is going to require gadgets.rpc or
+ // ifpc or something.
+ },
+
+ getCurrentView : function() {
+ return currentView;
+ },
+
+ getSupportedViews : function() {
+ return supportedViews;
+ },
+
+ getParams : function() {
+ return params;
+ },
+
+ /**
+ * Initializes views. Assumes that the current view is the "view"
+ * url parameter (or default if "view" isn't supported), and that
+ * all view parameters are in the form view-<name>
+ * TODO: Use unified configuration when it becomes available.
+ * @param {Map<String, Boolean>} supported The views you support,
+ * where keys = name of the view and values = isOnlyVisible
+ */
+ init : function(supported) {
+ if (typeof supported["default"] === "undefined") {
+ throw new Error("default view required!");
+ }
+
+ for (var s in supported) if (supported.hasOwnProperty(s)) {
+ supportedViews[s] = new gadgets.views.View(s, supported[s]);
+ }
+
+ var urlParams = gadgets.util.getUrlParameters();
+ // extract all parameters prefixed with "view-".
+ for (var p in urlParams) if (urlParams.hasOwnProperty(p)) {
+ if (p.substring(0, 5) === "view-") {
+ params[p.substr(5)] = urlParams[p];
+ }
+ }
+ currentView = supportedViews[urlParams.view] ||
supportedViews["default"];
+ }
+ };
+}();
+
+gadgets.views.View = function(name, opt_isOnlyVisible) {
+ this.name_ = name;
+ this.isOnlyVisible_ = !!opt_isOnlyVisible;
};
-/**
- * Returns a map of all the supported views. Keys each gadgets.view.View by
- * its name.
- *
- * @return {Map<gadgets.views.ViewType | String, gadgets.views.View>} All
- * supported views, keyed by their name attribute.
- * @member gadgets.views
- */
-gadgets.views.getSupportedViews = function() {
- return this.supportedSurfaces;
-};
-
-/**
- * Returns the parameters passed into this gadget for this view. Does not
- * include all url parameters, only the ones passed into
- * gadgets.views.requestNavigateTo
- *
- * @return {Map.<String, String>} The parameter map
- * @member gadgets.views
- */
-gadgets.views.getParams = function() {
- return this.params;
-};
-
-
-/**
- * @class Base interface for all view objects.
- * @name gadgets.views.View
- */
-
-/**
- * @private
- * @constructor
- */
-gadgets.views.View = function(name, opt_isOnlyVisibleGadgetValue) {
- this.name = name;
- this.isOnlyVisibleGadgetValue = !!opt_isOnlyVisibleGadgetValue;
-};
-
-/**
- * Returns the name of this view.
- *
- * @return {gadgets.views.ViewType | String} The view name, usually specified
as
- * a gadgets.views.ViewType
- */
gadgets.views.View.prototype.getName = function() {
- return this.name;
+ return this.name_;
};
-/**
- * Returns true if the gadget is the only visible gadget in this view.
- * On a canvas page or in maximize mode this is most likely true; on a profile
- * page or in dashboard mode, it is most likely false.
- *
- * @return {boolean} True if the gadget is the only visible gadget; otherwise,
false
- */
gadgets.views.View.prototype.isOnlyVisibleGadget = function() {
- return this.isOnlyVisibleGadgetValue;
+ return this.isOnlyVisible_;
};
-
-/**
- * @static
- * @class
- * Used by <a href="gadgets.views.View.html"> View</a>s.
- * @name gadgets.views.ViewType
- */
-gadgets.views.ViewType = {
- /**
- * A view where the gadget is displayed in a very large mode. It should be the
- * only thing on the page. In a social context, this is usually called the
- * canvas page.
- *
- * @member gadgets.views.ViewType
- */
- FULL_PAGE : 'FULL_PAGE',
-
- /**
- * A view where the gadget is displayed in a small area usually on a page with
- * other gadgets. In a social context, this is usually called the profile
page.
- *
- * @member gadgets.views.ViewType
- */
- DASHBOARD : 'DASHBOARD',
-
- /**
- * A view where the gadget is displayed in a small separate window by itself.
- *
- * @member gadgets.views.ViewType
- */
- POPUP : 'POPUP'
-};
+gadgets.views.ViewType = gadgets.util.makeEnum([
+ "FULL_PAGE", "DASHBOARD", "POPUP"
+]);
\ No newline at end of file
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java?rev=617472&r1=617471&r2=617472&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
Fri Feb 1 03:05:01 2008
@@ -160,7 +160,7 @@
Node messagesAttr = attrs.getNamedItem("messages");
Node languageAttr = attrs.getNamedItem("lang");
Node countryAttr = attrs.getNamedItem("country");
- Node rtlAttr = attrs.getNamedItem("rtl");
+ Node rtlAttr = attrs.getNamedItem("language_direction");
String messages = null;
if (null != messagesAttr) {
@@ -181,10 +181,8 @@
language = languageAttr.getNodeValue();
}
- boolean rightToLeft;
- if (null == rtlAttr) {
- rightToLeft = false;
- } else {
+ boolean rightToLeft = false;
+ if (rtlAttr != null && rtlAttr.getTextContent().equals("rtl")) {
rightToLeft = true;
}
@@ -548,19 +546,25 @@
public String getContentData() {
return getContentData(DEFAULT_VIEW);
}
-
+
public String getContentData(String view) {
Check.is(contentType == ContentType.HTML,
"getContentData() requires contentType HTML");
if (view == null || view == "") {
view = DEFAULT_VIEW;
}
- if (!contentData.containsKey(view)) {
- return null;
+
+ StringBuilder content = contentData.get(view);
+ if (content == null) {
+ return "";
+ } else {
+ return content.toString();
}
- return contentData.get(view).toString();
}
-
+
+ // TODO: Synchronizing this seems unnecessary...a parse job should never
+ // happen across threads, and addContent *can't* be called anywhere but
+ // within a call to GadgetSpecParser.parse()
public synchronized void addContent(String view, String content) {
if (view == null || view.equals("")) {
view = DEFAULT_VIEW;
@@ -569,7 +573,7 @@
if (!contentData.containsKey(view)) {
contentData.put(view, new StringBuilder());
}
-
+
contentData.get(view).append(content);
}
}