Core Gadget - Gadget Lifecycle Events
This is a DRAFT PROPOSAL ... this is more than just a simple edit.. the current discussion of Gadget Lifecycle Events in the Core Gadget specification is pretty much pointless and useless as currently defined. The mechanism described here brings in new technical details and specifications but does so in a way that should be completely backwards compatible with whatever else is there... I think... it's hard to tell since the current stuff is pretty much useless....
#. Gadget Lifecycle Events The Gadget Lifecycle Event capability allows an OpenSocial server and container to send notifications to a remote endpoint of the gadget developer's choosing whenever events significant to the lifecycle of an individual instance of the gadget occur. Such notifications can be used for a variety of purposes, including, but not limited to, the provisioning of additional resources external to the container that instances of the gadget require to operate. Every instance of a gadget processed and rendered by a container follows the same basic general lifecycle: Pending occurs prior to a gadget specification document being "Registered" with the container. This is an intermediate step in a gadget's lifecycle that occurs, for example, when a gadget developer first submits the gadget specification to the container, or when an Embedded Experience that references a previously unknown gadget specification is encountered, and that specification has not yet been processed. This phase in the lifecycle implies that additional action might be required before the gadget specification can be considered to be "Registered". Rejected occurs when "Registration" of a "Pending" gadget specification cannot be completed for any reason. For instance, if the registration of the gadget is rejected by an administrator. Registered occurs after the container first becomes aware of the Gadget Specification Document. For instance, when an administrator adds a gadget specification to a catalog of available gadget's, or when a previously unknown gadget specification is referenced within an Embedded Experience currently being processed by a container. Available occurs when the gadget specification becomes available for use by the container. In order to be considered "Available", a gadget specification MUST have first passed through the "Registered" phase. There are a number of actions that can trigger the availability of a gadget specification such as an administrator approving the registration or adding the gadget to a "whitelist" of acceptable gadgets. Unavailable occurs when the gadget specification becomes unavailable for use by the container. Unavailable gadgets are known to the container ("Registered") but cannot be used for some reason. Examples include gadgets that have been added to a "blacklist" or have otherwise been disabled for some reason. Updated occurs whenever the gadget specification known to the container has been updated. This can happen whenever a new version of the gadget specification is provided to the container. Installed occurs when a specific instance of a gadget is provisioned for use. For instance, when an instance is added to a page. Only "Available" gadgets can be "Installed". Installing a gadget is not the same as "opening" or "rendering" the gadget. Configured occurs whenever the configuration details for an installed gadget have been modified. Restriction occurs whenever the functionality of a particular instance of the gadget has been restricted in some way. For instance, if the operation of the gadget has caused it to exceed request rate limitations or quotas and the container responds by limiting the actions the gadget instance is permitted to perform. Another example could be when the container has limited the security policy permissions underwhich the instance of the gadget is operating. Opened occurs whenever an "Installed" instance of a gadget is opened or rendered by the container. Closed occurs whenever an "Installed" instance of a gadget is closed by the container. Note that closing a gadget is not the same as uninstalling it. A closed gadget can be reopened later. Uninstalled occurs when a provisioned instance of a gadget is destroyed. This lifecycle event implies that all resources associated with a specific gadget instance are to be deallocated. Unregistered occurs when a "Registered" gadget specification is removed from the container. A gadget developer can indicate interest in receiving notification whenever any of these lifecycle events occur by using the <Link> element. Containers are not, however, required to send lifecycle event notifications and MAY ignore any <Link> element specifying an event identifier. The optional "method" attribute can be specified on the <Link> element to indicate the HTTP request method to be used when sending the event notification. Valid values are either "GET" or "POST". When not specified, the default is assumed to be "GET". For example, <Module> <ModulePrefs> ... <Link rel="org.opensocial.event" href="http://example.org/event" method="POST" /> <Link rel="org.opensocial.event.registered" href="http://example.org/event/registered" /> <Link rel="org.opensocial.event.unregistered" href="http://example.org/event/unregistered" /> ... </ModulePrefs> <Content type="html"> ... </Content> </Module> The "rel" attribute on the <Link> element identifies the type of event the gadget developer is interested in receiving. The event identifier syntax used as the value of the rel is: segment = 1*( ALPHA / DIGIT ) prefix = segment *("." segment ) "." name = segment *("." segment) event = [prefix] "event" [ "." name ] This specification defines the following event identifiers: org.opensocial.event.pending Identifies the "Pending" lifecycle event. org.opensocial.event.rejected Identifies the "Rejected" lifecycle event. org.opensocial.event.registered Identifies the "Registered" lifecycle event. org.opensocial.event.available Identifies the "Available" lifecycle event. org.opensocial.event.unavailable Identifies the "Unavailable" lifecycle event. org.opensocial.event.updated Identifies the "Updated" lifecycle event. org.opensocial.event.installed Identifies the "Installed" lifecycle event. org.opensocial.event.configured Identifies the "Configured" lifecycle event. org.opensocial.event.restriction Identifies the "Restriction" lifecycle event. org.opensocial.event.opened Identifies the "Opened" lifecycle event. org.opensocial.event.closed Identifies the "Closed" lifecycle event. org.opensocial.event.uninstalled Identifies the "Uninstalled" lifecycle event. org.opensocial.event.unregistered Identifies the "Unregistered" lifecycle event. org.opensocial.event A specially defined "wildcard" that represents all other events using the "org.opensocial." prefix. Use of the "org.opensocial." prefix is reserved by this specification. Implementations MUST NOT use event identifiers that use the "org.opensocial." prefix other than those defined above. Implementations are free to define additional event type identifiers that use prefixes other than "org.opensocial.". #.# Lifecycle Event Notifications Whenever a significant lifecycle event occurs for a particular gadget specification, the container MAY send an event notification to the IRI identified by any <Link> element provided by that gadget specification whose "rel" attribute values identifies the event. If the container supports sending event notifications, one notification SHOULD be sent for each matching <Link> element. For instance, given the following partial gadget specification: <Module> <ModulePrefs> ... <Link rel="org.opensocial.event" href="http://example.org/event" method="POST" /> <Link rel="org.opensocial.event.registered" href="http://example.org/event/registered" /> <Link rel="org.opensocial.event.unregistered" href="http://example.org/event/unregistered" /> ... </ModulePrefs> <Content type="html"> ... </Content> </Module> ]]> When the gadget specification is registered within the container, two event notifications will be sent: - One to the endpoint "http://example.org/event" identified by the "org.opensocial.event" rel value, and - One to the endpoint "http://example.org/event/registered" identified by the "org.opensocial.event.registered" rel value. Each event notification is sent as an HTTP request message using the method declared by the <Link> elements "method" attribute. If the "method" attribute is not specified, then the HTTP GET method is used. The container MUST add the additional "eventtype" query string parameter to the IRI specified by the <Link> element. The value MUST be the name part of the event identifier provided in the "rel" attribute (e.g. if rel="org.opensocial.event.registered", then "eventtype" will equal "registered"). If the event identifier does not have a name component (as is the case with the special identifier "org.opensocial.event") then value of "eventtype" MUST be set to a name specific to event that triggered the notification. All event notification requests MUST be signed as specified by [SignedFetch]. In the example given, the notification sent to "http://example.org/event" will utilize the HTTP POST method: POST /event?eventtype=registered HTTP/1.1 Host: example.org TODO: Finish Example The notification sent to "http://example.org/event/registered" will utilize HTTP GET: GET /event?eventtype=registered HTTP/1.1 Host: example.org TODO: Finish Example Responses to event notification requests are considered to be insignificant by this specification. #.# Legacy Support Previous version of this specification defined the following deprecated event identifiers that MAY continued to be supported by containers for backwards compatibility: event Equivalent to "org.opensocial.event". event.addapp Equivalent to "org.opensocial.event.installed" event.removeapp Equivalent to "org.opensocial.event.uninstalled" event.app Provides an indication that some action has been performed on the gadget. The specific action performed is identified by adding an additional "action" parameter to the GET or POST request. The valid "action" values are "enabled", "disabled", "approved", "submitted", "rejected", "new" and "banned".