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 &lt;Link&gt; 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 &lt;Link&gt; 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".