Google Gadget Scaffolding
Last modified by Thomas Mortagne on 2021/03/18 11:28
![]() | Show how to build a Google gadget that can be installed in any iGoogle gadget container |
Type | Snippet |
Category | |
Developed by | |
Rating | |
License | GNU Lesser General Public License 2.1 |
Table of contents
Description
Note that it supports the token-based authentication mechanism.
Code
The gadget (GadgetCode.Gadget)
{pre }
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="My XWiki Gadget">
<Require feature="dynamic-height"/>
</ModulePrefs>
<UserPref name="server"
display_name="XWiki Server URL"
datatype="string" />
<UserPref name="username"
display_name="Username"
datatype="string" />
<UserPref name="token"
display_name="Authorization Token"
datatype="string" />
<Content type="html">
<![CDATA[
<div id="content">
</div>
<script type="text/javascript">
var prefs = new gadgets.Prefs();
function doRequest() {
var params = {};
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT;
var args = "xpage=plain&token=" + prefs.getString("token") + "&username=" + prefs.getString("username");
var url = prefs.getString("server") + $xwiki.getURL("GadgetCode.Service","view") + "? + args;
gadgets.io.makeRequest(url, responseHandler, params);
};
function responseHandler(obj) {
document.getElementById('content').innerHTML = obj.text;
gadgets.window.adjustHeight();
};
gadgets.util.registerOnLoadHandler(doRequest);
</script>
]]>
</Content>
</Module>
{/pre }
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="My XWiki Gadget">
<Require feature="dynamic-height"/>
</ModulePrefs>
<UserPref name="server"
display_name="XWiki Server URL"
datatype="string" />
<UserPref name="username"
display_name="Username"
datatype="string" />
<UserPref name="token"
display_name="Authorization Token"
datatype="string" />
<Content type="html">
<![CDATA[
<div id="content">
</div>
<script type="text/javascript">
var prefs = new gadgets.Prefs();
function doRequest() {
var params = {};
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT;
var args = "xpage=plain&token=" + prefs.getString("token") + "&username=" + prefs.getString("username");
var url = prefs.getString("server") + $xwiki.getURL("GadgetCode.Service","view") + "? + args;
gadgets.io.makeRequest(url, responseHandler, params);
};
function responseHandler(obj) {
document.getElementById('content').innerHTML = obj.text;
gadgets.window.adjustHeight();
};
gadgets.util.registerOnLoadHandler(doRequest);
</script>
]]>
</Content>
</Module>
{/pre }
The back-end service (GadgetCode.Service)
#**
* Service for handling a google gadget asynchronous requests.
* Authentication is token-based. The token is a hashcode of the concatenated
* username and password of one use.)
*
* @programming
* @internalapi to retrieve the user doc, because we are called as XWikiGuest.
* @ajaxservice called by a google gadget container.
*#
{pre }
#set($token = $request.token)
#set($username = $request.username)
#if($token && $username)
#set($userdoc=$xwiki.xWiki.getDocument("XWiki.${username}",$context.context))
#set($password=$userdoc.getObject('XWiki.XWikiUsers').getStringValue('password'))
#set($validToken="${userdoc.fullName}${password}")
#set($validToken=$validToken.hashCode())
#if($validToken == $token)
$context.context.setUser("XWiki.${username}") ## set to valid user
## BEGIN Placeholder for the service logic code starts here. Replace the code below, until END, by yours
#set($hql = "where doc.creator='$context.user' order by doc.date desc")
<h2>Latests modifications on the pages I've created :</h2>
<ul>
#foreach($docName in $xwiki.searchDocuments($hql, 10, 0))
#set($tDoc=$xwiki.getDocument($docName))
<li><a href=$tDoc.getExternalURL() target="_new">$tDoc.fullName</a></li>
#end
</ul>
## END Placeholder for the service logic code starts here
#else ## invalid token
Invalid combination of username and token.
#end
#else
Request parameters are wrong.
#end
{/pre }
* Service for handling a google gadget asynchronous requests.
* Authentication is token-based. The token is a hashcode of the concatenated
* username and password of one use.)
*
* @programming
* @internalapi to retrieve the user doc, because we are called as XWikiGuest.
* @ajaxservice called by a google gadget container.
*#
{pre }
#set($token = $request.token)
#set($username = $request.username)
#if($token && $username)
#set($userdoc=$xwiki.xWiki.getDocument("XWiki.${username}",$context.context))
#set($password=$userdoc.getObject('XWiki.XWikiUsers').getStringValue('password'))
#set($validToken="${userdoc.fullName}${password}")
#set($validToken=$validToken.hashCode())
#if($validToken == $token)
$context.context.setUser("XWiki.${username}") ## set to valid user
## BEGIN Placeholder for the service logic code starts here. Replace the code below, until END, by yours
#set($hql = "where doc.creator='$context.user' order by doc.date desc")
<h2>Latests modifications on the pages I've created :</h2>
<ul>
#foreach($docName in $xwiki.searchDocuments($hql, 10, 0))
#set($tDoc=$xwiki.getDocument($docName))
<li><a href=$tDoc.getExternalURL() target="_new">$tDoc.fullName</a></li>
#end
</ul>
## END Placeholder for the service logic code starts here
#else ## invalid token
Invalid combination of username and token.
#end
#else
Request parameters are wrong.
#end
{/pre }
The token provider (GadgetCode.TokenProvider)
#set($userdoc = $xwiki.getDocument($context.user))
#set($token = "${userdoc.fullName}${userdoc.getObject('XWiki.XWikiUsers').getProperty('password').value}")
#set($token = $token.hashCode())
#info("Token for $context.user : $token")
#set($token = "${userdoc.fullName}${userdoc.getObject('XWiki.XWikiUsers').getProperty('password').value}")
#set($token = $token.hashCode())
#info("Token for $context.user : $token")
Google Gadget development
See http://code.google.com/apis/igoogle/ for more information. In development mode, you might want to use the gadget developer sandbox. Remember to uncheck the "Cached" checkbox to see your changes when you refresh your iGoogle page.
Result
Hereunder is the result as you can observe it in the iGoogle gadget container:
Settings view
Result view
TBD. (iGoogle gadget sandbox does not work properly today, see this thread)