OK I got it - so you propagate the shared data update to all widgets (of any 
type) that have the same shareddatakey and API key. That then cascades the 
notifications to their siblings.

Yes, this is the UC we are dealing with.

It certainly has the benefit of simplicity, and looks like it works nicely for 
the UC. I do wonder though if this kind of UC can also be handled purely 
client-side using things like PostMessage and open-app[1]? I think Mattias 
Palmer was doing something with this for a widget portal project he was working 
on.

I think: yes, if all browser would support HTML5. An advantage now is storage of the variables in the Wookie database. So information don't get lost.

There is also a reset() method that hasn't been implemented yet that clears all 
the shared state [2].

Ah yes, this would be nice!

Great bit of refactoring there! I'll leave the comment in Notifier just in case we need 
it later, but your new solution looks much simpler - as you say the trick is to see if we 
can generalize it a bit and maybe add some other levels of control over the 
"channels" that are enabled by the user. Maybe for now we might use your patch 
but have it deactivated by default and have a switch in widgetserver.properties to enable 
it?

A switch for enabling it would be perfect!! Generalization could then be done in-line with other IWC ideas, as you said.

-Bernhard





On 07/10/10 11:44, Scott Wilson (JIRA) wrote:

     [ 
https://issues.apache.org/jira/browse/WOOKIE-133?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12918864#action_12918864
 ]

Scott Wilson commented on WOOKIE-133:
-------------------------------------

Thanks, Ivan. Your table is my number one source of info on IWC!



Implement inter-widget messaging
--------------------------------

                 Key: WOOKIE-133
                 URL: https://issues.apache.org/jira/browse/WOOKIE-133
             Project: Wookie
          Issue Type: New Feature
          Components: Server, Wookie REST API
            Reporter: Scott Wilson
            Priority: Minor
   Original Estimate: 168h
  Remaining Estimate: 168h

One of the more persistent new feature requests we've had for Wookie has been 
to extend the mechanisms for inter-widget communication (IWC). As it currently 
stands, Wookie supports two mechanisms for IWC:
1. Wave Shared States
Wookie enables "sibling" widgets to share their state. This is exposed to 
widgets using the Google Wave Gadget API, which enables widgets to submit state update 
deltas, and to register a callback to notify them when their state has been updated by 
another widget instance. We define siblings using the algorithm in 
org.apache.wookie.util.SiblingPageNormalizer; essentially this is that the widget 
instance must be for the same widget, with the same shared data key, and the same API key.
2. HTML5 Drag and Drop
While not actually part of Wookie itself, Widgets can be developed using HTML5 
drag and drop capability, enabling user-directed IWC.
Some use-cases for IWC have been collected on the Talk About Widgets mailing 
list.
The most common use-cases for extending IWC proposed for Wookie I've seen involve "Dashboard"-style 
messaging. In this model, widgets appearing in the same space for the user get to share events. For example, all the 
widgets in a single user's dashboard can send data to each other. This might follow a single shared state model, but is 
more likely to follow a "channel" metaphor, with named "channels" or "queues" between 
widgets. There are several ways this could be implemented, for example:
A. User-specified channels
In this model, the user specifies exactly which messages are sent between widgets. For example, the EzWeb project defines a 
"wiring" interface with "slots" and "events" connected with user-created "channels". For example, 
the user create a channel from a widget with a "weather" event to a widget with a "weather" slot.
B. Widget-specified channels
In this model, widgets are automatically able to receive any events on any 
channel that they choose to listen to. Users do not need to create channels to 
enable IWC.
These two mechanisms are not necessarily exclusive, and could be supported 
within the same Feature extension. For example, the JavaScript API may look 
like this:
iwc.sendEvent(String event_name, Object event_value)
iwc.registerCallback(String slot_name, Function callback)
I would prefer having this IWC extension use its own functions in its own 
object rather than overload the Wave and Widget objects, to avoid any possible 
confusion.
In case "A", callbacks are only triggered where there are explicit channels linking the 
sending event and the receiving slot; in case "B", events are propagated to all 
registered callbacks that the event_name matches.
For example, in pseudocode, the implementation could look something like:
sendEvent(event_name, value, idkey){
                instance = find widget instance (idkey)
                if use_channels:
                        event = find event(instance.getWidget, event_name)
                        find channels (eventinstance = instance&   event = 
event_name)
                        for channel in channels:
                                slot = channel.slot
                                send notification to slot (target, slot, value)
                                
Notifier.notifySingleInstance(target,"iwc.__callback({slot},{value})")
                else:   
                        
Notifier.notifySiblingsByUser(instance,"iwc.__callback({event_name},{value})")
}
Note that in case "A", the widget author just registers callbacks for its slots without having to 
be concerned with what the sending widget calls them, so if a user can wire a "weather" event to a 
"temperature" slot, the sending widget calls:
sendEvent("weather","30C");
and the receiver can call:
registerCallback("temperature",my_function);
... and the channel wires things up despite the names not matching. In case B, 
the receiving widget would have to know the name of the event, and register a 
callback.
In case A, widgets need to declare their "events" and "slots" as extensions in 
config.xml so they can be wired up in channels by a user, and there needs to be some sort of UI 
where users get to do some wiring. Wookie could expose an API for creating/removing/editing 
channels that could be implemented by containers rather than provide this UI itself.
(Interestingly, case A would in theory support situations where widgets send 
notifications to widgets in different containers; though I think this would 
only really work if we went did the OpenID implementation so could have some 
assurance that the source and target widget instances belonged to the same 
user).
[1] http://groups.google.com/group/talk-about-widgets/web/use-cases-for-iwc
[2] http://forge.morfeo-project.org/wiki/index.php/Gadget_development_guide

<WidgetAPIImpl.java>


Reply via email to