Author: vsiveton
Date: Mon Apr 6 22:41:36 2009
New Revision: 762545
URL: http://svn.apache.org/viewvc?rev=762545&view=rev
Log:
o more doc
Added:
incubator/shindig/trunk/site/src/site/resources/images/samples/getFriendsHasApp.png
(with props)
Modified:
incubator/shindig/trunk/site/src/site/apt/getting-started.apt
incubator/shindig/trunk/site/src/site/xdoc/overview.xml
Modified: incubator/shindig/trunk/site/src/site/apt/getting-started.apt
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/site/src/site/apt/getting-started.apt?rev=762545&r1=762544&r2=762545&view=diff
==============================================================================
--- incubator/shindig/trunk/site/src/site/apt/getting-started.apt (original)
+++ incubator/shindig/trunk/site/src/site/apt/getting-started.apt Mon Apr 6
22:41:36 2009
@@ -3,7 +3,7 @@
-----
Vincent Siveton
------
- 2009-03-26
+ 2009-04-06
------
~~ Licensed to the Apache Software Foundation (ASF) under one
@@ -33,15 +33,19 @@
Discovering Shindig Samples
- Shindig comes with several samples. The sample container should be your
first starting point:
+ The sample container should be your first starting point:
- {{http://localhost:8080/gadgets/files/samplecontainer/samplecontainer.html}}.
+ {{http://localhost:8080/gadgets/files/samplecontainer/samplecontainer.html}}
-[./images/samples/samplecontainer.png] Sample Container
+ The page displayed in the figure bellow is the Shindig sample container. Its
goal is to help you to deploy
+ and test your applications. You could also change the application state:
changing the number and kind of friends,
+ application data, or changing the viewer (i.e. the user accessing the
application).
- You could change the <"Displaying gadget"> field with one of them and click
on <"reset all">:
+[./images/samples/samplecontainer.png] Sample Container
- *
{{http://localhost:8080/gadgets/files/samplecontainer/examples/SocialActivitiesWorld.xml}}
+ By default, the gadget is
{{http://localhost:8080/gadgets/files/samplecontainer/examples/SocialHelloWorld.xml}}.
+ You could try to use another gadget by specifying one of following URLs in
the <"Displaying gadget"> field and
+ click on <"reset all">:
*
{{http://localhost:8080/gadgets/files/samplecontainer/examples/SocialCajaWorld.xml}}
@@ -51,6 +55,16 @@
[]
+ By default, all the datas are in the
{{http://localhost:8080/gadgets/files/samplecontainer/../sampledata/canonicaldb.json}}.
+ You could try to use another state by specifying one of following URLs in
the <"Using state"> field and
+ click on <"reset all">:
+
+ *
{{http://localhost:8080/gadgets/files/samplecontainer/state-basicfriendlist.xml}}
+
+ *
{{http://localhost:8080/gadgets/files/samplecontainer/state-smallfriendlist.xml}}
+
+ []
+
You could also discover other samples on {{http://localhost:8080}}:
* {{http://localhost:8080/gadgets/files/container/sample1.html}}
@@ -75,37 +89,230 @@
[]
+Playing With Shindig
+
+ This part is mainly to play with OpenSocial APIs.
+
+* OpenSocial REST
+
+ Shindig implements the
{{{http://docs.google.com/View?docid=dcc2jvzt_37hdzwkmf8}OpenSocial Restful
Protocol}} based
+ on {{{http://bitworking.org/projects/atom/rfc5023.html}AtomPub}}. It
supports XML and JSON formats in addition to
+ Atom format XML. The following REST samples will focus on the Read only
operation (GET). All sample data are
+ located in
{{http://localhost:8080/gadgets/files/sampledata/canonicaldb.json}}.
+
+ * Getting all people connected to <john.doe>:
+
+ * URL: {{http://localhost:8080/social/rest/people/john.doe/@all}}
+
+ * Result:
+
++-----+
+{"entry":[{"id":"jane.doe","name":{"formatted":"Jane
Doe","givenName":"Jane","familyName":"Doe"}},
+{"id":"george.doe","name":{"formatted":"George
Doe","givenName":"George","familyName":"Doe"}},
+{"id":"maija.m","name":{"formatted":"Maija
Meikäläinen","givenName":"Maija","familyName":"Meikäläinen"}}],"totalResults":3,"startIndex":0}
++-----+
+
+ []
+
+ * Getting the profile of <john.doe>:
+
+ * URL: {{http://localhost:8080/social/rest/people/john.doe/@self}}
+
+ * Result:
+
++-----+
+{"entry":{"id":"john.doe","name":{"formatted":"John
Doe","givenName":"John","familyName":"Doe"}}}
++-----+
+
+ []
+
+ * Getting all the friends of <jane.doe>:
+
+ * URL: {{http://localhost:8080/social/rest/people/jane.doe/@friends}}
+
+ * Result:
+
++-----+
+{"entry":[{"id":"john.doe","name":{"formatted":"John
Doe","givenName":"John","familyName":"Doe"}}],"totalResults":1,"startIndex":0}
++-----+
+
+ []
+
+ * Getting the activities of <john.doe>:
+
+ * URL: {{http://localhost:8080/social/rest/activities/john.doe/@self}}
+
+ * Result:
+
++-----+
+{"entry":[{"title":"yellow","userId":"john.doe","id":"1","body":"what a
color!"}],"totalResults":1,"startIndex":0}
++-----+
+
+ []
+
+ * Getting the activities of <john.doe> using a <<security token>>:
+
+ * URL:
{{http://localhost:8080/social/rest/people/jane.doe/@friends?st=a:a:a:a:a:a:a}}
+
+ * Result:
+
++-----+
+{"entry":[{"title":"yellow","userId":"john.doe","id":"1","body":"what a
color!"}],"totalResults":1,"startIndex":0}
++-----+
+
+ []
+
+ []
+
+ For more information on the URI templates, please read
{{{./overview.html#OpenSocial_REST}OpenSocial REST}} section
+ in the overview page.
+
+* OpenSocial JSON-RPC
+
+ Shindig also implements
{{{http://docs.google.com/View?docid=dhjrqr8t_4cwzqq7gh}OpenSocial RPC
Protocol}}. The
+ following RPC samples are similar to the REST samples.
+
+ * Getting the profile of <john.doe>:
+
+ * URL:
{{http://localhost:8080/social/rpc?method=people.get&userId=john.doe&group...@self}}
+
+ * Result:
+
++-----+
+{"data":{"id":"john.doe","name":{"formatted":"John
Doe","givenName":"John","familyName":"Doe"}}}
++-----+
+
+ []
+
+ * Getting all the friends of <jane.doe>:
+
+ * URL:
{{http://localhost:8080/social/rpc?method=people.get&userId=john.doe&group...@all}}
+
+ * Result:
+
++-----+
+{"data":{"list":[{"id":"jane.doe","name":{"formatted":"Jane
Doe","givenName":"Jane","familyName":"Doe"}},
+{"id":"george.doe","name":{"formatted":"George
Doe","givenName":"George","familyName":"Doe"}},
+{"id":"maija.m","name":{"formatted":"Maija
Meikäläinen","givenName":"Maija","familyName":"Meikäläinen"}}],"totalResults":3,"startIndex":0}}
++-----+
+
+ []
+
+ []
+
+ For more information on the URI templates, please read
{{{./overview.html#OpenSocial_JSON-RPC}OpenSocial JSON-RPC}} section
+ in the overview page.
+
Go Further: Building a Container Supporting OpenSocial
-* Create Your Own Gadget Renderer
+ You are now ready to create your first OpenSocial application!
+
+* Create Your First OpenSocial Gadget
Shindig implements
{{{http://www.opensocial.org/Technical-Resources/opensocial-spec-v08/gadget-spec.html}Gadgets
Specification}}.
Gadgets are web-based software components based on HTML, CSS, and
JavaScript. Please read
{{{http://code.google.com/apis/gadgets/docs/gs.html}Getting Started:
gadgets.* API}} to learn more.
- Typically, an Opensocial gadget will be composed by <metadata>, <gadget
features>, <user preferences>, <message bundles>
- and <content>. Here is a small snippet:
+ Typically, an Opensocial gadget is similar to a Google Gadget since its
should respect the Google Gadgets
+ specifications. Here is a small snippet:
+------+
<?xml version="1.0" encoding="UTF-8"?>
<Module>
- <ModulePrefs title="Hello World">
+ <ModulePrefs title="A Title">
<Require feature="opensocial-0.8"/>
...
</ModulePrefs>
<Content type="html">
<![CDATA[
-...
+ <script type="text/javascript">
+ ...
+ gadgets.util.registerOnLoadHandler(init);
+ </script>
+ <div id="id"/>
+ ...
]]>
</Content>
</Module>
+------+
- You could see a real gadget
-
{{{http://svn.apache.org/repos/asf/incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml}here}}.
+ This XML file describes the OpenSocial application.
+
+ * The <ModulePrefs> section contains application metadata, such as title and
required libraries. Also, you would
+ notice the <require> element which includes the OpenSocial APIs as feature.
Always declaring this requirement make
+ your applications as an OpenSocial application. Others features supported by
Shindig are described
+ {{{./developers/features/index.html}here}}.
+
+ * The application contents live within the <Content> section. You should
include additional JavaScript that contains
+ the application logic and an handler to fire an <init()> function at launch
time with the
+ <gadgets.util.registerOnLoadHandler()> function. Finally, you will include
an HTML section to display the result.
+
+ []
+
+ To access data from the Shindig, you have to create a <DataRequest> object
using the <opensocial.newDataRequest()>
+ call.
+
+ Your first application will enumerate the friends currently belonging to the
network of the user accessing the
+ application. The following snippet is the code of
+
{{http://localhost:8080/gadgets/files/samplecontainer/examples/getFriendsHasApp.xml}}.
+
++-----+
+<?xml version="1.0" encoding="UTF-8"?>
+<Module>
+ <ModulePrefs title="List Friends using HAS_APP filter Example">
+ <Require feature="opensocial-0.7"/>
+ </ModulePrefs>
+ <Content type="html">
+ <![CDATA[
+ <script type="text/javascript">
+ /**
+ * Request for friend information.
+ */
+ function getData() {
+ var req = opensocial.newDataRequest();
+
+
req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER),
'owner');
+ var params = {};
+ params[opensocial.DataRequest.PeopleRequestFields.MAX] = 50;
+ params[opensocial.DataRequest.PeopleRequestFields.FILTER] =
opensocial.DataRequest.FilterType.HAS_APP;
+ params[opensocial.DataRequest.PeopleRequestFields.SORT_ORDER] =
opensocial.DataRequest.SortOrder.NAME;
+
req.add(req.newFetchPeopleRequest(opensocial.DataRequest.Group.OWNER_FRIENDS,
params), 'ownerFriends');
+ req.send(onLoadFriends);
+ };
+
+ /**
+ * Parses the response to the friend information request and generates
+ * html to list the friends along with their display name.
+ *
+ * @param {Object} dataResponse Friend information that was requested.
+ */
+ function onLoadFriends(dataResponse) {
+ var owner = dataResponse.get('owner').getData();
+ var html = 'Friends of ' + owner.getDisplayName();
+ html += ':<br><ul>';
+ var ownerFriends = dataResponse.get('ownerFriends').getData();
+ ownerFriends.each(function(person) {
+ html += '<li>' + person.getDisplayName() + '</li>';
+ });
+ html += '</ul>';
+ document.getElementById('message').innerHTML = html;
+ };
+
+ gadgets.util.registerOnLoadHandler(getData);
+ </script>
+ <div id="message"> </div>
+ ]]>
+ </Content>
+</Module>
++-----+
+
+ The following is the result of
{{http://localhost:8080/gadgets/files/samplecontainer/examples/getFriendsHasApp.xml}}
+ in the sample container
{{http://localhost:8080/gadgets/files/samplecontainer/samplecontainer.html}}:
+
+[./images/samples/getFriendsHasApp.png] Get Friends
- All features supported by Shindig are described
{{{./developers/features/index.html}here}}.
+ This is your first overview of the APIs that deals with people and
relationships.
* Create Your Own OpenSocial Back-end
Added:
incubator/shindig/trunk/site/src/site/resources/images/samples/getFriendsHasApp.png
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/site/src/site/resources/images/samples/getFriendsHasApp.png?rev=762545&view=auto
==============================================================================
Binary file - no diff available.
Propchange:
incubator/shindig/trunk/site/src/site/resources/images/samples/getFriendsHasApp.png
------------------------------------------------------------------------------
svn:mime-type = image/png
Modified: incubator/shindig/trunk/site/src/site/xdoc/overview.xml
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/site/src/site/xdoc/overview.xml?rev=762545&r1=762544&r2=762545&view=diff
==============================================================================
--- incubator/shindig/trunk/site/src/site/xdoc/overview.xml (original)
+++ incubator/shindig/trunk/site/src/site/xdoc/overview.xml Mon Apr 6 22:41:36
2009
@@ -25,7 +25,7 @@
<properties>
<title>Overview Of Shindig</title>
<author>Vincent Siveton</author>
- <date>2009-03-25</date>
+ <date>2009-04-06</date>
</properties>
<body>
<section name="Introduction">
@@ -74,18 +74,18 @@
<ul>
<li>Gadget container (gadget.js), fully opensocial gadget
compliant;</li>
<li>OpenSocial container;</li>
- <li><a href="http://www.json.org/">JSON</a>, Restful container and
- <a href="http://code.google.com/p/google-caja/">Caja</a>
support.</li>
+ <li><a href="http://www.json.org/">JSON</a>, Restful container and <a
+ href="http://code.google.com/p/google-caja/">Caja</a>
support.</li>
</ul>
<p>
<img src="./images/shindig-client.jpg" alt="Shindig Client Flow"/>
</p>
</subsection>
- </section>
- <section name="OpenSocial Flow">
- <p>The following is a typical flow to get a list of Friends.</p>
- <subsection name="Server Side Flow">
+ <subsection name="Put It Together: OpenSocial Flow">
+ <p>The following is a typical flow to get a list of Friends.</p>
+
+ <h4>Server Side Flow</h4>
<ol>
<li>Call JsonRpcServlet;</li>
<li>Get the appropriate handler;</li>
@@ -102,8 +102,8 @@
<li>Get the JSON object from the DB;</li>
<li>Return to the client.</li>
</ol>
- </subsection>
- <subsection name="Client Side Flow">
+
+ <h4>Client Side Flow</h4>
<ol>
<li>Create request object;</li>
<li>Populate request parameters;</li>
@@ -112,13 +112,285 @@
</subsection>
</section>
+ <section name="OpenSocial APIs">
+ <p>Shindig implements several OpenSocial APIs:</p>
+ <ul>
+ <li><b>OpenSocial REST</b>: for server to server communication</li>
+ <li><b>OpenSocial JSON-RPC</b>: for gadget to server communication</li>
+ <li><b>Javascript</b>: for gadgets</li>
+ </ul>
+
+ <subsection name="OpenSocial REST">
+ <p>There are four types of REST services which can be exposed by
Shindig:
+ <i>people</i>, <i>activities</i>, <i>appdata</i> and
<i>groups</i>.There are URI
+ Templates defined for each type of service.</p>
+ <p>For instance, <a
href="http://localhost:8080/social/rest/people/john.doe"
+ >http://localhost:8080/social/rest/people/john.doe</a></p>
+ <table>
+ <thead>
+ <tr>
+ <th>Type</th>
+ <th>Spec.</th>
+ <th>URI-Template</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <b>People</b>
+ </td>
+ <td>
+ <a
+
href="http://docs.google.com/View?docid=dcc2jvzt_37hdzwkmf8#ssc:290"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>/social/rest/people/{guid}/@all</dt>
+ <dd>Collection of all people connected to user {guid}</dd>
+ <dt>/social/rest/people/{guid}/@all</dt>
+ <dd>Collection of all people connected to user {guid}</dd>
+ <dt>/social/rest/people/{guid}/@friends</dt>
+ <dd>Collection of all friends of user {guid}; subset of
@all</dd>
+ <dt>/social/rest/people/{guid}/{groupid}</dt>
+ <dd>Collection of all people connected to user {guid} in
group
+ {groupid}</dd>
+ <dt>/social/rest/people/{guid}/@all/{pid}</dt>
+ <dd>Individual person record for a specific person known to
+ {guid}; shows {guid}'s view of {pid}.</dd>
+ <dt>/social/rest/people/{guid}/@self</dt>
+ <dd>Profile record for user {guid}</dd>
+ <dt>/social/rest/people/@me/@self</dt>
+ <dd>Profile record for requestor</dd>
+ </dl>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Activities</b>
+ </td>
+ <td>
+ <a
+
href="http://docs.google.com/View?docid=dcc2jvzt_37hdzwkmf8#ssc:315"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>/social/rest/activities/{guid}/@self</dt>
+ <dd>Collection of activities generated by given user</dd>
+ <dt>/social/rest/activities/{guid}/@friends</dt>
+ <dd>Collection of activities for friends of the given user
+ {guid}</dd>
+ <dt>/social/rest/activities/{guid}/{groupid}</dt>
+ <dd>Collection of activities for people in group {groupid}
+ belonging to given user {uid}</dd>
+ <dt>/social/rest/activities/{guid}/@self/{activityid}</dt>
+ <dd>Individual activity resource; usually discovered from
+ collection</dd>
+ </dl>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Appdata</b>
+ </td>
+ <td>
+ <a
+
href="http://docs.google.com/View?docid=dcc2jvzt_37hdzwkmf8#ssc:328"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>/social/rest/appdata/{guid}/@self/{appid}</dt>
+ <dd>All app data for user {guid}, app {appid}</dd>
+ <dt>/social/rest/appdata/{guid}/@friends/{appid}</dt>
+ <dd>All app data for friends of user {guid} and app {appid};
+ read-only (only GET and HEAD supported)}</dd>
+
<dt>/social/rest/appdata/{guid}/@self/{appid}?fields=count</dt>
+ <dd>Just the count field for user {guid}, app {appid}</dd>
+ </dl>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Group</b>
+ </td>
+ <td>
+ <a
+
href="http://docs.google.com/View?docid=dcc2jvzt_37hdzwkmf8#ssc:310"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>/social/rest/groups/{guid}</dt>
+ <dd>Collection of groups associated with user {guid}</dd>
+ </dl>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </subsection>
+
+ <subsection name="OpenSocial JSON-RPC">
+ <p>Shindig implements all required RPC services: <i>People</i>,
<i>Activities</i>,
+ <i>Appdata</i>, <i>Messages</i> and <i>System</i>.</p>
+ <p><b>Note</b>: Shindig doesn't implement all methods defined in <a
+
href="http://docs.google.com/View?docid=dhjrqr8t_4cwzqq7gh#tqgg1">OpenSocial
+ RPC Protocol, Section 8, Services</a> but these missing methods
are not
+ required to be OpenSocial compliant.</p>
+ <table>
+ <thead>
+ <tr>
+ <th>Type</th>
+ <th>Spec.</th>
+ <th>Service method</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <b>People</b>
+ </td>
+ <td>
+ <a
href="http://docs.google.com/View?docid=dhjrqr8t_4cwzqq7gh#livr1"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>people.get</dt>
+ <dd>Retrieve a single person or list of opensocial.Person
+ objects.</dd>
+ <dt>people.supportedFields</dt>
+ <dd>List the supported fields for this service.</dd>
+ </dl>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Activities</b>
+ </td>
+ <td>
+ <a
href="http://docs.google.com/View?docid=dhjrqr8t_4cwzqq7gh#id2e"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>activities.create</dt>
+ <dd>Support creating opensocial.Activity objects as the
targets
+ of a relationship with the specified user.</dd>
+ <dt>activities.get</dt>
+ <dd>Retrieve a one or list of opensocial.Activity
objects.</dd>
+ <dt>activities.update</dt>
+ <dd>Support updating opensocial.Activity objects as the
targets
+ of a relationship with the specified user.</dd>
+ <dt>activities.delete</dt>
+ <dd>Support removing the relationship between an
+ opensocial.Activity and the specified user.</dd>
+ <dt>activities.supportedFields</dt>
+ <dd>List the supported fields for this service.</dd>
+ </dl>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Appdata</b>
+ </td>
+ <td>
+ <a
href="http://docs.google.com/View?docid=dhjrqr8t_4cwzqq7gh#j4b90"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>appdata.create</dt>
+ <dd>Support creating key-value pairs in a user appdata.<b>Not
+ defined in the spec.</b></dd>
+ <dt>appdata.get</dt>
+ <dd>Retrieve a map of key-value pairs for the list of
specified
+ keys.</dd>
+ <dt>appdata.update</dt>
+ <dd>Add or replace key-value pairs stored in a users appdata
+ with the key-vaues in the data parameter.</dd>
+ <dt>appdata.delete</dt>
+ <dd>Remove the specifed keys from a users appdata and
returned
+ the values associated with those removed keys.</dd>
+ </dl>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Messages</b>
+ </td>
+ <td>
+ <a
href="http://docs.google.com/View?docid=dhjrqr8t_4cwzqq7gh#c16v"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>messages.create</dt>
+ <dd>Support creating opensocial.Message objects. <b>Not
defined
+ in the spec.</b></dd>
+ <dt>messages.get</dt>
+ <dd>etrieve a one or list of opensocial.Message objects.
<b>Not
+ defined in the spec.</b></dd>
+ <dt>messages.modify</dt>
+ <dd>Support updating opensocial.ActivityMessage objects.
<b>Not
+ defined in the spec.</b></dd>
+ <dt>messages.delete</dt>
+ <dd>Support removing opensocial.ActivityMessage objects.
<b>Not
+ defined in the spec.</b></dd>
+ </dl>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>System</b>
+ </td>
+ <td>
+ <a
href="http://docs.google.com/View?docid=dhjrqr8t_4cwzqq7gh#q:_q1"
+ >Spec.</a>
+ </td>
+ <td>
+ <dl>
+ <dt>system.listMethods</dt>
+ <dd>Returns an array of all methods supported by the endpoint
+ including the system methods.</dd>
+ <dt>messages.methodSignatures</dt>
+ <dd>Returns a method signature describing the types of the
+ parameters. <b>Not implemented yet.</b></dd>
+ <dt>messages.methodHelp</dt>
+ <dd>Returns a textual description of the operation
identified by
+ the methodName parameter. <b>Not implemented yet.</b></dd>
+ </dl>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </subsection>
+
+ <subsection name="OpenSocial JavaScript">
+ <p>Shindig includes all JavaScript APIs as described in <a
+
href="http://www.opensocial.org/Technical-Resources/opensocial-spec-v08/opensocial-reference08"
+ >OpenSocial API Reference</a> and <a
+
href="http://www.opensocial.org/Technical-Resources/opensocial-spec-v08/gadgets-reference08"
+ >Gadgets API Reference</a>.</p>
+ <p>See also the <a
href="./shindig-1.1.x/shindig-features/jsdoc/index.html"
+ >JavascriptDoc for Shindig 1.1.x.</a></p>
+ </subsection>
+ </section>
+
<section name="Resources">
<ul>
<li><a
href="http://rajdeep.dua.googlepages.com/shindigPHP-overview-tidy_img.html">
- Shindig : An Architectural Overview (PHP Version)</a> by Rajdeep Dua.
- </li>
- <li><a
href="http://chrisschalk.com/shindig_docs/rajdeep/shindig-overview/onjava-shindig-overview-tidy.html">
- Architectural Overview of Shindig , an OpenSocial Reference
Implementation</a> by Rajdeep Dua.
+ Shindig : An Architectural Overview (PHP Version)</a> by Rajdeep
Dua. </li>
+ <li><a
+
href="http://chrisschalk.com/shindig_docs/rajdeep/shindig-overview/onjava-shindig-overview-tidy.html"
+ > Architectural Overview of Shindig , an OpenSocial Reference
+ Implementation</a> by Rajdeep Dua. </li>
+ <li><a
href="http://sites.google.com/site/opensocialarticles/Home/shindig-rest-java"
+ >Overview of REST Implementation in Shindig - Java Version</a> by
Rajdeep
+ Dua. </li>
+ <li>
+ <a href="http://www.opensocial.org/page/specs-1">OpenSocial
specifications</a>
</li>
</ul>
</section>