<?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-391420546418472250</id><updated>2012-02-17T04:36:30.684+01:00</updated><category term='Rich'/><category term='jcr'/><category term='Bean'/><category term='emf'/><category term='generic'/><category term='ecore'/><category term='Hibernate'/><category term='tmf'/><category term='Emma'/><category term='Build'/><category term='OSGI'/><category term='Tutorial'/><category term='Client'/><category term='Module'/><category term='postprocessor'/><category term='Equinox'/><category term='Hudson'/><category term='JUnit'/><category term='Spring'/><category term='beautifier'/><category term='Application'/><category term='repository'/><category term='m2t'/><category term='riena'/><category term='xml'/><category term='jackrabbit'/><category term='Service'/><category term='java'/><category term='Server'/><category term='nebula'/><category term='version'/><category term='DM'/><category term='JavaDoc'/><category term='swt'/><category term='Buckminster'/><category term='galileo'/><category term='RCP'/><category term='Springframework'/><category term='Eclipse'/><category term='Dynamic'/><category term='dao'/><category term='mwe'/><category term='subselect'/><category term='modeling'/><category term='openarchitectureware'/><category term='datetime'/><category term='generation'/><category term='teneo'/><category term='content'/><category term='widget'/><category term='oaw'/><title type='text'>Swiss Software Development</title><subtitle type='html'>A blog about Java, OSGi, Eclipse and lots of other related technologies.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-5248395237636093418</id><published>2010-03-28T23:12:00.005+02:00</published><updated>2010-03-29T00:10:49.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emma'/><category scheme='http://www.blogger.com/atom/ns#' term='Hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaDoc'/><category scheme='http://www.blogger.com/atom/ns#' term='JUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Buckminster'/><title type='text'>Running JavaDoc/JUnit/Emma on Hudson using Buckminster</title><content type='html'>Last week I wrote about "&lt;a href="http://swissdev.blogspot.com/2010/03/building-products-with.html"&gt;Building Products with Buckminster/Hudson&lt;/a&gt;", today I want to share some of my experience about my JavaDoc job, running JUnit tests and Emma code coverage.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JavaDoc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My goal was to generate JavaDoc for our framework softmodeler and the server/client application.&lt;br /&gt;&lt;br /&gt;A short overview about the checkout sources:&lt;br /&gt;${workspace}/source/softmodeler/plugins&lt;br /&gt;${workspace}/source/scodi-server/plugins&lt;br /&gt;${workspace}/source/scodi-rcp/plugins&lt;br /&gt;&lt;br /&gt;To prevent errors (some errors prevent JavaDoc from creating the index.html and related files) it's important to set the classpath, in my case the target platform. So I pass the location of the target platform and use a fileset to get all the jars together. This path is then referred using &lt;span style="font-style: italic;"&gt;classpathref="files-classpath"&lt;/span&gt; in the javadoc call.&lt;br /&gt;&lt;br /&gt;If you get errors about too long filenames and such, make sure you use &lt;span style="font-style: italic;"&gt;useexternalfile="true"&lt;/span&gt;, more information on that &lt;a href="http://osflash.org/pipermail/red5commits_osflash.org/2006-September/000931.html"&gt;here&lt;/a&gt;.&lt;br /&gt;For the actual Javadoc task I use a bunch of filesets, excluding some unwanted packages.&lt;br /&gt;&lt;br /&gt;Here the ant "create.javadoc" target:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;target name="create.javadoc" description="Generate the JavaDoc for the sources"&amp;gt;&lt;br /&gt; &amp;lt;echo message="javadoc source ${source}"&amp;gt;&amp;lt;/echo&amp;gt;&lt;br /&gt; &amp;lt;echo message="javadoc destination ${javadoc.output}"&amp;gt;&amp;lt;/echo&amp;gt;&lt;br /&gt; &amp;lt;echo message="target platform ${target.platform}"&amp;gt;&amp;lt;/echo&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- set target platform as classpath --&amp;gt;&lt;br /&gt; &amp;lt;path id="files-classpath"&amp;gt;&lt;br /&gt;  &amp;lt;fileset dir="${target.platform}"&amp;gt;&lt;br /&gt;   &amp;lt;include name="*.jar"/&amp;gt;&lt;br /&gt;  &amp;lt;/fileset&amp;gt;&lt;br /&gt; &amp;lt;/path&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- clean and create output location --&amp;gt;&lt;br /&gt; &amp;lt;delete dir="${javadoc.output}"/&amp;gt;&lt;br /&gt; &amp;lt;mkdir dir="${javadoc.output}"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- generate the javadoc --&amp;gt;&lt;br /&gt; &amp;lt;javadoc&lt;br /&gt;  destdir="${javadoc.output}"&lt;br /&gt;  classpathref="files-classpath"&lt;br /&gt;  maxmemory="1024m"&lt;br /&gt;  source="1.6"&lt;br /&gt;  useexternalfile="true"&lt;br /&gt;  author="true"&lt;br /&gt;  version="true"&lt;br /&gt;  use="true"&lt;br /&gt;  windowtitle="Scodi/Softmodeler Documentation"&amp;gt;&lt;br /&gt;   &amp;lt;!-- link external APIs --&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://java.sun.com/javase/6/docs/api/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://www.osgi.org/javadoc/r4v42/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://help.eclipse.org/galileo/topic/org.eclipse.platform.doc.isv/reference/api/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://download.eclipse.org/modeling/emf/emf/javadoc/2.5.0/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://docs.huihoo.com/javadoc/jboss/jbpm/4.1/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://technology-related.com/javaee/5/docs/api/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://docs.jboss.org/hibernate/stable/core/api/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://docs.jboss.org/hibernate/stable/annotations/api/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://docs.jboss.org/hibernate/stable/entitymanager/api/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://jackrabbit.apache.org/api/1.4/"/&amp;gt;&lt;br /&gt;   &amp;lt;link offline="false" href="http://www.day.com/maven/jsr170/javadocs/jcr-1.0/"/&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;!-- softmodeler sources --&amp;gt;&lt;br /&gt;   &amp;lt;fileset dir="${source}/softmodeler/plugins/" defaultexcludes="true"&amp;gt;&lt;br /&gt;    &amp;lt;include name="**/*.java"/&amp;gt;&lt;br /&gt;    &amp;lt;exclude name="**/org/**"/&amp;gt;&lt;br /&gt;    &amp;lt;exclude name="**/net/**"/&amp;gt;&lt;br /&gt;    &amp;lt;exclude name="**/test/**"/&amp;gt;&lt;br /&gt;   &amp;lt;/fileset&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;!-- scodi sources --&amp;gt;&lt;br /&gt;   &amp;lt;fileset dir="${source}/scodi-server/plugins/"&amp;gt;&lt;br /&gt;    &amp;lt;include name="**/*.java"/&amp;gt;&lt;br /&gt;    &amp;lt;exclude name="**/test/**"/&amp;gt;&lt;br /&gt;   &amp;lt;/fileset&amp;gt;&lt;br /&gt;   &amp;lt;fileset dir="${source}/scodi-rcp/plugins/"&amp;gt;&lt;br /&gt;    &amp;lt;include name="**/*.java"/&amp;gt;&lt;br /&gt;    &amp;lt;exclude name="**/test/**"/&amp;gt;&lt;br /&gt;    &amp;lt;exclude name="ch.scodi.mig/**"/&amp;gt;&lt;br /&gt;   &amp;lt;/fileset&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;bottom&amp;gt;&amp;lt;![CDATA[&amp;lt;i&amp;gt;Copyright © 2007 henzler informatik gmbh, CH-4106 Therwil&amp;lt;/i&amp;gt;]]&amp;gt;&amp;lt;/bottom&amp;gt;&lt;br /&gt; &amp;lt;/javadoc&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To be able to launch the ant task from Buckminster I had to add the following action to buckminster.cspex:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;cs:public name="create.javadoc" actor="ant"&amp;gt;&lt;br /&gt;  &amp;lt;cs:actorproperties&amp;gt;&lt;br /&gt;      &amp;lt;cs:property key="buildFile" value="build/javadoc.ant"&amp;gt;&lt;br /&gt;      &amp;lt;cs:property key="targets" value="create.javadoc"&amp;gt;&lt;br /&gt;  &amp;lt;/cs:property&amp;gt;&lt;br /&gt;  &amp;lt;cs:properties&amp;gt;&lt;br /&gt;      &amp;lt;cs:property key="source" value="${workspace}source"&amp;gt;&lt;br /&gt;      &amp;lt;cs:property key="javadoc.output" value="${workspace}javadoc"&amp;gt;&lt;br /&gt;  &amp;lt;/cs:property&amp;gt;&lt;br /&gt;&amp;lt;/cs:property&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Hudson job then needs to checkout the source and run a build step "Run Buckminster":&lt;br /&gt;&lt;br /&gt;import '${WORKSPACE}source/scodi-rcp/features/ch.scodi.client.site/site.cquery'&lt;br /&gt;&lt;br /&gt;perform -D workspace=${WORKSPACE} -D target.platform=${WORKSPACE}../../target.platform/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/ ch.scodi.client.site#create.javadoc&lt;br /&gt;&lt;br /&gt;I know the target.platform path is ugly, didn't find a pre-defined variable. Tried ${targetPlatformPath} but that somehow didn't work, any hints?&lt;br /&gt;&lt;br /&gt;You then can publish the JavaDoc using the "Post-Build-Action".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Junit &amp;amp; Emma&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Buckminster provides the command "junit" which allows you to launch "JUnit Plug-In Tests". This is a really great feature, because you can run tests in your eclipse environment very easy.&lt;br /&gt;I ran into some problems because my launch file was not found, the launch needs to be within your workspace (not your checkout sources).&lt;br /&gt;I imported my product site.query and did not realize that my test feature (containing the launch file) was not part of that. So additionally I had to import my test feature (see below) and it worked.&lt;br /&gt;&lt;br /&gt;import '${WORKSPACE}source/scodi-server/features/ch.scodi.server.site/site.cquery'&lt;br /&gt;import '${WORKSPACE}source/scodi-server/features/ch.scodi.server.test.site/site.cquery'&lt;br /&gt;&lt;br /&gt;build&lt;br /&gt;&lt;br /&gt;perform -D target.os=* -D target.ws=* -D target.arch=* -D qualifier.replacement.*=${version} ch.scodi.server.site#site.p2&lt;br /&gt;perform -D target.os=win32 -D target.ws=win32 -D target.arch=x86 ch.scodi.server.site#create.product.zip&lt;br /&gt;&lt;br /&gt;junit -l '/ch.scodi.server.test.site/ScodiServerTest.launch' -o '${WORKSPACE}output/junit_result.xml'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There is a "Post-Build-Action" to publish JUnit results. It somehow does not work with the generated output and caused my build to fail.&lt;br /&gt;A great alternative is the "&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Performance+Plugin"&gt;Performance Plugin&lt;/a&gt;", which publishes your result and also performance trends.&lt;br /&gt;&lt;br /&gt;Martin Taal, founder and lead of the &lt;a href="http://www.eclipse.org/modeling/emf/?project=teneo"&gt;EMF Teneo&lt;/a&gt; project, wrote a very useful &lt;a href="http://wiki.eclipse.org/Teneo/Teneo_Build_Setup"&gt;wiki article&lt;/a&gt; about Teneo building with Buckminster and Hudson.&lt;br /&gt;Interesting for me was the Emma part.&lt;br /&gt;To get Emma coverage reports do the following:&lt;br /&gt;- Install the &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Emma+Plugin"&gt;Emma Plug-In&lt;/a&gt;&lt;br /&gt;- Install org.eclipse.buckminster.emma.headless.feature.feature.group to the Buckminster installation&lt;br /&gt;- change the "junit" command to "emma"&lt;br /&gt;- add an additional paramter for the coverage report&lt;br /&gt;- Your done. Awesome!!!&lt;br /&gt;&lt;br /&gt;emma -l '/ch.scodi.server.test.site/ScodiServerTest.launch' -o '${WORKSPACE}output/junit_result.xml' --xml '${WORKSPACE}/output/coverage_report.xml' --flatXML&lt;br /&gt;&lt;br /&gt;The Emma "Post-Build-Action" then publishes your coverage report.&lt;br /&gt;&lt;br /&gt;Buckminster and Hudson, a great combination which makes releng of eclipse based products so much easier. Thanks to the Buckminster team!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-5248395237636093418?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/5248395237636093418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=5248395237636093418' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/5248395237636093418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/5248395237636093418'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2010/03/running-javadocjunitemma-on-hudson.html' title='Running JavaDoc/JUnit/Emma on Hudson using Buckminster'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-2358350793847484270</id><published>2010-03-26T01:33:00.007+01:00</published><updated>2010-03-26T02:27:04.898+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Build'/><category scheme='http://www.blogger.com/atom/ns#' term='Hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Buckminster'/><title type='text'>Building Products with Buckminster/Hudson</title><content type='html'>I just finished setting up our Buckminster/Hudson build server. Due to lack of documentation it was a real struggle, sharing some of my experience may help other developers.&lt;br /&gt;&lt;br /&gt;I used &lt;a href="http://www.ralfebert.de/blog/eclipsercp/rcp_builds/"&gt;Ralf's tutorial&lt;/a&gt; to get an good overview about the topic, great blog.&lt;br /&gt;&lt;br /&gt;First up some information about the project I'm working on. It's a server-client application (two separated products) called scodi, which is based on our framework softmodeler. For a more detailed overview you can read my &lt;a href="http://swissdev.blogspot.com/2009/12/2009.html"&gt;previous post&lt;/a&gt;, if your interested.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Target Platform&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How to setup Hudson and Buckminster can be read in Ralf's tutorial. Little tip, to prevent OutOfMemoryErrors, add -Xmx1024m to the "additional parameters" of your Buckminster installation (see &lt;span id="summary_alias_container"&gt;&lt;span id="short_desc_nonedit_display"&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=306102"&gt;troubleshooting  tip Hudson out of memory&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I have a separated free style job to publish my target platform for other jobs. In the "Source-Code-Management" section I checkout the feature which contains my target defintion (in my case ch.scodi.client.site).&lt;br /&gt;To actually resolve the target definition, I added a build step "Run Buckminster" with the following command:&lt;br /&gt;importtargetdefinition -A '${WORKSPACE}ch.scodi.client.site/TargetDefinition.target'&lt;br /&gt;&lt;br /&gt;In the "Post-Build-Action" checked "Archive and publish an Eclipse Target Platform" and added ".metadata/.plugins/org.eclipse.pde.core/.bundle_pool" as path.&lt;br /&gt;&lt;br /&gt;Consider that the TargetDefinition can not resolve directory locations. My target definition used to have a directory location containing bundles from the &lt;a href="http://www.springsource.com/repository/app/"&gt;springsource&lt;/a&gt; repository.&lt;br /&gt;I tried using the rmap file to get the bundles during materialization but had some trouble with that, so I decided to create an own update site for those bundles and add this site to the target definition. More on that can be found here: &lt;a href="http://www.eclipse.org/forums/index.php?t=msg&amp;amp;th=164508&amp;amp;start=0&amp;amp;"&gt;http://www.eclipse.org/forums/index.php?t=msg&amp;amp;th=164508&amp;amp;start=0&amp;amp; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Building the Product&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After the target definition job is run, we can start building the products.&lt;br /&gt;This is pretty straight forward, see Ralf's tutorial on how to checkout your source from SVN.&lt;br /&gt;I have three different builds for each, server and client product: Integration, Nightly and Release.&lt;br /&gt;For each build the plug-in qualifier should be different (e.g. I20100326-2, N20100326, R20100326-01).&lt;br /&gt;To accomplish this I installed the flowing plug-in: &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Version+Number+Plugin"&gt;http://wiki.hudson-ci.org/display/HUDSON/Version+Number+Plugin&lt;/a&gt;&lt;br /&gt;In the integration job I choose "Create a formatted version number" name it "version" and use something like this "I${BUILD_YEAR, XXXX}${BUILD_MONTH, XX}${BUILD_DAY, XX}-${BUILDS_TODAY}" as format.&lt;br /&gt;&lt;br /&gt;To finally build the client product I added a Buckminster build step, selected the previously published target platform and used the following as commands:&lt;br /&gt;import '${WORKSPACE}source/scodi-rcp/features/ch.scodi.client.site/site.cquery'&lt;br /&gt;&lt;br /&gt;build&lt;br /&gt;&lt;br /&gt;perform -D target.os=* -D target.ws=* -D target.arch=* -D qualifier.replacement.*=${version} ch.scodi.client.site#site.p2.zip&lt;br /&gt;perform -D target.os=win32 -D target.ws=win32 -D target.arch=x86 ch.scodi.client.site#create.product.zip&lt;br /&gt;perform -D target.os=win32 -D target.ws=win32 -D target.arch=x86_64 ch.scodi.client.site#create.product.zip&lt;br /&gt;&lt;br /&gt;Notice qualifier.replacement.*=${version}, this tells Buckminster/Eclipse to use my formated version as qualifier and results in plug-ins named like this "com.softmodeler.model_1.0.0.I20100325-3.jar", requires that Bundle-Version: 1.0.0.qualifier is defined in the bundle manifest.&lt;br /&gt;&lt;br /&gt;Ok this post is getting long and I'm tired.&lt;br /&gt;I will post some more next week about my JavaDoc build and running JUnit Tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-2358350793847484270?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/2358350793847484270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=2358350793847484270' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/2358350793847484270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/2358350793847484270'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2010/03/building-products-with.html' title='Building Products with Buckminster/Hudson'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-8946997611300096782</id><published>2009-12-30T11:26:00.004+01:00</published><updated>2009-12-30T12:22:50.390+01:00</updated><title type='text'>2009</title><content type='html'>2009 is ending, time to look back at a productive and very interesting year.&lt;br /&gt;&lt;br /&gt;As mentioned in earlier posts, I'm working on a software called Scodi which is currently released as version 3.4.x.&lt;br /&gt;For the next version 4.0, we dumped all the old code and rebuild the whole software using new and "fancy" technologies.&lt;br /&gt;Version 3.4 was a fat RCP client, version 4.0 will be a server-client application.&lt;br /&gt;&lt;br /&gt;That said, I had the pleasure to integrate a lot of amazing frameworks and APIs into our new software.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://eclipse.org/modeling/emf/"&gt;EMF&lt;/a&gt; to model our business objects, &lt;a href="http://eclipse.org/modeling/emf/?project=teneo"&gt;Teneo&lt;/a&gt; and &lt;a href="https://www.hibernate.org/"&gt;Hibernate&lt;/a&gt; to persist those objects.&lt;br /&gt;The &lt;a href="http://www.springsource.org/"&gt;Spring framework&lt;/a&gt; to create our beans and register some of them as OSGi services, &lt;a href="http://eclipse.org/riena/"&gt;Riena&lt;/a&gt; to publish them for remote access.&lt;br /&gt;&lt;a href="http://jackrabbit.apache.org/"&gt;Apache Jackrabbit&lt;/a&gt; to store and version some of our data.&lt;br /&gt;&lt;a href="http://www.jboss.com/products/jbpm/"&gt;jBPM&lt;/a&gt; to handle workflows (e.g. data that is being committed needs to be reviewed by certain users) and a &lt;a href="http://eclipse.org/mylyn/"&gt;Mylyn&lt;/a&gt; connector to handle those user tasks.&lt;br /&gt;&lt;br /&gt;This November I took a look at &lt;a href="http://www.eclipse.org/modeling/gmf/"&gt;GMF&lt;/a&gt; to build our Process Flow designer, the designer itself will be developed by another company.&lt;br /&gt;&lt;br /&gt;Towards the end of this year I cleaned out our &lt;a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform"&gt;RCP&lt;/a&gt; client to make it &lt;a href="http://eclipse.org/rap/"&gt;RAP&lt;/a&gt; ready as we have a web part of our software.&lt;br /&gt;The EMF based UI framework which I built last year, uses RCP and SWT per default. The framework works on the web now including databinding, field decorations and such. RAP is great and single sourcing a blessing :-).&lt;br /&gt;&lt;br /&gt;Using all these technologies I reported about 30-40 bugs I hope to soon find more time to contribute back to the open source community. My project on sourceforge.net "&lt;a href="http://workreporter.sourceforge.net/"&gt;workreporter&lt;/a&gt;" didn't get any commits this year, I was fully concentrating on Scodi.&lt;br /&gt;&lt;br /&gt;It was a busy year and I'm looking forward to release version 4.0 in 2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-8946997611300096782?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/8946997611300096782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=8946997611300096782' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8946997611300096782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8946997611300096782'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/12/2009.html' title='2009'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-5388736488865893329</id><published>2009-12-24T16:06:00.002+01:00</published><updated>2009-12-25T14:11:23.690+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Override Eclipse Key Binding</title><content type='html'>A few weeks back is was struggling with an Eclipse key binding problem. I had to override the CTRL+S binding. Since I had my own "org.eclipse.ui.bindings" extension, I keept on getting conflict messages (no wonder).&lt;br /&gt;So I thought I'll make a post as personal reference and maybe it helps some other developer.&lt;br /&gt;&lt;br /&gt;This is what I did in ApplicationActionBarAdvisor.makeActions().&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;IBindingService bindingService = (IBindingService) window.getService(IBindingService.class);&lt;br /&gt;bindingService.addBindingManagerListener(new IBindingManagerListener() {&lt;br /&gt;   @Override&lt;br /&gt;   public void bindingManagerChanged(BindingManagerEvent event) {&lt;br /&gt;       BindingManager manager = event.getManager();&lt;br /&gt;       for (Binding binding : manager.getBindings()) {&lt;br /&gt;           ParameterizedCommand command = binding.getParameterizedCommand();&lt;br /&gt;           if (command != null &amp;amp;&amp;amp; ActionFactory.SAVE.getCommandId().equals(command.getId())) {&lt;br /&gt;               manager.removeBinding(binding);&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;IWorkbenchAction saveDocumentAction = ActionFactory.SAVE.create(window);&lt;br /&gt;saveDocumentAction.setId("saveDocument");&lt;br /&gt;saveDocumentAction.setActionDefinitionId(SAVE_DOCUMENT_COMMAND);&lt;br /&gt;&lt;br /&gt;register(saveDocumentAction);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-5388736488865893329?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/5388736488865893329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=5388736488865893329' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/5388736488865893329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/5388736488865893329'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/12/override-eclipse-key-binding.html' title='Override Eclipse Key Binding'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-1395716426433501026</id><published>2009-12-21T23:37:00.005+01:00</published><updated>2009-12-22T00:05:03.288+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'>SWT instead of AWT packages</title><content type='html'>Today I got annoyed using eclipse code completion to add a KeyAdapter on a SWT component. Instead of adding the SWT KeyAdapter (since it's a SWT widget), eclipse suggests the AWT KeyAdapter before the SWT KeyAdapter. The result of this is that I often choose the wrong one.&lt;br /&gt;Same thing with other classes like KeyListener, MouseListener...&lt;br /&gt;&lt;br /&gt;So I was looking for a solution, eclipse should ignore the java.awt package.&lt;br /&gt;I have not found a way to handle this for the whole workspace using preferences.&lt;br /&gt;I now exclude the java.awt package in all my UI bundles from their Java Build Path.&lt;br /&gt;&lt;br /&gt;Maybe you have had the same "trouble" and never thought about getting rid of it :-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GQDJZpS7TsU/Sy_8jUL3gxI/AAAAAAAAAD0/2D1NvpRlxJE/s1600-h/AccessRule.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 239px;" src="http://2.bp.blogspot.com/_GQDJZpS7TsU/Sy_8jUL3gxI/AAAAAAAAAD0/2D1NvpRlxJE/s400/AccessRule.png" alt="" id="BLOGGER_PHOTO_ID_5417826560394101522" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-1395716426433501026?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/1395716426433501026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=1395716426433501026' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/1395716426433501026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/1395716426433501026'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/12/swt-instead-of-awt-packages.html' title='SWT instead of AWT packages'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_GQDJZpS7TsU/Sy_8jUL3gxI/AAAAAAAAAD0/2D1NvpRlxJE/s72-c/AccessRule.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-9093058742575785416</id><published>2009-09-12T22:36:00.004+02:00</published><updated>2009-09-12T23:25:53.941+02:00</updated><title type='text'>Interview</title><content type='html'>At the beginning of this month, my employer (&lt;a href="http://www.henzler.com/" target="_blank"&gt;henzler informatik gmbh&lt;/a&gt;) sent out a newsletter to all our customers.&lt;br /&gt;Part of it was an interview with myself, about the development I'm involved with and about my working day.&lt;br /&gt;It's in German but if anybody is interested, here is the link:&lt;br /&gt;&lt;a href="http://www.henzler.com/news/200909/interviewfdo.html" target="_blank"&gt;SCODi 4P Newsletter September 2009: Interview mit Flavio Donzé&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Haven't been blogging lately, I'm really busy working on this version 4 of SCODi 4P.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scodi.ch" target="_blank"&gt;&lt;img src="http://3.bp.blogspot.com/_GQDJZpS7TsU/SqwQwkP-wSI/AAAAAAAAAC8/zX5a4FwLU8g/s320/scodilogo.png" alt="SCODi 4P" id="BLOGGER_PHOTO_ID_5380694081351368994" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-9093058742575785416?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/9093058742575785416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=9093058742575785416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/9093058742575785416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/9093058742575785416'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/09/interview.html' title='Interview'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_GQDJZpS7TsU/SqwQwkP-wSI/AAAAAAAAAC8/zX5a4FwLU8g/s72-c/scodilogo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-8110267074745048694</id><published>2009-07-12T22:19:00.003+02:00</published><updated>2009-07-12T22:28:53.641+02:00</updated><title type='text'>jBPM 4.0 is Out!</title><content type='html'>jBPM 4.0 was released last Friday, more infos on that can be found &lt;a href="http://processdevelopments.blogspot.com/2009/07/jbpm-40-is-out.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As read in the readme.html file, the two bugs I reported were fixed:&lt;br /&gt;&lt;br /&gt;[&lt;a href="https://jira.jboss.org/jira/browse/JBPM-2319"&gt;JBPM-2319&lt;/a&gt;] -         Finished executions are not changed to "ended" (they stay in the "active" state)&lt;br /&gt;[&lt;a href="https://jira.jboss.org/jira/browse/JBPM-2340"&gt;JBPM-2340&lt;/a&gt;] -         TaskService getTaskComments throws NullPointerException if the task is not found&lt;br /&gt;&lt;br /&gt;Thanks guys great work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-8110267074745048694?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/8110267074745048694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=8110267074745048694' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8110267074745048694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8110267074745048694'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/07/jbpm-40-is-out.html' title='jBPM 4.0 is Out!'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-8999382058092531940</id><published>2009-07-08T22:32:00.009+02:00</published><updated>2009-07-12T19:41:22.874+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openarchitectureware'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='mwe'/><category scheme='http://www.blogger.com/atom/ns#' term='galileo'/><category scheme='http://www.blogger.com/atom/ns#' term='m2t'/><category scheme='http://www.blogger.com/atom/ns#' term='tmf'/><title type='text'>Migrate oAW projects to Eclipse Galileo</title><content type='html'>As we all know, oAW moved into the Eclipse Galileo release.&lt;br /&gt;More information on that &lt;a href="http://www.eclipse.org/gmt/oaw/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The new projects can be found here:&lt;br /&gt;&lt;a href="http://www.eclipse.org/modeling/emft/?project=mwe"&gt;Modeling Workflow (MWE)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/modeling/m2t/"&gt;Model to Text (M2T)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/modeling/tmf/"&gt;Textual Modeling Framework (TMF)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the project I'm working on, we use EMF to generate the model objects and oAW to generate services for the generated objects, which then are published using &lt;a href="http://www.eclipse.org/riena"&gt;Eclipse Riena&lt;/a&gt;.&lt;br /&gt;After the Galileo release, I had to update my current oAW workflow using the new workflow components and dependencies.&lt;br /&gt;&lt;br /&gt;First I downloaded the required bundles for my target platform and IDE, you can get them from the Galileo update site.&lt;br /&gt;&lt;br /&gt;Galileo - http://download.eclipse.org/releases/galileo/&lt;br /&gt;&lt;br /&gt;&gt; Modeling&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MWE SDK&lt;/li&gt;&lt;li&gt;Xpand SDK&lt;/li&gt;&lt;li&gt;Xtext SDK&lt;/li&gt;&lt;/ul&gt;My generator plug-in now has the following dependencies:&lt;br /&gt;&lt;br /&gt;Bundles&lt;br /&gt;&lt;ul&gt;&lt;li&gt; org.eclipse.emf.mwe.core;bundle-version="0.7.0",&lt;/li&gt;&lt;li&gt; org.eclipse.emf.mwe.utils;bundle-version="0.7.0",&lt;/li&gt;&lt;li&gt; org.eclipse.xtend;bundle-version="0.7.0",&lt;/li&gt;&lt;li&gt; org.eclipse.xpand;bundle-version="0.7.0"&lt;/li&gt;&lt;/ul&gt;Packages&lt;br /&gt;&lt;ul&gt;&lt;li&gt; com.ibm.icu.text;version="4.0.1",&lt;/li&gt;&lt;li&gt; org.antlr.runtime;version="3.0.0",&lt;/li&gt;&lt;li&gt; org.eclipse.jdt.core,&lt;/li&gt;&lt;li&gt; org.osgi.framework,&lt;/li&gt;&lt;li&gt; org.slf4j;version="1.5.6"&lt;/li&gt;&lt;/ul&gt;Done that I renamed my workflow file from generator.oaw to generator.mwe.&lt;br /&gt;Now finally the changes I made on the file itself:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;old generator.oaw&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;workflow&amp;gt;&lt;br /&gt; &amp;lt;property file="workflow/settings.properties"/&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- properties set through the generator --&amp;gt;&lt;br /&gt; &amp;lt;property name="ecoreFile" value=""/&amp;gt;&lt;br /&gt; &amp;lt;property name="outputLocation" value=""/&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- set up EMF for standalone execution --&amp;gt;&lt;br /&gt; &amp;lt;bean class="org.eclipse.mwe.emf.StandaloneSetup" &amp;gt;&lt;br /&gt;  &amp;lt;platformUri value=".."/&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- load basic model and store it in slot 'model' --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.mwe.emf.Reader"&amp;gt;&lt;br /&gt;  &amp;lt;uri value="${ecoreFile}" /&amp;gt;&lt;br /&gt;  &amp;lt;modelSlot value="model" /&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Service Interfaces --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.openarchitectureware.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.m2t.type.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Service::interface FOREACH model.eClassifiers" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${serviceInterfaceSrc}" &amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.openarchitectureware.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- Service Objects --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.openarchitectureware.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.m2t.type.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Service::javaClass FOREACH model.eClassifiers" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInternalPackage" value="'${serviceInternalPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${serviceInternalSrc}"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.openarchitectureware.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- Service Properties File --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.openarchitectureware.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.m2t.type.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Service::properties FOR model" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInternalPackage" value="'${serviceInternalPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${serviceInternal}/META-INF/spring/"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="com.softmodeler.generator.postprocessor.XmlBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Test Cases --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.openarchitectureware.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.m2t.type.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Test::javaClass FOREACH model.eClassifiers" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="testPackage" value="'${testPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${testSrc}"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.openarchitectureware.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- All Tests Suite --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.openarchitectureware.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.m2t.type.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Test::allTests FOR model" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="testPackage" value="'${testPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${testSrc}"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.openarchitectureware.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;/workflow&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;new generator.mwe&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;workflow&amp;gt;&lt;br /&gt; &amp;lt;property file="workflow/settings.properties"/&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- properties set through the generator --&amp;gt;&lt;br /&gt; &amp;lt;property name="ecoreFile" value=""/&amp;gt;&lt;br /&gt; &amp;lt;property name="outputLocation" value=""/&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- set up EMF for standalone execution --&amp;gt;&lt;br /&gt; &amp;lt;bean class="org.eclipse.emf.mwe.utils.StandaloneSetup" &amp;gt;&lt;br /&gt;  &amp;lt;platformUri value=".."/&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- load model and store it in slot 'model' --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.emf.mwe.utils.Reader" uri="${ecoreFile}"&amp;gt;&lt;br /&gt;  &amp;lt;modelSlot value="model" /&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- first do some cleanup --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.emf.mwe.utils.DirectoryCleaner" directory="${outputLocation}${serviceInterfaceSrc}" /&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.emf.mwe.utils.DirectoryCleaner" directory="${outputLocation}${serviceInternalSrc}" /&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.emf.mwe.utils.DirectoryCleaner" directory="${outputLocation}${serviceInternal}" /&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.emf.mwe.utils.DirectoryCleaner" directory="${outputLocation}${testSrc}" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Service Interfaces --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Service::interface FOREACH model.eClassifiers" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${serviceInterfaceSrc}" &amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.eclipse.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Service Objects --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Service::javaClass FOREACH model.eClassifiers" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInternalPackage" value="'${serviceInternalPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${serviceInternalSrc}"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.eclipse.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- Service Properties File --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Service::properties FOR model" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInternalPackage" value="'${serviceInternalPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${serviceInternal}/META-INF/spring/"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="com.softmodeler.generator.postprocessor.XmlBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Test Cases --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Test::javaClass FOREACH model.eClassifiers" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="serviceInterfacePackage" value="'${serviceInterfacePackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="testPackage" value="'${testPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${testSrc}"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.eclipse.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- All Tests Suite --&amp;gt;&lt;br /&gt; &amp;lt;component class="org.eclipse.xpand2.Generator"&amp;gt;&lt;br /&gt;  &amp;lt;metaModel id="mm" class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;  &amp;lt;expand value="template::Test::allTests FOR model" /&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="testPackage" value="'${testPackage}'"/&amp;gt;&lt;br /&gt;  &amp;lt;globalVarDef name="productName" value="'${productName}'"/&amp;gt;&lt;br /&gt;  &amp;lt;outlet path="${outputLocation}${testSrc}"&amp;gt;&lt;br /&gt;   &amp;lt;postprocessor class="org.eclipse.xpand2.output.JavaBeautifier" /&amp;gt;&lt;br /&gt;  &amp;lt;/outlet&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;/workflow&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Basically only the namespace of the component classes changed.&lt;br /&gt;&lt;br /&gt;Ending the whole story I have to say that I launch the workflow in my application using the org.eclipse.emf.mwe.core.WorkflowRunner.run(...) which works fine.&lt;br /&gt;If I launch the workflow by itself "Run As -&gt; MWE Workflow" I get an strange&lt;br /&gt;"java.lang.ClassNotFoundException: org.eclipse.jface.text.BadLocationException" Exception, strange because I don't get why there should be an dependency on jface.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-8999382058092531940?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/8999382058092531940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=8999382058092531940' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8999382058092531940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8999382058092531940'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/07/eclipse-and-openarchitectureware.html' title='Migrate oAW projects to Eclipse Galileo'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-1123103872444912621</id><published>2009-05-22T12:41:00.013+02:00</published><updated>2009-05-22T17:15:50.068+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='version'/><category scheme='http://www.blogger.com/atom/ns#' term='jcr'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jackrabbit'/><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><category scheme='http://www.blogger.com/atom/ns#' term='content'/><title type='text'>Jackrabbit/JCR Versioning FAQ</title><content type='html'>There is not a lot of documentation about Jackrabbit/JCR versioning around. So I thought I could publish a little FAQ about JCR versioning.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;How do I make a Node versionable?&lt;/span&gt;&lt;br /&gt;&lt;code&gt;node.addMixin(JcrConstants.MIX_VERSIONABLE);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;How to get the current Version of a Node?&lt;/span&gt;&lt;br /&gt;&lt;code&gt;node.getBaseVersion();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;How do I increment the minor version of a Node?&lt;/span&gt;&lt;br /&gt;&lt;code&gt;node.checkout();&lt;br /&gt;node.setProperty("title", new StringValue("test"));&lt;br /&gt;getSession().save();&lt;br /&gt;node.checkin();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;How do I increment the major version of a Node?&lt;/span&gt;&lt;br /&gt;You can't, simple as that.&lt;br /&gt;&lt;a href="http://osdir.com/ml/apache.jackrabbit.devel/2005-10/msg00417.html"&gt;http://osdir.com/ml/apache.jackrabbit.devel/2005-10/msg00417.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;How to restore a node?&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;node.checkout();&lt;br /&gt;node.setProperty("title", new StringValue("test 2"));&lt;br /&gt;getSession().save();&lt;br /&gt;Version lastVersion = node.checkin();&lt;br /&gt;&lt;br /&gt;node.checkout();&lt;br /&gt;node.setProperty("title", new StringValue("test 3"));&lt;br /&gt;getSession().save();&lt;br /&gt;node.checkin();&lt;br /&gt;&lt;br /&gt;System.out.println("CURRENT: " + node.getProperty("title").getValue().getString());&lt;br /&gt;node.restore(lastVersion, true);&lt;br /&gt;System.out.println("RESTORED: " + node.getProperty("title").getValue().getString());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;output &lt;/span&gt;will be:&lt;br /&gt;CURRENT: test 3&lt;br /&gt;RESTORED: test 2&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;How do I iterate over all versions of a Node?&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;VersionIterator i = node.getVersionHistory().getAllVersions();&lt;br /&gt;i.skip(1); // important, otherwise the currentNode will fail to read the 'title' property&lt;br /&gt;while (i.hasNext()) {&lt;br /&gt; Version v = i.nextVersion();&lt;br /&gt; NodeIterator nodeIterator = v.getNodes();&lt;br /&gt; while (nodeIterator.hasNext()) {&lt;br /&gt;  Node currentNode = nodeIterator.nextNode();&lt;br /&gt;  System.out.println("Version: " + v.getName());&lt;br /&gt;  System.out.println(currentNode.getProperty("title").getValue().getString());&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Do I have to add JcrConstants.MIX_VERSIONABLE to my subnodes?&lt;/span&gt;&lt;br /&gt;No, changed subnodes are correctly stored under the version of the versionable Node.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;Node node = root.addNode(name);&lt;br /&gt;node.addMixin(JcrConstants.MIX_VERSIONABLE);&lt;br /&gt;node.setProperty("title", new StringValue("test 1"));&lt;br /&gt;Node subnode = node.addNode("subnode");&lt;br /&gt;subnode.setProperty("descr", "this is a description");&lt;br /&gt;getSession().save();&lt;br /&gt;node.checkin();&lt;br /&gt;&lt;br /&gt;node.checkout();&lt;br /&gt;subnode = node.getNode("subnode");&lt;br /&gt;subnode.setProperty("descr", "this is a NEW description");&lt;br /&gt;&lt;br /&gt;node.setProperty("title", new StringValue("test 2"));&lt;br /&gt;getSession().save();&lt;br /&gt;node.checkin();&lt;br /&gt;&lt;br /&gt;VersionIterator i = node.getVersionHistory().getAllVersions();&lt;br /&gt;i.skip(1);&lt;br /&gt;while (i.hasNext()) {&lt;br /&gt; Version v = i.nextVersion();&lt;br /&gt; NodeIterator nodeIterator = v.getNodes();&lt;br /&gt; while (nodeIterator.hasNext()) {&lt;br /&gt;  Node currentNode = nodeIterator.nextNode();&lt;br /&gt;  System.out.println("Version: " + v.getName());&lt;br /&gt;  System.out.println(currentNode.getProperty("title").getValue().getString());&lt;br /&gt;  if (currentNode.hasNodes()) {&lt;br /&gt;   for (NodeIterator childs = currentNode.getNodes(); childs.hasNext();) {&lt;br /&gt;    Node child = childs.nextNode();&lt;br /&gt;    System.out.println("Description: " + child.getProperty("descr").getValue().getString());&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OUTPUT&lt;/span&gt;:&lt;br /&gt;Version: 1.0&lt;br /&gt;test 1&lt;br /&gt;Description: this is a description&lt;br /&gt;Version: 1.1&lt;br /&gt;test 2&lt;br /&gt;Description: this is a NEW description&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;How can I export a Node and all it's Versions?&lt;/span&gt;&lt;br /&gt;That's not possible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;If I delete a Node will it's history be deleted as well?&lt;/span&gt;&lt;br /&gt;No you have to iterate over the versions and call VersionHistory.removeVersion(String versionName);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Usefull links:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.onjava.com/pub/a/onjava/2006/10/04/what-is-java-content-repository.html?page=1"&gt;http://www.onjava.com/pub/a/onjava/2006/10/04/what-is-java-content-repository.html?page=1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=170"&gt;http://jcp.org/en/jsr/detail?id=170&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-1123103872444912621?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/1123103872444912621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=1123103872444912621' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/1123103872444912621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/1123103872444912621'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/05/jackrabbitjcr-versioning-faq.html' title='Jackrabbit/JCR Versioning FAQ'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-8983078668560644637</id><published>2009-05-13T15:36:00.007+02:00</published><updated>2009-05-13T16:22:54.639+02:00</updated><title type='text'>jBPM Deploy Problem "no start activity in process"</title><content type='html'>I had a jBPM workflow engine running in my OSGi server environment.&lt;br /&gt;&lt;br /&gt;Then I updated from 4.0.0 Beta1 to 4.0.0 Beta2. Well there are quite a few changes. The "exclusive" tag turned into "decision" and yeah subprocesses are supported now!&lt;br /&gt;Check the readme.html in your jBPM directory for more details.&lt;br /&gt;&lt;br /&gt;Anyway why I write this blog entry is this little bastard. After the update I kept getting the following error message: &lt;span style="font-weight: bold;"&gt;error: no start activity in process&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After a little debugging I found the source of the problem. In your *.jpdl.xml file change&lt;br /&gt;&lt;code&gt;&amp;lt;process name="..." xmlns="http://jbpm.org/4/jpdl"&amp;gt;&lt;/code&gt;&lt;br /&gt;to&lt;br /&gt;&lt;code&gt;&amp;lt;process name="..." xmlns="http://jbpm.org/4.0/jpdl"&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Problem solved.&lt;/process&gt;&lt;/process&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-8983078668560644637?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/8983078668560644637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=8983078668560644637' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8983078668560644637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8983078668560644637'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/05/jbpm-startup-problem-no-start-activity.html' title='jBPM Deploy Problem &quot;no start activity in process&quot;'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-4476436108922703093</id><published>2009-03-16T22:28:00.006+01:00</published><updated>2009-03-16T23:02:12.648+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Client'/><category scheme='http://www.blogger.com/atom/ns#' term='teneo'/><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='riena'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='emf'/><title type='text'>Use EMF and Riena</title><content type='html'>EMF, Teneo and Riena are great Eclipse projects. Use EMF to model your business objects and generate the Java code, use Teneo to persist through Hibernate and Riena to transfer your objects to the Eclipse RCP client and back. Isn't that sexy!&lt;br /&gt;&lt;br /&gt;Nevertheless As I tried to use that setup, I ran into a few problems.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Transferring a 0...* reference causes an &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251501"&gt;Exception&lt;/a&gt;: java.util.ArrayList ([...]) cannot be assigned to org.eclipse.emf.common.util.EList&lt;/li&gt;&lt;li&gt;Registered Adapters (EObjectImpl:eAdapters) can not be passed over the wire and causes Exception&lt;/li&gt;&lt;li&gt;In some cases I had trouble transferring the EObjectImpl:eProperties attribute&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The way I figured to solve those issues, is the AbstractSerializerFactory.&lt;br /&gt;&lt;br /&gt;Through extension points I can register my own EObjectSerializerFactory which uses my Deserialiser/Serializer for all EObjects.&lt;br /&gt;My classes need to be in a "common" plug-in which is active on the server and client.&lt;br /&gt;Both the EObjectSerializer and EObjectDeserializer are based on the JavaSerializer/JavaDeserializer provided by Caucho.&lt;br /&gt;&lt;br /&gt;Basiclly all I do, is serializing the content of the EStructuralFeatures instead of serializing the Java fields.&lt;br /&gt;So this way eFlags, eAdapters, eContainer, eContainerFeatureID and eProperties (EObjectImpl fields) are not passed over the wire.&lt;br /&gt;I my case this works since I don't need the eContainer on the server.&lt;br /&gt;&lt;br /&gt;Here the classes, maybe they help you to use the same combination:&lt;br /&gt;&lt;b&gt;EObjectSerializerFactory.java&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;* $URL: $&lt;br /&gt;*&lt;br /&gt;* Copyright (c) 2007 henzler informatik gmbh, CH-4106 Therwil&lt;br /&gt;*******************************************************************************/&lt;br /&gt;package com.softmodeler.service.communication;&lt;br /&gt;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import org.eclipse.emf.ecore.EClass;&lt;br /&gt;import org.eclipse.emf.ecore.EClassifier;&lt;br /&gt;import org.eclipse.emf.ecore.EObject;&lt;br /&gt;import org.eclipse.emf.ecore.EPackage;&lt;br /&gt;&lt;br /&gt;import com.caucho.hessian.io.AbstractSerializerFactory;&lt;br /&gt;import com.caucho.hessian.io.Deserializer;&lt;br /&gt;import com.caucho.hessian.io.HessianProtocolException;&lt;br /&gt;import com.caucho.hessian.io.Serializer;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* EObjectSerializerFactory, provides a serializer and deserializer for EObjects&lt;br /&gt;*&lt;br /&gt;* @see EObjectSerializer&lt;br /&gt;* @see EObjectDeserializer&lt;br /&gt;* @author created by Author: fdo, last update by $Author: fdo $&lt;br /&gt;* @version $Revision: 1236 $, $Date: 2009-03-03 22:51:32 +0100 (Di, 03 Mrz 2009) $&lt;br /&gt;*/&lt;br /&gt;public class EObjectSerializerFactory extends AbstractSerializerFactory {&lt;br /&gt;/** class name suffix for implemented EClassifiers */&lt;br /&gt;private static final String CLASS_SUFFIX = "Impl"; //$NON-NLS-1$&lt;br /&gt;/** packages that should be excluded from reading */&lt;br /&gt;private static final String[] EXCLUDE_PACKAGE_NS_URI = new String[] { "http://www.eclipse.org/emf/2002/Ecore" }; //$NON-NLS-1$&lt;br /&gt;&lt;br /&gt;/** internal cache of all EClassifiers existing in the system, ClassifierName=&gt;EClassifier */&lt;br /&gt;private Map&lt;string, eclassifier=""&gt; allClassifiers = null;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Returns a map with all relevant EClassifiers&lt;br /&gt;*&lt;br /&gt;* @return map ClassifierName=&gt;EClassifier&lt;br /&gt;*/&lt;br /&gt;private Map&lt;string, eclassifier=""&gt; getAllClassifiers() {&lt;br /&gt;if (allClassifiers == null) {&lt;br /&gt;allClassifiers = new HashMap&lt;string, eclassifier=""&gt;();&lt;br /&gt;&lt;br /&gt;// iterate the EPackages and place all classifiers in the allClassifiers map&lt;br /&gt;for (Object value : EPackage.Registry.INSTANCE.values()) {&lt;br /&gt; if (value instanceof EPackage) {&lt;br /&gt;  EPackage ePackage = (EPackage) value;&lt;br /&gt;  if (isValidPackage(ePackage.getNsURI())) {&lt;br /&gt;   for (EClassifier eClassifier : ePackage.getEClassifiers()) {&lt;br /&gt;    allClassifiers.put(eClassifier.getName(), eClassifier);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return allClassifiers;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Returns true if the package is valid (not in the EXCLUDE_PACKAGE_NS_URI list)&lt;br /&gt;*&lt;br /&gt;* @param nsURI the package NameSpace URI&lt;br /&gt;* @return true if valid&lt;br /&gt;*/&lt;br /&gt;private boolean isValidPackage(String nsURI) {&lt;br /&gt;for (String excludePackage : EXCLUDE_PACKAGE_NS_URI) {&lt;br /&gt;if (excludePackage.equals(nsURI)) {&lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Returns the EClassifier for the passed Class&lt;br /&gt;*&lt;br /&gt;* @param cl&lt;br /&gt;* @return returns null if the class is not an EObject or not found in the EPackages&lt;br /&gt;*/&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;private EClass getClassifier(Class cl) {&lt;br /&gt;if (EObject.class.isAssignableFrom(cl)) {&lt;br /&gt;String name = cl.getSimpleName();&lt;br /&gt;if (name.endsWith(CLASS_SUFFIX)) {&lt;br /&gt; EClassifier classifier = getAllClassifiers().get(name.substring(0, name.indexOf(CLASS_SUFFIX)));&lt;br /&gt; if (classifier instanceof EClass) {&lt;br /&gt;  return (EClass) classifier;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;@Override&lt;br /&gt;public Deserializer getDeserializer(Class cl) throws HessianProtocolException {&lt;br /&gt;EClass classifier = getClassifier(cl);&lt;br /&gt;if (classifier != null) {&lt;br /&gt;return new EObjectDeserializer(classifier);&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;@Override&lt;br /&gt;public Serializer getSerializer(Class cl) throws HessianProtocolException {&lt;br /&gt;EClass classifier = getClassifier(cl);&lt;br /&gt;if (classifier != null) {&lt;br /&gt;return new EObjectSerializer(classifier);&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EObjectSerializer.java&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;* $URL: $&lt;br /&gt;*&lt;br /&gt;* Copyright (c) 2007 henzler informatik gmbh, CH-4106 Therwil&lt;br /&gt;*******************************************************************************/&lt;br /&gt;package com.softmodeler.service.communication;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.logging.Level;&lt;br /&gt;&lt;br /&gt;import org.eclipse.emf.ecore.EClass;&lt;br /&gt;import org.eclipse.emf.ecore.EClassifier;&lt;br /&gt;import org.eclipse.emf.ecore.EObject;&lt;br /&gt;import org.eclipse.emf.ecore.EStructuralFeature;&lt;br /&gt;import org.eclipse.emf.ecore.impl.EObjectImpl;&lt;br /&gt;&lt;br /&gt;import com.caucho.hessian.io.AbstractHessianOutput;&lt;br /&gt;import com.caucho.hessian.io.AbstractSerializer;&lt;br /&gt;import com.caucho.hessian.io.JavaSerializer;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Serializes EObjects, this class is based on the {@link JavaSerializer} instead of working with java fields,&lt;br /&gt;* {@link EStructuralFeature} are used to serialize the 'data' values of the {@link EObject}.&lt;br /&gt;&lt;br /&gt;* Java fields of the {@link EObjectImpl}; eAdapters, eFlags, eContainer, eContainerFeatureID and eProperties are&lt;br /&gt;* ignored&lt;br /&gt;*&lt;br /&gt;* @see JavaSerializer&lt;br /&gt;* @author created by Author: fdo, last update by $Author: fdo $&lt;br /&gt;* @version $Revision: 1151 $, $Date: 2009-02-25 22:47:19 +0100 (Mi, 25 Feb 2009) $&lt;br /&gt;*/&lt;br /&gt;public class EObjectSerializer extends AbstractSerializer {&lt;br /&gt;private List&lt;fieldserializer&gt; fieldSerializers;&lt;br /&gt;private List&lt;estructuralfeature&gt; fields;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* constructor&lt;br /&gt;*&lt;br /&gt;* @param classifier&lt;br /&gt;*/&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;public EObjectSerializer(EClass classifier) {&lt;br /&gt;fields = classifier.getEAllStructuralFeatures();&lt;br /&gt;fieldSerializers = new ArrayList&lt;fieldserializer&gt;();&lt;br /&gt;&lt;br /&gt;for (EStructuralFeature feature : fields) {&lt;br /&gt;if (!feature.isMany()) {&lt;br /&gt; EClassifier eDataType = feature.getEType();&lt;br /&gt; Class type = eDataType.getInstanceClass();&lt;br /&gt; fieldSerializers.add(getFieldSerializer(type));&lt;br /&gt;} else {&lt;br /&gt; fieldSerializers.add(ListFieldSerializer.SER);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;@Override&lt;br /&gt;public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {&lt;br /&gt;if (out.addRef(obj)) {&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Class cl = obj.getClass();&lt;br /&gt;&lt;br /&gt;int ref = out.writeObjectBegin(cl.getName());&lt;br /&gt;&lt;br /&gt;if (ref &lt; -1) {    writeObject10((EObject) obj, out);   } else {    if (ref == -1) {     writeDefinition20(out);     out.writeObjectBegin(cl.getName());    }     writeInstance((EObject) obj, out);   }  }   private void writeObject10(EObject obj, AbstractHessianOutput out) throws IOException {   for (int i = 0; i &lt; feature =" fields.get(i);" i =" 0;" feature =" fields.get(i);" ser =" new" value =" null;" value =" obj.eGet(feature);" ser =" new" value =" false;" value =" (Boolean)" ser =" new" value =" 0;" value =" (Integer)" ser =" new" value =" 0;" value =" (Long)" ser =" new" value =" 0;" value =" (Double)" ser =" new" value =" null;" value =" (String)" ser =" new" value =" null;" objvalue =" (List)" value =" new"&gt;&lt;/fieldserializer&gt;&lt;/estructuralfeature&gt;&lt;/fieldserializer&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EObjectDeserializer.java&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;* $URL: $&lt;br /&gt;*&lt;br /&gt;* Copyright (c) 2007 henzler informatik gmbh, CH-4106 Therwil&lt;br /&gt;*******************************************************************************/&lt;br /&gt;package com.softmodeler.service.communication;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import org.eclipse.emf.ecore.EClass;&lt;br /&gt;import org.eclipse.emf.ecore.EClassifier;&lt;br /&gt;import org.eclipse.emf.ecore.EObject;&lt;br /&gt;import org.eclipse.emf.ecore.EStructuralFeature;&lt;br /&gt;import org.eclipse.emf.ecore.impl.EObjectImpl;&lt;br /&gt;import org.eclipse.emf.ecore.util.EcoreUtil;&lt;br /&gt;&lt;br /&gt;import com.caucho.hessian.io.AbstractHessianInput;&lt;br /&gt;import com.caucho.hessian.io.AbstractMapDeserializer;&lt;br /&gt;import com.caucho.hessian.io.HessianFieldException;&lt;br /&gt;import com.caucho.hessian.io.IOExceptionWrapper;&lt;br /&gt;import com.caucho.hessian.io.JavaDeserializer;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Deserializes EObjects, this class is based on the {@link JavaDeserializer} instead of working with java fields,&lt;br /&gt;* {@link EStructuralFeature} are used to deserialize the 'data' values of the {@link EObject}.&lt;br /&gt;&lt;br /&gt;* Java fields of the {@link EObjectImpl}; eAdapters, eFlags, eContainer, eContainerFeatureID and eProperties are&lt;br /&gt;* ignored&lt;br /&gt;*&lt;br /&gt;* @see JavaDeserializer&lt;br /&gt;* @author created by Author: fdo, last update by $Author: fdo $&lt;br /&gt;* @version $Revision: 1236 $, $Date: 2009-03-03 22:51:32 +0100 (Di, 03 Mrz 2009) $&lt;br /&gt;*/&lt;br /&gt;public class EObjectDeserializer extends AbstractMapDeserializer {&lt;br /&gt;private Map&lt;string, fielddeserializer=""&gt; fieldMap;&lt;br /&gt;private EClass classifier;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* constructor&lt;br /&gt;*&lt;br /&gt;* @param classifier&lt;br /&gt;*/&lt;br /&gt;public EObjectDeserializer(EClass classifier) {&lt;br /&gt;this.classifier = classifier;&lt;br /&gt;fieldMap = getFieldMap(classifier);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;@Override&lt;br /&gt;public Class getType() {&lt;br /&gt;return classifier.getInstanceClass();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public Object readMap(AbstractHessianInput in) throws IOException {&lt;br /&gt;try {&lt;br /&gt;EObject obj = instantiate();&lt;br /&gt;&lt;br /&gt;return readMap(in, obj);&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;throw e;&lt;br /&gt;} catch (RuntimeException e) {&lt;br /&gt;throw e;&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;throw new IOExceptionWrapper(classifier.getName() + ":" + e.getMessage(), e); //$NON-NLS-1$&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public Object readObject(AbstractHessianInput in, String[] fieldNames) throws IOException {&lt;br /&gt;try {&lt;br /&gt;Object obj = instantiate();&lt;br /&gt;return readObject(in, (EObject) obj, fieldNames);&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;throw e;&lt;br /&gt;} catch (RuntimeException e) {&lt;br /&gt;throw e;&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;throw new IOExceptionWrapper(classifier.getName() + ":" + e.getMessage(), e); //$NON-NLS-1$&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Object readMap(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;try {&lt;br /&gt;int ref = in.addRef(obj);&lt;br /&gt;&lt;br /&gt;while (!in.isEnd()) {&lt;br /&gt; Object key = in.readObject();&lt;br /&gt;&lt;br /&gt; FieldDeserializer deser = fieldMap.get(key);&lt;br /&gt;&lt;br /&gt; if (deser != null) {&lt;br /&gt;  deser.deserialize(in, obj);&lt;br /&gt; } else {&lt;br /&gt;  in.readObject();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;in.readMapEnd();&lt;br /&gt;&lt;br /&gt;in.setRef(ref, obj);&lt;br /&gt;return obj;&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;throw e;&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;throw new IOExceptionWrapper(e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Object readObject(AbstractHessianInput in, EObject obj, String[] fieldNames) throws IOException {&lt;br /&gt;try {&lt;br /&gt;int ref = in.addRef(obj);&lt;br /&gt;&lt;br /&gt;for (String name : fieldNames) {&lt;br /&gt; FieldDeserializer deser = fieldMap.get(name);&lt;br /&gt;&lt;br /&gt; if (deser != null) {&lt;br /&gt;  deser.deserialize(in, obj);&lt;br /&gt; } else {&lt;br /&gt;  in.readObject();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;in.setRef(ref, obj);&lt;br /&gt;return obj;&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;throw e;&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;throw new IOExceptionWrapper(obj.getClass().getName() + ":" + e, e); //$NON-NLS-1$&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* create an instance of the passed classifier&lt;br /&gt;*&lt;br /&gt;* @return&lt;br /&gt;* @throws Exception&lt;br /&gt;*/&lt;br /&gt;protected EObject instantiate() throws Exception {&lt;br /&gt;return EcoreUtil.create(classifier);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Creates a map featureName=&gt;FieldDeserializer.&lt;br /&gt;*/&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;protected Map&lt;string, fielddeserializer=""&gt; getFieldMap(EClass classifier) {&lt;br /&gt;Map&lt;string, fielddeserializer=""&gt; fieldMap = new HashMap&lt;string, fielddeserializer=""&gt;();&lt;br /&gt;&lt;br /&gt;for (EStructuralFeature feature : classifier.getEAllStructuralFeatures()) {&lt;br /&gt;if (feature.isTransient() || fieldMap.containsKey(feature.getName())) {&lt;br /&gt; continue;&lt;br /&gt;}&lt;br /&gt;FieldDeserializer deser;&lt;br /&gt;&lt;br /&gt;EClassifier eDataType = feature.getEType();&lt;br /&gt;Class type = eDataType.getInstanceClass();&lt;br /&gt;&lt;br /&gt;if (String.class.equals(type)) {&lt;br /&gt; deser = new StringFieldDeserializer(feature);&lt;br /&gt;} else if (byte.class.equals(type)) {&lt;br /&gt; deser = new ByteFieldDeserializer(feature);&lt;br /&gt;} else if (short.class.equals(type)) {&lt;br /&gt; deser = new ShortFieldDeserializer(feature);&lt;br /&gt;} else if (int.class.equals(type)) {&lt;br /&gt; deser = new IntFieldDeserializer(feature);&lt;br /&gt;} else if (long.class.equals(type)) {&lt;br /&gt; deser = new LongFieldDeserializer(feature);&lt;br /&gt;} else if (float.class.equals(type)) {&lt;br /&gt; deser = new FloatFieldDeserializer(feature);&lt;br /&gt;} else if (double.class.equals(type)) {&lt;br /&gt; deser = new DoubleFieldDeserializer(feature);&lt;br /&gt;} else if (boolean.class.equals(type)) {&lt;br /&gt; deser = new BooleanFieldDeserializer(feature);&lt;br /&gt;} else if (feature.isMany()) {&lt;br /&gt; deser = new EListDeserializer(feature);&lt;br /&gt;} else {&lt;br /&gt; deser = new ObjectFieldDeserializer(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fieldMap.put(feature.getName(), deser);&lt;br /&gt;}&lt;br /&gt;return fieldMap;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;abstract static class FieldDeserializer {&lt;br /&gt;protected EStructuralFeature feature;&lt;br /&gt;&lt;br /&gt;public FieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;this.feature = feature;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;abstract void deserialize(AbstractHessianInput in, EObject obj) throws IOException;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class EListDeserializer extends FieldDeserializer {&lt;br /&gt;&lt;br /&gt;EListDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;List value = null;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = (List) in.readObject(List.class);&lt;br /&gt; if (value.size() &gt; 0) {&lt;br /&gt;  obj.eSet(feature, value);&lt;br /&gt; }&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class ObjectFieldDeserializer extends FieldDeserializer {&lt;br /&gt;&lt;br /&gt;ObjectFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;Object value = null;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readObject(feature.getEType().getInstanceClass());&lt;br /&gt;&lt;br /&gt; if (value != null) {&lt;br /&gt;  obj.eSet(feature, value);&lt;br /&gt; }&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class BooleanFieldDeserializer extends FieldDeserializer {&lt;br /&gt;BooleanFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;boolean value = false;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readBoolean();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class ByteFieldDeserializer extends FieldDeserializer {&lt;br /&gt;ByteFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;int value = 0;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readInt();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class ShortFieldDeserializer extends FieldDeserializer {&lt;br /&gt;ShortFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;int value = 0;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readInt();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class IntFieldDeserializer extends FieldDeserializer {&lt;br /&gt;IntFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;int value = 0;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readInt();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class LongFieldDeserializer extends FieldDeserializer {&lt;br /&gt;LongFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;long value = 0;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readLong();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class FloatFieldDeserializer extends FieldDeserializer {&lt;br /&gt;FloatFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;double value = 0;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readDouble();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class DoubleFieldDeserializer extends FieldDeserializer {&lt;br /&gt;DoubleFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;double value = 0;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readDouble();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class StringFieldDeserializer extends FieldDeserializer {&lt;br /&gt;StringFieldDeserializer(EStructuralFeature feature) {&lt;br /&gt;super(feature);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;void deserialize(AbstractHessianInput in, EObject obj) throws IOException {&lt;br /&gt;String value = null;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt; value = in.readString();&lt;br /&gt;&lt;br /&gt; obj.eSet(feature, value);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt; logDeserializeError(feature, obj, value, e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void logDeserializeError(EStructuralFeature feature, Object obj, Object value, Throwable e)&lt;br /&gt;throws IOException {&lt;br /&gt;String fieldName = (feature.getContainerClass().getName() + "." + feature.getName()); //$NON-NLS-1$&lt;br /&gt;&lt;br /&gt;if (e instanceof HessianFieldException) {&lt;br /&gt;throw (HessianFieldException) e;&lt;br /&gt;} else if (e instanceof IOException) {&lt;br /&gt;throw new HessianFieldException(fieldName + ": " + e.getMessage(), e); //$NON-NLS-1$&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (value != null) {&lt;br /&gt;throw new HessianFieldException(fieldName + ": " + value.getClass().getName() + " (" + value + ")" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$&lt;br /&gt;  + " cannot be assigned to " + feature.getEType().getName()); //$NON-NLS-1$&lt;br /&gt;} else {&lt;br /&gt;throw new HessianFieldException(fieldName + ": " + feature.getEType().getName() //$NON-NLS-1$&lt;br /&gt;  + " cannot be assigned from null", e); //$NON-NLS-1$&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-4476436108922703093?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/4476436108922703093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=4476436108922703093' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/4476436108922703093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/4476436108922703093'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2009/03/use-emf-and-riena.html' title='Use EMF and Riena'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-8353322828048713123</id><published>2008-12-02T21:07:00.005+01:00</published><updated>2008-12-02T22:08:08.136+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='generic'/><category scheme='http://www.blogger.com/atom/ns#' term='subselect'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='emf'/><category scheme='http://www.blogger.com/atom/ns#' term='dao'/><title type='text'>Generic Hibernate DAO</title><content type='html'>I intended to create a post about Hibernate subselects, but I decided to post the whole Generic Hibernate DAO.&lt;br /&gt;&lt;br /&gt;A short briefing of the surrounding system.&lt;br /&gt;I have different child classes of "BasicObject" they all got an according "ObjectRef" which is a small object (id,name,locale) used as reference on the larger BasicObject (like in a tree or document content). The reference object and the BasicObject have the same id (UUID).&lt;br /&gt;The whole software is a server/client application using &lt;a href="http://www.eclipse.org/modeling/emf/"&gt;Eclipse EMF&lt;/a&gt; to model, generate and handle the business objects, &lt;a href="http://www.eclipse.org/riena/"&gt;Eclipse Riena&lt;/a&gt; for remoting and &lt;a href="http://hibernate.org/"&gt;Hibernate&lt;/a&gt;/&lt;a href="http://www.eclipse.org/modeling/emft/?project=teneo#teneo"&gt;Teneo&lt;/a&gt; for persistence. Ohh and for sure &lt;a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform"&gt;Eclipse RCP&lt;/a&gt; as client. Isn't the Eclipse movement great :-).&lt;br /&gt;&lt;br /&gt;To the subselects, I used them in the search(...) method.&lt;br /&gt;The search() restricts the select on BasicObject fields and returns a list of ObjectRefs. This saves us a lot of bandwidth since BasicObjects can have n fields of any size and the ObjectRef only has three.&lt;br /&gt;The first query (DetachedCriteria) which is restricted based on the BasicObject fields (i.e. name LIKE 'test' AND description LIKE 'Start%') is used to restrict the actual query on ObjectRef using the result (ids) of the DetachedCriteria query.&lt;br /&gt;&lt;br /&gt;As for the rest of the class, it's a Generic Hibernate Data Access Object even though the name ends in "Service". I just combined the Service and DAO, since in our case, it doesn't make sense to separate them.&lt;br /&gt;Maybe the create() method is a bit confusing, that's because we use the &lt;a href="http://www.eclipse.org/emf"&gt;Eclipse Modeling Framework&lt;/a&gt; to create the business objects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BasicObjectService.java&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt; * $RCSfile: $ Copyright (c) 2007 henzler informatik gmbh, CH-4106 Therwil&lt;br /&gt; *******************************************************************************/&lt;br /&gt;package com.softmodeler.service.impl;&lt;br /&gt;&lt;br /&gt;import java.lang.reflect.ParameterizedType;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Collections;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import javax.persistence.EntityManager;&lt;br /&gt;import javax.persistence.EntityTransaction;&lt;br /&gt;&lt;br /&gt;import org.eclipse.emf.ecore.EClass;&lt;br /&gt;import org.eclipse.emf.ecore.EPackage;&lt;br /&gt;import org.eclipse.emf.ecore.EStructuralFeature;&lt;br /&gt;import org.eclipse.emf.ecore.util.EcoreUtil;&lt;br /&gt;import org.hibernate.Criteria;&lt;br /&gt;import org.hibernate.Session;&lt;br /&gt;import org.hibernate.criterion.DetachedCriteria;&lt;br /&gt;import org.hibernate.criterion.Property;&lt;br /&gt;import org.hibernate.criterion.Restrictions;&lt;br /&gt;&lt;br /&gt;import com.softmodeler.model.BasicObject;&lt;br /&gt;import com.softmodeler.model.ObjectRef;&lt;br /&gt;import com.softmodeler.service.IBasicObjectService;&lt;br /&gt;import com.softmodeler.service.ModelUtil;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * The BasicObjectService implements the default handling for all BasicObject sub services&lt;br /&gt; * &lt;br /&gt; * @author created by Author: fdo, last update by $Author: $&lt;br /&gt; * @version $Revision: $, $Date: $&lt;br /&gt; */&lt;br /&gt;public abstract class BasicObjectService&lt;K extends BasicObject, V extends ObjectRef&gt; implements&lt;br /&gt;  IBasicObjectService&lt;K, V&gt; {&lt;br /&gt; /** The Hibernate Session */&lt;br /&gt; protected Session session;&lt;br /&gt; /** The Entity Manager */&lt;br /&gt; protected EntityManager entityManager;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * The constructor&lt;br /&gt;  * &lt;br /&gt;  * @param session&lt;br /&gt;  * @param entityManager&lt;br /&gt;  */&lt;br /&gt; public BasicObjectService(Session session, EntityManager entityManager) {&lt;br /&gt;  this.session = session;&lt;br /&gt;  this.entityManager = entityManager;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns the class of the BasicObject&lt;br /&gt;  * &lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; protected Class&lt;K&gt; getObjectClass() {&lt;br /&gt;  return (Class&lt;K&gt;) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns the class of the ObjectRef&lt;br /&gt;  * &lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; protected Class&lt;V&gt; getRefClass() {&lt;br /&gt;  return (Class&lt;V&gt;) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Begins a Transaction&lt;br /&gt;  * &lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; protected EntityTransaction beginTransaction() {&lt;br /&gt;  EntityTransaction transaction = entityManager.getTransaction();&lt;br /&gt;  if (!transaction.isActive()) {&lt;br /&gt;   transaction.begin();&lt;br /&gt;  }&lt;br /&gt;  return transaction;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public K create() {&lt;br /&gt;  // create the objects using the according EPackage&lt;br /&gt;  EPackage modelPackage = ModelUtil.getModelPackage();&lt;br /&gt;  EPackage refPackage = ModelUtil.getRefPackage();&lt;br /&gt;  EClass objectEClass = (EClass) modelPackage.getEClassifier(getObjectClass().getSimpleName());&lt;br /&gt;  EClass refEClass = (EClass) refPackage.getEClassifier(getRefClass().getSimpleName());&lt;br /&gt;  K object = (K) modelPackage.getEFactoryInstance().create(objectEClass);&lt;br /&gt;  V ref = (V) refPackage.getEFactoryInstance().create(refEClass);&lt;br /&gt;&lt;br /&gt;  // set the ids&lt;br /&gt;  object.setId(EcoreUtil.generateUUID());&lt;br /&gt;  ref.setId(object.getId());&lt;br /&gt;&lt;br /&gt;  // store objects in the database&lt;br /&gt;  EntityTransaction transaction = beginTransaction();&lt;br /&gt;  session.save(object);&lt;br /&gt;  session.save(ref);&lt;br /&gt;  transaction.commit();&lt;br /&gt;  return object;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public void delete(K object) {&lt;br /&gt;  EntityTransaction transaction = beginTransaction();&lt;br /&gt;&lt;br /&gt;  // load first, to prevent delete problems&lt;br /&gt;  Criteria criteria = session.createCriteria(getObjectClass());&lt;br /&gt;  criteria.add(Restrictions.eq(ID, object.getId()));&lt;br /&gt;  K loadedObject = (K) criteria.uniqueResult();&lt;br /&gt;&lt;br /&gt;  Criteria criteriaRef = session.createCriteria(getRefClass());&lt;br /&gt;  criteriaRef.add(Restrictions.eq(ID, object.getId()));&lt;br /&gt;  V loadedRef = (V) criteria.uniqueResult();&lt;br /&gt;&lt;br /&gt;  session.delete(loadedObject);&lt;br /&gt;  session.delete(loadedRef);&lt;br /&gt;  transaction.commit();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public List&lt;V&gt; findAllRefs() {&lt;br /&gt;  Criteria critica = session.createCriteria(getRefClass());&lt;br /&gt;  return critica.list();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public K findById(String uuid) {&lt;br /&gt;  Criteria criteria = session.createCriteria(getObjectClass());&lt;br /&gt;  criteria.add(Restrictions.eq(ID, uuid));&lt;br /&gt;  return (K) criteria.uniqueResult();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public K findByRef(V ref) {&lt;br /&gt;  Criteria criteria = session.createCriteria(getObjectClass());&lt;br /&gt;  criteria.add(Restrictions.eq(ID, ref.getId()));&lt;br /&gt;  return (K) criteria.uniqueResult();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public V getRef(K object) {&lt;br /&gt;  Criteria criteria = session.createCriteria(getRefClass());&lt;br /&gt;  criteria.add(Restrictions.eq(ID, object.getId()));&lt;br /&gt;  return (V) criteria.uniqueResult();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void store(K object) {&lt;br /&gt;  EntityTransaction transaction = beginTransaction();&lt;br /&gt;  entityManager.merge(object);&lt;br /&gt;  transaction.commit();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void storeRef(ObjectRef ref) {&lt;br /&gt;  EntityTransaction transaction = beginTransaction();&lt;br /&gt;  entityManager.merge(ref);&lt;br /&gt;  transaction.commit();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unchecked")&lt;br /&gt; @Override&lt;br /&gt; public List&lt;V&gt; search(Map&lt;String, Object&gt; fieldValues) {&lt;br /&gt;  DetachedCriteria objCritica = DetachedCriteria.forEntityName(getObjectClass().getSimpleName(), "obj");&lt;br /&gt;  for (String field : fieldValues.keySet()) {&lt;br /&gt;   objCritica.add(Restrictions.like(field, fieldValues.get(field)));&lt;br /&gt;  }&lt;br /&gt;  objCritica.setProjection(Property.forName(ID));&lt;br /&gt;  Criteria criteria = session.createCriteria(getRefClass());&lt;br /&gt;  criteria.add(Property.forName(ID).in(objCritica));&lt;br /&gt;  return criteria.list();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here the according interface:&lt;br /&gt;&lt;b&gt;IBasicObjectService.java&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt; * $RCSfile: $ Copyright (c) 2007 henzler informatik gmbh, CH-4106 Therwil&lt;br /&gt; *******************************************************************************/&lt;br /&gt;package com.softmodeler.service;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import com.softmodeler.model.BasicObject;&lt;br /&gt;import com.softmodeler.model.ObjectRef;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author created by Author: fdo, last update by $Author: $&lt;br /&gt; * @version $Revision: $, $Date: $&lt;br /&gt; */&lt;br /&gt;public interface IBasicObjectService&lt;K extends BasicObject, V extends ObjectRef&gt; {&lt;br /&gt; /** Id field */&lt;br /&gt; public static final String ID = "id";&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Creates, stores and returns an object&lt;br /&gt;  * &lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; K create();&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Creates, stores and returns an object reference&lt;br /&gt;  * &lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; V getRef(K object);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Deletes an object&lt;br /&gt;  * &lt;br /&gt;  * @param object&lt;br /&gt;  */&lt;br /&gt; void delete(K object);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Stores an object&lt;br /&gt;  * &lt;br /&gt;  * @param object&lt;br /&gt;  */&lt;br /&gt; void store(K object);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Stores a reference object&lt;br /&gt;  * &lt;br /&gt;  * @param ref&lt;br /&gt;  */&lt;br /&gt; void storeRef(V ref);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Finds an object, by it's uuid&lt;br /&gt;  * &lt;br /&gt;  * @param AutoJobRef&lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; K findById(String uuid);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Finds an object, using it's reference object&lt;br /&gt;  * &lt;br /&gt;  * @param ref&lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; K findByRef(V ref);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Returns a list containing all ref objects&lt;br /&gt;  * &lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; List&lt;V&gt; findAllRefs();&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Searches ObjectRefs using the passed map to create the query&lt;br /&gt;  * &lt;br /&gt;  * @param fieldValues field name =&gt; value&lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; List&lt;V&gt; search(Map&lt;String, Object&gt; fieldValues);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-8353322828048713123?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/8353322828048713123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=8353322828048713123' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8353322828048713123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8353322828048713123'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2008/12/generic-hibernate-dao.html' title='Generic Hibernate DAO'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-257907255871774696</id><published>2008-12-01T21:12:00.002+01:00</published><updated>2008-12-01T21:35:35.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><category scheme='http://www.blogger.com/atom/ns#' term='nebula'/><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'>Eclipse Nebula</title><content type='html'>I was searching for a better SWT DateTime widget, since the standard widget isn't really "done" yet.&lt;br /&gt;Durring my search I stumbled over the Eclipse Nebula project, which provides a few real nice widgets that extend the SWT widget collection.&lt;br /&gt;&lt;br /&gt;Currently the widgets are in Alpha and Beta status. Right now I'm using the &lt;a href="http://www.eclipse.org/nebula/widgets/datechooser/datechooser.php"&gt;DateChooserCombo&lt;/a&gt; in a CellEditor, I found and reported a Bug and hope the widgets will be stabilzed soon.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/nebula/"&gt;http://www.eclipse.org/nebula/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-257907255871774696?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/257907255871774696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=257907255871774696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/257907255871774696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/257907255871774696'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2008/12/eclipse-nebula.html' title='Eclipse Nebula'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-8532997140670250819</id><published>2008-08-21T19:44:00.003+02:00</published><updated>2008-08-21T20:48:08.385+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openarchitectureware'/><category scheme='http://www.blogger.com/atom/ns#' term='ecore'/><category scheme='http://www.blogger.com/atom/ns#' term='generation'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='oaw'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='beautifier'/><category scheme='http://www.blogger.com/atom/ns#' term='postprocessor'/><title type='text'>oaw Output Postprocessor (Beautifier)</title><content type='html'>I'm working on a project using oaw to generate java classes, spring definitions, ecore models and a lot more.&lt;br /&gt;&lt;br /&gt;There is a pretty nice JavaBeautifier to clean up my generated classes. The problem was the XmlBeautifier, it didn't remove white spaces. This resulted in some pretty ugly xml files.&lt;br /&gt;&lt;br /&gt;So I searched the web for some alternative, didn't find one so I modified the original for my own needs.&lt;br /&gt;Here is the code if someone approaches the same problem.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt;* &lt;copyright&gt;&lt;br /&gt;*&lt;br /&gt;* Copyright (c) 2005-2006 Sven Efftinge (http://www.efftinge.de) and others.&lt;br /&gt;* All rights reserved.   This program and the accompanying materials&lt;br /&gt;* are made available under the terms of the Eclipse Public License v1.0&lt;br /&gt;* which accompanies this distribution, and is available at&lt;br /&gt;* http://www.eclipse.org/legal/epl-v10.html&lt;br /&gt;*&lt;br /&gt;* Contributors:&lt;br /&gt;*     Sven Efftinge (http://www.efftinge.de) - Initial API and implementation&lt;br /&gt;*&lt;br /&gt;* &lt;/copyright&gt;&lt;br /&gt;*/&lt;br /&gt;package com.softmodeler.generator.postprocessor;&lt;br /&gt;&lt;br /&gt;import java.io.ByteArrayInputStream;&lt;br /&gt;import java.io.ByteArrayOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.OutputStreamWriter;&lt;br /&gt;import java.io.StringReader;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.xml.parsers.DocumentBuilder;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;import javax.xml.transform.ErrorListener;&lt;br /&gt;import javax.xml.transform.OutputKeys;&lt;br /&gt;import javax.xml.transform.Source;&lt;br /&gt;import javax.xml.transform.Transformer;&lt;br /&gt;import javax.xml.transform.TransformerException;&lt;br /&gt;import javax.xml.transform.TransformerFactory;&lt;br /&gt;import javax.xml.transform.URIResolver;&lt;br /&gt;import javax.xml.transform.dom.DOMSource;&lt;br /&gt;import javax.xml.transform.stream.StreamResult;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.logging.Log;&lt;br /&gt;import org.apache.commons.logging.LogFactory;&lt;br /&gt;import org.openarchitectureware.util.EncodingDetector;&lt;br /&gt;import org.openarchitectureware.xpand2.output.FileHandle;&lt;br /&gt;import org.openarchitectureware.xpand2.output.PostProcessor;&lt;br /&gt;import org.w3c.dom.CharacterData;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.dom.Node;&lt;br /&gt;import org.w3c.dom.NodeList;&lt;br /&gt;import org.xml.sax.EntityResolver;&lt;br /&gt;import org.xml.sax.ErrorHandler;&lt;br /&gt;import org.xml.sax.InputSource;&lt;br /&gt;import org.xml.sax.SAXException;&lt;br /&gt;import org.xml.sax.SAXParseException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* *&lt;br /&gt;*&lt;br /&gt;* @author Sven Efftinge (http://www.efftinge.de)&lt;br /&gt;* @author Bernd Kolb&lt;br /&gt;*/&lt;br /&gt;public class XmlBeautifier implements PostProcessor {&lt;br /&gt;&lt;br /&gt;   private final Log log = LogFactory.getLog(getClass());&lt;br /&gt;&lt;br /&gt;   private String[] fileExtensions = new String[] { ".xml", ".xsl", ".xsd", ".wsdd", ".wsdl", ".ecore" };&lt;br /&gt;&lt;br /&gt;   public void setFileExtensions(final String[] fileExtensions) {&lt;br /&gt;       this.fileExtensions = fileExtensions;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void beforeWriteAndClose(final FileHandle info) {&lt;br /&gt;       if (isXmlFile(info.getTargetFile().getAbsolutePath())) {&lt;br /&gt;           try {&lt;br /&gt;               // TODO this is only a heuristic, but it should work for most cases. This really is the beginning of reimplementing&lt;br /&gt;               // the XML parser just because we do RAM rather then file based beautification...&lt;br /&gt;               final String bufferedString = info.getBuffer().toString().trim();&lt;br /&gt;               final int indEncoding = bufferedString.indexOf("encoding");&lt;br /&gt;               final int indEndHeader = bufferedString.indexOf("?&gt;");&lt;br /&gt;               String readEncoding = null;&lt;br /&gt;               Document doc = null;&lt;br /&gt;               if (bufferedString.startsWith(" 0 &amp;amp;&amp;amp; indEncoding &lt; readencoding =" info.getFileEncoding();" doc =" parseDocument(bufferedString," doc =" parseDocument(bufferedString," tfactory =" TransformerFactory.newInstance();" threadid="562510&amp;amp;tstart="90" showtopic="788" serializer =" tfactory.newTransformer();" systemvalue =" doc.getDoctype().getSystemId();" publicid =" doc.getDoctype().getPublicId();" bytearrayoutputstream =" new" string =" byteArrayOutputStream.toString(info.getFileEncoding());" nodelist =" node.getChildNodes();" i =" 0;" child =" nodeList.item(i);"&gt; encodingsToTry = new ArrayList&lt;string&gt;();&lt;br /&gt;       if (encoding != null) {&lt;br /&gt;           encodingsToTry.add(encoding);&lt;br /&gt;       } else {&lt;br /&gt;           byte[] sampleBytes = bufferedString.substring(0, Math.min(64, bufferedString.length())).getBytes();&lt;br /&gt;           encodingsToTry.add(EncodingDetector.detectEncoding(sampleBytes).displayName());&lt;br /&gt;           encodingsToTry.add("ISO-8859-1");&lt;br /&gt;           encodingsToTry.add("UTF-8");&lt;br /&gt;           encodingsToTry.add("MacRoman");&lt;br /&gt;           encodingsToTry.add("UTF-16");&lt;br /&gt;           encodingsToTry.add("UTF-16BE");&lt;br /&gt;           encodingsToTry.add("UTF-16LE");&lt;br /&gt;       }&lt;br /&gt;       encodingsToTry.add(System.getProperty("file.encoding"));&lt;br /&gt;&lt;br /&gt;       Document doc = null;&lt;br /&gt;       Exception lastException = null;&lt;br /&gt;       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();&lt;br /&gt;       factory.setExpandEntityReferences(false);&lt;br /&gt;       factory.setValidating(false);&lt;br /&gt;&lt;br /&gt;       DocumentBuilder builder = factory.newDocumentBuilder();&lt;br /&gt;&lt;br /&gt;       builder.setEntityResolver(new EntityResolver() {&lt;br /&gt;           public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {&lt;br /&gt;               return new InputSource(new StringReader(""));&lt;br /&gt;           }&lt;br /&gt;       });&lt;br /&gt;       builder.setErrorHandler(new ErrorHandler() {&lt;br /&gt;           public void error(SAXParseException exception) throws SAXException {&lt;br /&gt;               log.warn(exception.getMessage());&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           public void fatalError(SAXParseException exception) throws SAXException {&lt;br /&gt;               if (exception.getMessage() != null &amp;amp;&amp;amp; exception.getMessage().startsWith("Invalid byte")) {&lt;br /&gt;                   // ignore, since we try other encodings&lt;br /&gt;               } else {&lt;br /&gt;                   log.warn(exception.getMessage());&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           public void warning(SAXParseException exception) throws SAXException {&lt;br /&gt;               log.debug(exception.getMessage());&lt;br /&gt;           }&lt;br /&gt;       });&lt;br /&gt;&lt;br /&gt;       for (Iterator&lt;string&gt; it = encodingsToTry.iterator(); it.hasNext();) {&lt;br /&gt;           String enc = it.next();&lt;br /&gt;           try {&lt;br /&gt;               doc = builder.parse(new ByteArrayInputStream(bufferedString.getBytes(enc)));&lt;br /&gt;               // if no error exit here&lt;br /&gt;               break;&lt;br /&gt;           } catch (Exception e) {&lt;br /&gt;               lastException = e;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;       if (doc == null &amp;amp;&amp;amp; lastException != null) {&lt;br /&gt;           throw lastException;&lt;br /&gt;       } else {&lt;br /&gt;           return doc;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public boolean isXmlFile(final String absolutePath) {&lt;br /&gt;       for (int i = 0; i &lt;&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The only difference to the original Beautifier is the removeWhiteSpaces method and it's call.&lt;br /&gt;&lt;br /&gt;If you want to use this class or make your own for any other job, place the class in your generator plug-in and add the following config in your oaw workflow file:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    &amp;lt;component class="org.openarchitectureware.xpand2.Generator"&amp;gt;&lt;br /&gt;        &amp;lt;metaModel id="mm" class="org.eclipse.m2t.type.emf.EmfRegistryMetaModel"/&amp;gt;&lt;br /&gt;        &amp;lt;expand    value="template::Nls::modelEcoreFile FOR model" /&amp;gt;&lt;br /&gt;        &amp;lt;outlet path="${model-ecore}"&amp;gt;&lt;br /&gt;            &amp;lt;postprocessor class="com.softmodeler.generator.postprocessor.XmlBeautifier"/&amp;gt;&lt;br /&gt;        &amp;lt;/outlet&amp;gt;&lt;br /&gt;    &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-8532997140670250819?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/8532997140670250819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=8532997140670250819' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8532997140670250819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/8532997140670250819'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2008/08/oaw-output-postprocessor-beautifier.html' title='oaw Output Postprocessor (Beautifier)'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-154032995950520633</id><published>2008-06-11T20:13:00.007+02:00</published><updated>2008-06-16T22:27:45.475+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Springframework'/><category scheme='http://www.blogger.com/atom/ns#' term='Equinox'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic'/><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='OSGI'/><category scheme='http://www.blogger.com/atom/ns#' term='Module'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Spring Dynamic Modules and Hibernate</title><content type='html'>I'm currently working on a Sourceforge project.&lt;br /&gt;On the server side I want to use Spring DM and Hibernate.&lt;br /&gt;Eclipse RCP and Spring DM builds the client.&lt;br /&gt;&lt;br /&gt;I spent the last few evenings trying and searching for a working Spring DM/Hibernate example. I had a lot of classloading issues.&lt;br /&gt;Yesterday I got it to work, you can download the plug-in &lt;a href="http://web126.delta.ibone.ch/swissdev/com.blogspot.swissdev.springservice.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's a simple application handling a User object and using HSQL as database.&lt;br /&gt;&lt;br /&gt;I added all the dependent jars in the /lib directory. You can create separated plug-ins for them if you want.&lt;br /&gt;Here a list of all the jar files, because thats where I had my problems:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cglib-nodep-2.1_3.jar&lt;/li&gt;&lt;li&gt;commons-collections.jar&lt;/li&gt;&lt;li&gt;commons-dbcp.jar&lt;/li&gt;&lt;li&gt;commons-pool.jar&lt;/li&gt;&lt;li&gt;dom4j-1.6.1.jar&lt;/li&gt;&lt;li&gt;hibernate3.jar&lt;/li&gt;&lt;li&gt;hsqldb.jar&lt;/li&gt;&lt;li&gt;jta.jar&lt;/li&gt;&lt;li&gt;spring-core.jar&lt;/li&gt;&lt;li&gt;spring-jdbc.jar&lt;/li&gt;&lt;li&gt;spring-orm.jar&lt;/li&gt;&lt;li&gt;spring-tx.jar // why is the org.springframework.dao package in this jar?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;You can access the service in the Test class:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;package com.blogspot.swissdev.springservice;&lt;br /&gt;&lt;br /&gt;import org.osgi.framework.BundleContext;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author Flavio Donze &lt;flavio.donze@gmail.com&gt;&lt;br /&gt;*/&lt;br /&gt;public class Test {&lt;br /&gt;&lt;br /&gt;  private BundleContext context = Activator.getDefault().getContext();&lt;br /&gt;&lt;br /&gt;  public void start() {&lt;br /&gt;      System.out.println("starting the test...");&lt;br /&gt;&lt;br /&gt;      UserService service = (UserService) context.getService(context.getServiceReference(UserService.class.getName()));&lt;br /&gt;   &lt;br /&gt;      User user = (User) context.getService(context.getServiceReference(User.class.getName()));&lt;br /&gt;      user.setPassword("pass");&lt;br /&gt;      user.setUsername("user");&lt;br /&gt;      service.store(user);&lt;br /&gt;&lt;br /&gt;      for (User u : service.findAll())&lt;br /&gt;      {&lt;br /&gt;          System.out.println("User: "+u.getId() + ", " + u.getUsername() + ", " + u.getPassword());&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/flavio.donze@gmail.com&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And here is my Spring configuration:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&amp;gt;&lt;br /&gt;      &amp;lt;property name="location" value="META-INF/spring/database.properties"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&amp;gt;&lt;br /&gt;      &amp;lt;property name="driverClassName" value="${jdbc.driverClassName}"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="url" value="${jdbc.url}"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="username" value="${jdbc.username}"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="password" value="${jdbc.password}"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&amp;gt;&lt;br /&gt;      &amp;lt;property name="dataSource" ref="dataSource"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="mappingResources"&amp;gt;&lt;br /&gt;      &amp;lt;list&amp;gt;&lt;br /&gt;          &amp;lt;value&amp;gt;User.hbm.xml&amp;lt;/value&amp;gt;&lt;br /&gt;      &amp;lt;/list&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;      &amp;lt;property name="hibernateProperties"&amp;gt;&lt;br /&gt;          &amp;lt;props&amp;gt;&lt;br /&gt;              &amp;lt;prop key="hibernate.dialect"&amp;gt;${hibernate.dialect}&amp;lt;/prop&amp;gt;&lt;br /&gt;              &amp;lt;prop key="hibernate.show_sql"&amp;gt;${hibernate.show_sql}&amp;lt;/prop&amp;gt;&lt;br /&gt;              &amp;lt;prop key="hibernate.hbm2ddl.auto"&amp;gt;${hibernate.hbm2ddl.auto}&amp;lt;/prop&amp;gt;&lt;br /&gt;          &amp;lt;/props&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="test" init-method="start" class="com.blogspot.swissdev.springservice.Test"/&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- USER beans, POJO, DAO, Service --&amp;gt;&lt;br /&gt;  &amp;lt;bean id="user" class="com.blogspot.swissdev.springservice.UserImpl" scope="prototype"&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="userDao" class="com.blogspot.swissdev.springservice.UserDaoImpl"&amp;gt;&lt;br /&gt;      &amp;lt;property name="sessionFactory" ref="sessionFactory"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="userService" class="com.blogspot.swissdev.springservice.UserServiceImpl"&amp;gt;&lt;br /&gt;      &amp;lt;property name="userDao" ref="userDao"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Since I just wanted to get Spring DM and Hibernate to work, I didn't really test the rest, just in case you encounter some bugs.&lt;br /&gt;&lt;br /&gt;To setup your workspace with Spring DM read the first part of my &lt;a href="http://swissdev.blogspot.com/2008/06/eclipse-rcp-application-using-spring-dm.html"&gt;previous post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For this example I used:&lt;br /&gt;&lt;a href="http://download.eclipse.org/eclipse/downloads/"&gt;Eclipse 3.4 RC3&lt;/a&gt;&lt;br /&gt;&lt;a href="http://springframework.org/osgi"&gt;Spring Dynamic Modules for OSGi(tm) 1.0.2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-154032995950520633?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/154032995950520633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=154032995950520633' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/154032995950520633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/154032995950520633'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2008/06/spring-dynamic-modules-and-hibernate.html' title='Spring Dynamic Modules and Hibernate'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-391420546418472250.post-9197671680333897033</id><published>2008-06-04T15:36:00.000+02:00</published><updated>2008-06-10T13:23:33.769+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Application'/><category scheme='http://www.blogger.com/atom/ns#' term='RCP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Service'/><category scheme='http://www.blogger.com/atom/ns#' term='Module'/><category scheme='http://www.blogger.com/atom/ns#' term='Client'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic'/><category scheme='http://www.blogger.com/atom/ns#' term='DM'/><category scheme='http://www.blogger.com/atom/ns#' term='OSGI'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='Rich'/><category scheme='http://www.blogger.com/atom/ns#' term='Bean'/><title type='text'>Eclipse RCP Application using Spring DM</title><content type='html'>Last week I was searching the web for some example of Spring DM running on a Eclipse RCP application.&lt;br /&gt;Didn't find one, so I thought I could write a post.&lt;br /&gt;&lt;br /&gt;Download:&lt;br /&gt;&lt;a href="http://download.eclipse.org/eclipse/downloads/"&gt;Eclipse 3.4 RC3&lt;/a&gt;&lt;br /&gt;&lt;a href="http://springframework.org/osgi"&gt;Spring Dynamic Modules for OSGi(tm) 1.0.2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now create a new Plug-in-Project, using the settings below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GQDJZpS7TsU/SElzJEUn_xI/AAAAAAAAAAM/EyvVooVmVLA/s1600-h/wizard.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_GQDJZpS7TsU/SElzJEUn_xI/AAAAAAAAAAM/EyvVooVmVLA/s320/wizard.jpg" alt="" id="BLOGGER_PHOTO_ID_5208821043646955282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_GQDJZpS7TsU/SE2AeQ9zyWI/AAAAAAAAABU/aK-fs5iny0o/s1600-h/wizard1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_GQDJZpS7TsU/SE2AeQ9zyWI/AAAAAAAAABU/aK-fs5iny0o/s320/wizard1.jpg" alt="" id="BLOGGER_PHOTO_ID_5209961601376176482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GQDJZpS7TsU/SE2AzJT6cBI/AAAAAAAAABc/8T1rEiQ2n_g/s1600-h/wizardlast.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_GQDJZpS7TsU/SE2AzJT6cBI/AAAAAAAAABc/8T1rEiQ2n_g/s320/wizardlast.jpg" alt="" id="BLOGGER_PHOTO_ID_5209961960098656274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As a next step you have to import the Spring DM Plug-ins.&lt;br /&gt;File-&gt;Import-&gt;Plug-in Development-&gt;Plug-ins and Fragments.&lt;br /&gt;Point the plug-in location to the extracted "spring-osgi-1.0.2/dist" directory.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GQDJZpS7TsU/SEl710Un_0I/AAAAAAAAAAk/zRhdsf5vDh0/s1600-h/import.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_GQDJZpS7TsU/SEl710Un_0I/AAAAAAAAAAk/zRhdsf5vDh0/s320/import.jpg" alt="" id="BLOGGER_PHOTO_ID_5208830608539123522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the next page, add the following plug-ins:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;org.springframework.bundle.osgi.core&lt;/li&gt;&lt;li&gt;org.springframework.bundle.osgi.extender&lt;/li&gt;&lt;li&gt;org.springframework.bundle.osgi.io&lt;/li&gt;&lt;/ul&gt;You just imported the Spring DM OSGi part, you also need the actual Spring framework.&lt;br /&gt;Do the same as above, but instead of the "dist" directory select the "spring-osgi-1.0.2/lib" dir and select those plugins:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;org.springframework.bundle.spring.aop&lt;/li&gt;&lt;li&gt;org.springframework.bundle.spring.beans&lt;/li&gt;&lt;li&gt;org.springframework.bundle.spring.context&lt;/li&gt;&lt;li&gt;org.springframework.bundle.spring.core&lt;/li&gt;&lt;li&gt;org.springframework.osgi.aopalliance.osgi&lt;/li&gt;&lt;/ul&gt;We have to manually create a apache commons logging plugin.&lt;br /&gt;Spring DM has some classloading problems with the existing plugin contained in the eclipse platform.&lt;br /&gt;New-&gt;Plug-in Development-&gt;Plug-in from existing JAR archives.&lt;br /&gt;Add External...&lt;br /&gt;Now if you have the Spring framework including&lt;span lang="en-US"&gt; dependencies &lt;/span&gt;on your machine select the commons-logging.jar located at "spring-framework-2.5.x/lib/jakarta-commons", otherwise download the jar &lt;a href="http://commons.apache.org/downloads/download_logging.cgi"&gt;here&lt;/a&gt;.&lt;br /&gt;Name the plugin "org.apache.commons.logging&lt;br /&gt;&lt;br /&gt;Ok, so now your workspace is ready.&lt;br /&gt;Let's create a Spring service.&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;package swissdev.springdm;&lt;br /&gt;&lt;br /&gt;public interface IMyService {&lt;br /&gt;&lt;br /&gt;String getSomething();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;package swissdev.springdm;&lt;br /&gt;&lt;br /&gt;public class MyService implements IMyService {&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String getSomething() {&lt;br /&gt;return "something";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void start() {&lt;br /&gt;System.out.print("start service");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void stop() {&lt;br /&gt;System.out.print("stop service");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;META-INF/spring/applicationContext.xml&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="myService"&lt;br /&gt;class="swissdev.springdm.MyService"&lt;br /&gt;init-method="start"&lt;br /&gt;destroy-method="stop"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;META-INF/spring/applicationContext-osgi.xml&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xmlns:osgi="http://www.springframework.org/schema/osgi"&lt;br /&gt;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&lt;br /&gt;         http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;osgi:service id="myServiceOsgi" ref="myService" interface="swissdev.springdm.IMyService"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Our application is basically ready to launch, so lets do that.&lt;br /&gt;Right click on the swissdev.springdm plug-in: Run-As -&gt; Eclipse Application.&lt;br /&gt;A simple window containing a view is launched, nothing special.&lt;br /&gt;&lt;br /&gt;Open the run configuration: Run -&gt; Run Configurations...&lt;br /&gt;Select your "swissdev.springdm.application" launch config and change to the "Arguments" tab.&lt;br /&gt;Add "-console" to the Program arguments.&lt;br /&gt;Switch to the Plug-ins tab and select all the "Workspace" plug-ins, hit the "Add Required Plug-ins" button and run again.&lt;br /&gt;Type ss in the console, you will get the following output:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GQDJZpS7TsU/SEmadEUn_2I/AAAAAAAAAA0/EoVrPNcE7p4/s1600-h/console.jpg"&gt;&lt;img style="cursor: pointer; width: 447px; height: 145px;" src="http://3.bp.blogspot.com/_GQDJZpS7TsU/SEmadEUn_2I/AAAAAAAAAA0/EoVrPNcE7p4/s400/console.jpg" alt="" id="BLOGGER_PHOTO_ID_5208864268197822306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So our Spring plug-ins are not active.&lt;br /&gt;Open the run configurations again and switch to the "Configurations" tab, change the Configurations File option to "Use existing config.ini file as a template" and enter ${workspace_loc}/swissdev.springdm/config.ini.&lt;br /&gt;We can get the default generated config.ini in our workspace.&lt;br /&gt;It's located at /.metadata/.plugins/org.eclipse.pde.core/swissdev.springdm.application/config.ini, copy it to your plug-in.&lt;br /&gt;Right click on the ini file and select Open With -&gt; Text Editor.&lt;br /&gt;Ctrl+f  Find: extender&lt;br /&gt;You should find ....org.springframework.bundle.osgi.extender add @start at the end:&lt;br /&gt;org.springframework.bundle.osgi.extender@start&lt;br /&gt;Do the same with the swissdev.springdm plugin.&lt;br /&gt;&lt;br /&gt;Launch again, you will see a lot of output and somewhere between "start service", thats the output we defined in the MyService class.&lt;br /&gt;Spring DM is working!&lt;br /&gt;&lt;br /&gt;To use our service we first need to modify our Activator:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;private BundleContext context;&lt;br /&gt;&lt;br /&gt;public BundleContext getContext() {&lt;br /&gt;  return context;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void start(BundleContext context) throws Exception {&lt;br /&gt;  super.start(context);&lt;br /&gt;  plugin = this;&lt;br /&gt;  this.context = context;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Open the generated View class and edit the createPartControl method:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;public void createPartControl(Composite parent) {&lt;br /&gt;  viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL&lt;br /&gt;          | SWT.V_SCROLL);&lt;br /&gt;  viewer.setContentProvider(new ViewContentProvider());&lt;br /&gt;  viewer.setLabelProvider(new ViewLabelProvider());&lt;br /&gt;  viewer.setInput(getViewSite());&lt;br /&gt;  viewer.addDoubleClickListener(new IDoubleClickListener() {&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      public void doubleClick(DoubleClickEvent event) {&lt;br /&gt;          ServiceTracker tracker = new ServiceTracker(Activator.getDefault().getContext(), IMyService.class.getName(),null);&lt;br /&gt;          tracker.open();&lt;br /&gt;          IMyService service = (IMyService) tracker.getService();&lt;br /&gt;          System.out.println(service.getSomething());&lt;br /&gt;      }&lt;br /&gt;  });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Launch again and double click one of the itms in the window, in the console there should appear an "something" output.&lt;br /&gt;&lt;br /&gt;That was it....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/391420546418472250-9197671680333897033?l=swissdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://swissdev.blogspot.com/feeds/9197671680333897033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=391420546418472250&amp;postID=9197671680333897033' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/9197671680333897033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/391420546418472250/posts/default/9197671680333897033'/><link rel='alternate' type='text/html' href='http://swissdev.blogspot.com/2008/06/eclipse-rcp-application-using-spring-dm.html' title='Eclipse RCP Application using Spring DM'/><author><name>Flavio Donzé</name><uri>http://www.blogger.com/profile/06593471906127749750</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_GQDJZpS7TsU/SqwSXuf46iI/AAAAAAAAADE/-oX99HO0mNU/S220/flavio.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_GQDJZpS7TsU/SElzJEUn_xI/AAAAAAAAAAM/EyvVooVmVLA/s72-c/wizard.jpg' height='72' width='72'/><thr:total>27</thr:total></entry></feed>
