reference / example / blips

Example Blip Implementations

Although blips, the "common message" of the LLUP, are implementation agnostic, when it comes to implementing LLUP a few examples of how Blips can be constructed using various underlying technologies becomes really useful. That's what we describe here.

An example XML Blip

Schema

atom-elements.xsd

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.w3.org/2005/Atom"
    xmlns="http://www.w3.org/2005/Atom">
    
    <xs:element name="category">
        <xs:complexType>
            <xs:attribute name="term" type="xs:string" use="required" />
            <xs:attribute name="scheme" type="xs:anyURI" />
            <xs:attribute name="label" type="xs:string" />
        </xs:complexType>
    </xs:element>
    
</xs:schema>

llup-types.xsd

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.x2x2x.org/projects/llup" 
    xmlns="http://www.x2x2x.org/projects/llup"
    elementFormDefault="qualified">
    
    <!-- Specifies the content for an identity -->

    <!-- The content of the type is mixed so that a human readable version 
         of the sender's id can be provided -->

    <xs:complexType name="identity" mixed="true">

        <!-- The identifier could be using a number of service provision standards, 
          including but certainly not limited to OpenId -->

        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>
    
    <!-- Declares a list of blip recipients
         Recipients could be groups or individuals, but the actual mapping to 
         distribution channels will be done at the LLUP node -->

    <xs:complexType name="recipients">
        <xs:sequence>
            <xs:element name="recipient" type="xs:string" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    
    <!-- Decalares a time-span that tags a particular entry with a lifetime of relevancy -->

    <xs:complexType name="time-span">
        <xs:attribute name="start" type="xs:dateTime"/>
        <xs:attribute name="expires" type="xs:dateTime"/>
    </xs:complexType>    
    
    <!-- Specifies a payload where any additional information can be passed -->

    <xs:complexType name="custom">
        <xs:sequence>
            <xs:any minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    
    <!-- Specifies recent historical characteristics -->

    <xs:complexType name="history">
        <xs:attribute name="created" type="xs:dateTime" />
        <xs:attribute name="last-updated" type="xs:dateTime" />
    </xs:complexType>
    
</xs:schema>

blip.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.x2x2x.org/projects/llup" xmlns="http://www.x2x2x.org/projects/llup"
    xmlns:atom="http://www.w3.org/2005/Atom"
    elementFormDefault="qualified">

    <!-- Start of Type Declarations -->

    <!-- include LLUP Types constructs -->

    <xs:include schemaLocation="llup-types.xsd"/>

    <!-- Reuse Atom element constructs -->

    <xs:import namespace="http://www.w3.org/2005/Atom" schemaLocation="atom-elements.xsd" />

    <!-- End of Type Declarations -->

    <!-- Document Definition -->

    <xs:element name="blip">
        <xs:complexType>
            <xs:sequence>
                <!-- Identifies the sender of this Blip -->
                <xs:element name="sender" type="identity"/>
                
                <!-- Used to indicate the types of receipients that may be interested in this Blip -->
                <!-- It is possible to not specify any recipients, in which case it is the responsibility 
                    of the LLUP node to direct the blip along any channels it sees fit -->

                <xs:element name="recipients" type="recipients" minOccurs="0" maxOccurs="1"/>
                
                <!-- Used to declare the time-span of relevancy for this Blip. 
                     Outside of which this blip can be ignored or even destroyed -->

                <xs:element name="time-span" type="time-span" />
                
                <!-- Declares a list of cateogories -->

                <xs:element ref="atom:category" />
                
                <!-- Need to add llup home and llup admin according to the spec. -->
                
                <!-- Specifies the link to the actual content that this blip is notifying about -->

                <xs:element name="link" type="xs:anyURI" />
                
                <!-- Specifies the subject of this blip -->

                <xs:element name="subject" type="xs:string" />
                
                <!-- Indicates the recent history of this blip -->

                <xs:element name="history" type="history" />
                
                <!-- Allows the addition of domain or implementation specific blip payload data
                    This metadata may or may not be maintained by a node within the LLUP system. -->

                <xs:element name="custom" type="custom" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <!-- End Document Definition -->
</xs:schema>

Examples

A very simple Blip with no custom data

<?xml version="1.0" encoding="UTF-8"?>

<blip xmlns="http://www.x2x2x.org/projects/llup"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:atom="http://www.w3.org/2005/Atom">
    <sender id="russ@openid.contemporarywebdesign.co.uk">Russ Miles</sender>
    <recipients>
        <recipient>Russ Miles' Friends</recipient>
        <recipient>Russ Miles' Family</recipient>
    </recipients>
    <time-span start="2007-05-25T09:00:00" expires="2007-05-26T09:00:00"/>
    <atom:category  term="party"/>
    <link>http://www.russmiles.com/party-announcement</link>
    <subject>31st Birthday Party Announcement</subject>
    <history created="2007-04-17T12:46:00" last-updated="2007-04-17T12:46:00"/>
</blip>

