<?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-32678118</id><updated>2011-07-07T22:05:27.727-07:00</updated><category term='spring modules configuration auto-loading'/><category term='EL4J spring remoting implicit context passing'/><category term='lazy loading'/><category term='maven dependency plugin el4j'/><category term='hibernate'/><category term='xml merging'/><category term='hibernate offlining disconnected mode java open-source synchronization conflict'/><category term='jpa'/><category term='el4j release'/><category term='programming challenge jazoon students competition'/><category term='dao'/><category term='Simpler J2EE development EL4J best-of-breed'/><category term='jazoon'/><category term='Spring insights into application introspection jmx'/><category term='EL4J'/><title type='text'>Philipp H. Oser's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32678118.post-8686288771209363972</id><published>2009-06-07T11:22:00.000-07:00</published><updated>2009-06-07T11:36:57.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='el4j release'/><title type='text'>EL4J Release 1.6 is out!</title><content type='html'>&lt;p&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;I am glad to announce the new EL4J release 1.6!  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;There are quite a large number of new features: &lt;/span&gt;  &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;DataExtent for controlling eager loading of Hibernate Entities&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;JAX-WS upgrade&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;First release of the Hibernate offliner&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Cleaned up env support (to share config between Maven and Spring, now each module can incrementally define its configuration in an XML file)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Database scripts can now be versioned and only the "right" upgrade scripts are then applied&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;ID fixer improvements (to get hibernate session semantics even outside of a Hibernate session, e.g. with remoting)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Support for the Maven Sonar plugin&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Better handling of the PK with Hibernate (our convenience parent class for entity objects)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Full JPA support in Hibernate (e.g. @PrePersist can be enabled). &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Upgrades for many libraries C3P0 instead of DBCP, Spring, Maven, …&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;Bugfixes and clean-ups&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style=";font-family:Arial;font-size:100%;"  &gt;More info can be found in the &lt;/span&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;release notes:&lt;/span&gt; &lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:100%;"  &gt;     &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://el4j.svn.sourceforge.net/viewvc/*checkout*/el4j/trunk/el4j/etc/ReleaseNotes.txt" target="_blank"&gt;&lt;u&gt;&lt;span style="color: rgb(0, 0, 255);font-family:Arial;" &gt;http://el4j.svn.sourceforge.&lt;wbr&gt;net/viewvc/*checkout*/el4j/&lt;wbr&gt;trunk/el4j/etc/ReleaseNotes.&lt;wbr&gt;txt&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-8686288771209363972?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/8686288771209363972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=8686288771209363972' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/8686288771209363972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/8686288771209363972'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2009/06/el4j-release-16-is-out.html' title='EL4J Release 1.6 is out!'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-2691507051264880762</id><published>2008-12-23T02:13:00.000-08:00</published><updated>2008-12-23T04:53:20.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate offlining disconnected mode java open-source synchronization conflict'/><title type='text'>Convenient Disconnected Mode in your Rich Java Application with Hibernate Offliner</title><content type='html'>In EL4J, we have recently published the open-source Hibernate Offliner, a lightweight layer above Hibernate that supports 2 modes: online and offline (=disconnected) mode. In the online mode the application works on objects that lie in a remote database and that are served via an application server. In the offline mode, the application works on objects that lie in a local database that runs on the client node. The transitions between online and offline mode are handled almost transparently for the application.&lt;br /&gt;A typical use-case of the Hibernate Offliner is a salesforce-support application that runs both when connected to the application server AND when the sales representative is disconnected from the network.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Under the hood&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;As in traditional database applications, we use the DAO pattern to abstract details of the database access. When switching from online to offline mode, we use a different DAO instance that uses the local database instead and records deleted objects (currently with an interceptor). A DAO registry (a factory for DAO instances) makes the right DAO selection transparent for the application. In order to make an application offline-capable as transparently as possible, a service-layer can be duplicated in the local application. This avoids that the service-layer needs to be fully aware of the offline-capability. All object-operations are done on the level of Hibernate. This means the Hibernate Offliner adds no dependency to the underlying database brand.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Going offline&lt;/span&gt;&lt;br /&gt;When switching between the online and the offline mode, you use a set of hibernate queries to indicate what parts of your data you want to replicate on your local database. From this moment on, all future database accesses go to the local database.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Synchronizing data with the master database &amp;amp; going online again&lt;/span&gt;&lt;br /&gt;Once you are reconnected to the application server, the local changes (detected via a newer object id/version pair and the recorded deletes (either delete locally only or delete in master db)) get committed in chunks (for scalability) to the master database. What if someone else has changed a same object instance in parallel (e.g. optimistic locking failures)? When going online again, the Offliner indicates conflicts in a data structure that can then be handled by the application (there is no generic conflict handling approach that works in all cases).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Transparency of the offline-capability for your application&lt;/span&gt;&lt;br /&gt;For your application it can be to a large extent transparent that it supports online and offline mode: Data accesses work in exactly the same way, whether your application is offline or not. When you adapt an application to support offlining, it just needs to treat the 2 transitions: “go offline” and “go online” (this includes handling of potential conflicts). These two transitions typically require a few calls to the Offliner that can be nicely separated from the rest of the application. In other words, the concern  “offlining” is nicely separated from other concerns.&lt;br /&gt;The 2 pictures "Before" and "After" indicate a possible scenario:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_huhyXR2HDpE/SVC8M_g4ZiI/AAAAAAAAABU/uAc3LowbQ-c/s1600-h/hibernateOffliningBefore.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 46px;" src="http://2.bp.blogspot.com/_huhyXR2HDpE/SVC8M_g4ZiI/AAAAAAAAABU/uAc3LowbQ-c/s320/hibernateOffliningBefore.png" alt="" id="BLOGGER_PHOTO_ID_5282929294299391522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;hl&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_huhyXR2HDpE/SVC8SQhA25I/AAAAAAAAABk/JfscaAjbI0o/s1600-h/hibernateOffliningAfter.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 184px;" src="http://4.bp.blogspot.com/_huhyXR2HDpE/SVC8SQhA25I/AAAAAAAAABk/JfscaAjbI0o/s320/hibernateOffliningAfter.png" alt="" id="BLOGGER_PHOTO_ID_5282929384762694546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Architecture constraints &amp;amp; open issues&lt;/span&gt;&lt;br /&gt;What do you need to take into consideration when using this infrastructure? The following limitations exist:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Currently only support for primary keys (PKs) of type int, long and String are implemented. The PKs on entity objects are also used to identify whether they are local or remote: so the PKs of the local and the remote database must be distinct.&lt;/li&gt;&lt;li&gt; Between online and offline mode, the application mustn't keep objects (as their PKs change).&lt;/li&gt;&lt;li&gt; At the moment, the Hibernate Offliner intercepts DAO-access (for deleted objects) on the EL4J generic DAO infrastructure (this is a convenience support that provides DAO with basic CRUD operations without coding). The core of the Hibernate Offliner is independent of this choice.&lt;/li&gt;&lt;li&gt; The Offliner cannot guess missing „incoming“ links (so chose your offlining-queries judiciously). E.g., if you have a person class with a parent pointer and children set (1:n, one-way) and offline only the parent, fetching it from the local database and calling getChildren() will return a (wrong) empty set.&lt;/li&gt;&lt;li&gt; Hibernate cascading save and the Offliner may not run efficiently together&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Acknowledgments&lt;/span&gt;&lt;br /&gt;The bean browser was designed and implemented by David Bernhard, thanks for the good work!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;More info&lt;/span&gt;&lt;br /&gt;Have a look at the svn head of EL4J under framework/modules/offliner or contact the EL4J team.&lt;br /&gt;&lt;br /&gt;&lt;/hl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-2691507051264880762?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/2691507051264880762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=2691507051264880762' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/2691507051264880762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/2691507051264880762'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2008/12/convenient-disconnected-mode-in-your.html' title='Convenient Disconnected Mode in your Rich Java Application with Hibernate Offliner'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_huhyXR2HDpE/SVC8M_g4ZiI/AAAAAAAAABU/uAc3LowbQ-c/s72-c/hibernateOffliningBefore.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-5251404901885396977</id><published>2008-11-27T08:46:00.000-08:00</published><updated>2009-10-24T04:12:10.936-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='lazy loading'/><category scheme='http://www.blogger.com/atom/ns#' term='dao'/><title type='text'>DataExtends to control lazy loading with Hibernate</title><content type='html'>Who has not suffered from LazyLoadingExceptions with JPA/ Hibernate? Often one uses the open session in view pattern to improve the situation. When sending hibernate-loaded classes over the network, not even this pattern solves the issue.&lt;br /&gt;Thanks to an idea of Michael Vorburger, we have implemented a small abstraction called DataExtent. When loading an object, a DataExtent defines what extent of its "surrounding" object graph we want to load as well.&lt;br /&gt;For this, you 1) define first a data extent, and 2) use it in your  findById or findByCriteria methods of the DAO. You would put the often required DataExtents as constants in your DAO, other DataExtents can be defined on the fly.&lt;br /&gt;&lt;br /&gt;The following picture illustrates a possible class graph, with different extents we may be interested in:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_huhyXR2HDpE/ST5qMNUDrCI/AAAAAAAAABM/1k0l3XYtUl0/s1600-h/ScreenShot001.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 265px;" src="http://4.bp.blogspot.com/_huhyXR2HDpE/ST5qMNUDrCI/AAAAAAAAABM/1k0l3XYtUl0/s320/ScreenShot001.bmp" alt="" id="BLOGGER_PHOTO_ID_5277772571289562146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sample code:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;fileWithoutContentExtent =&lt;br /&gt;new DataExtent(File.class)  &lt;br /&gt;  .with("name", "lastModified", "fileSize", "mimeType");&lt;br /&gt;&lt;br /&gt;fullFileExtent =&lt;br /&gt;new DataExtent(File.class).  &lt;br /&gt;with("name", "content", "lastModified", "fileSize", "mimeType");&lt;br /&gt;&lt;br /&gt;// The Extent Object of type 'Person'&lt;br /&gt;myExtent = new DataExtent(Person.class);&lt;br /&gt;// Construct a complex graph:&lt;br /&gt;// Person has a List of Teeth, a Tooth has a 'Person' as owner,&lt;br /&gt;// the owner has a list of 'Person' as friends, the friends are again&lt;br /&gt;// the same 'Person'-entity as defined in the beginning.&lt;br /&gt;myExtent.withSubentities(&lt;br /&gt;collection("teeth",&lt;br /&gt;entity(Tooth.class)&lt;br /&gt; .with("owner")&lt;br /&gt;),&lt;br /&gt;collection("friends", myExtent.getRootEntity())&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then you can easily control what should be loaded in the DAO (our DAOs are typically a subclass of our generic DAO):&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;myPerson = myDao.findById(myPk, myExtent);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;           or&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;myPersonList = myDao.findByCriteria(myCriteria, myExtent);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://el4j.svn.sourceforge.net/viewvc/el4j/trunk/el4j/framework/modules/hibernate/src/main/java/ch/elca/el4j/services/persistence/hibernate/dao/extent/DataExtent.java?view=markup"&gt;DataExtent class&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://el4j.svn.sourceforge.net/viewvc/el4j/trunk/el4j/framework/modules/hibernate/src/main/java/ch/elca/el4j/services/persistence/hibernate/dao/ConvenienceGenericHibernateDao.java?view=markup"&gt;GenericDao interface&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-5251404901885396977?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/5251404901885396977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=5251404901885396977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/5251404901885396977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/5251404901885396977'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2008/11/dataextends-to-controll-lazy-loading.html' title='DataExtends to control lazy loading with Hibernate'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_huhyXR2HDpE/ST5qMNUDrCI/AAAAAAAAABM/1k0l3XYtUl0/s72-c/ScreenShot001.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-8883417125396293531</id><published>2008-09-01T00:33:00.000-07:00</published><updated>2008-09-01T01:02:08.231-07:00</updated><title type='text'></title><content type='html'>I just came back from the &lt;a href="http://www.ipt.ch/infoglueDeliverLive_ipt/Veranstaltungen/Veranstaltungsdetail?contentId=187"&gt;SOA Security event of ipt and Credit Suisse&lt;/a&gt; - unfortunately quite disappointed:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;At the door of the event, I was refused entry because I work at a concurrent of ipt (the event runs under "SOA Interest Group"). I have no problem understanding limited access to events, but it should be stated when the event is published - or one should be notified before going there. The event was publicly announced &lt;a href="http://www.inside-it.ch/frontend/insideit?&amp;amp;site=ii&amp;amp;_d=_article&amp;amp;news.id=15220"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The reservation system (it runs on the web site of ipt) is broken: I reserved myself twice (separated by 3 days), and I did neither get the promised answering email nor an error response (I did not hear from them at all). Later they removed the remark that they promise an answering email - so I figured I could go without confirmation.&lt;/li&gt;&lt;li&gt;It is sad that the bank Credit Suisse, which used to have a good reputation, works with such a dicey partner.&lt;/li&gt;&lt;/ol&gt;Remark: I just checked their website again: in the mean time, they added some more concrete specification of who can go - they seem to like publishing unfinished stuff...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-8883417125396293531?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/8883417125396293531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=8883417125396293531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/8883417125396293531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/8883417125396293531'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2008/09/i-just-came-back-from-soa-security.html' title=''/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-6293670495364649914</id><published>2008-07-01T05:15:00.000-07:00</published><updated>2008-07-01T05:31:53.189-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EL4J'/><category scheme='http://www.blogger.com/atom/ns#' term='jazoon'/><title type='text'>Jazoon 08 &amp; EL4J 1.4</title><content type='html'>After a long silence due to intensive times, I am glad to announce 2 things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Jazoon 08, the international Java conference is over. Here is the presentation I held together with Martin Zeltner: &lt;a aiotarget="false" aiotitle="Jazoon 08 presentation on Module-based development with Spring and Maven" href="http://jazoon.com/download/presentations/3502.pdf"&gt;Jazoon 08 presentation on Module-based development with Spring and Maven&lt;/a&gt;. The presentation of Jean-François Poilpret on the new Sun App Framework for Swing (we use this framework extensively in EL4J) can be found &lt;a href="http://jazoon.com/jazoon08/en/conference/presentationdetails.html?type=sid&amp;amp;detail=3360"&gt;here&lt;/a&gt; .&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;We have released the version 1.4 of EL4J. Improvements include: more convenience methods for database access, new support to layout Swing GUIs in XML (similar to XAML), many maven improvements, jconsole can now connect by default to EL4J applications, clean-ups, ... . For a complete list of features, please consult the &lt;a href="http://el4j.svn.sourceforge.net/viewvc/*checkout*/el4j/trunk/el4j/etc/ReleaseNotes.txt"&gt;release notes&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-6293670495364649914?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/6293670495364649914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=6293670495364649914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/6293670495364649914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/6293670495364649914'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2008/07/some-news-jazoon-08-el4j-14.html' title='Jazoon 08 &amp; EL4J 1.4'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-2112864805812871482</id><published>2008-03-06T03:17:00.000-08:00</published><updated>2008-03-06T03:26:19.283-08:00</updated><title type='text'>EL4J release 1.3 is out!</title><content type='html'>We are glad to announce the new el4j release!&lt;br /&gt;&lt;br /&gt;Main features: New JSF application template based on Seam and Facelets (no need for EJB 3), simplified database access (less config duplication, more auto detection, more query possibilities), streamlined multi-environment support (make the same properties easily available in both maven (build and launch time) and Spring (run-time)), demo for single-jar deployment, new trouble-shooting guide (it helps with frequent issues that happen when you work with the technologies included in EL4J), improved doc, recursive maven builds (maven rec: as maven knows your dependencies it can now build your project and the projects it depends on automatically), clean-ups, ....&lt;br /&gt;&lt;br /&gt;Full release notes: http://el4j.svn.sourceforge.net/viewvc/*checkout*/el4j/trunk/el4j/etc/ReleaseNotes.txt&lt;br /&gt;SF.net site: http://el4j.sourceforge.net/index.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-2112864805812871482?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/2112864805812871482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=2112864805812871482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/2112864805812871482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/2112864805812871482'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2008/03/el4j-release-13-is-out.html' title='EL4J release 1.3 is out!'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-7870284059873489305</id><published>2007-12-18T00:17:00.000-08:00</published><updated>2007-12-18T00:18:59.520-08:00</updated><title type='text'>EL4J release 1.2 is out!</title><content type='html'>Main features: New Swing GUI framework (compilation of existing frameworks &amp;amp; demo), JAXWS usable via POJO programming model, new library versions, webstart demo, improved doc, seam demo, clean-ups, ....&lt;br /&gt;&lt;br /&gt;Full release notes: http://el4j.svn.sourceforge.net/viewvc/*checkout*/el4j/trunk/el4j/etc/ReleaseNotes.txt&lt;br /&gt;SF.net site: http://el4j.sourceforge.net/index.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-7870284059873489305?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/7870284059873489305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=7870284059873489305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/7870284059873489305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/7870284059873489305'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2007/12/el4j-release-12-is-out.html' title='EL4J release 1.2 is out!'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-526337144651814078</id><published>2007-07-06T17:43:00.001-07:00</published><updated>2007-07-06T17:56:44.462-07:00</updated><title type='text'>Presentation @ Jazoon 07 (European JavaOne Conference)</title><content type='html'>I held 2 presentations @ &lt;a href="http://jazoon.com/en/conference/day2.html"&gt;Jazoon&lt;/a&gt; this year, a demo about EL4J and a keynote on the heterogeneity of Java. Here are the slides: &lt;a href="http://el4j.sourceforge.net/el4jDemoSlidesJazoon02.pdf"&gt;EL4J demo&lt;/a&gt; &lt;a href="http://el4j.sourceforge.net/jazoonKeynoteOserJavaHeterogeneity02.pdf"&gt;keynote&lt;/a&gt; . Recently we have made quite some clean ups in EL4J. I hope to publish a next release soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-526337144651814078?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/526337144651814078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=526337144651814078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/526337144651814078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/526337144651814078'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2007/07/presentation-jazoon-07-european-javaone.html' title='Presentation @ Jazoon 07 (European JavaOne Conference)'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-261553412848044239</id><published>2007-03-21T01:59:00.000-07:00</published><updated>2007-03-21T02:07:24.034-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming challenge jazoon students competition'/><title type='text'>Jazoon scriptlet challenge for european students</title><content type='html'>The company I work for sponsors a &lt;a href="http://www.elca.ch/live/3/home/Careers/Student_Events/Jazoon_scriptlet_programming_challenge.php?pf_lat=81722"&gt;scriptlet programming challenge &lt;/a&gt;to mark the 2007 Jazoon conference (JavaOne of Europe) in Zurich.&lt;br /&gt;&lt;br /&gt;The goal is not to spend a lot of time coding, but to realize an interesting idea. Particularly encouraged are scriptlets using new features of Java 6, Groovy 1.0 and &lt;a href="http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29"&gt;Mashups&lt;/a&gt;.&lt;br /&gt;The number of raw lines of code is limited to 100 lines.&lt;br /&gt;&lt;br /&gt;You can win 3 free student entries for Jazoon and Amazon book vouchers.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.elca.ch/live/3/home/Careers/Student_Events/Jazoon_scriptlet_programming_challenge.php?pf_lat=81722"&gt;More details&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-261553412848044239?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/261553412848044239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=261553412848044239' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/261553412848044239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/261553412848044239'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2007/03/jazoon-scriptlet-challenge-for-european.html' title='Jazoon scriptlet challenge for european students'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-1330574658127719076</id><published>2007-01-25T13:44:00.000-08:00</published><updated>2007-01-25T14:24:27.674-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven dependency plugin el4j'/><title type='text'>Dependency graph for maven 2</title><content type='html'>When more and more maven modules are added to a project, it's sometimes useful to see a graph showing the dependencies between all modules. This can be done with the EL4J maven depgraph plugin. I think the quickest way to show the benefits is by showing its output when applied on itself:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_huhyXR2HDpE/RbkuApdzvAI/AAAAAAAAAAY/2o8YEj1rpVg/s1600-h/EL4J_dependencies.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_huhyXR2HDpE/RbkuApdzvAI/AAAAAAAAAAY/2o8YEj1rpVg/s400/EL4J_dependencies.png" alt="" id="BLOGGER_PHOTO_ID_5024097447974255618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are 2 modes of the plugin: one shows the dependencies of all the modules in a project. The other mode just shows the dependencies of the currently active directory. You can filter the modules to include. The output is then processed with the graphviz tool.&lt;br /&gt;&lt;br /&gt;For more info on the plugin I refer to the code (the global website has not yet been re-generated with the new plugins):&lt;br /&gt;&lt;br /&gt;http://svn.sourceforge.net/viewvc/el4j/trunk/el4j/maven/plugins/maven-depgraph-plugin/&lt;br /&gt;&lt;br /&gt;And while I am at it, we also have a maven database plugin that allows executing SQL scripts and (optionally) launching an embedded database.  More details can be found under http://svn.sourceforge.net/viewvc/el4j/trunk/el4j/maven/plugins/maven-database-plugin/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-1330574658127719076?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/1330574658127719076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=1330574658127719076' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/1330574658127719076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/1330574658127719076'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2007/01/dependency-graph-for-maven-2.html' title='Dependency graph for maven 2'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_huhyXR2HDpE/RbkuApdzvAI/AAAAAAAAAAY/2o8YEj1rpVg/s72-c/EL4J_dependencies.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-116112094432699781</id><published>2006-10-17T14:35:00.000-07:00</published><updated>2007-01-25T14:01:43.033-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EL4J spring remoting implicit context passing'/><title type='text'>Remoting semantics of Spring slightly changed</title><content type='html'>Time passes too quickly, already a month passed since my last blog entry :-(.&lt;br /&gt;We slightly adapted the remoting semantics of Spring. Here's a picture that shows how it works:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/el4jRemoting.gif"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/el4jRemoting.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the picture there are 2 JVMs: one has the &lt;span style="font-style: italic;"&gt;client&lt;/span&gt; and one has the &lt;span style="font-style: italic;"&gt;server &lt;/span&gt;role. We show the spring application context of each JVM. The rectangles with rounded corners are &lt;span style="font-style: italic;"&gt;spring beans&lt;/span&gt; (Java objects created by Spring). The normal rectangles are normal Java objects. Arrows are normal Java references. Spring beans with a dashed ring around have an &lt;span style="font-style: italic;"&gt;auto proxy &lt;/span&gt;(so you could e.g. add interceptors to them).&lt;br /&gt;In the server JVM, to publish POJOs via a remoting protocol, you define an &lt;span style="font-style: italic;"&gt;exporter &lt;/span&gt;spring bean (this requires no code, only a short Spring configuration). This exporter bean references another spring bean that represents the &lt;span style="font-style: italic;"&gt;protocol&lt;/span&gt; (this protocol bean fully configures what protocol to use and settings for the protocol). By changing settings on the protocol spring bean, you can fully control &lt;span style="font-style: italic;"&gt;how&lt;/span&gt; all the linked exporter beans are exported.&lt;br /&gt;In the client JVM, to get access to a remotely published POJO (either via Spring or other remoting), you just define an &lt;span style="font-style: italic;"&gt;importer &lt;/span&gt;&lt;span&gt;spring bean. This importer spring bean can be accessed like any other spring bean.  We tend to share the protocol configuration between the client and the server JVM.&lt;br /&gt;&lt;br /&gt;For simpler testing, one could even deploy the spring beans of the client and those of the server in one JVM (omitting the importer and exporter).&lt;br /&gt;&lt;br /&gt;Why did we change the semantics of the Spring remoting?&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;span&gt;&lt;span&gt;&lt;li&gt;It's easier to switch remoting protocols. The protocol definition and the fact that we remote is completely orthogonal.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can also remote 2.0/2.1 EJB beans without writing custom delegator classes (as Spring proposes it)&lt;/li&gt;&lt;li&gt;You can optionally enable implicit context passing (this is a topic for another blog entry, you may want to check out my article decribing this if you are impatient).&lt;/li&gt;&lt;li&gt;It allows for easy set up of load-balancing&lt;br /&gt;&lt;/li&gt;&lt;/span&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;The following picture illustrates our load-balancing feature:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/LoadBalancingRemoting_Overview.gif"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/LoadBalancingRemoting_Overview.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The load balancing protocol is a so-called composite protocol. It applies the Composite Design Pattern and thus allows the user to compose several of the atomic protocols (i.e., a non-composite protocol such as RMI) into this composite protocol. To the outside, it behaves like an atomic protocol. Note that the load balancing protocol is only used on the client side of a (remote) invocation and requires no modifications to existing remoting protocols.&lt;br /&gt;&lt;br /&gt;The load balancing protocol attempts to establish an initial connection to a particular server. If this connection attempt fails, it will ask for the next server from the policy bean and attempt to connect to this server. It repeats this behavior until it succeeds to connect, or no more servers are available. In the latter case, it throws a ch.elca.el4j.services.remoting.protocol.loadbalancing.NoProtocolAvailableException.&lt;br /&gt;&lt;br /&gt;Different policies can be plugged to govern the sequence in which protocol instances are invoked.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-116112094432699781?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/116112094432699781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=116112094432699781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/116112094432699781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/116112094432699781'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2006/10/remoting-semantics-of-spring-slightly.html' title='Remoting semantics of Spring slightly changed'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-115870208918197900</id><published>2006-09-19T14:41:00.000-07:00</published><updated>2007-01-25T14:02:19.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml merging'/><title type='text'>Pragmatic merging of XML</title><content type='html'>Sometimes it is useful to be able to merge different XML document into one.  For example when a tool accepts only one XML configuration file, but different subprojects that use the tool together would each be able to add some information to the XML configuration file. A concrete example would be the &lt;span style="font-family:courier new;"&gt;web.xml&lt;/span&gt; file of a J2EE servlet container: there can only be one such file per WAR-file. What if you have 2 subprojects that you would like to deploy into one WAR-file?&lt;br /&gt;You could merge the files by hand or you could set up an merging functionality to do it automatically for you. With the little framework I present here, you can easily set up your own XML file merging. The framework is available under the EL4J project (http://EL4J.sf.net) as part of the xml merger module. It was contributed by Laurent Bovet (from outside of the EL4J core team), thanks.&lt;br /&gt;&lt;br /&gt;Let's look at a simple example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/untitled.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/untitled.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The following simple code implements this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-family:courier new;"&gt;public String merge(String original, String patch) {&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;    Configurer c = new PropertyXPathConfigurer("xpath.1=/root/d \n matcher.1=ID");&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;    return new ConfigurableXmlMerge(c).merge(new String[]{original, patch} );&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;}&lt;/span&gt; &lt;img style="font-family: courier new;" src="file:///C:/DOCUME%7E1/PHILIP%7E1.SUR/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;You may ask: what does it mean to merge XML documents? I think it is difficult to find a general answer to this question:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sometimes the second XML file should be able override tags of the first XML file&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What are the branches that should be merged? Just the same XML tags? Or does some attribute need to be equal?&lt;/li&gt;&lt;li&gt;Sometimes some branches of the XML document may need to be left out&lt;/li&gt;&lt;/ul&gt;Because of this, the XML merger is set up as a framework. You plug in your own definitions of how matching and mappings are done. There are basic merging semantics implemented in the framework. If you need other rules, you can extend the parts that you are interested in.&lt;br /&gt;&lt;br /&gt;Please consult the detailed documentation or the samples of the xml merger in case you would like to know more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-115870208918197900?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/115870208918197900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=115870208918197900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115870208918197900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115870208918197900'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2006/09/pragmatic-merging-of-xml.html' title='Pragmatic merging of XML'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-115816303012439853</id><published>2006-09-13T08:57:00.000-07:00</published><updated>2007-03-14T12:03:10.283-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring insights into application introspection jmx'/><title type='text'>Getting insights in a running Spring application via JMX</title><content type='html'>During development it is often practical to be able to get more information about what is going on in a running JVM, e.g.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;what Spring configuration was loaded (taking into account all the overridden configuration),&lt;br /&gt;&lt;/li&gt;&lt;li&gt;what threads are running and with what properties,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;what interceptors are present on what spring beans&lt;/li&gt;&lt;/ul&gt;The EL4J JMX module allows exactly this. You just add a dependency from your application module to the JMX module and automatically have this and more information available via any web browser.&lt;br /&gt;&lt;br /&gt;Here are some screenshots to illustrate this:&lt;br /&gt;&lt;br /&gt;First we show the JMX overview page:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/jmxOverview.gif"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/jmxOverview.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Clicking on the fooBean leads to the following view:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/fooBeanOverview.gif"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/fooBeanOverview.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Clicking on the Configuration property shows the config values of the bean:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/fooBeanConfigurationView.gif"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/fooBeanConfigurationView.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Which corresponds to following spring configuration:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/springConfig.gif"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/springConfig.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also see all the threads that run in the JVM with their attributes:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/threadinfo.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/threadinfo.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additional features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Change the log4j logging level for a certain package during runtime&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get the current configuration location of log4j&lt;/li&gt;&lt;li&gt;See the measurements from the JaMON performance measuring interceptor&lt;/li&gt;&lt;li&gt;Activate log4j appenders during runtime (e.g. to get more info in case of problems)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;See all system properties defined in the JVM (e.g. to get the current CLASSPATH)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get the order of the configuration files as Spring reads them&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;All this is available with just the addition of a reference to the JMX module. Remark: to make the spring configuration available to JMX, it is required to use a subclass of the normal XMLApplicationContext.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-115816303012439853?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/115816303012439853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=115816303012439853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115816303012439853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115816303012439853'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2006/09/getting-insights-in-running-spring.html' title='Getting insights in a running Spring application via JMX'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-115575830277367050</id><published>2006-08-16T12:39:00.000-07:00</published><updated>2007-03-14T12:01:24.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring modules configuration auto-loading'/><title type='text'>Modules in the open-source EL4J framework</title><content type='html'>EL4J is to a large extent a collection of existing J2EE frameworks. Spring is the most important of the contained frameworks.&lt;br /&gt;&lt;br /&gt;One interesting feature of EL4J are&lt;span style="font-style: italic;"&gt; &lt;/span&gt;m&lt;span style="font-style: italic;"&gt;odules&lt;/span&gt;. They allow to split an application in smaller pieces. EL4J itself also uses modules to split its features in more handy chunks. A module is similar to an eclipse plugin or to a maven project (in fact, an EL4J module is both mapped to an eclipse plugin and a maven module).&lt;br /&gt;&lt;br /&gt;A module in EL4J contains (1) code, (2) predefined configuration and (3) dependencies. You can make dependencies on other modules or on jar files. When a module &lt;span style="font-weight: bold;"&gt;m1&lt;/span&gt; uses another module &lt;span style="font-weight: bold;"&gt;m2&lt;/span&gt;, the module &lt;span style="font-weight: bold;"&gt;m1&lt;/span&gt; has acces to all the content (code, config and dependencies) of module &lt;span style="font-weight: bold;"&gt;m2&lt;/span&gt;. This works transitively, i.e. if &lt;span style="font-weight: bold;"&gt;m2&lt;/span&gt; depends on a module &lt;span style="font-weight: bold;"&gt;m3&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;m1&lt;/span&gt; has also access to &lt;span style="font-weight: bold;"&gt;m2&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sample use: Adding simple performance tracking&lt;/span&gt;&lt;br /&gt;Why are modules useful? Let's assume you have an application with the module app. If you want to setup the performance interceptor to automatically time the duration of all calls to certain spring beans, you just make a dependency from your application to the module "light-statistics". From then on, you can access performance information via JMX.&lt;br /&gt;Under the hood, the module light-statistics sets up the JAMON performance interceptor, adds it by default to all spring beans (you can override this) and makes the information available in JMX. No need to configure anything or know more about the working of the module light statistics. By default, all is setup for you.&lt;br /&gt;In case you are not happy with the default, you can change anything. But simple things are simple to set up.&lt;br /&gt;&lt;br /&gt;Here's a sample setup of modules:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/138/3575/1600/sampleModules.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/138/3575/320/sampleModules.png" alt="" 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;In your applications, you make a dependency on all EL4J modules you need (above the module &lt;span style="font-weight: bold;"&gt;YourApplication &lt;/span&gt;needs the modules &lt;span style="font-weight: bold;"&gt;Security &lt;/span&gt;and &lt;span style="font-weight: bold;"&gt;WebTools&lt;/span&gt;. In this way, you automatically setup the things that are tedious to set up: jar-dependencies and the default configuration.&lt;br /&gt;&lt;br /&gt;Are you afraid that EL4J loads configuration "magically"? You don't have to use this feature, we just recommend it for simplicity. For your application context, you specify the place from where configuration should be loaded from (as always in spring). By convention, we put configuration we recommend to always use for a given module in a directory called &lt;span style="font-style: italic;"&gt;mandatory&lt;/span&gt;. The location we recommend to add to the list of locations to load configurations from is "classpath*:mandatory/*.xml".  Spring then includes all the default configuration automatically. You also have the possibility to exclude a location in case you do not need it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-115575830277367050?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/115575830277367050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=115575830277367050' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115575830277367050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115575830277367050'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2006/08/modules-in-open-source-el4j-framework.html' title='Modules in the open-source EL4J framework'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32678118.post-115559349662979062</id><published>2006-08-14T15:03:00.000-07:00</published><updated>2007-03-14T12:02:20.943-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Simpler J2EE development EL4J best-of-breed'/><title type='text'>We need a well-integrated set of best-of-breed tools for J2EE development</title><content type='html'>For simple, non-heterogeneous environments, IT-analysts often recommend using the .NET framework as development platform, rather than the J2EE. They say that .NET is simpler and more productive.&lt;br /&gt;This bugs me, because I prefer the Java platform and because I favor the more open community around the J2EE. Great innovation occurs in the J2EE open source world. We also have the better IDEs.&lt;br /&gt;&lt;br /&gt;However, when I recommend how to use the J2EE myself, I enumerate many different tools (just to name a few: Spring, Hibernate or Ibatis, Axis, Maven, Ant, JUnit, Log4j, Acegi), from different sources. It is often far from obvious what frameworks one should choose, there are just too many out there (consider e.g. the web framework domain). The integration of these frameworks is also done anew too many times.&lt;br /&gt;&lt;br /&gt;EL4J, the open-source project I work on, has the goal to improve this situation. It combines leading J2EE tools, provides sample applications and adds some features of its own. It was already used in 16 projects so far.  &lt;a href="http://el4j.sf.net/"&gt;http://EL4J.sf.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How do &lt;span style="font-weight: bold;"&gt;you&lt;/span&gt; estimate the situation in the J2EE development world?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32678118-115559349662979062?l=philhoser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philhoser.blogspot.com/feeds/115559349662979062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32678118&amp;postID=115559349662979062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115559349662979062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32678118/posts/default/115559349662979062'/><link rel='alternate' type='text/html' href='http://philhoser.blogspot.com/2006/08/we-need-well-integrated-set-of-best-of.html' title='We need a well-integrated set of best-of-breed tools for J2EE development'/><author><name>Phil</name><uri>http://www.blogger.com/profile/05759211477165330549</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
