<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7603905557430854104</id><updated>2011-10-08T01:01:54.712-07:00</updated><category term='ocmgroovy'/><category term='apache'/><category term='silly'/><category term='jackrabbit'/><category term='quotes weird'/><category term='jcr'/><category term='soap'/><category term='jfugue'/><category term='programming'/><category term='appengine groovy groovlet howto'/><category term='maven'/><category term='sling'/><category term='flex groovy ruby'/><category term='flex'/><category term='gui'/><category term='rest'/><category term='controls managment project'/><category term='grails'/><category term='griffon'/><category term='osgi'/><category term='dynamic languages'/><category term='mime-type'/><category term='groovy'/><category term='metrics'/><category term='ocm'/><category term='design'/><category term='modeling'/><category term='code'/><category term='builders'/><category term='vista'/><category term='rant'/><category term='tapestry'/><title type='text'>Nice One!</title><subtitle type='html'>(Yet) another perspective on cutting edge software technology</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-2648617523545392876</id><published>2011-09-04T10:56:00.000-07:00</published><updated>2011-09-04T10:56:41.969-07:00</updated><title type='text'>Easy In Place Editing with Apache Sling and jQuery jEditable</title><content type='html'>&lt;ol&gt;&lt;li&gt;Download &amp;amp; reference &lt;a href="http://jquery.org/"&gt;jquery&lt;/a&gt; and &lt;a href="http://www.appelsiini.net/projects/jeditable"&gt;jeditable&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Create a scriplet to be included&lt;pre class="prettyprint"&gt;$(document).ready(function () {&lt;br /&gt;        $("[class^='edit']").each(function () {&lt;br /&gt;                var param = $(this).attr('class').substring(4).toLowerCase();&lt;br /&gt;                $(this).editable('&lt;%=currentNode.path%&gt;', {&lt;br /&gt;                        type: 'textarea',&lt;br /&gt;                        name: param,&lt;br /&gt;                        submitdata: {&lt;br /&gt;                                '_charset_': 'utf-8',&lt;br /&gt;                                ':redirect': '&lt;%=currentNode.path%&gt;.html'&lt;br /&gt;                        },&lt;br /&gt;                        cancel: 'Cancel',&lt;br /&gt;                        submit: 'OK',&lt;br /&gt;                        event: "dblclick",&lt;br /&gt;                        tooltip: 'Click to edit...'&lt;br /&gt;                });&lt;br /&gt;        });&lt;br /&gt;});&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Use this scriplet in your respective script file, and create an editable textare with a css class named&amp;nbsp; "editXY" where XY is the name of the property to be edited&lt;pre class="prettyprint"&gt;    &amp;lt;div class="editProperty"&amp;gt;&lt;br /&gt;&lt;div class="editFirstname"&gt;&lt;br /&gt;&amp;lt;%=currentNode.firstname%&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp; &lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;That's it. The redirect doesn't work too well, but hey ... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-2648617523545392876?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/2648617523545392876/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=2648617523545392876' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2648617523545392876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2648617523545392876'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2011/09/easy-in-place-editing-with-apache-sling.html' title='Easy In Place Editing with Apache Sling and jQuery jEditable'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-7656839588406804716</id><published>2009-06-30T12:42:00.000-07:00</published><updated>2010-04-10T15:13:04.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silly'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='jfugue'/><title type='text'>Playing a website with JFugue</title><content type='html'>Ok, had to do this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;import org.jfugue.*&lt;br /&gt;&lt;br /&gt;def munge(s) {&lt;br /&gt;s.findAll { it ==~ /[A-Ga-g]/ }.join(' ')&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String.metaClass.play = { new Player().play(new Pattern(munge(delegate.toString()))) }&lt;br /&gt;&lt;br /&gt;"http://www.google.com".toURL().getText().play()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;All credits go to &lt;a href="http://www.transentia.com.au/flatpress/index.php/2009/06/30/curiosity-killed-the-catdunno-what-its-doing-to-me/"&gt;transentia&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-7656839588406804716?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/7656839588406804716/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=7656839588406804716' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7656839588406804716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7656839588406804716'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/06/playing-website-with-jfugue.html' title='Playing a website with JFugue'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-5097897060740661708</id><published>2009-05-24T04:43:00.000-07:00</published><updated>2009-05-24T11:24:49.488-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sling'/><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Sling/Groovy Development with OSGI</title><content type='html'>After having evaded this whole OSGI/Maven topic, I think it is time that I delve into the whole issue. Lars Trieloff and other helpful people alredy gave me a &lt;a href="http://n1ceone.blogspot.com/2008/08/controls-managment-project-desiding-for.html"&gt;hint &lt;/a&gt;about when to change from webdav/scripting mode to OSGI/Maven bundles.&lt;br /&gt;&lt;br /&gt;After several hours and reading several blogs and webpages, I came up with the following pom.xml:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&amp;gt;&lt;br /&gt;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;SlingControlmanagement&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;SlingControlmanagement&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;packaging&amp;gt;bundle&amp;lt;/packaging&amp;gt;&lt;br /&gt;&amp;lt;build&amp;gt;&lt;br /&gt;  &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;!--&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-scr-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;1.0.8&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;      --&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-bundle-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;&lt;br /&gt;          &amp;lt;configuration&amp;gt;&lt;br /&gt;              &amp;lt;instructions&amp;gt;&lt;br /&gt;                  &amp;lt;Export-Package&amp;gt;&lt;br /&gt;                     test;version=1.0.0&lt;br /&gt;                  &amp;lt;/Export-Package&amp;gt;&lt;br /&gt;                  &amp;lt;Bundle-SymbolicName&amp;gt;controlmanagement&amp;lt;/Bundle-SymbolicName&amp;gt;&lt;br /&gt;                  &amp;lt;Bundle-Name&amp;gt;controlmanagement&amp;lt;/Bundle-Name&amp;gt;&lt;br /&gt;                  &amp;lt;Import-Package&amp;gt;&lt;br /&gt;                      org.osgi.framework;version="1.3.0",groovy.lang;version=1.6.0,org.codehaus.groovy.reflection;version=1.6.0,org.codehaus.groovy.runtime;version=1.6.0,org.codehaus.groovy.runtime.callsite;version=1.6.0&lt;br /&gt;                  &amp;lt;/Import-Package&amp;gt;&lt;br /&gt;                  &amp;lt;Sling-Initial-Content&amp;gt;&lt;br /&gt;                      SLING-INF/initial-content/libs/myapp;overwrite:=true;path:=/libs/myapp&lt;br /&gt;                  &amp;lt;/Sling-Initial-Content&amp;gt;&lt;br /&gt;              &amp;lt;/instructions&amp;gt;&lt;br /&gt;          &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;groupId&amp;gt;org.apache.sling&amp;lt;/groupId&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-sling-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;executions&amp;gt;&lt;br /&gt;              &amp;lt;execution&amp;gt;&lt;br /&gt;                  &amp;lt;id&amp;gt;install-bundle&amp;lt;/id&amp;gt;&lt;br /&gt;                  &amp;lt;goals&amp;gt;&lt;br /&gt;                      &amp;lt;goal&amp;gt;validate&amp;lt;/goal&amp;gt;&lt;br /&gt;                      &amp;lt;goal&amp;gt;install&amp;lt;/goal&amp;gt;&lt;br /&gt;                  &amp;lt;/goals&amp;gt;&lt;br /&gt;                  &amp;lt;configuration&amp;gt;&lt;br /&gt;                      &amp;lt;mountByFS&amp;gt;true&amp;lt;/mountByFS&amp;gt;&lt;br /&gt;                  &amp;lt;/configuration&amp;gt;&lt;br /&gt;              &amp;lt;/execution&amp;gt;&lt;br /&gt;          &amp;lt;/executions&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;groupId&amp;gt;org.codehaus.groovy.maven&amp;lt;/groupId&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;gmaven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;executions&amp;gt;&lt;br /&gt;              &amp;lt;execution&amp;gt;&lt;br /&gt;                  &amp;lt;goals&amp;gt;&lt;br /&gt;                      &amp;lt;goal&amp;gt;generateStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;                      &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;&lt;br /&gt;                      &amp;lt;goal&amp;gt;generateTestStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;                      &amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;&lt;br /&gt;                  &amp;lt;/goals&amp;gt;&lt;br /&gt;              &amp;lt;/execution&amp;gt;&lt;br /&gt;          &amp;lt;/executions&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;  &amp;lt;repository&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;apache.incubating&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;Apache Incubating Repository&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;http://people.apache.org/repo/m2-incubating-repository&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;br /&gt;&amp;lt;pluginRepositories&amp;gt;&lt;br /&gt;  &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;apache.incubating.plugins&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;Apache Incubating Plugin Repository&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;url&amp;gt;http://people.apache.org/repo/m2-incubating-repository&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;1.6.3&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There are several things to point out:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I am by no means a OSGI/Maven expert, so consider this to be a first draft&lt;/li&gt;&lt;li&gt;the commented out scr plugin is used for declarative OSGI services, details &lt;a href="http://felix.apache.org/site/apache-felix-maven-scr-plugin.html"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;the groovy version used for compilation (1.6.3) and within OSGI (1.6.0) are different. This might lead to problem. Best thing to do would be to reinstall groovy-all.jar into the OSGI environment&lt;/li&gt;&lt;li&gt;the "Sling-Inital-Content" tag is a convenience used to supply initial content to sling&lt;/li&gt;&lt;li&gt;the &amp;lt;mountByFS&amp;gt;true&amp;lt;/mountByFS&amp;gt; tag should theoretically allow to have all changes done within the filesystem be propagated to sling. Doesn't work atm, although, unsure why&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-5097897060740661708?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/5097897060740661708/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=5097897060740661708' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5097897060740661708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5097897060740661708'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/05/slinggroovy-development-with-osgi.html' title='Sling/Groovy Development with OSGI'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-5353924347596527111</id><published>2009-05-20T13:29:00.000-07:00</published><updated>2009-05-20T14:12:21.857-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sling'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>So where in REST is the MVC?</title><content type='html'>Still trying to get my head around REST. Looking at &lt;a href="http://incubator.apache.org/sling"&gt;sling&lt;/a&gt;, I do see two different approaches:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;view/model combined: a  resource is represented by a markup (html), which contains both view and model information. The controller (browser) is responsible for the correct representation and the hypermedia functionality (hyperlinks, forms),  which allows navigation and manipulation of the represented data&lt;br /&gt;&lt;/li&gt;&lt;li&gt;model exclusively: the resource is represented by a data structure (json), which is both rendered to the controllers (browser) taste as view&lt;/li&gt;&lt;/ul&gt;Now, from a design point of view, the second one seems cleaner, and very compatible with the MVC pattern. But the first approach is the one the web is build upon, soooo there has to be something about it ...&lt;br /&gt;&lt;br /&gt;The idea spinning around in my head is to implement the first approach with &lt;a href="http://griffon.codhaus.org"&gt;Griffon &lt;/a&gt;and Sling: Sling will deliver SwingBuilder fragments which then will be interpreted by Griffon. Stay tuned...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-5353924347596527111?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/5353924347596527111/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=5353924347596527111' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5353924347596527111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5353924347596527111'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/05/so-where-in-rest-is-mvc.html' title='So where in REST is the MVC?'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-6079846347497561710</id><published>2009-05-12T21:22:00.000-07:00</published><updated>2009-05-12T21:27:00.026-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mime-type'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Apache's mime-type list</title><content type='html'>Just stumbled on &lt;a href="http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types"&gt;this&lt;/a&gt; while reading the sling mailing list:&lt;br /&gt;&lt;br /&gt;Apache's web server default mime-type list, together with associated extensions: might come handy, includes the relevant RFCs in the comment&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-6079846347497561710?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/6079846347497561710/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=6079846347497561710' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/6079846347497561710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/6079846347497561710'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/05/apaches-mime-type-list.html' title='Apache&apos;s mime-type list'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-2710273127453720945</id><published>2009-04-25T06:38:00.000-07:00</published><updated>2009-04-25T06:50:40.612-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes weird'/><title type='text'>This must be the quote of the week</title><content type='html'>Having read the (german) news post on &lt;a href="http://www.heise.de/newsticker/BKA-Chef-Produktpiraterie-traegt-Zuege-der-organisierten-Kriminalitaet--/meldung/136781"&gt;heise.de&lt;br /&gt;&lt;/a&gt; regarding the issue of prodcut piratry one quote struck me:&lt;br /&gt;According to the article (no source is quoted there!), Peer Laslo of SAP is supposed to have made this statement:&lt;br /&gt;" ...&lt;br /&gt;Wir sind nicht betroffen. Unseres Software ist so kompliziert, dass man sie schlecht fälschen kann.&lt;br /&gt;..."&lt;br /&gt;&lt;br /&gt;eng:&lt;br /&gt;&lt;br /&gt;"...&lt;br /&gt;We are not affected. Our software is that complicated that it hardly can be imitated.&lt;br /&gt;..."&lt;br /&gt;&lt;br /&gt;Now, I do not have any context information for this statement. Put like this, it sounds really weird. And wrong too: A software can simply be pirated by copy and paste, or reverse engineering.&lt;br /&gt;&lt;br /&gt;So the only thing protecting this particular product is the complexity to enhance/change and lastly to use it. Looks like not only security but whole businesses can be built with obscurity in mind....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-2710273127453720945?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/2710273127453720945/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=2710273127453720945' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2710273127453720945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2710273127453720945'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/04/this-must-be-quote-of-week.html' title='This must be the quote of the week'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-2393043786690717721</id><published>2009-04-18T08:40:00.000-07:00</published><updated>2009-04-18T14:00:10.865-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='appengine groovy groovlet howto'/><title type='text'>Deploying a Groovlet Application to the AppEngine with AntBuilder</title><content type='html'>Just a quick &amp;amp; dirty info: you can easily use the &lt;a href="http://code.google.com/appengine/docs/java/tools/ant.html"&gt;already defined tasks &lt;/a&gt;for Google AppEngine with your Groovlet-based application (as &lt;a href="http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/"&gt;described&lt;/a&gt; by Guillaume Laforge on his SpringSource blog)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;def ant = new AntBuilder()&lt;br /&gt;def webinf = "war/WEB-INF"&lt;br /&gt;def aesdk = "appengine" //change this to the location of AppEngine SDK&lt;br /&gt;&lt;br /&gt;ant."import" (file: "${aesdk}/config/user/ant-macros.xml")&lt;br /&gt;ant.sequential() {&lt;br /&gt;  taskdef name: "groovyc", classname: "org.codehaus.groovy.ant.Groovyc"&lt;br /&gt;  groovyc srcdir: "src", destdir: "${webinf}/classes", {&lt;br /&gt;          classpath {&lt;br /&gt;                  fileset dir: "${webinf}/lib", {&lt;br /&gt;                  include name: "*.jar"&lt;br /&gt;                  }&lt;br /&gt;                  pathelement path: "${webinf}/classes"&lt;br /&gt;          }&lt;br /&gt;          javac source: "1.5", target: "1.5", debug: "on"&lt;br /&gt;  }&lt;br /&gt;  copy toDir: "${webinf}/groovy", {&lt;br /&gt;          fileset dir:"groovlets"&lt;br /&gt;  }&lt;br /&gt;  if(args.find{it.startsWith("-u")}) {&lt;br /&gt;     appcfg action:"update", war:"war"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Please note that appcfg is a task defined in the GAE SDK. By importing the relevant xml file (and having the respective jar files on classpath), this and all other ant tasks become available to groovy scripts.&lt;br /&gt;&lt;br /&gt;If you run this script with &lt;code&gt;"groovy build -u&lt;/code&gt;" 3 things will happen:&lt;ol&gt;&lt;li&gt;all stuff in "src" will get compiled&lt;/li&gt;&lt;li&gt;all stuff in "groovlets" will get copied over to the appropriate directory (no need to compile those, if you follow Guillaume's hints regarding web.xml configuration&lt;br /&gt;&lt;/li&gt;&lt;li&gt;all stuff will get pushed to the AppEngine&lt;/li&gt;&lt;/ol&gt;If you use strictly Groovlets, nothing needs to be compiled and step 1 might become obsolete.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-2393043786690717721?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/2393043786690717721/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=2393043786690717721' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2393043786690717721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2393043786690717721'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/04/deploying-groovlet-application-to.html' title='Deploying a Groovlet Application to the AppEngine with AntBuilder'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-716127997732552350</id><published>2009-03-12T12:05:00.000-07:00</published><updated>2009-03-12T12:15:08.503-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metrics'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>What is your LOCBUT?</title><content type='html'>How many &lt;span style="font-weight: bold;"&gt;l&lt;/span&gt;ines &lt;span style="font-weight: bold;"&gt;o&lt;/span&gt;f &lt;span style="font-weight: bold;"&gt;c&lt;/span&gt;ode do you write &lt;span style="font-weight: bold;"&gt;b&lt;/span&gt;efore having the &lt;span style="font-weight: bold;"&gt;u&lt;/span&gt;rge to &lt;span style="font-weight: bold;"&gt;t&lt;/span&gt;est if it is working? Does this count go up or down when you know that there are solid tests backing it?&lt;br /&gt;&lt;br /&gt;For me personally, it is about 5, and going down if tests are around.&lt;br /&gt;&lt;br /&gt;I have of course no metrics, but I have the feeling that this is not depending on the programming language. Which leads to some interesting conclusions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;strive for fast round-trip cycles in your development process&lt;br /&gt;&lt;/li&gt;&lt;li&gt;prefer expressive languages which allow to more in less LOC&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-716127997732552350?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/716127997732552350/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=716127997732552350' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/716127997732552350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/716127997732552350'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/03/what-is-your-locbut.html' title='What is your LOCBUT?'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-5055610263062670657</id><published>2009-02-28T12:50:00.000-08:00</published><updated>2009-02-28T13:16:08.750-08:00</updated><title type='text'>Checking the Radar</title><content type='html'>Well, about time this blog gets some content added.&lt;br /&gt;&lt;br /&gt;Quick check on my radar: what technologies am I watching, where they are heading, what else I would like to have a look at etc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tapestry.apache.org/"&gt;&lt;span style="font-weight: bold;"&gt;Tapestry&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;Wasn't able to play around with it. Currently V5.0, looks very very good, but I will take it off the radar, since I do not see an opportunity to test it out.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/"&gt;&lt;span style="font-weight: bold;"&gt;Grails&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;About same as Tapestry. I personally would choose one of those two as Web Framework.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groovy.codehaus.org/"&gt;&lt;span style="font-weight: bold;"&gt;Groovy&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;This has become my home language. Just makes sense. Just good. Use it. Will be on Main Road by 2011 (and might get boring then :))&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://incubator.apache.org/sling"&gt;Sling&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; (and &lt;a href="http://jackrabbit.apache.org/"&gt;Jackrabbit&lt;/a&gt;)&lt;/span&gt;:&lt;br /&gt;Still much work going on there. Sling (and Jackrabbit) are not only superb technologies, but more than that, have become inspiration for modeling content and thinking about data and their respective handling.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://griffon.codehaus.org/"&gt;&lt;span style="font-weight: bold;"&gt;Griffon:&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Everyone and their mum does that AJAX-Flex-JavaFX-RIA-thingie. Everyone? No, there are some stubborn, backward-oriented guys (did not spot any ladies up to now), which, basically, say, screw it: we are doing SWING! Yeah baby. Do it right by using Groovy, be inspired by Grails, and well, use some major brain power. This one is hot, mark my words...&lt;br /&gt;&lt;br /&gt;What are possible new candidates for the Radar?&lt;br /&gt;Well, there is &lt;a href="http://www.clojure.org"&gt;Clojure&lt;/a&gt;, but I do not yet have any use case for it at the moment. I will first read the book. Suggestions welcome...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-5055610263062670657?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/5055610263062670657/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=5055610263062670657' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5055610263062670657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5055610263062670657'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2009/02/checking-radar.html' title='Checking the Radar'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-4784460165272949650</id><published>2008-12-11T21:41:00.000-08:00</published><updated>2008-12-11T21:50:40.066-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='jackrabbit'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Apache Jackrabbit 1.5</title><content type='html'>Apache Jackrabbit was just released in version &lt;a href="http://jackrabbit.apache.org/downloads.html"&gt;1.5&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It looks that this is the "yes, we heard you" release, and is a huge jump forward for straightforward usage:&lt;br /&gt;1) grab the jar-file&lt;br /&gt;2) java -jar jackrabbit-....jar&lt;br /&gt; &lt;br /&gt;And... there is no step 3 :).&lt;br /&gt;&lt;br /&gt;I can't stress out enough the importance of such easy usage. While it already has been more or less simple to use Jackrabbit in, say, semi-professional setups, it now has the chance to hit the Main Street. "Want webdav? Well, you'd better use that jackrabbit thingie".&lt;br /&gt;&lt;br /&gt;Ok, there may be some steps 3, but I will write about those later&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-4784460165272949650?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/4784460165272949650/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=4784460165272949650' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4784460165272949650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4784460165272949650'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/12/apache-jackrabbit-15.html' title='Apache Jackrabbit 1.5'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-1298675490508186430</id><published>2008-11-18T21:53:00.000-08:00</published><updated>2008-11-18T22:14:55.173-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>Fun with annotations in Groovy/Griffon</title><content type='html'>The 1.6 version of Groovy seems to have full-fledged annotation support.&lt;br /&gt;&lt;br /&gt;I took the occasion to finally learn to create some annotations on my own, and wrote an annotation which can be used in a Griffon model to give the controller some hints about how to best display its data.&lt;br /&gt;&lt;br /&gt;I might have taken this a little bit too far, but it is also possible to declare strings in annotations which can later be evaluated.&lt;br /&gt;&lt;br /&gt;Take this annotation as an example:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package annotations&lt;br /&gt;&lt;br /&gt;import java.lang.annotation.*&lt;br /&gt;&lt;br /&gt;@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;public @interface TableModelInformation {&lt;br /&gt;   boolean displayed() default true&lt;br /&gt;   String displayName() default ""&lt;br /&gt;   String displayValue() default ""&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This can be used in the model like this:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;...&lt;br /&gt;    @TableModelInformation(displayValue='"Total Subprocesses: ${object.subprocesses.size()}"')&lt;br /&gt;    List subprocesses = []&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;(Note the weird string syntax: only double quotes (i.e. GString) are rightfully not interpreted as Strings. Furthermore it expects to receive an instance of the object in a variable named (tadaaa) "object".&lt;br /&gt;&lt;br /&gt;This can  be evaluated later in the controller:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;return new GroovyShell(new Binding([object:object])).evaluate(object.class.getDeclaredField(field).getAnnotation(annotations.TableModelInformation).displayValue())&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;("object" and "field" are available in the context of the controller)&lt;br /&gt;&lt;br /&gt;I am not sure how to optimize this code, especially the verbosity of annotation retrieval. It nevertheless is kind of funny to see groovy behavior in an (at least from me) unexpected way...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-1298675490508186430?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/1298675490508186430/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=1298675490508186430' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1298675490508186430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1298675490508186430'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/11/fun-with-annotations-in-groovygriffon.html' title='Fun with annotations in Groovy/Griffon'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-8786991520028059454</id><published>2008-11-14T00:17:00.000-08:00</published><updated>2008-11-15T06:04:13.262-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='jackrabbit'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='flex groovy ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>Using ocmgroovy as Persistance Layer for Griffon</title><content type='html'>&lt;a href="http://griffon.codehaus.org/"&gt;Griffon&lt;/a&gt; is a very interessting approach to create an agile and fun framework for building Swing applications. Currently a very shy version numeration is used (0.0.1 is current), but the whole package is built using large know-how.&lt;br /&gt;&lt;br /&gt;One thing missing is the persistance layer. It is planned to use &lt;a href="http://grails.org/GORM"&gt;GORM&lt;/a&gt;, the hibernate-based layer of &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This situation is an opportunity for &lt;a href="http://ocmgroovy.googlecode.com/"&gt;ocmgroovy&lt;/a&gt;, my "framework"(*) for persisting Groovy objects into a JCR. While beeing a little ugly hack atm, the basic things like save() and get() seem to work, at least for my basic test cases.&lt;br /&gt;&lt;br /&gt;Using ocmgroovy in grails is one annoying and 2 easy steps&lt;br /&gt;&lt;ol&gt;&lt;li&gt;download ocmgroovy (either create the project via pom.xml or download all dependencies manually, which basically means to download all jackrabbit dependencies and xstream with its dependencies) and install it into {griffon_project}/lib directory&lt;/li&gt;&lt;li&gt;declare the class to be persisted in {griffon_project/lifecycle}/Startup.groovy&lt;/li&gt;&lt;li&gt;use it in your Griffon mvc&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Step 2 looks like this&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;TransientRepository repository = new TransientRepository()&lt;br /&gt;def session = repository.login(&lt;br /&gt;       new SimpleCredentials("threatmanagment", "password".toCharArray()))&lt;br /&gt;JcrPersister strategy = new JcrPersister()&lt;br /&gt;strategy.session = session&lt;br /&gt;strategy.instanceRoot ="threatmanagment"&lt;br /&gt;&lt;br /&gt;strategy.instrumentate(ThreatModel, "name")&lt;br /&gt;strategy.instrumentate(Dataflow,"id")&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;This makes model classes ThreatModel and Dataflow persistable, i.e. currently mostly adds save() and get() methods to instance and class, respectively&lt;br /&gt;&lt;br /&gt;And Step 3: about as easy&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;ThreatModel model = new ThreatModel("name": "TestModel")&lt;br /&gt;model.save()&lt;br /&gt;...&lt;br /&gt;ThreatModel model2 = ThreatModel.get("TestModel")&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Please note that this is all very shaky at the moment (and therefore will create a black hole if you try it at home ;)), but might prove usable in the future.&lt;br /&gt;&lt;br /&gt;I probably will release a PoC-project in the near future.&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;(*): ocmgroovy is very alpha and only used by myself. Therefore I do not consider this to be a framework&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-8786991520028059454?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/8786991520028059454/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=8786991520028059454' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/8786991520028059454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/8786991520028059454'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/11/using-ocmgroovy-as-persistance-layer.html' title='Using ocmgroovy as Persistance Layer for Griffon'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-9176062018104165142</id><published>2008-09-17T08:15:00.000-07:00</published><updated>2008-09-17T08:29:38.214-07:00</updated><title type='text'>Ditching Flex ... for now</title><content type='html'>Well, killing another fairie: I am dissing Flex for my pet project. There are several reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;not too good Flex-Support in IDEA&lt;br /&gt;&lt;/li&gt;&lt;li&gt;roundtrips are slow (create compile load)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;open source built on closed source doesn't work&lt;/li&gt;&lt;li&gt;mxml: simply don't like those&lt;/li&gt;&lt;li&gt;actionscript will not be the next ecmascript&lt;/li&gt;&lt;li&gt;verbosity: too much to write while using MVC frameworks. Convention over Configuration is not there yet (?)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;HTTP support is kind of crippled&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;There are very good reasons to love Flex:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the looks: I am no expert, but I got the feeling Flex just looks great out of the box&lt;/li&gt;&lt;li&gt;components: component based UIs are great.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;event models&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ubiquity&lt;/li&gt;&lt;/ol&gt;I am sure that some of the points are due to the fact that I am a novice. I might come back to it, but now it is time to move on...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-9176062018104165142?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/9176062018104165142/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=9176062018104165142' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/9176062018104165142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/9176062018104165142'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/09/ditching-flex-for-now.html' title='Ditching Flex ... for now'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-5229503115724461900</id><published>2008-09-11T07:03:00.000-07:00</published><updated>2008-09-13T02:53:48.094-07:00</updated><title type='text'>An "in between" review of Sling</title><content type='html'>Now that I have been using Apache &lt;a href="http://incubator.apache.org/sling"&gt;Sling &lt;/a&gt;for a pet project for some weeks now, I thought I could share some insights on it. The spaghetti western way, of course :). And all utterly subjective.&lt;br /&gt;&lt;h2&gt;The Good&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;java -jar sling.jar -&gt; http://localhost:8080 and dav://localhost:8080. This is fantastic.&lt;/li&gt;&lt;li&gt;Scripting support&lt;br /&gt;&lt;/li&gt;&lt;li&gt;REST: learn it the Sling way&lt;br /&gt;&lt;/li&gt;&lt;li&gt;webdav-support&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A good community&lt;br /&gt;&lt;/li&gt;&lt;li&gt;best-of-breed technologies: OSGI (with Felix), JCR (with Jackrabbit)&lt;/li&gt;&lt;li&gt;JCR muscle flexing included: query, hierarchies, versioning&lt;/li&gt;&lt;li&gt;semi-structured data approach&lt;br /&gt;&lt;/li&gt;&lt;li&gt;it's fun&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;The Bad&lt;/h2&gt;Nothing bad, just great stuff with some edges:&lt;br /&gt;&lt;h2&gt;The Ugly&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Docu. Yeah I know. Is getting better, but should be more (please kill those "out of sync" pages)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;After a fast start, there still is a learning curve (OSGI, REST, JCR, Maven, ...). Since these are hot topics anyway, this is no big deal, expect when you want something fast and nownownow :)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;bootstrapping problem: despite the available &lt;a href="http://incubator.apache.org/sling/site/discover-sling-in-15-minutes.html"&gt;help&lt;/a&gt;, I still did struggle with the question whether controls (scripts) or data should be created first. But this is just me, I guess :)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;JCR Editor support: Days eclipse plugin is great, but unfortunately doesn't work on my Ubuntu-system&lt;/li&gt;&lt;li&gt;No out-of-the-box solution for rich applications (Except dojo, which is a beast on its own...)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;All in all, Sling holds its head up high in a tight, competitive market. I am looking forward to do more stuff with it. The rough spots are being addressed, therefore I am positive and quite impressed. Most important thing now would be to flesh out the documentation....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;update 13th Sept:&lt;/span&gt; The &lt;a href="http://www.day.com/eclipse"&gt;JCR Plugin&lt;/a&gt; for eclipse works after a fresh install, using Eclipse Ganymede and JCR Plugin version 3.6.6. Nice thing is, that Eclipse editors seem to work, e.g. when editing a HTML file. Have to check if this works with the groovy editor too ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-5229503115724461900?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/5229503115724461900/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=5229503115724461900' title='5 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5229503115724461900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5229503115724461900'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/09/in-between-review-of-sling.html' title='An &quot;in between&quot; review of Sling'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-8162942812910803072</id><published>2008-09-07T23:47:00.000-07:00</published><updated>2008-09-08T05:55:35.417-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sling'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><title type='text'>Flex/Flash wasn't made for REST</title><content type='html'>Well, it did take longer than &lt;a href="http://michaelmarth.blogspot.com/2008/08/flex-open-source-right.html"&gt;others&lt;/a&gt;, but I finally got the message: Flash was not built with HTTP in mind. There are other &lt;a href="http://bugs.adobe.com/jira/browse/FP-201"&gt;issues&lt;/a&gt; flying around, but I think it all boils down to HTTP not being treated as first-class-citizen in the Flex/Flash environment.&lt;br /&gt;&lt;br /&gt;I guess that the reason is a historical one: all remote connection protocols where proprietary, only in the last years Adobe opened itself a little bit (by &lt;a href="http://www.techcrunch.com/2007/12/12/adobe-releases-blazeds-open-source-version-of-livecycle-data-services/"&gt;releasing&lt;/a&gt; BlazeDS and open sourcing Flex). Now I think Adobe should go 2 steps further:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;implement standards (e.g. using HTTP how it was meant to be used)&lt;/li&gt;&lt;li&gt;open source the whole stack&lt;/li&gt;&lt;/ol&gt;This is highly speculative, but perhaps the "&lt;a href="http://www.mikechambers.com/blog/2008/08/14/actionscript-3-and-ecmascript-4/"&gt;Nay&lt;/a&gt;" to EcmaScript4 was due to the apparent closeness of the Flash ecosystem.&lt;br /&gt;&lt;br /&gt;The saddest thing is that Flex is great! Real good default (looks nice out of the box), a real component model, just plain fun! Next stop: &lt;a href="http://www.dojotoolkit.org/"&gt;Dojo&lt;/a&gt;, I think ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-8162942812910803072?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/8162942812910803072/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=8162942812910803072' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/8162942812910803072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/8162942812910803072'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/09/flexflash-wasnt-made-for-rest.html' title='Flex/Flash wasn&apos;t made for REST'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-6950954540931228177</id><published>2008-09-04T01:02:00.000-07:00</published><updated>2008-09-08T05:56:00.904-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sling'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Using Groovy Builders in Sling</title><content type='html'>&lt;a href="http://incubator.apache.org/sling"&gt;Sling&lt;/a&gt; is a new approach in web development. It is, amongst other, a thin REST layer onto a JCR repository.&lt;br /&gt;&lt;br /&gt;Sling also makes use of the language neutral &lt;a href="https://scripting.dev.java.net/"&gt;scripting features&lt;/a&gt; of the java platform. Out of the box, several scripting languages are supported, like javascript and jruby. Since Groovy does have JSR 223 support, it is rather easy to create a groovy module to be used inside Sling. The only pity is that the Groovy Scripting Engine is not available via maven. See &lt;a href="https://issues.apache.org/jira/browse/SLING-315?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;amp;focusedCommentId=12576587#action_12576587"&gt;this&lt;/a&gt; Jira issue for some hints on creating a  Groovy OSGI-module for Sling.&lt;br /&gt;&lt;br /&gt;The thing I like most about Groovy is the real cool builder support. Using the MarkupBuilder, it is a snap to generate HTML or XML documents. I personally started to like MarkupBuilder syntax more than the templating approach.&lt;br /&gt;&lt;br /&gt;The first time I saw something similar was at a demonstration of the excellent &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt; framework, where everything, including layout, is done in smalltalk. I am not sure wether the Groovy builders have been inspired by smalltalk or even Seaside, but both are sexy (I cannot speak for Seaside, haven't had the chance to play with it).&lt;br /&gt;&lt;br /&gt;Anyways, on to some comparisons:&lt;br /&gt;&lt;br /&gt;First a piece of jsp:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;%@page import="javax.jcr.query.Query"%&amp;gt;&lt;br /&gt;&amp;lt;%@page import="javax.jcr.NodeIterator"%&amp;gt;&lt;br /&gt;&amp;lt;%@page import="javax.jcr.Node"%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0"%&amp;gt;&lt;br /&gt;&amp;lt;sling:defineobjects/&amp;gt;&lt;br /&gt;&amp;lt;div class="blueprint detail"&amp;gt;&lt;br /&gt;&amp;lt;a href=""&amp;gt;.details.html"&amp;gt;&amp;lt;%= currentNode.getName() %&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Properties&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Controls&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;div id="List"&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;String q = "/jcr:root"+currentNode.getPath()+ "//*[@sling:resourceType='secmanagment/control']";&lt;br /&gt;Query query = currentNode.getSession().getWorkspace().getQueryManager().createQuery(q, "xpath");&lt;br /&gt;NodeIterator result = query.execute().getNodes();&lt;br /&gt;%&amp;gt;Total &amp;lt;%=result.getSize()%&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&amp;lt;%&lt;br /&gt;while(result.hasNext()) {&lt;br /&gt; Node n = result.nextNode();&lt;br /&gt;%&amp;gt;&amp;lt;li&amp;gt;&amp;lt;%&lt;br /&gt;out.flush();&lt;br /&gt;sling.include(n.getPath() + ".overview.html");&lt;br /&gt;%&amp;gt; &amp;lt;/li&amp;gt;&amp;lt;%&lt;br /&gt;}&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div class="new"&amp;gt;&lt;br /&gt;&amp;lt;form action=""&amp;gt;/controls/" method="POST"&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="name" value="Name"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="sling:resourceType" value="secmanagment/control"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="jcr:primaryType" value="nt:unstructured"&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="create"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The same using Groovy with MarkupBuilder:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;import groovy.xml.MarkupBuilder&lt;br /&gt;import javax.jcr.query.Query&lt;br /&gt;import javax.jcr.NodeIterator&lt;br /&gt;import javax.jcr.Node&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def q = "/jcr:root${currentNode.path}//*[@sling:resourceType='secmanagment/controls']";&lt;br /&gt;def query = currentNode.session.workspace.queryManager.createQuery(q, "xpath");&lt;br /&gt;def result = query.execute().nodes;&lt;br /&gt;&lt;br /&gt;def builder = new MarkupBuilder(out)&lt;br /&gt;builder.div(class:"blueprint detail") {&lt;br /&gt; a(class:"blueprint details", href:"${currentNode.path}.details.html", currentNode.name)&lt;br /&gt; h2("Properties")&lt;br /&gt; h2("Controls") {&lt;br /&gt;   ul(class:"List") {&lt;br /&gt;     result.each { node -&amp;gt;&lt;br /&gt;//this is necessary: need to put the outer tags explicitely   &lt;br /&gt;       mkp.yieldUnescaped "&amp;lt;li&amp;gt;"&lt;br /&gt;       sling.include(node.path)&lt;br /&gt;       mkp.yieldUnescaped "&amp;lt;/li&amp;gt;"&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;   h3("Create new")&lt;br /&gt;   div(class:"new") {&lt;br /&gt;     form(action:"${currentNode.path}/controls/", method:"POST") {&lt;br /&gt;       input(type:"text", name:"name", value:"Name")&lt;br /&gt;       input(type:"hidden", name:"sling:resourceType", value:"secmanagment/controls")&lt;br /&gt;       input(type:"hidden", name:"jcr:primaryType", value:"nt:unstructured")&lt;br /&gt;       input(type:"submit", value:"create")&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;While not being too different, those 2 samples (hopefully) show the usage of MarkupBuilders as valid alternative to a templating engine like jsp or gsp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-6950954540931228177?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/6950954540931228177/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=6950954540931228177' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/6950954540931228177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/6950954540931228177'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/09/using-groovy-builders-in-sling.html' title='Using Groovy Builders in Sling'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-4620065514827650457</id><published>2008-08-19T13:56:00.000-07:00</published><updated>2008-08-19T14:03:20.014-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex groovy ruby'/><title type='text'>Oh what irony</title><content type='html'>So, after some years of java-programming I am getting used to dynamic, loosely typed languages, walk like a duck, y'know the drill.&lt;br /&gt;&lt;br /&gt;Then enters Flex, enters AS3 and you know what? Explicit type declarations all the way (Not mandatory at all, but, you know, the compiler complains and stuff, so you better behave...)&lt;br /&gt;&lt;br /&gt;This is not a problem and all, but something about the whole thing  just made me smile :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-4620065514827650457?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/4620065514827650457/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=4620065514827650457' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4620065514827650457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4620065514827650457'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/08/oh-what-irony.html' title='Oh what irony'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-8174125563812507620</id><published>2008-08-11T04:01:00.001-07:00</published><updated>2008-08-12T07:54:06.377-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sling'/><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='controls managment project'/><title type='text'>Controls Managment Project: Desiding for JCR/Sling</title><content type='html'>I am pondering for a half year on the idea of creating a piece of software which allows to manage (security) controls. There are several programs which allow to manage risks, but they assume the existence of a complete business services catalogue, broken down to hardware installations and software instances. Which I do not have atm.&lt;br /&gt;&lt;br /&gt;What we do have is a set of controls, together with measures which describe how to implement those controls. The very basic model is:&lt;br /&gt;&lt;blockquote&gt;1 control &lt;-&gt; m measures&lt;br /&gt;1 measure &lt;-&gt; m implementations&lt;/blockquote&gt;A set of controls can be packet together in a workbook (haven't found a better word for it), which then can be assigned to someone (e.g. infrastructure guys) to define the implementations and their respective fulfillment.&lt;br /&gt;&lt;br /&gt;This is all kind of vague, and it will probably will remain to be vague and not 100% defined in a strict (relational) domain model. It might for example be possible that some controls have more attributes than others. This is of course possible to be modeled with object compositions, but this is always the point where ORM starts to produce to much friction heat...&lt;br /&gt;&lt;br /&gt;And this vagueness is imho a indicator for the need of a kind of &lt;a href="http://en.wikipedia.org/wiki/Semi-structured_model"&gt;semi structured&lt;/a&gt; data model. And this again is a good sign for using the &lt;a href="http://www.betaversion.org/%7Estefano/linotype/news/93/"&gt;data first&lt;/a&gt; approach: use the hierarchy as structuring model, and, well, see to more structure later. Maybe :). Therefore JCR is the weapon of choice....&lt;br /&gt;&lt;br /&gt;As for Sling: I am still completely indecisive regarding the right client technology. Therefore it makes sense to have a REST-full interface to the business domain.&lt;br /&gt;&lt;br /&gt;And Sling is sexy. Want to use it. 'Nuff said.&lt;br /&gt;&lt;br /&gt;Next steps would be to answer some questions regarding Sling development. Currently I am scouting the message boards and the (way too sparse) documentation...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;what's the best way to setup a Sling project? Use webdav for deployment?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How to backup/restore work?&lt;/li&gt;&lt;li&gt;How to design a JCR/Sling project? Top down? Paralell development of content model and functionality?&lt;/li&gt;&lt;li&gt;OSGI Best Practises&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Which client-side technology to choose?&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-8174125563812507620?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/8174125563812507620/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=8174125563812507620' title='6 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/8174125563812507620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/8174125563812507620'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/08/controls-managment-project-desiding-for.html' title='Controls Managment Project: Desiding for JCR/Sling'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-1563778805468917284</id><published>2008-08-05T01:16:00.000-07:00</published><updated>2008-08-05T01:47:33.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sling'/><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='jackrabbit'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamic languages'/><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><title type='text'>A first view at Sling</title><content type='html'>&lt;a href="http://incubator.apache.org/sling/site/index.html"&gt;Sling &lt;/a&gt;is, well Yet Another Java Web Framework. But it adds some unique aspects, which might turn out to be a game changer:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it focuses on resources&lt;br /&gt;&lt;/li&gt;&lt;li&gt;it uses JCR as backend API (see &lt;a href="http://jackrabbit.apache.org"&gt;jackrabbit&lt;/a&gt; as implementation)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;it adds a thin layer of REST over JCR&lt;/li&gt;&lt;li&gt;it adds a dash of custom behavior by allowing dynamic languages (javascript, jruby, amongst others) to manipulate the REST request processing flow&lt;br /&gt;&lt;/li&gt;&lt;li&gt;it uses &lt;a href="http://en.wikipedia.org/wiki/OSGi"&gt;OSGI &lt;/a&gt;and its plugin-mechanism for more heavyweight and/or integration stuff&lt;/li&gt;&lt;/ul&gt;Besides being rather hype compliant (JCR, jruby, osgi, REST, thank you), the most interesting feature is that it's inspiring: it makes me &lt;span style="font-style: italic;"&gt;think&lt;/span&gt;, and this in a constructive way. It kind of makes REST more approachable as an architectural &lt;span style="font-style: italic;"&gt;style &lt;/span&gt;rather than a framework.&lt;br /&gt;&lt;br /&gt;In a sense, it is like learning a new programming language: it opens your horizons, and questions some established thought routines.&lt;br /&gt;&lt;br /&gt;Go ahead and check it out, it might trickle in...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-1563778805468917284?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/1563778805468917284/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=1563778805468917284' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1563778805468917284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1563778805468917284'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/08/first-view-at-sling.html' title='A first view at Sling'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-5412732223422914541</id><published>2008-07-10T03:29:00.000-07:00</published><updated>2008-07-12T00:02:39.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails, Flex, Soap</title><content type='html'>Today I have written a small PoC for Grails, Flex, SOAP. The initial task was (and still is) to find out which communication takes place in a Flex application.&lt;br /&gt;&lt;br /&gt;Having no clue about Flex, a little understandig of Web Services and some minor understanding of Grails, it took me no more than 3 hours, including googling for web service usage in Flex and hunting of really stupid beginners bug.&lt;br /&gt;&lt;br /&gt;This shows the real muscles of Grails and its really awesome plugin ecosystem.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;grails create-app HelloFlex&lt;br /&gt;cd HelloFlex&lt;br /&gt;grails install-plugin flex&lt;br /&gt;grails install-plugin xfire&lt;br /&gt;grails create-service hello&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ok, everything needed is installed. 2 more things to do. in HelloFlex\services\HelloService.groovy:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class HelloService {&lt;br /&gt;static expose=['xfire', 'flex-remoting']&lt;br /&gt;def hello(String echo) { return echo.reverse() }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note the use of expose: this service is both available via flex-remoting and via SOAP.&lt;br /&gt;&lt;br /&gt;Second: create HelloFlex\web-app\test.mxml&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;mx:WebService&lt;br /&gt;  id="userRequest"&lt;br /&gt;  wsdl="http://localhost:8080/HelloFlex/services/hello?wsdl"&amp;gt;&lt;br /&gt; &amp;lt;mx:operation name="hello" resultFormat="object"&lt;br /&gt;  fault="mx.controls.Alert.show(event.fault.faultString)"&lt;br /&gt;  result="showResult(event)"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:WebService&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;import mx.rpc.events.ResultEvent;&lt;br /&gt;import mx.rpc.events.FaultEvent;&lt;br /&gt;import mx.controls.Alert;&lt;br /&gt;[Bindable] private var passage:String;&lt;br /&gt;private var options:Object = {"output-format": "plain-text"};&lt;br /&gt;private function showResult(e:ResultEvent):void {&lt;br /&gt;passage = userRequest.hello.lastResult;&lt;br /&gt;}&lt;br /&gt;private function send_data(input:String):void {&lt;br /&gt;userRequest.hello(input);&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:Text text="Echo Service" fontSize="16" fontWeight="bold"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Text text="Input" fontSize="12"/&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput id="lookupPsg"  textAlign="center"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Button label="Submit" click="send_data(lookupPsg.text)"/&amp;gt;&lt;br /&gt;     &amp;lt;mx:TextArea height="352" width="590" id="psg" text="{passage}" editable="false" fontSize="11"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;(sorry for the mess, dunno how to format this better )&lt;br /&gt;&lt;br /&gt;Hitting &lt;code&gt;http://localhost:8080/HelloFlex/test.mxml&lt;/code&gt; displays the Flex application which uses SOAP protocol to consume the webservice.&lt;br /&gt;&lt;br /&gt;Built on the shoulder of giants...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 12th Jul:&lt;/span&gt; Marcel Overdijk has already &lt;a href="http://marceloverdijk.blogspot.com/2008/01/blazeds-test-drive-sample-in-grails.html"&gt;written&lt;/a&gt; a similar (well, actually better:)) example back in january.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-5412732223422914541?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/5412732223422914541/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=5412732223422914541' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5412732223422914541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5412732223422914541'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/07/grails-flex-soap.html' title='Grails, Flex, Soap'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-4304666602830722350</id><published>2008-07-07T00:22:00.001-07:00</published><updated>2008-07-09T12:30:10.759-07:00</updated><title type='text'>Complex Swing Widgets, where art thou?</title><content type='html'>I am currently looking at creating something with a good ol' Swing interface.&lt;br /&gt;&lt;br /&gt;A typical use case is the following scenario: a &lt;span style="font-style: italic;"&gt;drag-and-droppable, sortable, pageable treetable with editable fields&lt;/span&gt;. Datatype aware editors, subtrees, master-detail views would be considered as added value. Such a treetable always&lt;br /&gt;&lt;br /&gt;I did find the respective contributions of &lt;a href="http://extjs.com/deploy/dev/examples/samples.html"&gt;ext-js&lt;/a&gt; and jquery quite usable, albeit both need some customizing and/or (more or less) programming.&lt;br /&gt;&lt;br /&gt;Coming back to Swing after several years, I naively expected to have a plethora of tree table implementations. Well, at the moment the only thing I have found is the SwingX &lt;a href="http://www.java2s.com/Code/Java/Swing-Components/TreeTable.htm"&gt;Treetable&lt;/a&gt;. I will have a look at it in near future.&lt;br /&gt;&lt;br /&gt;The question I ask myself is wether the HTML/js way is the way to go also for complex GUIs? I would still think that this platform has its limitations. But when I do see how sparse complex Swing widgets are, I really am unsure to  use the right  technology. Also things like autocompletion and other Web2.0 goodies should be easily available.&lt;br /&gt;&lt;br /&gt;What is your opinion? Are there other Swing (or SWT, whatever) widgets collections with advanced components available? Does the Flex ecosystem provide more components?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;update 9th Jul&lt;/span&gt;&lt;br /&gt;Well, I guess I was right with not finding a Swing TreeTable: &lt;a href="http://weblogs.java.net/blog/timboudreau/archive/2008/06/egads_an_actual.html"&gt;others&lt;/a&gt; have been waiting for it, too...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-4304666602830722350?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/4304666602830722350/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=4304666602830722350' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4304666602830722350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4304666602830722350'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/07/complex-swing-widgets-where-art-thou.html' title='Complex Swing Widgets, where art thou?'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-1633839435996041617</id><published>2008-06-29T12:34:00.000-07:00</published><updated>2008-06-29T13:03:57.018-07:00</updated><title type='text'>Comments on an interesting Wired Article</title><content type='html'>Chris Anderson has written an &lt;a href="http://www.wired.com/science/discoveries/magazine/16-07/pb_theory/"&gt;interesting&lt;/a&gt; article. While the title is rather placative ("The End of Thery") there are some thoughts worth beeing mentioned.&lt;br /&gt;&lt;br /&gt;First "All models are wrong, and increasingly you can succeed without them". True, so true: models are just that: models. Also nothing against succeeding without them: data mining can be made without models.&lt;br /&gt;&lt;br /&gt;But: is the Peta-Age really the end of theories? Interestingly, the article mentioned Craig Venters huge task to "sequence the air". This creates vast amounts data, and makes it almost ridiculously simple to find new species, or make correlations between species. To analyse this, to explain and understand it, there needs to be a model. Or doesn't it?&lt;br /&gt;&lt;br /&gt;There is absolute nothing against the idea to look for unexpected correlations in huge datasets. But to make it really scientific, results or rather conclusions out of those results need to be falsificable. This falsification cannot be done in the dataset beeing used, but in a larger context. In a model, extrapolated from the dataset.&lt;br /&gt;&lt;br /&gt;All mho...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-1633839435996041617?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/1633839435996041617/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=1633839435996041617' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1633839435996041617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1633839435996041617'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/06/comments-on-interesting-wired-article.html' title='Comments on an interesting Wired Article'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-7951104573493544027</id><published>2008-06-22T05:45:00.000-07:00</published><updated>2008-06-23T03:45:58.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='ocmgroovy'/><title type='text'>ocmgroovy: Design Considerations</title><content type='html'>I have put some design consideration &lt;a href="http://code.google.com/p/ocmgroovy/wiki/DesignConsiderations"&gt;thoughts &lt;/a&gt;on the ocmgroovy site.&lt;br /&gt;Feel free to comment on it, feedback is appreciated :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-7951104573493544027?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/7951104573493544027/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=7951104573493544027' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7951104573493544027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7951104573493544027'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/06/ocmgroovy-design-considerations.html' title='ocmgroovy: Design Considerations'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-7695802619733343207</id><published>2008-06-12T00:10:00.000-07:00</published><updated>2008-06-12T00:16:12.699-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='ocm'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='ocmgroovy'/><title type='text'>JCR Builder and JCR Query code now hosted on googlecode</title><content type='html'>The source code mentioned on &lt;a href="http://n1ceone.blogspot.com/2008/05/groovy-builders-jcr-and-miglayout-to_26.html"&gt;this &lt;/a&gt;blog and on the Day dev-&lt;a href="http://dev.day.com/microsling/content/blogs/main/groovyjcr.html"&gt;site &lt;/a&gt;is now &lt;a href="http://code.google.com/p/ocmgroovy"&gt;hosted &lt;/a&gt;by the octopus. The project ist named "ocmgroovy" and you may expect more from that department in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-7695802619733343207?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/7695802619733343207/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=7695802619733343207' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7695802619733343207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7695802619733343207'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/06/jcr-builder-and-jcr-query-code-now.html' title='JCR Builder and JCR Query code now hosted on googlecode'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-7002916975690662526</id><published>2008-06-06T03:19:00.000-07:00</published><updated>2008-06-06T03:37:34.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tapestry'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy in Tapestry</title><content type='html'>Good news on the &lt;a href="http://tapestryjava.blogspot.com/2008/06/tapestry-with-groovy.html"&gt;Tapestry&lt;/a&gt; front: Using groovy seems to be trivial in T5, according to H.L. Ship.  Also the hint regarding Groovy becoming a  first choice for Tapestry development is good to hear, and makes perfect sense!&lt;br /&gt;&lt;br /&gt;This opens up a loads of options: Tapestry Builders (Tapestry is all about components ...), Usage of GORM as ORM layer, and all the goodness of the Groovy language at your fingertips. And a rock solid foundation like T5 to build applications upon. Wow.&lt;br /&gt;&lt;br /&gt;No excuse to not try it out now, aaah so much to do, so little time ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-7002916975690662526?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/7002916975690662526/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=7002916975690662526' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7002916975690662526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7002916975690662526'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/06/groovy-in-tapestry.html' title='Groovy in Tapestry'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-7332119012409189665</id><published>2008-05-26T11:58:00.001-07:00</published><updated>2008-06-01T11:41:48.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy Builders, JCR (and MigLayout to the rescue)</title><content type='html'>I still am struggling with the JCR Query functionality. The whole idea of supporting both XPath and/or SQL-like syntax with some additions is, for me personally, rather challenging.&lt;br /&gt;&lt;br /&gt;What to do? Either read &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=JCRPract"&gt;docu&lt;/a&gt;, source code, create tests against the API or create a little GUI to test it with.&lt;br /&gt;&lt;br /&gt;So, finally a good excuse to use the &lt;a href="http://groovy.codehaus.org/Swing+Builder"&gt;SwingBuilder&lt;/a&gt;. Beeing in dire need of a refresh on Swing (remember Java 1.2? Sheesh...) I stumbled upon &lt;a href="http://www.miglayout.com/"&gt;MigLayout&lt;/a&gt;, which, kind of ironically, plays to my (meager) CSS know-how.&lt;br /&gt;&lt;br /&gt;In order to have some test data available, I make use of a JCR Builder, which is described &lt;a href="http://dev.day.com/microsling/content/blogs/main/groovyjcr.html"&gt;here&lt;/a&gt;. Groovy builders are a nice way to create hierarchical structures.&lt;br /&gt;&lt;br /&gt;And this is what the GUI looks like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;import groovy.swing.SwingBuilder&lt;br /&gt;import net.miginfocom.swing.MigLayout&lt;br /&gt;import javax.swing.WindowConstants as WC&lt;br /&gt;import javax.jcr.Repository&lt;br /&gt;import org.apache.jackrabbit.core.TransientRepository&lt;br /&gt;import javax.jcr.Session&lt;br /&gt;import javax.jcr.SimpleCredentials&lt;br /&gt;import ch.bluepenguin.jcr.groovy.builder.JcrBuilder&lt;br /&gt;import javax.jcr.Workspace&lt;br /&gt;import javax.jcr.query.QueryManager&lt;br /&gt;import javax.jcr.query.Query&lt;br /&gt;import javax.jcr.query.QueryResult&lt;br /&gt;import javax.jcr.NodeIterator&lt;br /&gt;import javax.jcr.ValueFormatException&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class JCRGroovy implements Runnable {&lt;br /&gt; def swing&lt;br /&gt; def builder&lt;br /&gt; Session session&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;     swing = new SwingBuilder()&lt;br /&gt;&lt;br /&gt;     def queryTextField = swing.textArea(rows: 5, columns: 20)&lt;br /&gt;     queryTextField.text = "/jcr:root/blueprint/element(*,nt:unstructured)"&lt;br /&gt;     def valueTextField = swing.textArea(rows: 5, columns: 20)&lt;br /&gt;     def deleteTextField = swing.textField()&lt;br /&gt;     valueTextField.text =&lt;br /&gt;         """blueprint() {&lt;br /&gt;         master1(['name':'String',&lt;br /&gt;                'type':'String']) {&lt;br /&gt;             detail()&lt;br /&gt;         }&lt;br /&gt;         master2(){&lt;br /&gt;             references('otherMaster':'../master1')&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;     """&lt;br /&gt;&lt;br /&gt;     deleteTextField.text ="/blueprint"&lt;br /&gt;     def resultTextField = swing.textArea(rows: 20, columns: 20)&lt;br /&gt;     Repository repository = new TransientRepository();&lt;br /&gt;     session = repository.login(new SimpleCredentials("username", "password".toCharArray()))&lt;br /&gt;     builder = new JcrBuilder()&lt;br /&gt;     builder.session = session&lt;br /&gt;     def gui = swing.frame(title: 'JCRQuery', defaultCloseOperation: WC.EXIT_ON_CLOSE) {&lt;br /&gt;         panel(layout: new MigLayout("fill")) {&lt;br /&gt;             widget(queryTextField, constraints: 'grow')&lt;br /&gt;             button(text: 'Query', constraints: 'span, aligny bottom', actionPerformed: {&lt;br /&gt;                 resultTextField.text = queryAction(queryTextField.text, valueTextField.text)&lt;br /&gt;             })&lt;br /&gt;&lt;br /&gt;             widget(valueTextField, constraints: 'grow')&lt;br /&gt;             button(text: 'Create', constraints: 'span, aligny bottom', actionPerformed: {&lt;br /&gt;                 resultTextField.text = createAction(valueTextField.text)&lt;br /&gt;             })&lt;br /&gt;             widget(deleteTextField, constraints: 'grow')&lt;br /&gt;&lt;br /&gt;             button(text: 'Delete', constraints: 'span, aligny bottom', actionPerformed: {&lt;br /&gt;                 resultTextField.text = deleteAction(deleteTextField.text)&lt;br /&gt;             })&lt;br /&gt;             //label(text: 'Result')&lt;br /&gt;             scrollPane(constraints: 'wrap, grow') {{&lt;br /&gt;                 widget(resultTextField)&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;gui.pack()&lt;br /&gt;     gui.show()&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def deleteAction(path) {&lt;br /&gt;     def results = ""&lt;br /&gt;     try {&lt;br /&gt;         def relPath = path.charAt(0) == '/' ? path.substring(1) : path&lt;br /&gt;         session.rootNode.getNode(relPath).remove()&lt;br /&gt;         session.save()&lt;br /&gt;     } catch (Exception e) {&lt;br /&gt;         results = e.toString()&lt;br /&gt;     }&lt;br /&gt;     return results&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def queryAction(query, model) {&lt;br /&gt;     return executeQuery(query, printClosure)&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def createAction(model) {&lt;br /&gt;     return buildModel(model)&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def executeQuery(queryString, clos) {&lt;br /&gt;     def results = ""&lt;br /&gt;     try {&lt;br /&gt;         Workspace workspace = session.getWorkspace();&lt;br /&gt;         QueryManager qm = workspace.getQueryManager();&lt;br /&gt;         Query query = qm.createQuery(queryString, Query.XPATH);&lt;br /&gt;         QueryResult queryResult = query.execute();&lt;br /&gt;         NodeIterator nodeIterator = queryResult.nodes&lt;br /&gt;         for (n in nodeIterator) {&lt;br /&gt;             results += clos.call(n)&lt;br /&gt;         }&lt;br /&gt;     } catch (Exception e) {&lt;br /&gt;         results = e.toString()&lt;br /&gt;     }&lt;br /&gt;     return results&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def printClosure = {node -&gt;&lt;br /&gt;     def filler = "   "&lt;br /&gt;     def results = ""&lt;br /&gt;     def to = node.depth&lt;br /&gt;     for (i in 0..(to-1)) filler += "   "&lt;br /&gt;     results += filler + node.path + '\n'&lt;br /&gt;     node.properties.each {property -&gt;&lt;br /&gt;         try {&lt;br /&gt;             results += filler + "   " + property.name + ": " + property.string + '\n'&lt;br /&gt;         } catch(ValueFormatException wft) {&lt;br /&gt;             results += filler + "   " + property.name + ": (multiple values) \n"&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;     return results&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def removeClosure = {node -&gt;&lt;br /&gt;     try {&lt;br /&gt;         if (node.path == "/" || node.path.startWith("/jcr:system")) {&lt;br /&gt;             println "wont remove root node"&lt;br /&gt;         } else {&lt;br /&gt;             node.remove()&lt;br /&gt;         }&lt;br /&gt;     } catch (Exception e) {}&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def buildModel(model) {&lt;br /&gt;     GroovyShell groovyShell = new GroovyShell(new Binding([builder: builder]))&lt;br /&gt;     def modelScript = "builder." + model + "\nbuilder.build({})"&lt;br /&gt;     return groovyShell.evaluate(modelScript)&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So with some fumbling and trial &amp;amp; error a quick testing GUI to check for those JCR Query result. Of course, many things are open:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XPath queries support&lt;/li&gt;&lt;li&gt;use of a JTree instead of a dump message&lt;/li&gt;&lt;li&gt;"remember me" functionality&lt;/li&gt;&lt;/ul&gt;But it does the trick and demonstrates (once again) the real power of Groovy: while beeing a real cool language in itself, the usage of such powerfull tools as Jackrabbit and MigLayout are a breeze.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-7332119012409189665?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/7332119012409189665/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=7332119012409189665' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7332119012409189665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7332119012409189665'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/05/groovy-builders-jcr-and-miglayout-to_26.html' title='Groovy Builders, JCR (and MigLayout to the rescue)'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-2423117829468845765</id><published>2008-05-20T06:38:00.000-07:00</published><updated>2008-05-20T06:41:57.883-07:00</updated><title type='text'>Nice one, indeed!</title><content type='html'>This made me smile: an &lt;a href="http://ubuntuforums.org/showthread.php?t=567453"&gt;entry&lt;/a&gt; on the ubuntu forums where someone asks for help with a webcam. Running under Windows Vista!&lt;br /&gt;&lt;br /&gt;Now instead of "get the fuck out of here" someone mentioned a blog entry describing the problem. No bitching, no "read the fucking url", just beeing helpful. Of course, next entry hits back, but anyways... nice one!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-2423117829468845765?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/2423117829468845765/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=2423117829468845765' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2423117829468845765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2423117829468845765'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/05/nice-one-indeed.html' title='Nice one, indeed!'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-2045477887910071563</id><published>2008-04-26T12:26:00.000-07:00</published><updated>2008-06-06T05:51:56.807-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><title type='text'>Canonical Form for Content Hierarchies</title><content type='html'>I am still pondering the question how exactly a content hierarchy should be modeled.&lt;br /&gt;&lt;br /&gt;In a previous post I mention the possibility to declare authorization facts in a hierarchy. Something is still bugging me. Similar to programming, I think that some informations should be considered as &lt;a href="http://en.wikipedia.org/wiki/Cross-cutting_concern"&gt;cross-cutting concerns&lt;/a&gt; (or aspects). David's Model also has an &lt;a href="http://wiki.apache.org/jackrabbit/DavidsModel#head-86c894fb8c02d98d18aa3e2403952fde9c8712bd"&gt;example &lt;/a&gt;where authorization decisions have an impact on the model. This bugs me.&lt;br /&gt;&lt;br /&gt;Somewhere there lurks the definition of a canonical representation of a content hierarchy:&lt;br /&gt;&lt;br /&gt;"&lt;br /&gt;&lt;i&gt;&lt;b&gt;basic, canonic, canonical&lt;/b&gt;&lt;/i&gt;: reduced to the simplest and most significant form possible without loss of generality, e.g. "a basic story line"; "a canonical syllable pattern"&lt;br /&gt;..."&lt;br /&gt;&lt;br /&gt;This does sound right, doesn't it? A basic form of a content hierarchy should&lt;br /&gt;&lt;ol&gt;&lt;li&gt;have the ideal relation of breadth vs. depth (ideal for the content model)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;only have the necessary node hierarchies/attributes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;still make sense&lt;/li&gt;&lt;/ol&gt;Those are non-mathematical requirements. The definition of a "&lt;a href="http://en.wikipedia.org/wiki/Canonical_form"&gt;Canonical Form&lt;/a&gt;" is interesting: while defining a canonical form via equivalency of  a range of objects, it remains unspecific about how and when to define a canonical form:&lt;br /&gt;&lt;br /&gt;"...&lt;br /&gt;A canonical form may simply be a convention, or a deep theorem.&lt;br /&gt;..."&lt;br /&gt;&lt;br /&gt;The most important part is that other content hierarchies which are equivalent to this normal form are all connectible via an equivalence relation.&lt;br /&gt;&lt;br /&gt;So the task at hand is to define a model which can act as a natural representation of the solution domain. As soon as this model is found, enhancements can be defined, while still being equivalent to the canonical form.&lt;br /&gt;&lt;br /&gt;Well, still lots of questions open:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;is it possible to define a canonical form for a specific use case (e.g. a blog)? Or would it be on an ad-hoc base?&lt;/li&gt;&lt;li&gt;what would the added benefit of such a canonical form be? The answer might be that extensions would be made vs. the canonical form. If the canonical form itself changes, it should trigger the changes to the other forms. Or at least depict the consequences the change in the canonical form has to equivalent representations&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;There might be another alternative to attack the problem of "hierarchy purpose overloading": as in programming, cross-cutting concerns might best be attacked by &lt;a href="http://en.wikipedia.org/wiki/Orthogonalization"&gt;Orthogonalization&lt;/a&gt;. But this is another story ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-2045477887910071563?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/2045477887910071563/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=2045477887910071563' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2045477887910071563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/2045477887910071563'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/04/canonical-form-for-content-hierarchies.html' title='Canonical Form for Content Hierarchies'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-4593996848137416136</id><published>2008-04-19T12:38:00.000-07:00</published><updated>2008-06-06T05:51:33.783-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><title type='text'>RESTful Authorization Model Considerations</title><content type='html'>Considering the fact that URIs map to  resources in a RESTful design, an authorization model almost automatically means a URI authorization model:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;URIs are subject to authorization decisions&lt;br /&gt;&lt;/li&gt;&lt;li&gt;URIs offer a hierarchical authorization scheme&lt;br /&gt;&lt;/li&gt;&lt;li&gt;additionally, the limited list of allowed actions  (verbs) leads way to a simple definition of ACLs (&lt;a href="http://en.wikipedia.org/wiki/Access_control_list"&gt;Access Control List&lt;/a&gt;), more or less the same as for file systems (read,write etc etc)&lt;/li&gt;&lt;/ul&gt;All in all this design is quite a non-event since it all fits together quite obviously.&lt;br /&gt;&lt;br /&gt;One thing to consider is the old question of attribute based security decisions.  A real world example is a blog where the author first checks the comments before publishing them. The attribute would be whether the comment already has been reviewed or not.&lt;br /&gt;&lt;br /&gt;There are 2 possibilities to do do the authorization check in a declarative manner:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;either the ACL is attached directly to the resource&lt;br /&gt;&lt;/li&gt;&lt;li&gt;or the resources (posts to be reviewed) are stored in another place of the URL hierarchy, e.g. '/comments/review' instead of '/comments'. The ACL would be attached to the directory instead of the resource itself (directory being a resource in its on right)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Both make use of ACL which looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ACL(resource):&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;    reviewer:read/write/delete (this allows to move)&lt;/li&gt;&lt;li&gt;    author: read/write &lt;/li&gt;&lt;/ul&gt;Both possibilities have got their respective advantages. The second one seems to be easier, but has an impact on the hierarchy of  resources. Is it allowed to define a resource hierarchy according to a cross-cutting concern like security?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-4593996848137416136?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/4593996848137416136/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=4593996848137416136' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4593996848137416136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/4593996848137416136'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/04/restful-authorization-model.html' title='RESTful Authorization Model Considerations'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-5835719437191501165</id><published>2008-04-15T12:24:00.000-07:00</published><updated>2008-04-18T06:19:20.757-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sling'/><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails &amp; GWT: an uneasy match?</title><content type='html'>Currently I am looking for the holy grail for AJAX-enabled Grails development. While trying out the excellent &lt;a href="http://grails.org/GWT+Plugin"&gt;GWT-Plugin&lt;/a&gt;, something occurred to me: there are 3 programming languages involved: Groovy for Grails and Java/JavaScript for GWT.&lt;br /&gt;&lt;br /&gt;One could argue that Javascript is transparent while using GWT. I would agree to a certain point with this, because I do not know how fast you need to touch Javascript in GWT.&lt;br /&gt;&lt;br /&gt;Still this leaves me with 2 languages, namely Groovy and Java. While those 2 languages are very close together, this situation reminds me of a brilliant &lt;a href="http://almaer.com/blog/rotating-java-and-javascript-on-the-server"&gt;comic.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So why not use Groovy and Javascript, i.e. directly use one of the excellent Javascript frameworks? It does make more sense, since both are dynamic languages and both get more and more IDE support, namely in that one that costs some (you get the idea...).&lt;br /&gt;&lt;br /&gt;Still: 2 languages is still one too much. Since Javascript is set on the client, this means to use, well Javascript on the server too. The guys creating the &lt;a href="http://incubator.apache.org/sling"&gt;Sling&lt;/a&gt; framework for example do exactly this: it is up to you to use the Sling API on the client or server-side. I am not sure wether the code is 100% the same, but the general direction is given...&lt;br /&gt;&lt;br /&gt;I still go with groovy, call me old-fashioned...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;update:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="text-decoration: line-through;font-size:100%;" &gt;Maybe the strangest thing in GWT/Grails combination is the fact that everything sent to the client has to be IsSerializable. And has to be retrieved via a Service.&lt;br /&gt;&lt;br /&gt;Contrasting this with the direct use of a JSON builder which creates a format directly consumable by all Javascript libraries. Nothing beats&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;    &lt;span style="font-size:100%;"&gt;&lt;br /&gt;render DomainClass.list as JSON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;update 2:&lt;br /&gt;&lt;/span&gt;The last "update" is of course complete crap, see the comments! I was still in a kind of prehistoric knowledge level, GWT-wise. &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-5835719437191501165?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/5835719437191501165/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=5835719437191501165' title='4 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5835719437191501165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/5835719437191501165'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/04/grails-gwt-uneasy-match.html' title='Grails &amp; GWT: an uneasy match?'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-3081272705438154637</id><published>2008-04-12T05:46:00.000-07:00</published><updated>2008-04-12T05:57:29.396-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>Dont puck with me, Vista!</title><content type='html'>This is a rant. Nothing hightech in it, except Vista.&lt;br /&gt;&lt;br /&gt;Lately, while writing an email, my MS Vista did a spontaneous reboot. With no apparent reason. Well, fact is, that this doesn't happen often. First I mainly game on MS Vista and do the real work on Ubuntu and second Vista is stable on my system.&lt;br /&gt;&lt;br /&gt;Now, perhaps I haven't read a message or just clicked away a message box, might be. After reboot it was clear that some patches had to be applied. Ok, why reboot and stuff, yeah, whatever, it's Windows. But the fact that a system has got the balls to disrupt my work in such a manner is sign of a huge arrogance and a non-willingness to listen to and care for endusers. It is my computer and you don't do reboots without an explicit ok from me, dammit!&lt;br /&gt;&lt;br /&gt;It is kind of saddening, because Vista is imho not as bad as it is being made. And securitywise it seems to play in a complete other league than the previous OS's from Redmond. But somehow Microsoft really manages to not be liked by me, although I really try hard :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-3081272705438154637?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/3081272705438154637/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=3081272705438154637' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/3081272705438154637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/3081272705438154637'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/04/dont-puck-with-me-vista.html' title='Dont puck with me, Vista!'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-7358729134740013729</id><published>2008-04-09T07:19:00.001-07:00</published><updated>2008-06-06T05:52:28.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy as a First Programming Language</title><content type='html'>I am sure that this question has been raised more than once with other languages:&lt;br /&gt;&lt;blockquote&gt;How does Groovy fit as first language to learn?&lt;/blockquote&gt;Same question could be asked for (J)Ruby, no doubt. It's too long ago for myself (yes, I admit that I started professionally with VB 5.0, so what? :)), but I do not see any showstoppers. Let's compare Groovy to other languages (purely subjective)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;vs. C: C is cool for a look under the surface, but, ehm, as first language?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;vs. C++: hardcore. Sooo hardcore. But I guess for someone who wants to get (at least) his/her hands dirty, it surely is a worthy choice.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;vs. C#: I can't say much there, I do not know the language.&lt;/li&gt;&lt;li&gt;vs. FORTRAN: hey, don't dismiss that F-word :)&lt;/li&gt;&lt;li&gt;vs. Smalltalk: Smalltalk still seems to be one of the cleanest OO-language, and using something like &lt;a href="http://www.squeak.org/"&gt;Squeak&lt;/a&gt;, why not? Problem there is imho the transition to production&lt;/li&gt;&lt;li&gt;vs. Java: well, tough call. Java has got one big beginners friend: the compiler. I think this outweights the advantage that Groovy the language has over Java. On the other hand, it might be instructive to learn how to test a program the same time as writing the program itself. Also: too much IDE-help might be wrong at the beginning&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I might test it with a workmate very soon. Have to check that Fortran-Compiler ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-7358729134740013729?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/7358729134740013729/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=7358729134740013729' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7358729134740013729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7358729134740013729'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/04/groovy-as-first-programming-language.html' title='Groovy as a First Programming Language'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-9046559723654788465</id><published>2008-03-28T11:02:00.000-07:00</published><updated>2008-04-03T05:42:54.556-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='builders'/><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><title type='text'>Builder and DSLs</title><content type='html'>Naive Question:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If builders allow to define DSLs, and DSL are languages, what is best practise for defining the grammar of this languages? &lt;/blockquote&gt;Or even more naively: when to use &lt;span style="font-style: italic;"&gt;verbs&lt;/span&gt;, when to use &lt;span style="font-style: italic;"&gt;nouns&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;E.g.:&lt;br /&gt;&lt;pre&gt;goToComputer(){&lt;br /&gt; startUp() {&lt;br /&gt;   login(username:'user', passwort:'password')&lt;br /&gt; }&lt;br /&gt; startProgram(name:'thunderbird') {&lt;br /&gt;   readMails()&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;vs.&lt;br /&gt;&lt;br /&gt;computer(action: 'goto'){&lt;br /&gt; computer(action: 'startup') {&lt;br /&gt;   loginscreen(action: 'enter username', username: 'user')&lt;br /&gt;   loginscreen(action: 'enter password', username: 'password')&lt;br /&gt;   loginscreen(action: 'enter')&lt;br /&gt; }&lt;br /&gt; computer(action: 'startProgram') {&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;and so on. Of course, it is obvious that the later one is more verbose and needs a convention for the attributes (like "action attribute describes function to execute").&lt;br /&gt;&lt;br /&gt;Maybe the best compromise is to use a way to differentiate between verbs and nouns, e.g. write nouns in uppercase.&lt;br /&gt;&lt;br /&gt;A related question:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;How should the syntax of a DSL be described?&lt;/blockquote&gt;&lt;br /&gt;For XML we have schemas, is there need for something like that for DSL? And if yes, how to describe it? &lt;a href="http://en.wikipedia.org/wiki/Backus-Naur_Form"&gt;BNF&lt;/a&gt; seems to be a choice, but when exactly is it needed? Is it overkill? Does it scale?&lt;br /&gt;&lt;br /&gt;The reason for such unreflected questions: on the one hand the description of &lt;a href="http://groovy.codehaus.org/Alphabetical+Widgets+List"&gt;SwingBuilder&lt;/a&gt;, on the other hand the longish BNF &lt;a href="http://jackrabbit.apache.org/node-type-notation.html"&gt;description&lt;/a&gt; of JCR node types.  With both I get the feeling that not much more is possible...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-9046559723654788465?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/9046559723654788465/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=9046559723654788465' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/9046559723654788465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/9046559723654788465'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/03/builder-and-dsls.html' title='Builder and DSLs'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-3628323040588948046</id><published>2008-03-22T01:46:00.000-07:00</published><updated>2008-04-03T05:43:16.857-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><title type='text'>From OR to CR modeling - Hierarchies</title><content type='html'>So in the previous post, I started to think about data models in a Content Repository and the differences between relational models and, well, what?&lt;br /&gt;&lt;br /&gt;But first a disclaimer: I am no big content repository expert. So expect me to do some classic mistakes, and ask some rather naive questions.&lt;br /&gt;&lt;br /&gt;Here be one:&lt;br /&gt;&lt;blockquote&gt;Is a hierarchy imperative to content modeling with JCR?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;  &lt;br /&gt;My thought is that hierarchical modeling feels natural in JCR. The hierarchical structure is instrinsic to structures with nodes, parents and children. So the next question would be&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;How do you map the hierarchies of an existing relational model to a hierarchical one?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We have the classical example once again&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class Author {&lt;br /&gt; static hasMany = [ books : Book ]&lt;br /&gt; String name&lt;br /&gt;}&lt;br /&gt;class Book {&lt;br /&gt; static belongsTo = [author:Author]&lt;br /&gt; String title&lt;br /&gt;}&lt;/pre&gt;which maps naturally to&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/authors&lt;br /&gt;/stephen king&lt;br /&gt;     /books&lt;br /&gt;         /Misery&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But what if there is another hierarchy, e.g.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class Author {&lt;br /&gt; static hasMany = [ books : Book ]&lt;br /&gt; String name&lt;br /&gt;}&lt;br /&gt;class Book {&lt;br /&gt; static belongsTo = [author:Author, category: Category]&lt;br /&gt; String title&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Category {&lt;br /&gt; static hasMany = [ books : Book ]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now the books suddenly are part of 2 hierarchies. How to model this? I currently see 2 possibilities&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Have one leading hierarchy&lt;/li&gt;&lt;li&gt;Flat it out&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;pre&gt;/authors&lt;br /&gt; /stephen king&lt;br /&gt;      /books&lt;br /&gt;          /Misery&lt;br /&gt;/categories&lt;br /&gt; /Thriller&lt;br /&gt;      /Misery*&lt;br /&gt;&lt;/pre&gt;vs&lt;br /&gt;&lt;pre&gt;/authors&lt;br /&gt; /stephen king&lt;br /&gt;      /books&lt;br /&gt;          /Misery*&lt;br /&gt;/categories&lt;br /&gt; /Thriller&lt;br /&gt;      /books&lt;br /&gt;          /Misery*&lt;br /&gt;/books&lt;br /&gt; /Misery&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(the * depicts a relation to a Node elsewhere)&lt;br /&gt;&lt;br /&gt;Another solution would be to allow multiple dimensions, in which the objects can be stored (this is more or less the same as the "flat out" version, except that looking at the object always gives you the "real" one, and not the relation.&lt;br /&gt;&lt;br /&gt;As I said, I am not an expert of data modeling.&lt;br /&gt;&lt;br /&gt;Feel free to comment on it...&lt;br /&gt;&lt;br /&gt;Ok, next post will be about Groovy/Grails again :) (yeah, with a dash of JCR in it)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-3628323040588948046?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/3628323040588948046/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=3628323040588948046' title='6 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/3628323040588948046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/3628323040588948046'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/03/from-or-to-cr-modeling-hierarchies.html' title='From OR to CR modeling - Hierarchies'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-1925292410456121106</id><published>2008-03-20T06:31:00.000-07:00</published><updated>2008-04-03T05:43:16.858-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><title type='text'>Transition from ORM to JCR modeling</title><content type='html'>I am currently thinking about using JCR as a Backend for &lt;a href="http://grails.org/"&gt;Grails &lt;/a&gt;(or more generally Groovy). Graeme Rocher has made some great steps in creating a Grails plugin.&lt;br /&gt;&lt;br /&gt;GORM is imho one of the best possibilities to define an ORM model, since it hides all technical aspects of the implementation and lets the developer describe the domain model in a clear an consistent way.&lt;br /&gt;&lt;br /&gt;Therefore this clearness should still be around when using JCR as backend.&lt;br /&gt;&lt;br /&gt;Take an Grails/GORM example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class Author {&lt;br /&gt;   static hasMany = [ books : Book ]&lt;br /&gt;   String name&lt;br /&gt;}&lt;br /&gt;class Book {&lt;br /&gt;   static belongsTo = [author:Author]&lt;br /&gt;   String title&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;The dynamical nature of Grails adds the necessary properties, you could also write it as&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class Author {&lt;br /&gt;   static hasMany = [ books : Book ]&lt;br /&gt;   String name&lt;br /&gt;   Set books&lt;br /&gt;}&lt;br /&gt;class Book {&lt;br /&gt;   static belongsTo = [author:Author]&lt;br /&gt;   Author author&lt;br /&gt;   String title&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;There are 2 aspects to this domain model&lt;br /&gt;&lt;ol&gt;&lt;li&gt;object relations: an author has a set of books&lt;br /&gt;&lt;/li&gt;&lt;li&gt;constraints: you have to make sure that a book really has an author (except when you define this property as nullable, which is also a contraint in this sense)&lt;/li&gt;&lt;/ol&gt;This simple domain model has got an interessting implication when mapping it to a repository:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the one-to-many relation author vs. books would typically be mapped by a hierarchical manner, e.g.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/authors&lt;br /&gt;    /stephen king&lt;br /&gt;         /books&lt;br /&gt;             /Misery&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the constraints, on the other hand would mean to add a structure to the repository by, e.g., defining node types. I think, that's what David &lt;a href="http://wiki.apache.org/jackrabbit/DavidsModel#head-7e1bea156cb9b0a91a9cac70cb5bea80f45372b8"&gt;means&lt;/a&gt;. Might be nice to have (I personally don't mind structure), but is not mandatory&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Conclusion? I think what can be said is that thinking &lt;a href="http://www.betaversion.org/%7Estefano/linotype/news/93/"&gt;"data first"&lt;/a&gt;  might lead to an ever more relaxed approach of defining domain models than Grails/GORM already has today ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-1925292410456121106?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/1925292410456121106/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=1925292410456121106' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1925292410456121106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/1925292410456121106'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/03/transition-from-orm-to-jcr-modeling.html' title='Transition from ORM to JCR modeling'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-3188716039981042431</id><published>2008-03-17T09:42:00.000-07:00</published><updated>2008-03-17T22:54:37.298-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><title type='text'>A Use Case for JCR</title><content type='html'>A creepy thing, this &lt;a href="http://jackrabbit.apache.org/"&gt;JCR &lt;/a&gt;stuff. Once into your head, you start to see possibilities. And the alternatives (good ol'e RDBMs, for example) start to look... bleak ... boring ... so 2004 ...&lt;br /&gt;&lt;br /&gt;Imagine you are in responsibility of a, say, control system, with which different applications having impact on the books of your company have to answer to a catalogue of risk control questions.&lt;br /&gt;&lt;br /&gt;So you are responsible for the move from excel sheet to web application. Ok, so you start designing your domain model, all easy, all smooth. But wait: those controls have got the tendency to &lt;span style="font-weight: bold;"&gt;change&lt;/span&gt;, but the respective application owner have to answer to a certain &lt;span style="font-weight: bold;"&gt;version&lt;/span&gt; of your control catalogue. Additional feedback for proposed changes to the controls have to be kept in a separate &lt;span style="font-weight: bold;"&gt;branch &lt;/span&gt;of your risk catalogue, which then will be &lt;span style="font-weight: bold;"&gt;merged&lt;/span&gt; with the &lt;span style="font-weight: bold;"&gt;trunk &lt;/span&gt;of your catalogue.&lt;br /&gt;&lt;br /&gt;You see where it is going. This describes only one aspect of the &lt;a href="http://www.day.com/maven/jsr170/javadocs/jcr-1.0/"&gt;JCR API&lt;/a&gt;, which simply is included. Of course you could implement it by using another repository product (e.g. &lt;a href="http://svnkit.com/"&gt;svn&lt;/a&gt;), but this is not the point. The point is that the need for a content repository is inherent to several reappearing use cases for software systems design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-3188716039981042431?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/3188716039981042431/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=3188716039981042431' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/3188716039981042431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/3188716039981042431'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/03/use-case-for-jcr.html' title='A Use Case for JCR'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-7738696483114561886</id><published>2008-03-15T00:20:00.000-07:00</published><updated>2008-03-15T02:27:15.142-07:00</updated><title type='text'>So many things to do, so little time?</title><content type='html'>The java ecosystem has a huge selections of mainly open source web frameworks.&lt;br /&gt;&lt;br /&gt;What I am wondering is:  when does the sheer amount of options to choose from have an impact&lt;br /&gt;&lt;ul&gt;&lt;li&gt;on the developer&lt;/li&gt;&lt;li&gt;on the respecitve web frameworks&lt;/li&gt;&lt;li&gt;on the ecosystem itself?&lt;/li&gt;&lt;/ul&gt;I remember having read about studies where putting more than 5 (?) variations of the same product has a  counterproductive impact on sales figures, at least for daily goods.&lt;br /&gt;&lt;br /&gt;The same should be valid for the developer who has to choose a web framework for the next project. And it is not only the developer: even an advanced managment can loose patience when the 10th web framework is presented as "The Solution". So the impact might be on the ecosystem itself, insofar as that ASP.NET still does not have too many alternatives (things are changing there too)&lt;br /&gt;&lt;br /&gt;Another point to consider is the fact that time is sparse also for potential web framework developers and community members. The abundance of high quality php-based CMS is a contradiction to this argument, so this might not be too big an issue.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Solutions?&lt;br /&gt;&lt;br /&gt;Hard to say. It's hard to imagine, as example, to merge &lt;a href="http://tapestry.apache.org"&gt;Tapestry&lt;/a&gt; and &lt;a href="http://wicket.apache.org"&gt;Wicket&lt;/a&gt;. Perhaps the &lt;a href="http://springframework.org/"&gt;Spring&lt;/a&gt; way to divide an conquer might be  a solution. A good example is &lt;a href="http://grails.org"&gt;Grails,&lt;/a&gt; which allows to use Wicket as presentation framework. On the other hand this leads to even more choices: use Wicket OR Grails changes to use Wicket AND/OR Grails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-7738696483114561886?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/7738696483114561886/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=7738696483114561886' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7738696483114561886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/7738696483114561886'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/03/so-many-things-to-do-so-little-time.html' title='So many things to do, so little time?'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7603905557430854104.post-6492224845299184427</id><published>2008-03-15T00:14:00.000-07:00</published><updated>2008-03-15T00:19:57.267-07:00</updated><title type='text'>Hello World!</title><content type='html'>Yet another blogger, yet another perspective on high tech trends.&lt;br /&gt;&lt;br /&gt;Currently on my radar:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jackrabbit.apache.org"&gt;JCR&lt;/a&gt; : Content repositories&lt;/li&gt;&lt;li&gt;&lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;/&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;: Next-Gen JVM Language/Web Framework&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7603905557430854104-6492224845299184427?l=n1ceone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://n1ceone.blogspot.com/feeds/6492224845299184427/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7603905557430854104&amp;postID=6492224845299184427' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/6492224845299184427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7603905557430854104/posts/default/6492224845299184427'/><link rel='alternate' type='text/html' href='http://n1ceone.blogspot.com/2008/03/hello-world.html' title='Hello World!'/><author><name>Chrigel</name><uri>http://www.blogger.com/profile/05227615949751525227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