A very simple Blip with custom domain-specific data embedded

<?xml version="1.0" encoding="UTF-8"?>

<blip xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:party="http://www.russmiles.com/party"
 xmlns="http://www.x2x2x.org/projects/llup"
 xmlns:atom="http://www.w3.org/2005/Atom">
    <sender id="russ@openid.contemporarywebdesign.co.uk">Russ Miles</sender>
    <recipients>
        <recipient>Russ Miles' Friends</recipient>
        <recipient>Russ Miles' Family</recipient>
    </recipients>
    <time-span start="2007-05-25T09:00:00" expires="2007-05-26T09:00:00"/>
    <atom:category  term="party"/>
    <link>http://www.russmiles.com/party-announcement</link>
    <subject>31st Birthday Party Announcement</subject>
    <history created="2007-04-17T12:46:00" last-updated="2007-04-17T12:46:00"/>
    <custom>
        <party:activities>
            <party:activity>Drinkin, mainly</party:activity>
        </party:activities>
    </custom>
</blip>

Atom and APP Integration

A Blip That Makes Extensive Use of Both Atom and the Atom Publishing Protocol for Queue-based Work Flow

<?xml version="1.0" encoding="utf-8"?>
<message xmlns="http://www.llup.org/blip#" xmlns:atom="http://www.w3.org/2005/Atom">
  <reference href="http://amp.fm/band/foobarfighters/event/utahartsfestival/2008/08/28"/>
  <scope start="2008-06-28T22:00:00Z" expire="2005-08-29T01:00:00Z">
    <relevance href="self://atom:entry/atom:category" type="application/atom+xml"/>
    <relevance href="http://amp.fm/artist/foobarfighters//fans" type="application/atom+xml"/>
  </scope>
  <signature>mailto+http:sha1:f0411747d71a46d5c63ff40405e877f87dc9e228</signature>
  <atom:entry xmlns="http://www.w3.org/2005/Atom">
    <atom:id>http://amp.fm/band/foobarfighters/event/utahartsfestival/2008/08/28//1</atom:id>
    <atom:link rel="self" href="https://amp.fm/band/foobarfighters/event/utahartsfestival/2008/08/28" />
    <atom:title>FooBar Fighters *ROCK* the Utah Arts Festival!</atom:title>
    <atom:published>2008-08-25T10:05:33Z</atom:published>
    <atom:author>
      <atom:name>M. David Peterson</atom:name>
      <atom:uri>http://xmlhacker.com/</atom:uri>
    </atom:author>
    <atom:summary>
      It's that time of year again for the Utah Arts Festival to hit Library Square,
      and this year is even better than last! Why?  Because we're headlining on
      Saturday night!  w00t!
    </atom:summary>
    <atom:category label="Utah Arts Festival" term="utah_arts_festival" scheme="http://personplacething.info/thing" />
    <atom:category label="Salt Lake City" term="salt_lake_city" scheme="http://personplacething.info/place/us/ut" />
    <atom:category label="Library Square" term="library_square" scheme="http://personplacething.info/place/us/ut/slc" />
    <atom:category label="Music" term="music" scheme="http://personplacething.info/category" />
    <atom:category label="Event" term="event" scheme="http://personplacething.info/category" />
    <atom:category label="FooBar Fighters" term="foobar_fighters" scheme="http://personplacething.info/people/music/band" />
    <atom:category label="Rock" term="rock" scheme="http://personplacething.info/thing/music/genre" />
  </atom:entry>
</message>

An Example JSON Blip

An example simple blip with no custom information

{"blip": {
  "sender": {"id": russ@openid.contemporarywebdesign.co.uk", "label": "Russ Miles"},
  "recipients": {
    "recipient": [
        {"value": "Russ Miles\' Friends"},
        {"value": "Russ Miles\' Family"}
    ]
  },
  "time-span": {"start": "2007-05-25T09:00:00", "expires": "2007-05-26T09:00:00"},
  "category": {"term": "party},
  "link": "http://www.russmiles.com/party-announcement",
  "subject": "31st Birthday Party Announcement",
  "history": {"created": "2007-04-17T12:46:00", "last-updated": "2007-04-17T12:46:00"}
}}

An example simple blip with custom information

{"blip": {
  "sender": {"id": russ@openid.contemporarywebdesign.co.uk", "label": "Russ Miles"},
  "recipients": {
    "recipient": [
        {"value": "Russ Miles\' Friends"},
        {"value": "Russ Miles\' Family"}
    ]
  },
  "time-span": {"start": "2007-05-25T09:00:00", "expires": "2007-05-26T09:00:00"},
  "category": {"term": "party},
  "link": "http://www.russmiles.com/party-announcement",
  "subject": "31st Birthday Party Announcement",
  "history": {"created": "2007-04-17T12:46:00", "last-updated": "2007-04-17T12:46:00"},
  "custom": {
    "activity": [
        {"value": "Drinkin\', mainly"}
    ]
  } 
}}

References

* The Atom Syndication Format