<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Timefields</title>
	<atom:link href="http://www.tfd.co.uk/blogs/sakaiblog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tfd.co.uk/blogs/sakaiblog</link>
	<description>Information Management, Opensource, Openthought</description>
	<pubDate>Fri, 01 Aug 2008 19:11:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Sakai K1 1.0 Site</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/08/01/sakai-k1-10-site/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/08/01/sakai-k1-10-site/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 19:10:49 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=168</guid>
		<description><![CDATA[I have published a maven site of the latest snaphot of the kernel containing current javadoc and test reports. Including some extremely embarrassing code coverage. (fixable). eg
http://www.tfd.co.uk/kernel/sakai-kernel-impl/cobertura/index.html
However this is coverage without integration tests.
The base of the site is at http://www.tfd.co.uk/kernel
Please dont take any notice of the checkstyle reports as they have not been configured.
 
]]></description>
			<content:encoded><![CDATA[<p>I have published a maven site of the latest snaphot of the kernel containing current javadoc and test reports. Including some extremely embarrassing code coverage. (fixable). eg</p>
<p><a href="http://www.tfd.co.uk/kernel/sakai-kernel-impl/cobertura/index.html" target="_blank">http://www.tfd.co.uk/kernel/sakai-kernel-impl/cobertura/index.html</a></p>
<p>However this is coverage without integration tests.</p>
<p>The base of the site is at <a href="http://www.tfd.co.uk/kernel" target="_blank">http://www.tfd.co.uk/kernel</a></p>
<p>Please dont take any notice of the checkstyle reports as they have not been configured.</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/08/01/sakai-k1-10-site/feed/</wfw:commentRss>
		</item>
		<item>
		<title>HTTPRest in a load balancer.</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/07/22/httprest-in-a-load-balancer/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/07/22/httprest-in-a-load-balancer/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 21:24:37 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=165</guid>
		<description><![CDATA[
The situation is that you have a rest based API, that is used by a client that doesnt support cookies, and you want to ensure that the client binds to an existing session. And if thats not a pain, it needs to work in a load balanced cluster.


Sound like an edge case. Well not really, [...]]]></description>
			<content:encoded><![CDATA[<p>
The situation is that you have a rest based API, that is used by a client that doesnt support cookies, and you want to ensure that the client binds to an existing session. And if thats not a pain, it needs to work in a load balanced cluster.
</p>
<p>
Sound like an edge case. Well not really, Flex network connections dont share the same connection path as the browser, and so will not share the session cookie with the browser. This sounds like an easy thing in sakai, just use the ?sakai.session parameter to bind the session to the sakai session, and thats all fine until you get into a load balancer.
</p>
<p>
mod_jk needs a session cookie to make a request sticky and send it to the correct app server. Fortunately the load balancer understands 2 forms. The JSESSIONID cookie and in the request URI. eg
</p>
<p><code><br />
http://localhost/servlets-examples/servlet/SessionExample;jsessionid=E0C23E770473D20640C4907F75304137.tomcat2?xyz=1<br />
</code></p>
<p>
Will translate as </p>
<ul>
<li>URI:http://localhost/servlets-examples/servlet/SessionExample</li>
<li>Query String:xyz=1</li>
<li>SessionID:E0C23E770473D20640C4907F75304137.tomcat2</li>
</ul>
<p>Looking at the mod_jk source code (1.2.26) the session ID is parsed to locate the &#8216;.&#8217; and generate the app server node name of &#8216;tomcat2&#8242;. The list of workers is then checked to see if a node name matches the name from the session cookie.
</p>
<p>
If you set up the workers.properties file with JKLogLevel=debug you can see what is going on inside the loadbalancer
</p>
<p><code><br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] map_uri_to_worker::jk_uri_worker_map.c (678): Found session identifier &#8216;;jsessionid=E0C23E770473D20640C4907F75304137.tomcat2&#8242; in url &#8216;/servlets-examples/servlet/SessionExample;jsessionid=E0C23E770473D20640C4907F75304137.tomcat2&#8242;<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] map_uri_to_worker::jk_uri_worker_map.c (682): Attempting to map URI &#8216;/servlets-examples/servlet/SessionExample&#8217; from 3 maps<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] find_match::jk_uri_worker_map.c (503): Attempting to map context URI &#8216;/*=ieb_lb_test&#8217; source &#8216;JkMount&#8217;<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] find_match::jk_uri_worker_map.c (516): Found a wildchar match &#8216;/*=ieb_lb_test&#8217;<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] jk_handler::mod_jk.c (2222): Into handler jakarta-servlet worker=ieb_lb_test r->proxyreq=0<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] wc_get_worker_for_name::jk_worker.c (115): found a worker ieb_lb_test<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] wc_get_name_for_type::jk_worker.c (292): Found worker type &#8216;lb&#8217;<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] init_ws_service::mod_jk.c (888): Service protocol=HTTP/1.1 method=GET host=(null) addr=172.16.1.1 name=bort.caret.local port=80 auth=(null) user=(null) laddr=10.0.0.197 raddr=172.16.1.1 uri=/servlets-examples/servlet/SessionExample;jsessionid=E0C23E770473D20640C4907F75304137.tomcat2<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] service::jk_lb_worker.c (940): service sticky_session=1 id=&#8217;E0C23E770473D20640C4907F75304137.tomcat2&#8242;<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] get_most_suitable_worker::jk_lb_worker.c (778): searching worker for partial sessionid E0C23E770473D20640C4907F75304137.tomcat2<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] get_most_suitable_worker::jk_lb_worker.c (786): searching worker for session route tomcat2</p>
<p>[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] get_most_suitable_worker::jk_lb_worker.c (799): found worker tomcat2 (tomcat2) for route tomcat2 and partial sessionid E0C23E770473D20640C4907F75304137.tomcat2</p>
<p>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</p>
<p>Routing to the tomcat2 appserver</p>
<p>[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] service::jk_lb_worker.c (962): service worker=tomcat2 route=tomcat2<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] ajp_get_endpoint::jk_ajp_common.c (2579): acquired connection pool slot=0<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] ajp_marshal_into_msgb::jk_ajp_common.c (553): ajp marshaling done<br />
[Tue Jul 22 21:57:52 2008] [19198:1251589008] [debug] ajp_service::jk_ajp_common.c (2050): processing tomcat2 with 2 retries<br />
</code></p>
<p>
You can see where the session is routed to the appserver node. There is a trick at this point that a little bit of experimentation reveals. The ID on the end of the session should match the name of the worker and should match the jvmRoute parameter and the sakai session ID.
</p>
<p>
If I have 2 nodes called tomat1 and tomcat2, </p>
<ul>
<li>I must have 2 workers in the load balancer called tomcat1 and tomcat2</li>
<li>I must have 2 app servers with jvmRoute= tomcat1 and tomcat2 in the Engine element of the server.xml on each app server node</li>
<li>And for Sakai, I must have a the serverId set to tomcat1 and tomcat2 on each appserver node</li>
</ul>
<p>Sadly, anything else results in the request being sent to a random app server node.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/07/22/httprest-in-a-load-balancer/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pulling SVN with Git on OSX</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/24/pulling-svn-with-git-on-osx/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/24/pulling-svn-with-git-on-osx/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 20:46:01 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=164</guid>
		<description><![CDATA[
I meant to do this a while back, document git setup on OSX.


Install SVN 1.4.3 from the DMG at Tigris http://www.collab.net/downloads/community/
Make certain you have a gcc compiler, probably from xcode on the OSX install disks
Build Git 1.5.5 form source with a ./configure; sudo make install
Symbolic link the subersion perl libraries into the perl build library

eg [...]]]></description>
			<content:encoded><![CDATA[<p>
I meant to do this a while back, document git setup on OSX.
</p>
<ul>
<li>Install SVN 1.4.3 from the DMG at Tigris <a href="http://www.collab.net/downloads/community/">http://www.collab.net/downloads/community/</a></li>
<li>Make certain you have a gcc compiler, probably from xcode on the OSX install disks</li>
<li>Build Git 1.5.5 form <a href="http://git.or.cz/">source</a> with a <code>./configure; sudo make install</code></li>
<li>Symbolic link the subersion perl libraries into the perl build library<br />
<code><br />
eg<br /> <br />
ln -s /opt/subversion/lib/svn-perl/SVN /System/Library/Perl/Extras/5.8.6/SVN<br />
ln -s /opt/subversion/lib/svn-perl/auto/SVN /System/Library/Perl/Extras/5.8.6/auto/SVN<br />
</code>
</li>
</ul>
<p>
Thats Git installed, now to sync the repo you are after using git-svn, now go an read <a href="http://git.or.cz/course/svn.html">Git for SVN Users</a>
</p>
<p>
Having done that to mirror an SVN repo do
</p>
<p><code><br />
 git-svn clone http://svn.foo.org/project/trunk<br />
 cd trunk<br />
</code></p>
<p>
And start working. <code>git commit . </code> will commit locally, <code>git svn dcommit</code> will commit all changes to the remote SVN and rebase your local gir repo to the remote svn
</p>
<p>
There are man pages on all of this and more &#8230; worth reading</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/24/pulling-svn-with-git-on-osx/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sakai Realm Relationships</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/17/sakai-realm-relationships/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/17/sakai-realm-relationships/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 11:44:12 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=163</guid>
		<description><![CDATA[
While writing some new queries I once again found myself looking for an entity diagram of the core relationships in Sakai Realm. I couldn&#8217;t find one, so I did a quick sketch, here for reference.


]]></description>
			<content:encoded><![CDATA[<p>
While writing some new queries I once again found myself looking for an entity diagram of the core relationships in Sakai Realm. I couldn&#8217;t find one, so I did a quick sketch, here for reference.
</p>
<p><img src="/images/SakaiReamRelationships.png" ></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/17/sakai-realm-relationships/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Reasons to support Safari</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/15/reasons-to-support-safari/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/15/reasons-to-support-safari/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 16:42:19 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=162</guid>
		<description><![CDATA[
With the excelence of Firefox many developers leave out Safari from their list of primary targeted browsers. I think this is beginning to be a mistake.


The standards compliance of Safari is good, and gives devlopers a second browser platform with good compliance
You thought Safari had got fast in v3.0, but it just got faster again, [...]]]></description>
			<content:encoded><![CDATA[<p>
With the excelence of Firefox many developers leave out Safari from their list of primary targeted browsers. I think this is beginning to be a mistake.
</p>
<ul>
<li>The standards compliance of Safari is good, and gives devlopers a second browser platform with good compliance</li>
<li>You thought Safari had got fast in v3.0, but it just got faster again, SquirelFish the core Javascript engine of WebKit just got 1.6 times faster than the version in v3.0 of Safari. see <a href="http://webkit.org/blog/189/announcing-squirrelfish/">http://webkit.org/blog/189/announcing-squirrelfish/</a></li>
<li>iPhone and Google Android is using WebKit behind the browser, so if it works on Safari it will more than likely work on iPhone, iTouch and any other mobile running Google Android in the future</li>
</ul>
<p>
Three reasons to support Safari</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/15/reasons-to-support-safari/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How To Design a Good API and Why it matters</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/15/how-to-design-a-good-api-and-why-it-matters/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/15/how-to-design-a-good-api-and-why-it-matters/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 16:01:49 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=161</guid>
		<description><![CDATA[
A great talk on API design, 1h long but worth listening to. Especially the advice,

&#8220;Don&#8217;t send 6 experts into a room for 6 months to write a spec for an API, start with spec on 1 sheet of paper.&#8221;

 
]]></description>
			<content:encoded><![CDATA[<p>
A great talk on API design, 1h long but worth listening to. Especially the advice,
</p>
<blockquote><p>&#8220;Don&#8217;t send 6 experts into a room for 6 months to write a spec for an API, start with spec on 1 sheet of paper.&#8221;</p></blockquote>
<p>
<embed id="VideoPlayback" style="width:400px;height:326px" allowFullScreen="true" flashvars="fs=true" src="http://video.google.com/googleplayer.swf?docid=-3733345136856180693&#038;hl=en" type="application/x-shockwave-flash"> </embed></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/15/how-to-design-a-good-api-and-why-it-matters/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Moving Git patch streams between repos.</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/10/moving-git-patch-streams-between-repos/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/10/moving-git-patch-streams-between-repos/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 21:38:25 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=160</guid>
		<description><![CDATA[
I have 2 Git repositories mirroring SVN repositories, and I want to use git to replay all the patches I made in one of the repositories to the other. The added complication is one of the SVN repos that I am mirroring uses externals, the other does not. So my source is a single repo, [...]]]></description>
			<content:encoded><![CDATA[<p>
I have 2 Git repositories mirroring SVN repositories, and I want to use git to replay all the patches I made in one of the repositories to the other. The added complication is one of the SVN repos that I am mirroring uses externals, the other does not. So my source is a single repo, with no externals, and the target has externals. Fortunately I want to make all my changes in one of the modules.
</p>
<p>
So I can use the patch generations capabilities of git to generate a stream of patches.<br />
<code>cd sdata; git log .</code> tells me the stream of commits in the subdir.<br />
Having located the commit I want to start from<br />
<code>git-format-patch -o patches --relative d649f550a43d8f94cbe91a7c735a4a68cab4ba14 . </code><br />
generates a number sequence of patch emails in a directory <code>gitrepobase/patches</code>. The <code>--relative</code> is vital since it makes the patch set relative to working directory. Unfortunately there is a bug in the next git command that means you must have the correct path for the patch to work <code>-p4</code> used to strip path elements from a patch in git-am does not work for new files.
</p>
<p>
Once the patch set is created, I dont need to email it, I can just run the patch set against the target repo from files on disk. <code>git-am -i ../camtools-trunk/patches/*.patch</code> will interactively apply patches to the target repo, asking me for each patch.
</p>
<p>
Once the patch operation is complete a <code>git svn dcommit</code> commits the changes back to the target svn repo
</p>
<p>
With a bit of scripting, it should be possible to build a complete patch set with moves and transfer it between detached repos, just as if the modifications where made to the target repo by hand.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/06/10/moving-git-patch-streams-between-repos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Whats so good about git with svn</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/05/18/whats-so-good-about-git-with-svn/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/05/18/whats-so-good-about-git-with-svn/#comments</comments>
		<pubDate>Sun, 18 May 2008 16:00:38 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Thought]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/?p=158</guid>
		<description><![CDATA[
This should be whats so good about git, but Sakai has SVN as its central repo&#8230;. so whats so good about git-svn ?


I am not forced to commit when I restructure, so when I go out of network range I am not forced to stop 2 minutes after the network is gone.
I can run multiple [...]]]></description>
			<content:encoded><![CDATA[<p>
This should be whats so good about git, but Sakai has SVN as its central repo&#8230;. so whats so good about git-svn ?
</p>
<ul>
<li>I am not forced to commit when I restructure, so when I go out of network range I am not forced to stop 2 minutes after the network is gone.</li>
<li>I can run multiple branches in the same code base, a quick git commit -a, git checkout otherbranch changes the active files on disk</li>
<li>I dont have to persuade anyone to change the central repo, if there is one</li>
<li>I can batch up all my svn commits into a single big block, and make a decision to commit when I am done</li>
</ul>
<p>
Ok the sync takes a while for a very large repo, like the whole of sakai, but once synced everything becomes much easier. And you will notice the I,I,I above, thats because its distributed so it doesn&#8217;t effect you <img src='http://www.tfd.co.uk/blogs/sakaiblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> (unless you want to use it). All of this goes for others like Hg.
</p>
<p>
I am only wondering why I didnt use it earlier&#8230;. lots of people said it was a good idea. Lesson there, listen more, think less.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/05/18/whats-so-good-about-git-with-svn/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installing git on OSX Tiger to work with SVN.</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/05/07/installing-git-on-osx-tiger-to-work-with-svn/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/05/07/installing-git-on-osx-tiger-to-work-with-svn/#comments</comments>
		<pubDate>Wed, 07 May 2008 21:19:03 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/2008/05/07/installing-git-on-osx-tiger-to-work-with-svn/</guid>
		<description><![CDATA[
First off, no dmg available for Tiger, so you need to build from source.


Building Git from source is easy on OSX, just download one of the tarballs from linux.org, configure make install, but getting it to work with SVN is not quite so easy because by default it binds to the OSX perl which may [...]]]></description>
			<content:encoded><![CDATA[<p>
First off, no dmg available for Tiger, so you need to build from source.
</p>
<p>
Building Git from source is easy on OSX, just download one of the tarballs from linux.org, configure make install, but getting it to work with SVN is not quite so easy because by default it binds to the OSX perl which may or may not have Alien::SVN
</p>
<p>
MacPorts appears to work:  sudo port install git-core +svn</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/05/07/installing-git-on-osx-tiger-to-work-with-svn/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kernel DB Reverse Engineer with Cayenne</title>
		<link>http://www.tfd.co.uk/blogs/sakaiblog/2008/04/28/kernel-db-reverse-engineer-with-cayenne/</link>
		<comments>http://www.tfd.co.uk/blogs/sakaiblog/2008/04/28/kernel-db-reverse-engineer-with-cayenne/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 10:57:38 +0000</pubDate>
		<dc:creator>Ian Boston</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.tfd.co.uk/blogs/sakaiblog/2008/04/28/kernel-db-reverse-engineer-with-cayenne/</guid>
		<description><![CDATA[
Since I have been playing with Cayenne, I though I would have a look at what it would do with the Sakai Kernel database. This is the limited set of services that represent a minimal kernel, no UI.


After fixing a bug, and getting the database built by starting tomcat, (2h), I popped up Cayenne modeler [...]]]></description>
			<content:encoded><![CDATA[<p>
Since I have been playing with Cayenne, I though I would have a look at what it would do with the Sakai Kernel database. This is the limited set of services that represent a minimal kernel, no UI.
</p>
<p>
After fixing a bug, and getting the database built by starting tomcat, (2h), I popped up Cayenne modeler and reverse engineered the DB. (10s <img src='http://www.tfd.co.uk/blogs/sakaiblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), Garbage in Garbage out I thought. Well not exactly, the modeler identified a number of tables with no proper PK&#8217;s and generated all the classes, and generated a significant number of the relationships between the tables. Its going to be interesting to see if these classes can replace the data storage area. Especially if its going to give us enough control in the AuthZGroups service to get any performance.
</p>
<p>
Oh, and I now have core SQL DDL scripts for DB2, Derby, Ingres, Postgres, Sybase, SQLServer and naturally HSQLDB, Mysql and Oracle&#8230;. all thanks to the cayenne plugin.
</p>
<p>
On other reason for thinking that this is worth doing is that Cayenne considers the request cycle to be the transaction boundary, and has built in caching. A test query I didn in the OpenSocial mode took 49ms first time round and 3ms second time round, indicating that the caching is working (mysql Query cache disabled to highlight  DB load)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tfd.co.uk/blogs/sakaiblog/2008/04/28/kernel-db-reverse-engineer-with-cayenne/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
