<?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-4336468578069957483</id><updated>2011-12-08T10:35:11.434+01:00</updated><category term='search'/><category term='source'/><category term='maven'/><category term='code'/><category term='ant'/><category term='ant java'/><category term='ivy'/><category term='build'/><category term='java'/><title type='text'>XHAB: Xavier Hanin's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-670045649460838405</id><published>2010-10-16T22:14:00.005+02:00</published><updated>2010-10-16T23:52:23.521+02:00</updated><title type='text'>Play! framework Flex module development</title><content type='html'>&lt;h2&gt;Playing around&lt;/h2&gt;
&lt;p&gt;
I've been recently starrting to evaluate &lt;a href="http://playframework.org"&gt;Play!&lt;/a&gt; to use as a basis for future developments at &lt;a href="http:/www.4sh.fr"&gt;4SH&lt;/a&gt;. What I've seen so far is really pleasant, I like the productivity you get, and especially the hot reload experience: I'm used to develop in Java with pretty good hot reload capabilities, but with Play! I almost never have to restart my server, even when I touch my JPA entities to add or remove properties. It's really a pleasure. Moreover I really like the architecture, the concepts of plugins and class enhancers opens a set of interesting possibilities without relying on a complex build mechanism which causes problems in your IDE (I've experienced that with AspectJ): in playframework the complex build is part of the runtime, so you can just rely on the framework whatever you use for development.
&lt;/p&gt;

&lt;h2&gt;My use case: calling methods in my Play app classes from a Flex client&lt;/h2&gt;
&lt;p&gt;
While conducting my evaluation I had to test how good I could integrate a &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt; client with the Play backend, partly because some customers request a shiny Flex UI, and partly because I really like the productivity we have with Flex. It's also a good way to see how difficult it is to go outside the Play! box... &lt;br /&gt;
My intention in this module is to allow to perform remote calls from the flex application to public static methods on my Play classes (something similar to action methods). Indeed I have like the domain driven approach you can take with Play!, and thus I want to be able to perform remote calls directly on that static methods we get for free on the domain classes.
&lt;/p&gt;

&lt;h2&gt;First steps&lt;/h2&gt;
&lt;p&gt;
So my first step was to investigate how Flex performs its remote invocation, having a look at BlazeDS classes really helped for that. Integrating this in Play is not too difficult, thanks to the very high level hook plugins provide: rawInvocation is called before the HTTP request is route, so you can do whatever you want here without going through the whole action routing. It's nice to have this kind of very low level hook. With this approach I had something working in less than a day, not too bad considering that I was just beginning with Play. I even quickly hacked something to make the serialization understand the JPA lazy initialization so that it doesn't serialize collections which have not been fetched, so you can easily control what get serialized to the client, without requiring copies to DTOs.&lt;br/&gt;
From a Play! perspective, what I was doing was just a plugin, that I was putting in the classpath of my application (with a mere project dependency in eclipse). So my contract was almost fulfilled: calling methods was possible, but still I needed to write all the client side code, including kind of duplicating the code of my domain classes to convert them in ActionScript3...
&lt;/p&gt;

&lt;h2&gt;Improving productivity: generating client side code&lt;/h2&gt;
&lt;p&gt;
Writing the client side code manually when you have such a productive framework on the server side is just too painful. Moreover FlashBuilder 4, the tool Adobe offers for Flex development, has very good code generation features when you use BlazeDS on the server side, so it was not acceptable to drop this productivity boost on the client just for better productivity on the server... So I first tried to see how FlashBuilder gets meta information from BlazeDS to generate the code, but unfortunately it relies on the server side on the configuration of a Servlet (flex.rds.server.servlet.FrontEndServlet) which is provided in BlazeDS binaries but not in BlazeDS sources :( &lt;br/&gt; 
Therefore I considered using the code generation tool that &lt;a href="http://www.graniteds.org/"&gt;GraniteDS&lt;/a&gt; provides: &lt;a href="http://www.graniteds.org/confluence/display/DOC/3.+Gas3+Code+Generator"&gt;Gas3&lt;/a&gt;. But while commuting to work friday morning on my bike, I thought that Play! already offers a pretty easy way to generate source code: its regular template mechanism to serve HTTP requests. The advantage is that it's fully integrated, and I thought it was going to be very fast to develop: a controller with 3 actions: one to give the list of classes from which generation is possible, one to generate the actionscript to represent a value object (based on my entities on java side) and one to generate the service (on client side I prefer to distinguish classes to represent the remote objects from the value objects). With that you can simply copy / paste the generated code (that you get in the browser).&lt;br /&gt;
When I started to further read the document on how to do that from py plugin, I realized that what I needed was a Play! module rather than a mere plugin. Indeed &lt;a href="http://groups.google.com/group/play-framework/msg/abfa72ba8e3c40b3"&gt;Guillaume Bort is clear about the difference&lt;/a&gt;:
&lt;blockquote&gt;A plugin is a java class that extends PlayPlugin.  A module is an 
application fragment that can contain anything like any application. 
And of course it can contain some plugin too. &lt;/blockquote&gt;
&lt;/p&gt;

&lt;h2&gt;Enter module development&lt;/h2&gt;
So I first searched for documentation on how to write a module, and the main source of information is &lt;a href="http://www.playframework.org/documentation/1.1RC1/modules"&gt;this page&lt;/a&gt; in the documentation. Ok, so here the documentation is mixing information on what you can do inside a module and what you need to do to install a module in your app. I tihnk for some people it may be confusing, most users only need to use a module, and actually most of that page describes this use case.&lt;br /&gt;
Still based on that doc I could quickly start up with the &lt;code&gt;play new-module&lt;/code&gt; command, which gives you the structure to get started, nice! But quickly I had trouble figuring out where my classes should go, and I think the documentation is not clear on that subject. From what I've understood, it's important to understand that in the module you need to distinguish between different kind of classes:
&lt;ul&gt;
&lt;li&gt;Plugin and utility classes&lt;/li&gt;
This is the kind of classes which are in plain Java, not enhanced by Play, and that may be used by your application classes like any library, and may participate to the framework using provided hooks (plugin classes). It's also there that you put the play.plugins file which describes the plugins you are contributing in the module. The source of these classes go in the &lt;code&gt;src&lt;/code&gt;directory of your module if you follow the regular directory layout, and these classes are compiled by the &lt;code&gt;play build-module&lt;/code&gt; or &lt;code&gt;ant&lt;/code&gt; command inside the &lt;code&gt;lib&lt;/code&gt; directory of your module.
These classes need to be in the regular classpath of your application, so if you use an IDE you need to regenerate its configuration for your application using your module once you declare the module in your application.conf. Moreover you HAVE TO build the jar in the lib directory to have the compiled classes available in your app (if like me you test your module in an application).
&lt;li&gt;Play classes and views of your module&lt;/li&gt;
As Guillaume says, a module is an application fragment, and as such it can provides model classes, controllers routes and views. These classes and resources which are managed by Play! (loaded and enhanced by the Play! classloader, with the famous full hot reload capability). These go in the &lt;code&gt;app&lt;/code&gt; directory of your module, and since they are loaded by Play! you don't have to worry about the classpath: all you need is to have your module properly setup in the application.conf of your application (and the &lt;a href="http://www.playframework.org/documentation/1.1RC1/modules"&gt;documentation on the subject&lt;/a&gt; is perfect to describe that).
&lt;/ul&gt;
Once I had properly understood that, I was ready to actually develop my module controller to generate my source code. I still had some minor issues due to my inexperience with Play (like an OutOfMemory error after an exctract method in my controller class, because I moved a recursive &lt;code&gt;public static void&lt;/code&gt; to my controller, which was considered by Play as an action chaining... making it private was enough to fix the problem). Still the code generation pages were ready pretty fast.
&lt;/p&gt;

&lt;h2&gt;Still not enough productivity: enter commands&lt;/h2&gt;
&lt;p&gt;
Once I got my code generation working, I quickly felt that the copy/paste from browser to sources was going to be annoying. So I decided to go further in the automation and try to provide commands to generate the code directly in the proper files. After all Play! provides a skeleton of commands.py in the module skeleton provided by &lt;code&gt;play new-module&lt;/code&gt;, so adding a command which more or less performs a &lt;code&gt;wget&lt;/code&gt; shouldn't be too complicated.&lt;br /&gt;
It shouldn't, but I underestimated the time I had to spend. First of all, it was my very first time that I wrote Python. With my 15 years of development I'm not afraid by this kind of challenge, still my productivity in this case is not good, and sometimes the spaces dependent interpretation of python was making me remember my very old days of COBOL in 1994. Don't get me wrong, python seems very productive when you're used to it, it's just far enough from my mostly Java background to get me fall in every possible trap.&lt;br /&gt;
Moreover I had some troubles to get my commands integrate in play. When I tried my first command with confidence I got that:
&lt;pre&gt;
sample1-client $ play flex:gen
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1-76-g2e8d571, http://www.playframework.org
~
~ Usage: play cmd [app_path] [--options]
~ 
~ with,  new      Create a new application
~        run      Run the application in the current shell
~        help     Show play help
~
~ Invalid command: flex:gen
~
&lt;/pre&gt;
Invalid command, mmm, it seems my module is not properly recognized... 
&lt;pre&gt;
sample1 $ play modules
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1-76-g2e8d571, http://www.playframework.org
~
~ Application modules are:
~ 
~ /Users/xavierhanin/dev/tools/play/play-trunk/modules/flex
~ 
&lt;/pre&gt;
Mmm, it's there, so what's going wrong? I double checked my command declaration in my commands.py, googled for this kind of problem, even started to investigate on how the play command line mechanism is working, but with my poor knowledge of python I didn't even know how to enter in step by step debug mode. I decided to revert back to the initially generated commands.py, and then:
&lt;pre&gt;
sample1 $ play flex:hello
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1-76-g2e8d571, http://www.playframework.org
~
~ hello
~
&lt;/pre&gt;
Ok, so the problem is actually in my commands.py when I add my new command. Fortunately at a point in time I just wanted to generate my eclipse settings and then did something like this:
&lt;pre&gt;
sample1 $ play eclipsify
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1-76-g2e8d571, http://www.playframework.org
~
Traceback (most recent call last):
  File "/Users/xavierhanin/dev/tools/play/play-trunk/play", line 111, in &lt;module&gt;
    cmdloader.commands[play_command].execute(command=play_command, app=play_app, args=remaining_args, env=play_env, cmdloader=cmdloader)
  File "/Users/xavierhanin/dev/tools/play/play-trunk/framework/pym/play/commands/eclipse.py", line 121, in execute
    execfile(commands)
  File "/Users/xavierhanin/dev/tools/play/play-trunk/modules/flex/commands.py", line 46
    for c in entities.splitlines():
                                  ^
IndentationError: unindent does not match any outer indentation level
&lt;/pre&gt;
OK, now I get enough details on the compilation error in my commands.py! With that in my mind, every time I got a &lt;code&gt;Invalid command&lt;/code&gt; message I return to &lt;code&gt;play eclipsify&lt;/code&gt; to get the details, and it's good enough to fix the problem. I still had to fight a couple of times against my habits to get the code working, but now I have my code generation working like a charm, being able to generate the classes I want, with patterns to select which one like this:
&lt;pre&gt;
sample1-client $ play flex:gen --class models.**
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC1-76-g2e8d571, http://www.playframework.org
~
~ models.Comment entity generated in src/models/Comment.as
~ models.User entity generated in src/models/User.as
~ models.details.UserDetails entity generated in src/models/details/UserDetails.as
~ models.details.UserDetails entity delegate generated in src/models/details/UserDetailsDelegate.as
~ models.Post entity generated in src/models/Post.as
~ models.User service generated in src/services/UserService.as
~ models.details.UserDetails service generated in src/services/details/UserDetailsService.as
~ models.Post service generated in src/services/PostService.as
&lt;/pre&gt;
I'm pretty happy with that, even though I still have a lot of work to do on the doc, error management, security and yet improve productivity (to avoid a security black hole I force to add &lt;code&gt;@RemotingInclude&lt;/code&gt; on every method to expose, but then it's difficult to expose methods provided by Play like findAll and sisters). But my conclusion is that my overall feeling with Play! is very good, the module development part is not very well documented but that's why I wrote this blog entry, hoping it could help others.&lt;br/&gt;
Have fun!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-670045649460838405?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/670045649460838405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=670045649460838405' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/670045649460838405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/670045649460838405'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2010/10/play-framework-flex-module-development.html' title='Play! framework Flex module development'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-3489935239007786585</id><published>2009-11-18T12:37:00.005+01:00</published><updated>2009-11-20T00:51:24.322+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>ForEach / Generics java puzzler</title><content type='html'>&lt;p&gt;While assisting at Mark Reinhold talk on JDK 7 updates at &lt;a href="http://devoxx.com"&gt;devoxx&lt;/a&gt;, it reminded me a problem we had very recently in a project.&lt;/p&gt;

&lt;p&gt;Here is a small piece of java code:
&lt;pre&gt;
import java.util.ArrayList;
import java.util.List;


public class TestForEachLoop {
 public static void main(String[] args) {
  List&amp;lt;String&amp;gt; listOfStrings = new ArrayList&amp;lt;String&amp;gt;();
  
  doSomethingWithListInPreJava5(listOfStrings);
  for (Object o : listOfStrings) {
   System.out.println(o);
  }
 }

 private static void doSomethingWithListInPreJava5(List list) {
  list.add(new Integer(12));
 }
}
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;So, do you have an idea of what will happen if I compile and run this piece of code? I'll let you comment if you have an idea, and I promise the final answer is not obvious!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-3489935239007786585?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/3489935239007786585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=3489935239007786585' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3489935239007786585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3489935239007786585'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2009/11/foreach-generics-java-puzzler.html' title='ForEach / Generics java puzzler'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-5553963624284809764</id><published>2009-11-18T10:51:00.002+01:00</published><updated>2009-11-18T11:04:01.321+01:00</updated><title type='text'>Strange NPE in jboss 4.2.2</title><content type='html'>&lt;p&gt;A customer for which I work currently recently reported an error when deploying a new version of the application we just delivered to them. A jboss MBean (annotated with @Service) wasn't starting successfully, with an NPE in the logs in jboss code:
&lt;pre&gt;
java.lang.NullPointerException
at org.jboss.ejb3.service.ServiceContainer.start(ServiceContainer.java:179)
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;Googling for this, I didn't get much clue on what was going wrong. It seems nobody reported such problem before, that's why I thought it may be worth sharing the conclusion. Digging into the logs and in the jboss configuration setup by my customer, I found this:
&lt;pre&gt;
TIMER SERVICE IS NOT INSTALLED
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;looking at their ejb-deployer.xml, I realized they had commented out the timer mbean (org.jboss.ejb.txtimer.EJBTimerServiceImpl). What's really strange is that enabling this again fixed the NPE problem, at least in our case. So in case you met such an issue yourself, check that first, it may save you a couple of hours.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-5553963624284809764?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/5553963624284809764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=5553963624284809764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5553963624284809764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5553963624284809764'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2009/11/strange-npe-in-jboss-422.html' title='Strange NPE in jboss 4.2.2'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-1985659701467110202</id><published>2009-04-23T04:05:00.003+02:00</published><updated>2009-04-23T04:21:25.142+02:00</updated><title type='text'>Maven leadership in question</title><content type='html'>&lt;p&gt;While reading my feeds tonight I stumbled upon a post by Nicolas Deloof: &lt;a href="http://blog.loof.fr/2009/04/maven-devient-un-projet-prive.html"&gt;OPA hostile sur Maven&lt;/a&gt;, that I would translate with the help of google "&lt;a href="http://translate.google.fr/translate?u=http%3A%2F%2Fblog.loof.fr%2F2009%2F04%2Fmaven-devient-un-projet-prive.html&amp;sl=fr&amp;tl=en&amp;hl=fr&amp;ie=UTF-8"&gt;Hostile takeover on Maven&lt;/a&gt;".
&lt;/p&gt;&lt;p&gt;
The content of this post is interesting, I've already heard people complaining about the way the maven project is lead which doesn't seem to follow the "Apache way". I'm surprised that it comes to an extremity where a Maven committer ends up a blog post with a sentence like "At this rate I'll end up back to the good old Ant and his buddy Ivy.". Maybe it's a good time to switch to Maven alternatives like &lt;a href="http://www.easyant.org/"&gt;EasyAnt&lt;/a&gt; or &lt;a href="http://gradle.codehaus.org/"&gt;Gradle&lt;/a&gt; :-)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-1985659701467110202?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/1985659701467110202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=1985659701467110202' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1985659701467110202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1985659701467110202'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2009/04/maven-leadership-in-question.html' title='Maven leadership in question'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-5289824917689966888</id><published>2009-01-25T19:17:00.004+01:00</published><updated>2009-01-26T16:40:31.361+01:00</updated><title type='text'>Apache Ivy 2.0 final is out!</title><content type='html'>&lt;div style="float:right;"&gt;&lt;img src="http://ant.apache.org/ivy/images/logo.png" /&gt;&lt;/div&gt;
&lt;p&gt;I'm very pleased to relay the announcement made on the Ivy mailing list: &lt;a href="http://ant.apache.org/ivy/history/2.0.0/release-notes.html"&gt;Ivy 2.0 is finally out&lt;/a&gt;! After a little more than 2 years since the last official stable release (1.4.1), Ivy has gone a long journey toward this 2.0 release: it started incubation at the Apache Software foundation in late 2006, it graduated as a sub project of Ant in october 2007. In the mean time, we produced 2 alpha releases, 2 beta releases, and 2 release candidates before finally releasing 2.0.0. &lt;/p&gt;
&lt;p&gt;
This is definitely a major release for Ivy, for several reasons:
&lt;ul&gt;
&lt;li&gt;This is the first final stable release of Ivy as an Apache project&lt;/li&gt;
&lt;li&gt;The code base has been fully reworked to make it more modular, easier to understand and to maintain&lt;/li&gt;
&lt;li&gt;Maven 2 compatibility has never been as good, Ivy is used by many projects to leverage public maven 2 repositories&lt;/li&gt;
&lt;li&gt;As often requested by users, cache management is now much more flexible, allowing to address complex development and integration environments&lt;/li&gt;
&lt;li&gt;More flexible dependency management, with module wide exclude, transitive dependency version overriding, dynamic resolve mode, ...&lt;/li&gt;
&lt;li&gt;A new packager resolver, which allow to use a repository declaring how to package modules instead of storing them, used in &lt;a href="http://code.google.com/p/ivyroundup/"&gt;Ivy roundup repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ivy core has still no dependency at all, now even for command line use. So using Ivy can be as simple as java -jar ivy.jar. Ivy is now also an osgi bundle, which adds one more way to use it.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ant.apache.org/ivy/ivyde/"&gt;IvyDE&lt;/a&gt;, the Ivy eclipse plugin, has also been improved a lot. A &lt;a href="http://code.google.com/p/ivybeans/"&gt;Netbeans plugin&lt;/a&gt; and an &lt;a href="http://code.google.com/p/ivyidea/"&gt;IDEA plugin&lt;/a&gt; are also available&lt;/li&gt;
&lt;li&gt;A growing community, with 4 committers, 70 contributors and active mailing lists&lt;/li&gt;
&lt;li&gt;As always, &lt;a href="http://ant.apache.org/ivy/history/2.0.0/index.html"&gt;documentation&lt;/a&gt; has been fully updated with all new features and improvements (the &lt;a href="http://ant.apache.org/ivy/history/2.0.0/book.html"&gt;printer friendly version&lt;/a&gt; counts now more than 180 pages).&lt;/li&gt;
&lt;li&gt;220 bug fixes, 84 improvements and 24 new features since 1.4.1!&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
Here are the stats of number of issues per release:&lt;br/&gt;
&lt;a href="http://spreadsheets.google.com/pub?key=pcsKjmJOwgOuuDZKarT0JOQ"&gt;&lt;img src="http://spreadsheets.google.com/pub?key=pcsKjmJOwgOuuDZKarT0JOQ&amp;oid=1&amp;output=image" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
So if you haven't tried Ivy yet, &lt;a href="http://ant.apache.org/ivy/history/2.0.0/tutorial.html"&gt;go ahead&lt;/a&gt;, it's hot! And if you already use it, upgrade now, this release is mostly backward compatible with previous ones, and has been extensively tested!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-5289824917689966888?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/5289824917689966888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=5289824917689966888' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5289824917689966888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5289824917689966888'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2009/01/apache-ivy-20-final-is-out.html' title='Apache Ivy 2.0 final is out!'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-6471917203267518263</id><published>2009-01-22T22:18:00.003+01:00</published><updated>2009-01-22T22:24:49.153+01:00</updated><title type='text'>Strange RuntimeException with Seam on JBoss AS</title><content type='html'>I'm currently setting up a &lt;a href="http://seamframework.org"&gt;seam&lt;/a&gt; application, and I ran into a strange problem recently:
&lt;pre&gt;
--- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM ---
ObjectName: jboss.j2ee:service=EJB3,module=jboss-seam.jar
State: FAILED
Reason: java.lang.RuntimeException: You did not specify a @Resource.mappedName() on javax.ejb.TimerService org.jboss.seam.async.TimerServiceDispatcher.timerService and there is no binding for enc name env/org.jboss.seam.async.TimerServiceDispatcher/timerService in XML

ObjectName: jboss.j2ee:service=EJB3,module=app.jar
State: FAILED
Reason: java.lang.RuntimeException: @javax.annotation.PostConstruct annotated method has the wrong signature - public void org.jboss.seam.intercept.SessionBeanInterceptor.postConstruct(javax.interceptor.InvocationContext)

ObjectName: jboss.j2ee:module=jboss-seam.jar,uid=33039820,service=EJB3
State: FAILED
Reason: java.lang.RuntimeException: You did not specify a @Resource.mappedName() on javax.ejb.TimerService org.jboss.seam.async.TimerServiceDispatcher.timerService and there is no binding for enc name env/org.jboss.seam.async.TimerServiceDispatcher/timerService in XML
&lt;/pre&gt;
Googling around didn't really help, so I had to figure out myself what I did wrong. Actually I messed up my ear lib directory, and had the ejb-api.jar there. Obviously this jar shouldn't go in the ear lib directory, since it's provided by the server.&lt;br/&gt;
Unfortunately the error message doesn't really help to understand what can be wrong, so I thought posting this may help other people facing a similar situation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-6471917203267518263?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/6471917203267518263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=6471917203267518263' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/6471917203267518263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/6471917203267518263'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2009/01/strange-runtimeexception-with-seam-on.html' title='Strange RuntimeException with Seam on JBoss AS'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-4062787631023475925</id><published>2008-11-06T08:32:00.003+01:00</published><updated>2008-11-06T08:34:56.770+01:00</updated><title type='text'>Apache Ivy 2.0.0-RC2</title><content type='html'>&lt;p&gt;Maarten has just posted the announcement for Ivy 2.0-rc2. We are getting very close to 2.0.0 final, should be a matter of a couple of weeks now! &lt;/p&gt;
&lt;p&gt;
Here is the announcement :
&lt;pre&gt;
Nov 4, 2008 - The Apache Ivy project is pleased to announce the
release of Ivy 2.0.0-rc2, the second release candidate for Ivy 2.0.0.

Ivy is a tool for managing (recording, tracking, resolving and
reporting) project dependencies, characterized by flexibility,
configurability, and tight integration with Apache Ant.

This is a release candidate for 2.0.0 final, meaning that no changes
except bug fixes will occur between this release candidate and 2.0.0 final.
Problems found at this phase can be fixed in the final release, so now
is a good time to download and use it. If no outstanding bugs are reported
in the coming weeks, this release candidate will be promoted as the 2.0.0
final release.

Key changes in this 2.0.0-rc2 version are
* enhanced Maven2 compatibility, with several bug fixes
* 20+ bug fixes as documented in Jira and in the release notes

Issues should be reported to:
&lt;a href="https://issues.apache.org/jira/browse/IVY"&gt;https://issues.apache.org/jira/browse/IVY&lt;/a&gt;

Download the 2.0.0-rc2 release files at:
&lt;a href="http://ant.apache.org/ivy/download.cgi"&gt;http://ant.apache.org/ivy/download.cgi&lt;/a&gt;

More information can be found on the Ivy website:
&lt;a href="http://ant.apache.org/ivy/"&gt;http://ant.apache.org/ivy/&lt;/a&gt;

Regards,
Maarten Coene (2.0.0-rc2 release manager)
&lt;/pre&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-4062787631023475925?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/4062787631023475925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=4062787631023475925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4062787631023475925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4062787631023475925'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/11/apache-ivy-200-rc2.html' title='Apache Ivy 2.0.0-RC2'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7396073714910913537</id><published>2008-06-24T06:25:00.002+02:00</published><updated>2008-06-24T06:49:21.129+02:00</updated><title type='text'>A gasless week</title><content type='html'>&lt;p&gt;Last tuesday morning after a lengthy and opinionated discussion with friends about global warming, I decided to go to work by bike. I mostly work at less than 10kms away from home, so biking there takes less than half an hour. &lt;/p&gt;
&lt;p&gt;
But why stop with one day... So the day after I used my bike again, to go to work, then to go climbing, then go visit a friend, and then come back home at 1am. About 40 kms in a day, not that hard after all.
&lt;/p&gt;
&lt;p&gt;
Then I had two days working at home, avoiding to use my scooter was easy :-)
&lt;/p&gt;
&lt;p&gt;
Friday night I went to a party with friends from tennis club. 8kms each way, by bike again. Saturday I went to a friend's birthday party, only 4kms, but I had to bring charcoal for the BBQ and paper tabblecloth... I used my bike again, keeping balance more or less easily. Going back home was pretty funny, a storm started just when I left, so I was fully soaking wet when I get back home. Fortunately human body is waterproof :-)
&lt;/p&gt;
&lt;p&gt;
Sunday I went to a volley ball tournament, and it was only 1km away from my home, so I enjoyed using my bike to go there. And yesterday I worked at home, fulfilling my gasless week. Today I plan to go to work with my bike again, it's a small contribution to decreasing the carbon dioxyd emission, but it's better than nothing. And you, what do you do for the earth?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7396073714910913537?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7396073714910913537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7396073714910913537' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7396073714910913537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7396073714910913537'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/06/gasless-week.html' title='A gasless week'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7877592738964661049</id><published>2008-05-07T10:05:00.002+02:00</published><updated>2008-05-07T10:11:10.396+02:00</updated><title type='text'>SpringSource Repository</title><content type='html'>A new public java module repository has just come into the dance: the &lt;a href="http://www.springsource.com/repository/"&gt;spring source repository&lt;/a&gt;. This repository is both a Maven repository and an Ivy repository. It means that it contains metadata not only in maven 2 pom format (which BTW Ivy is able to recognize) but also in Ivy native format: Ivy files.
&lt;p&gt;
The modules contained are not plain open source jars, most of them have been repackaged in OSGi bundles (all that were not already). I'm not sure about what this will mean for the future of public repositories, but it's great to see that spring source continue its commitment to support both Maven and Ivy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7877592738964661049?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7877592738964661049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7877592738964661049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7877592738964661049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7877592738964661049'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/05/springsource-repository.html' title='SpringSource Repository'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-8778604296009061283</id><published>2008-04-24T20:02:00.002+02:00</published><updated>2008-04-24T20:21:24.091+02:00</updated><title type='text'>Gradle, a new Groovy based build system</title><content type='html'>Hans Dockter recently &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=49165"&gt;announced&lt;/a&gt; the availability of first public version of Gradle, a new build system leveraging Grovvy, Ant and ... Ivy!
&lt;p&gt;
I won't comment too much on the tool yet, I've only read a few pages out of the 50+ pages the &lt;a href="http://gradle.org/userguide.html"&gt;user guide&lt;/a&gt; counts.
&lt;p&gt;
What really pleased me while reading the comments on the server side announcement, is the praise made to Ivy:
&lt;blockquote&gt;And I must say I'm absolutely thrilled with Gradle's choice for Ivy integration, which is a gem in its own right.&lt;/blockquote&gt;
&lt;br/&gt;
&lt;blockquote&gt;I was solely using Maven2 for years. I just knew that Ivy existed and I thought it plays more or less in the same league as Maven's dependency management. I couldn't have been more wrong.&lt;br/&gt;
&lt;br/&gt;
I completely agree that Ivy is a true gem. Starting from the quality of the code base to the fantastic solution of the problem space of dependency management. And its getting better and better. If I had to choose now between Ant &amp; Ivy or Maven, my decision would be very clear. Well, but now there is Gradle :) It adds one missing piece to Ivy. A build system that offers a build-by-convention integration for it.&lt;/blockquote&gt;
&lt;p&gt;
It's nice to hear this kind of thing, it's one of the best reward of the time and energy involved in this project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-8778604296009061283?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/8778604296009061283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=8778604296009061283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/8778604296009061283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/8778604296009061283'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/04/gradle-new-groovy-based-build-system.html' title='Gradle, a new Groovy based build system'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-5848128239335567140</id><published>2008-04-17T19:50:00.004+02:00</published><updated>2008-05-14T14:00:36.897+02:00</updated><title type='text'>IvyBeans wins Netbeans innovator grant!</title><content type='html'>&lt;p&gt;Winners of Netbeans innovator grants have &lt;a href="http://www.netbeans.org/grant/"&gt;just been announced&lt;/a&gt;, and IvyBeans, a project submitted by Laurent Foret with my collaboration is amoung the 10 large projects selected!&lt;/p&gt;
&lt;p&gt;This is a very good news both for the &lt;a href="http://ant.apache.org/ivy/"&gt;Ivy&lt;/a&gt; community and the Netbeans community. I can't tell too much about the content of this project yet, but you already have good hints of what it is about.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Update: The project is now started, hosted at google code: &lt;a href="http://code.google.com/p/ivybeans/"&gt;http://code.google.com/p/ivybeans/&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-5848128239335567140?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/5848128239335567140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=5848128239335567140' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5848128239335567140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5848128239335567140'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/04/ivybeans-win-netbeans-innovator-grant.html' title='IvyBeans wins Netbeans innovator grant!'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-5205547522951427870</id><published>2008-04-17T16:41:00.003+02:00</published><updated>2008-04-17T17:38:36.578+02:00</updated><title type='text'>Ivy ramblings</title><content type='html'>Today I spent some time setting up and developing a project for a customer, which involved some Ivy tricks for dependency management. I thought sharing this might interest some Ivy users or contemplators ;-)
&lt;p&gt;
First my Ivy settings:
&lt;pre&gt;
&amp;lt;ivysettings&amp;gt;
 &amp;lt;settings defaultResolver="default" /&amp;gt;
 &amp;lt;include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/&amp;gt;
 &amp;lt;include url="${ivy.default.settings.dir}/ivysettings-local.xml"/&amp;gt;
 &amp;lt;resolvers&amp;gt;
           &amp;lt;chain name="public"&amp;gt;
         &amp;lt;!-- official maven2 repo --&amp;gt;
  &amp;lt;ibiblio name="maven2" m2compatible="true" /&amp;gt;
         &amp;lt;!-- apache incubating maven2 repo, used for CXF --&amp;gt;
  &amp;lt;ibiblio name="apache-incubating" m2compatible="true" 
            root="http://people.apache.org/repo/m2-incubating-repository" /&amp;gt;
         &amp;lt;!-- jboss maven2 repo, used for jbpm --&amp;gt;
  &amp;lt;ibiblio name="jboss" m2compatible="true" 
            root="http://repository.jboss.org/maven2/" /&amp;gt;
         &amp;lt;!-- some jbpm modules seem to be missing from jboss repo, here is one where we can get what we need --&amp;gt;
  &amp;lt;ibiblio name="elca-services" m2compatible="true" 
            root="http://el4.elca-services.ch/el4j/maven2repository/"/&amp;gt;
  &amp;lt;!-- java.net repo, containing useful java apis --&amp;gt;
  &amp;lt;ibiblio name="java.net" root="http://download.java.net/maven/1/" 
                            pattern="[organisation]/[type]s/[artifact]-[revision].[ext]"/&amp;gt;
  &amp;lt;!-- restlet maven 2 repo --&amp;gt;   
  &amp;lt;ibiblio name="restlet" m2compatible="true" root="http://maven.restlet.org/" /&amp;gt;
    &amp;lt;/chain&amp;gt;
    &amp;lt;!-- eventbus is not available on any repo, we access it directly from its web site --&amp;gt;
    &amp;lt;url name="eventbus"&amp;gt;
   &amp;lt;artifact pattern="https://eventbus.dev.java.net/files/documents/4303/75132/EventBus-[revision].jar" /&amp;gt;
    &amp;lt;/url&amp;gt;   
 &amp;lt;/resolvers&amp;gt;
 &amp;lt;include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/&amp;gt;
 &amp;lt;include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/&amp;gt;
 &amp;lt;modules&amp;gt;
   &amp;lt;!-- use eventbus repo for eventbus only --&amp;gt;
   &amp;lt;module organisation="net.java.eventbus" name="eventbus" resolver="eventbus"/&amp;gt;
   &amp;lt;!-- use shared resolver for all modules developed internally, to improve perf --&amp;gt;
   &amp;lt;module organisation="com.foobar" name="*" resolver="shared"/&amp;gt;
 &amp;lt;/modules&amp;gt;
&amp;lt;/ivysettings&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
These settings are based on default Ivy settings, as such I follow the recommendations given &lt;a href="http://ant.apache.org/ivy/history/latest-milestone/tutorial/defaultconf.html"&gt;here&lt;/a&gt;.
&lt;p&gt;
Besides the chain of public maven repos I use for the set of tools used in this project (ranging from hibernate to spring, jbpm, groovy, restlet, flex...), there is one very specific trick used for eventbus. Eventbus doesn't seem to be available on any public repo, but its jar is available on its java.net home page. Thanks to Ivy flexibility, I can use this location as a "repository". But this repository will "find" almost any module, because there is no [module] or [artifact] tokens in the pattern. So I must be careful and put this resolver outside of the default chain resolver. Hence this resolver will never be used, except when I instruct Ivy to do so. That's exactly what I do with the module line, telling to use this resolver for modules whose name is "eventbus" and org is "java.net.eventbus".
&lt;p&gt;
Then in my Ivy file I can declare my dependency as if it where available like any other module:
&lt;pre&gt;
&amp;lt;dependency org="net.java.eventbus" name="eventbus" rev="1.1" /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
The other trick I use is to tell Ivy to use the shared resolver for all modules from "com.foobar". This trick is very useful to improve performance, it tells Ivy to look for the modules I develop for my customer in the shared resolver only, avoiding the latency of the public repo for these modules.
&lt;p&gt;
Ok, that's it for the settings. Now here is a very specific conflict management issue I had to deal with. As I said earlier I use both groovy and hibernate in my project. So here's my pretty simple first attempt to get the two dependencies in my module:
&lt;pre&gt;
&amp;lt;dependency org="org.codehaus.groovy" name="groovy" rev="1.5.4" /&amp;gt;
&amp;lt;dependency org="org.hibernate" name="hibernate" rev="3.2.6.ga" /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
The problem is that groovy 1.5.4 depends on asm 2.2, and hibernate 3.2.6.ga depends on cglib 2.1_3, which in turn depends on asm 1.5.3. Ivy resolves the conflict automatically according to my settings, and use the latest version between the two: 2.2. The problem is that I then have a classloader issue at runtime: java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
&lt;p&gt;
A quick search on the net and I find this &lt;a href="http://www.lumidant.com/blog/hibernate-asm-incompatibilities/"&gt;solution&lt;/a&gt;:
&lt;blockquote&gt;
The easiest solution I’ve found is to remove the CGLib and ASM (1.5.3), which come with Hibernate and instead replace them with a copy of cglib-nodep.
&lt;/blockquote&gt;
&lt;p&gt;
Allright, let's convert this in instructions for Ivy. First, we need to exclude the dependency on cglib that you have in hibernate metadata:
&lt;pre&gt;
&amp;lt;dependency org="org.hibernate" name="hibernate" rev="3.2.6.ga"&amp;gt;
    &amp;lt;exclude module="cglib"/&amp;gt; &amp;lt;!-- we use cglib-nodep instead, to fix a conflict with groovy asm usage --&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
Then I add the dependency on cglib nodep instead:
&lt;pre&gt;
&amp;lt;!-- this is to replace the regular dependency of hibernate on regular cglib --&amp;gt;
&amp;lt;dependency org="cglib" name="cglib-nodep" rev="2.1_3" /&amp;gt;
&lt;/pre&gt;
I'm not really happy with this, because I have to add a dependency cglib-nodep, while my module doesn't depend on cglib-nodep. But Ivy conflict management engine can't really help since I want to replace one module (cglib) by another (cglib-nodep). But I'll come back to this later.
&lt;p&gt;
Let's run my test again... allright, it seems to work properly! Let's have a look at the dependencies and the version of asm I now get in my classpath:
&lt;pre&gt;
asm-2.2.jar
asm-util-2.2.jar
asm-tree-2.2.jar
asm-analysis-2.2.jar
asm-attrs-1.5.3.jar
&lt;/pre&gt;
Mmm, I don't like this: I have a mix of versions of asm modules. Checking Ivy report, I clearly see why: hibernate has a direct dependency on asm-attrs 1.5.3, while groovy doesn't depend at all on asm-attrs. Thus there is no conflict on this module, and Ivy selects the only revision of this module that was requested. Too bad in this particular case, I'd prefer to have all asm modules aligned in version.&lt;br/&gt;
With the override mechanism introduced recently, it's easy:
&lt;pre&gt;
&amp;lt;override org="asm" rev="2.2" /&amp;gt;
&lt;/pre&gt;
This is enough to tell Ivy to use revision 2.2 of all modules from asm organization, whatever is actually requested. Since I don't use Ivy trunk version in this project, I had to circumvent the problem this way:
&lt;pre&gt;
&amp;lt;dependency org="org.hibernate" name="hibernate" rev="3.2.6.ga"&amp;gt;
 &amp;lt;exclude module="cglib"/&amp;gt; &amp;lt;!-- we use cglib-nodep instead, to fix a conflict with groovy asm usage --&amp;gt;
 &amp;lt;exclude module="asm.*" matcher="regexp" /&amp;gt; &amp;lt;!-- we want to take care of asm dependency ourself --&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;!-- this is to replace the regular dependency of hibernate on regular cglib --&amp;gt;
&amp;lt;dependency org="cglib" name="cglib-nodep" rev="2.1_3" /&amp;gt;
&amp;lt;!-- this would better be handled by new override mechanism --&amp;gt;
&amp;lt;dependency org="asm" name="asm-attrs" rev="2.2" /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Ok, so now it works properly and I have aligned versions for all asm jars. That's nice, but it was a bit cumbersome, and my metadata is cluttered with bad information: I have declared a dependency on cglib-nodep that I don't really have (same for asm, but with trunk version this would be avoided). Maybe we could find a way to improve the metadata or conflict management to be able deal with this kind of case... But the real problem is that these "modules" don't match the concept of module in Ivy: 
&lt;blockquote&gt;
A module in ivy is a piece of software that is reusable, and that follow a unique cycle of revision. 
&lt;/blockquote&gt;
In this case, all asm artifacts (attrs, tree, ...) would better fit in a single module in Ivy, with a configuration for each artifact (if it makes sense, I don't know asm enough). The same applies for cglib and cglib-nodep: it's actually a single module, it's just different packaging and usage, hence different configurations in Ivy. &lt;br/&gt;
So with actual Ivy metadata, getting asm-attrs in one version and asm-tree in another would almost be impossible (well, you'd need to use some Ivy tricks to get them if you really want to). And the problem with cglib could be handled with the conflict management or override system. Metadata would be kept consistent, and easier to maintain. But unfortunately I have to use maven 2 repos for this customer, and there is no such clean Ivy metadata... &lt;a href="http://www.nabble.com/Ivy-RoundUp-Repository---feedback-requested-to16704469.html"&gt;yet&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-5205547522951427870?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/5205547522951427870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=5205547522951427870' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5205547522951427870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/5205547522951427870'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/04/ivy-ramblings.html' title='Ivy ramblings'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-8146457325384634907</id><published>2008-04-03T20:59:00.002+02:00</published><updated>2008-04-03T21:22:32.346+02:00</updated><title type='text'>A day for Ivy development</title><content type='html'>Yesterday my main customer cancelled a meeting which was planned for today, so I decided to take advantage of this free day to fix some of the &lt;a href="https://issues.apache.org/jira/browse/IVY/fixforversion/12312237"&gt;open issues targeted for Ivy 2.0 final&lt;/a&gt;.
&lt;p&gt;
I started with the final touch to the implementation of transitive override support (&lt;a href="http://issues.apache.org/jira/browse/IVY-784"&gt;IVY-784&lt;/a&gt;). This will allow users to override the dependency constraint declared by a transitive dependency. This complement the already powerful support for transitive excludes, and fine grain conflict manager configuration. Together, those features are a very nice way to deal with bad metadata over which you don't have control. Actually, this implementation was required due to a change in dependency management handling introduced in maven 2.0.6: now the dependencyManagement section override transitive dependencies versions, so we had to implement this as well as part of our maven compatibility feature.
&lt;/p&gt;
&lt;p&gt;
Then I worked on &lt;a href="http://issues.apache.org/jira/browse/IVY-297"&gt;IVY-297&lt;/a&gt;, improving name consistency and readibility, deprecating allownomd="true | false" in favour of descriptor="required | optional" on resolvers. I also updated buildlist to replace skipbuildwithoutivy="true | false" by onMissingDescriptor="head | tail | skip | warn | fail", which is both more readable and give more control about what to do when a module is missing a module descriptor.
&lt;/p&gt;
&lt;p&gt;
The next job consisted in fixing an issue with properties and included files: properties used to be local to the settings file in which they were defined. Therefore it was not possible to define properties in an included file and use them in the including file. 
&lt;/p&gt;
&lt;p&gt;
Later I fixed &lt;a href="http://issues.apache.org/jira/browse/IVY-777"&gt;IVY-777&lt;/a&gt;, which required to introduce a new interface: Validatable. Now any Ivy plugin can be validated at the end of settings parsing, simply by implementing this interface. It's the case for dependency resolvers, which now checks that the configured cache manager, latest strategy and name space actually exist.
&lt;/p&gt;
&lt;p&gt;
The next issue was a maven 2 compatibility issue: supporting SNAPSHOT versions used to be rather limited in Ivy: with no specific handling, Ivy didn't know how to handle SNAPSHOT versions with a unique revision (where a timestamp and build number is used) and didn't try to update the revision when you don't use unique revision. This is now implemented, relying on maven-metadata.xml to get the required information.
&lt;/p&gt;
&lt;p&gt;
To end up my day, I resolved some easy to fix issues, like IVY-579, IVY-592, IVY-437, IVY-722 and IVY-774.
&lt;/p&gt;
&lt;p&gt;
So it's been a pretty busy day, but we now have 12 less issues on our road map toward Ivy 2.0!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-8146457325384634907?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/8146457325384634907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=8146457325384634907' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/8146457325384634907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/8146457325384634907'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/04/day-for-ivy-development.html' title='A day for Ivy development'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-1455767749438712193</id><published>2008-03-12T17:45:00.003+01:00</published><updated>2008-03-12T18:10:29.303+01:00</updated><title type='text'>New Maven 2 repository search site</title><content type='html'>mvnrepository.com has been unavailable for a few days, so I finally decided to quickly develop a new site, providing only one very basic but very useful feature: maven 2 repository search.
&lt;p&gt;
The site is available here:&lt;br/&gt;
&lt;a href="http://javarepo.xoocode.org/"&gt;http://javarepo.xoocode.org/&lt;/a&gt;
&lt;p&gt;
Nothing terrible here, just a very simple web interface. The advantage over mvnrepository.com:

&lt;h4&gt;it is available now&lt;/h4&gt;
I'm just kidding, it may be down in a couple of minute, and I guess mvnrepository will be back pretty soon
&lt;h4&gt;More Ivy friendly&lt;/h4&gt;
JavaRepo uses Ivy terminology instead of maven one, and also provides snippets to add a dependency in Ivy as well as in a Maven pom on each module revision page like &lt;a href="http://javarepo.xoocode.org/module/org.apache.ivy/ivy/2.0.0-beta2"&gt;this one&lt;/a&gt;.
&lt;h4&gt;More searchs&lt;/h4&gt;
JavaRepo provides several kind of searches: the classic general search, but also more constrained searches, like the list of organizations, or the list of modules in an organization, or the list of revisions per module, and in any case you can restrict the result to names starting with a given prefix.
&lt;h4&gt;RESTful interface&lt;/h4&gt;
I've developed the site using restlet, to keep control over the URLs. With no way to modify the data, being RESTful is pretty easy... But I've tried to follow some of the principles I've learned in "Restful Web services" book to design the URLs pattern, and the returned XHTML, which should be usable by human and computers. 
&lt;p&gt;
These two last things are actually my main motivation behind this site. In the future I'd like to provide better code completion and easy dependency adding by search in IvyDE when using maven 2 repository, and we first need a service like this one to implement that.
&lt;p&gt;
Will I improve it in the future? Will it say at this location? Will I maintain it alone? I really don't know, there's no big plan, just a simple solution to a problem of my own.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-1455767749438712193?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/1455767749438712193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=1455767749438712193' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1455767749438712193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1455767749438712193'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/03/new-maven-2-repository-search-site.html' title='New Maven 2 repository search site'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-3443680508810646043</id><published>2008-02-22T14:42:00.002+01:00</published><updated>2008-02-22T14:48:38.730+01:00</updated><title type='text'>Ant + Ivy team growing!</title><content type='html'>Yesterday I &lt;a href="http://www.nabble.com/-VOTE--add-Nicolas-Lalev%C3%A9e-as-committer-to15452682.html"&gt;published the end result of the vote&lt;/a&gt; I started last week to accept a new committer on the &lt;a href="http://ant.apache.org/"&gt;Apache Ant&lt;/a&gt; project, for his contribution to &lt;a href="http://ant.apache.org/ivy/"&gt;Ivy&lt;/a&gt; and IvyDE: Nicolas Lalevée has joined the team, congratulations Nicolas, keep up your good work, and continue to help make &lt;a href="http://ant.apache.org/ivy/ivyde/"&gt;IvyDE&lt;/a&gt; a kick ass tool :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-3443680508810646043?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/3443680508810646043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=3443680508810646043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3443680508810646043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3443680508810646043'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/02/ant-ivy-team-growing.html' title='Ant + Ivy team growing!'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-9088076458580856496</id><published>2008-01-10T15:29:00.000+01:00</published><updated>2008-01-10T15:57:41.782+01:00</updated><title type='text'>EasyAnt: Ant based pre packaged build system for java projects</title><content type='html'>&lt;p&gt;Here is a copy of an &lt;a href="http://www.nabble.com/-DISCUSS--EasyAnt%3A-Ant-based-pre-packaged-build-system-for-java-projects-td14735371.html"&gt;e-mail I've just posted on dev@ant.apache.org&lt;/a&gt; mailing list. I thought it might interest some of this blog readers too.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's been a long time since I'm thinking about this, and thought it might be interesting to share with you and see where the idea can go.&lt;/p&gt;

&lt;p&gt;I see many developers adopt Maven because they want a build system able to provide common features with no effort. Most of them don't want to spend much time writing an Ant script, or have seen or heard that maintaining Ant build scripts is troublesome. So they choose to use Maven only because it's easy to use for common use cases: install, write a simple pom of a few lines or generate it using an archetype, and you're ready to compile, test and package your new project following the Maven standard structure. They also get dependency management for free, and with only a few more effort they have multi module builds, and some nice features like code analysis, coverage, and a set of report gathered in a web site. That's really nice and that's what I like about Maven.&lt;/p&gt;

&lt;p&gt;But Maven suffers from a lack of flexibility and robustness IMHO. And later the same people who first adopted Maven because of its perceived ease of use become frustrated when they need to tweek the system to their own needs or don't understand how the release plugin work. Then some of them go back to Ant, first having to go through a sometimes painful road to describe their whole build system in xml, especially if they aren't Ant experts. Others try to use new build tools like raven, buildr or others.&lt;/p&gt;

&lt;p&gt;I really like Ant, and think it is a very good basis for robust and flexible build systems. People with enough knowledge of Ant can write very good build systems, testable, maintainable and adaptable. But you need to get your hands dirty, and you need to get a good knowledge of some of the mechanisms which can make an Ant based build system manageable: import, scripts and scriptdef, macrodef, presetdef, and so on.&lt;/p&gt;

&lt;p&gt;Hence I'm wondering if it wouldn't be a good idea to package a set of Ant build files, providing all the basic features of a build system for java projects: dependency management, compilation, testing and packaging, plus maybe some more advanced features like code coverage and code auditing. Multi module build support would be nice to have too. Then someone needing only those features could simply have a build file per project mostly consisting of a single import of the common build file provided. Some needing more could provide plugins to the build system itself. Some needing to tweak the system could simply override some target definitions or properties. Others with very specific needs could simply use the build scripts as examples or basis.&lt;/p&gt;

&lt;p&gt;I guess most people on this list know the benefit of having such a build system and how well it scales, and most of us already have developed such a set of build files. But providing the basis of such a good build system well packaged and documented could improve the Ant community IMO. With some efforts from our community we could end up with something interesting pretty easily. Most of us don't have much time, but we probably already have a good basis from the build files we work with around, and if this can be done in a community effort it could remain affordable in terms of time required.&lt;/p&gt;

&lt;p&gt;So, what do you think? Do you think this would be useful? Would you be interested in contributing? Do you think a new Ant sub project would be a good fit?&lt;/p&gt;
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-9088076458580856496?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/9088076458580856496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=9088076458580856496' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/9088076458580856496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/9088076458580856496'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2008/01/easyant-ant-based-pre-packaged-build.html' title='EasyAnt: Ant based pre packaged build system for java projects'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-3891676816248543434</id><published>2007-11-11T19:08:00.000+01:00</published><updated>2007-11-11T19:18:32.567+01:00</updated><title type='text'>Wicket and Databinder new releases</title><content type='html'>&lt;p&gt;This week-end Apache Wicket has released its &lt;a href="http://wicket.apache.org/wicket-130-rc1.html"&gt;first release candidate for the 1.3 version&lt;/a&gt;. That's very good news, I'm using 1.3 beta versions for a while now, and getting closer to the 1.3 final release is exciting! Kudos to the Wicket developer team for their work!
&lt;/p&gt;&lt;p&gt;
A couple of hours after this release, Nathan released a &lt;a href="http://databinder.net/forum/viewtopic.php?p=677#677"&gt;new beta version of databinder&lt;/a&gt;, upgraded to the new wicket version. Nathan you're so fast!
&lt;/p&gt;&lt;p&gt;
An interesting detail about this databinder beta: it now includes the &lt;a href="http://xhab.blogspot.com/2007/06/wicket-hibernate-query-panel.html"&gt;Query Panel&lt;/a&gt; I developed some months ago, and make it even easier to use. Indeed, Nathan had the neat idea to provide a Data Browser page, which is mounted by default on the /dbrowser URL only in development mode. So if you have a databinder application, you benefit from this page for free! Good job Nathan!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-3891676816248543434?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/3891676816248543434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=3891676816248543434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3891676816248543434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3891676816248543434'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/11/wicket-and-databinder-new-releases.html' title='Wicket and Databinder new releases'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-3232380728535431991</id><published>2007-10-16T16:46:00.000+02:00</published><updated>2007-10-16T16:56:14.656+02:00</updated><title type='text'>Ivy has graduated!</title><content type='html'>&lt;div style="float:right;"&gt;&lt;a href="http://ant.apache.org/ivy/"&gt;&lt;img src="http://ant.apache.org/ivy/images/logo.png"/&gt;&lt;/a&gt;&lt;/div&gt; After almost one year of incubation, two incubating releases, 1800+ e-mails on the user list, 1400+ e-mails on the developer list, with the help of 4 mentors, 3 committers, 38 contributors and many more users, Ivy has officially graduated as a sub project of Apache Ant!
&lt;p&gt;
This means that Ivy is now an official Apache project, and I hope this will help us attract more contributors and committers in our community. Being a subproject of Ant, all Ant committers now have right access to Ivy svn repository, so this is already an important increase in the number of committers! And since we are about to decide to use the same development mailing list, hopefully the development community behind Ant+Ivy will soon be only a single and stronger community.
&lt;p&gt;
As a direct consequence of graduation, Ivy's web site is now reachable at &lt;a href="http://ant.apache.org/ivy/"&gt;http://ant.apache.org/ivy/&lt;/a&gt;. Update your bookmarks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-3232380728535431991?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/3232380728535431991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=3232380728535431991' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3232380728535431991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3232380728535431991'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/10/ivy-has-graduated.html' title='Ivy has graduated!'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-4822280411871911980</id><published>2007-08-21T17:30:00.000+02:00</published><updated>2007-08-21T17:36:18.783+02:00</updated><title type='text'>Upcoming talks</title><content type='html'>Last week I've been contacted by Eelco Hillenius to replace him to give a talk on &lt;a href="http://wicket.apache.org"&gt;Wicket&lt;/a&gt; at &lt;a href="http://www.javazone.no/"&gt;JavaZone&lt;/a&gt;. After some questions about my skils to prepare and give this talk, I accepted. This will be my first trip to Norway, and my first talk on Wicket.
&lt;p&gt;
I'm not a Wicket expert, but I hope the lessons I've learned since I'm using it for some of my open source projects will help me give an interesting talk and answer questions.
&lt;p&gt;
What's pretty funny is that almost the same day I've been contacted by some &lt;a href="http://www.javapolis.org/"&gt;Javapolis&lt;/a&gt; folks to give short talk on &lt;a href="http://incubator.apache.org/ivy/"&gt;Ivy&lt;/a&gt;. And if ever I'm accepted to give a talk on Ivy at the Asia OS Summit in Hong Kong, the end of the year will be booked with quite a lot of conferences and traveling!
&lt;p&gt;
Now it's time for me to prepare the Wicket talk, and return to &lt;a href="http://xooctory.xoocode.org/"&gt;Xooctory&lt;/a&gt; and &lt;a href="http://incubator.apache.org/ivy/"&gt;Ivy&lt;/a&gt; development, we have a beta to release pretty soon on both projects. In october I'll have much less time for open source with my courses at ENSEIRB starting again, and probably a consultancy for Thales Avionics, and some training sessions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-4822280411871911980?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/4822280411871911980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=4822280411871911980' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4822280411871911980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4822280411871911980'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/08/upcoming-talks.html' title='Upcoming talks'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7434135653147559217</id><published>2007-07-04T11:49:00.000+02:00</published><updated>2007-07-04T14:05:34.960+02:00</updated><title type='text'>Top 10 reasons why you should try Wicket</title><content type='html'>If you haven't already tried &lt;a href="http://incubator.apache.org/wicket/"&gt;Wicket&lt;/a&gt; so far, here are my top ten reasons why you should:
&lt;ol&gt;
&lt;li&gt;Wicket is now Apache Wicket&lt;/li&gt;
Wicket entered Apache incubation last october, and has recently &lt;a href="http://martijndashorst.com/blog/2007/06/20/3-2-1/"&gt;graduated as a top level Apache project&lt;/a&gt;. This means that it is now a real Apache project. Why is it important? Because it means that all the legal bits have been cleaned to meet the ASF requirements (and your legal department should be concerned about that :-)), that the project has demonstrated a diverse and active community which is a very good sign of project health, and that the project releases are archived and mirrored all over the world.
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Wicket 1.3 beta 2 is available&lt;/li&gt;
A few days after their graduation, the wicket team has &lt;a href="http://martijndashorst.com/blog/2007/07/02/apache-wicket-130-beta-2-released/"&gt;released a second beta version of their 1.3 stream&lt;/a&gt;. This version is a huge improvement over the 1.2.x versions, with 339 new features, improvements and bug fixed issues addressed in &lt;a href="http://issues.apache.org/jira/browse/WICKET"&gt;their JIRA&lt;/a&gt;. This version should provide a pretty stable API, so it's a very good time to give it a try.
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Very active community&lt;/li&gt;
If you are not afraid of &lt;a href="http://sourceforge.net/mailarchive/forum.php?forum_name=wicket-user"&gt;receiving 1300+ mail a month&lt;/a&gt;, I strongly suggest subscribing to the wicket user mailing list. Got a question? 600+ subscribed users will probably provide an answer in the following hours, or even minutes. And since most of the wicket developer team takes time to participate to this list, you will have precise, clear and from the source information in case of real problems. Last but not least, Wicket team has a very good sense of humor :-)
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Proven web framework&lt;/li&gt;
Wicket released its 1.0 version in June 2005, and has regularly provided new versions since then. Even though it's &lt;a href="http://chillenious.wordpress.com/2007/06/20/wicket-is-now-a-top-level-apache-project/"&gt;difficult to know exactly the number of wicket application running today&lt;/a&gt;, the trend seems to be growing, and having graduated as an Apache project shouldn't reverse the trend :-). Another important fact is how wicket team lead their development: they often provides maintenance release on their production stream (wicket 1.2.6 has been released last April) while they develop the new major version.
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Neat component model&lt;/li&gt;
Wicket provides a neat component model which makes building feature rich and consistent web applications much easier. Anybody with a basic Java knowledge can develop AJAX applications with Wicket, thanks to the AJAX components available. You don't need to have advanced javascript and browser compatibility skills. Moreover, components in Wicket allow to have a clean separation between team members responsibilities. Senior web developers can develop new components, with fancy javascript effects and AJAX behaviors, while junior developers can keep focused on business centric development reusing the component palette available. 
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Creating components is &lt;b&gt;really&lt;/b&gt; easy&lt;/li&gt;
One of the main benefits of component oriented frameworks is the re usability of components. But is it really interesting if creating a component is too complex? Have you ever tried creating a JSF component? Forget about that, creating components in Wicket is as easy as creating an HTML file and a corresponding (and simple) Java class. And since the HTML file is a regular HTML file, you can very easily test your javascript effects or your CSS within your browser without even launching a web server. 
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Large set of existing components&lt;/li&gt;
Out of the box wicket &lt;a href="http://wicketstuff.org/wicket13/compref/"&gt;provides a large set of components&lt;/a&gt;, including data tables, forms, trees, along with corresponding AJAX versions. With a vibrant community, you can find more and more components contributions, like the wicket contrib dojo project which provides a mapping of many &lt;a href="http://www.dojotoolkit.com/"&gt;dojo&lt;/a&gt; components in wicket, or &lt;a href="http://databinder.net/"&gt;databinder&lt;/a&gt; which provides a very easy to use mapping between wicket and hibernate, with some very nice components too. Since creating component in wicket is easy, many people share their ideas and code about reusable components, providing a large growing source of reusable components.
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;No XML&lt;/li&gt;
Wicket is entirely based on plain Java and plan HTML. No XML. No maintenance nightmare of overly big and complex configuration file. Just Java, with excellent IDE support for code completion, refactorings, source code navigation and documentation.
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Separation of concerns&lt;/li&gt;
In Wicket templates are plain HTML files, with only a few ids used to relate HTML tags to Java objects. It makes it very easy for teams with web designers and web developers to work concurrently without stepping on each other.
And since templates are plain HTML, the framework ensure you won't &lt;b&gt;ever&lt;/b&gt; get business logic in your templates. Do you remember any JSP maintenance nightmare?
&lt;br/&gt;&lt;br/&gt;
&lt;li&gt;Clean rendered web application&lt;/li&gt;
In wicket component rendering is not too complex, and you can easily read and understand the HTML code produced, and adjust it to your own needs if required. There is no over complex javascript involved. The Java code used to generate HTML is clean, and you can often override rendering by overriding Java methods. Simple yet powerful.
Furthermore wicket provide an easy and powerful way to provide clean URLs, by mounting pages and providing a flexible URL coding strategy. 
&lt;br/&gt;&lt;br/&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7434135653147559217?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7434135653147559217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7434135653147559217' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7434135653147559217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7434135653147559217'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/07/top-10-reasons-why-you-should-try.html' title='Top 10 reasons why you should try Wicket'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-3923422471636460100</id><published>2007-07-02T09:16:00.000+02:00</published><updated>2007-07-02T09:22:04.800+02:00</updated><title type='text'>My first german article</title><content type='html'>For those of you speaking german, Jan Materne and I have written an article on &lt;a href="http://incubator.apache.org/ivy/"&gt;Ivy&lt;/a&gt; in JavaMagazin, which is already &lt;a href="http://javamagazin.de/itr/online_artikel/psecom,id,912,nodeid,11.html"&gt;online&lt;/a&gt; and should be published in the next printed version.
&lt;p&gt;
It's an introduction article, so don't expect to learn much if you're already familiar with Ivy :-)
&lt;p&gt;
For those who might wonder, I don't speak german; so I'm not even able to understand the article :-) Jan did the translation from the english version on which we worked. It's pretty funny for a french guy like me to write an article in english to work with a german guy finally translating the article! Good old Europe and our so many languages!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-3923422471636460100?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/3923422471636460100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=3923422471636460100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3923422471636460100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3923422471636460100'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/07/my-first-german-article.html' title='My first german article'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7804165616851549995</id><published>2007-06-22T16:10:00.000+02:00</published><updated>2007-06-22T16:31:39.255+02:00</updated><title type='text'>Xooctory 0.2</title><content type='html'>I've just published and announce the 0.2 version of Xooctory, the open source continuous integration server on which I'm currently spending most of time (along with &lt;a href="http://incubator.apache.org/ivy/"&gt;Ivy&lt;/a&gt;, and providing trainings and java consulting).
&lt;p&gt;
I'm happy that we respect the &lt;a href="http://xooctory.xoocode.org/road-map.html"&gt;road map&lt;/a&gt; we have set up so far, if we continue to work as expected the 0.3 version should come in a few weeks, and the 1.0 beta 1 in september. We have upgraded our own installation, so you can see it in action here:&lt;br/&gt;
&lt;a href="http://builds.xoocode.org/"&gt;http://builds.xoocode.org/&lt;/a&gt;
&lt;p&gt;
This version is still very limited and far from providing all the &lt;a href="http://xooctory.xoocode.org/features.html"&gt;features&lt;/a&gt; we intend to have for 1.0, but it begins to give an idea of some of the concepts. The flexibility has been greatly improved with the introduction of some &lt;a href="http://xooctory.xoocode.org/doc/plugins.html"&gt;plugins&lt;/a&gt;, and the &lt;a href="http://xooctory.xoocode.org/doc/architecture.html"&gt;architecture&lt;/a&gt; has been improved after some discussions with people interested in the project.
&lt;p&gt;
One of the most interesting new feature in this version is the result publishing architecture. It makes it pretty easy to collect any kind of result from the builds. In this release only junit is implemented this way, but more are coming (compilation, javadoc, checkstyle, ...). This result publication system is interesting because it fully adhere to our instant feedback feature: you get the results as soon as they are produced by your build, instead of waiting for the end of the build. The result format is flexible, but still need to be improved. After a discussion with Arnaud Bailly, we may try to use RDF as format for publishing results. We'll see how we can evolve the system in future versions to take advantage of this.
&lt;p&gt;
Now it's time for me to investigate more the distribution problem, I'm currently considering &lt;a href="http://www.jini.org/"&gt;Jini&lt;/a&gt; very seriously as a way to discover new agents in the system and easily upload code for build execution (with very simple administration). We will see how the 0.3 will implement this, but the distribution problem is very interesting and the discussions I've had so far on xooctory makes me enjoy its development very much!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7804165616851549995?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7804165616851549995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7804165616851549995' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7804165616851549995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7804165616851549995'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/06/xooctory-02.html' title='Xooctory 0.2'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-4507569475673834041</id><published>2007-06-19T11:38:00.000+02:00</published><updated>2007-06-19T12:35:49.874+02:00</updated><title type='text'>wicket hibernate query panel</title><content type='html'>It's so easy to create components in wicket that I almost create one reusable component a day! After the &lt;a href="http://xhab.blogspot.com/2007/06/wicket-jquery-tab-component.html"&gt;JQuery tab panel&lt;/a&gt; and a JQuery &lt;a href="http://www.xoocode.org/wsvn/xoocode/org.xoocode.xooctory/trunk/xooctory/src/main/java/org/xoocode/xooctory/web/component/jquery/accordion/"&gt;accordion panel&lt;/a&gt;, I've now setup a more complete component: a panel where you can enter an hibernate query and execute it. This is very simple, but very useful for debug and administration needs.
&lt;p&gt;
Here is how it looks like:
&lt;a href="http://www.flickr.com/photos/41363014@N00/568548098/"&gt;&lt;img src="http://farm2.static.flickr.com/1035/568548092_f768733aac_o.jpg" width="400" height="189" alt="hibernate-query-panel-small" /&gt;&lt;/a&gt;
&lt;p&gt;
Once again the &lt;a href="http://www.xoocode.org/wsvn/xoocode/org.xoocode.xooctory/trunk/xooctory/src/main/java/org/xoocode/xooctory/web/component/hibernate/HibernateQueryPanel.java?op=file&amp;rev=0&amp;sc=0"&gt;source code&lt;/a&gt; is not too complex and only requires a session factory (obtained from the spring container in my case). And since this is ASL v2 licensed code which depends on hibernate, wicket and databinder only, you can pretty easily reuse it for your own needs.
&lt;p&gt;
The development of this component was very easy, the longer part is to setup the columns, depending on the request. For instance, you can type "select job.name as name, job.id as id from JobModel job" and it will display two columns in the result, 'name' and 'id'. But you don't specify a select clause (eg "from JobModel") you will get all the properties of JobModel in the result table.
&lt;p&gt;
This is still far from what the &lt;a href="http://siegfried.puchbauer.com/blog/2007/06/grails-ext-userinterface.html"&gt;Grails Ext user interface&lt;/a&gt; provides, but it's pretty useful already.
&lt;p&gt;
If I have time, I plan to extend it to provide the list of available entities for an easy access to corresponding queries. If I have even more time it could be interesting to push the idea even further and create some kind of phpMyAdmin for hibernate applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-4507569475673834041?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/4507569475673834041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=4507569475673834041' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4507569475673834041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4507569475673834041'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/06/wicket-hibernate-query-panel.html' title='wicket hibernate query panel'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7475438105334541116</id><published>2007-06-04T19:04:00.000+02:00</published><updated>2007-06-05T08:21:16.638+02:00</updated><title type='text'>Wicket JQuery tab component</title><content type='html'>I'm currently using &lt;a href="http://incubator.apache.org/wicket/"&gt;wicket&lt;/a&gt; for the &lt;a href="http://xooctory.xoocode.org/"&gt;open source project&lt;/a&gt; on which I spend most of my time, and I was &lt;a href="http://www.nabble.com/When-you-have-tabs-and-forms%2C-is-it-ok-to-have-the-tabs-all-inside-one-form%2C-tf3372494.html#a9480567"&gt;needing a client side tabbed panel component to submit a form using tabs&lt;/a&gt; in one POST.
&lt;p&gt;
So I've decided to implement a simple one using &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; and the &lt;a href="http://stilbuero.de/jquery/tabs/"&gt;tabs plugin&lt;/a&gt; by Klaus Hartl.
&lt;p&gt;
The implementation was pretty fast, and it can be used as drop in replacement of wicket TabbedPanel component. Therefore I just have to replace:&lt;br/&gt;
&lt;code&gt;new WicketPanel(id, tabs)&lt;/code&gt;&lt;br/&gt;
by&lt;br/&gt;
&lt;code&gt;new JQWicketPanel(id, tabs)&lt;/code&gt;&lt;br/&gt;
&lt;p&gt;
Very easy, and I can also customize the tabs with the available options from the tabs plugin. For instance &lt;code&gt;new JQWicketPanel(id, tabs, "{ fxFade: true, fxSpeed: 'fast' }")&lt;/code&gt; will create a tabbed panel with a fast fading between each tab.
&lt;p&gt;
For those interested, the source code is &lt;a href="http://www.xoocode.org/wsvn/xoocode/org.xoocode.xooctory/trunk/xooctory/src/main/java/org/xoocode/xooctory/web/component/jquery/"&gt;available in xooctory&lt;/a&gt;, the license is an ASLv2 license, so feel free to copy and adapt it to your needs.
&lt;p&gt;
Wicket makes very easy to develop such components, and that's one of the thing I like the most about wicket. It remembers me a session at last javapolis where experts explained during one hour how easy it is to create custom JSF components in eleven points. I luckily won their book while attending to javapolis, it's a 400 pages book just to explain how to create ajax components for JSF. This is not what I call easy. My wicket implementation is about &lt;a href="http://www.xoocode.org/wsvn/xoocode/org.xoocode.xooctory/trunk/xooctory/src/main/java/org/xoocode/xooctory/web/component/jquery/tabs/JQTabbedPanel.java?op=file&amp;rev=0&amp;sc=0"&gt;140 lines of Java&lt;/a&gt; (well, 50 lines of Java and the rest of comments and imports) and &lt;a href="http://www.xoocode.org/wsvn/xoocode/org.xoocode.xooctory/trunk/xooctory/src/main/java/org/xoocode/xooctory/web/component/jquery/tabs/JQTabbedPanel.html?op=file&amp;rev=0&amp;sc=0"&gt;40 lines of html&lt;/a&gt; (most of which is used for testing only). That's all, and you don't need to be an expert in wicket to write such a component. I really like wicket!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7475438105334541116?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7475438105334541116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7475438105334541116' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7475438105334541116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7475438105334541116'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/06/wicket-jquery-tab-component.html' title='Wicket JQuery tab component'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-4388020517113147215</id><published>2007-05-28T11:17:00.000+02:00</published><updated>2007-05-28T13:03:24.886+02:00</updated><title type='text'>My road to the open source world</title><content type='html'>&lt;p&gt;
During the past months my professional life has drastically changed and I think I've finally found my way...
&lt;h2&gt;Beginning of my trip&lt;/h2&gt;
&lt;p&gt;
Since my diploma in 1999, I've tried may different forms of working. I spent a few months as an employee working for a bug consulting company, then a few other months for a Parisian startup; I later decided to become a freelancer, which worked quite well for a few years, but when I decided to come back to Bordeaux in early 2002, it was much more difficult to find missions, then I decided to join Lectra as an employee. The challenges of the research and development department of this french "software CAD/CAM equipment for textile leather and soft material maker" were interesting, but the way to manage employees was not my cup of tea, and I decided to leave with friends of mine and start &lt;a href="http://www.jayasoft.fr/"&gt;Jayasoft&lt;/a&gt;.
&lt;p&gt;
The very first thing I did for this company was setup the development environment and the build system. After a quick evaluation of our needs, I wrote a small plugin for Apache Ant to manage the dependencies between our projects. A few months later, we decided to open source this tool: &lt;a href="http://incubator.apache.org/ivy/"&gt;Ivy&lt;/a&gt; was born!
&lt;h2&gt;Ivy, first milestone on the road&lt;/h2&gt;
&lt;p&gt;
Open sourcing Ivy was not really thought as a contribution to the open source world from which we already leveraged a lot of libraries and tools, but as a way to try to make our company better known, with a tool which would never have become commercial anyway.
&lt;p&gt;
Then the first posts appeared on the forum, and people actually began to download, install and use this small tool. I was very excited, it was the very first time I was in direct contact with people from all over the world using my work.
&lt;p&gt;
Excited by this new form of contact with people, I spent a lot of time improving the tool, answering to people, and trying to communicate on it. Some people began to talk about it on their blogs, and after a few months we reached the 1.0 version.
&lt;p&gt;
Then my excitation and involvement in this tool grew, but it was still an open source software developed in a closed source way. I slowly learned how important it was to have a public issue tracking system, and a public source repository. Later some people get more involved, and we decided to welcome Maarten Coene as a committer on the project. This was our very first step in the direction of an open development.
&lt;p&gt;
At that time we were contacted by a californian university to help them improve their build system by reviewing their Ant builds and installing Ivy. I left the old continent for 3 months, which was a very interesting time during which I had time to get even more involved on Ivy.
&lt;p&gt;
On the other hand, this period was pretty difficult for our company, a commercial project on which we invested a lot was not going as well as we hoped, and we had to face the truth: we were not able to make enough money with our current business plan.
&lt;h2&gt;September 2006, the big turn&lt;/h2&gt;
&lt;p&gt;
When I cam back to France in September 2006, we decided to split the company. Two of us left to go back to the employee world, another one decided to become a freelancer acting for jayasoft and providing services to local big companies. On my side, I decided to come back as a freelancer, with a simple idea: I don't need much money to live, and I prefer to be free to do what I want most of the time. So I decided to try to do only to short missions, giving me enough time to spend in developing ideas for the open source community. Indeed at the same time Ivy entered incubation in the Apache Software Foundation, and I was getting more and more excited about the open source world and community.
&lt;p&gt;
During my first month as a freelancer I spent quite a lot of time in missions, and my time for open source was mostly dedicated to the migration of Ivy to the ASF: migration of documentation and web site, migration to the mailing lists and the Apache way, refactoring of code to make it cleaner, and so on.
&lt;p&gt;
And now it's been a few months since I've started a new project I was dreaming about for a while: the &lt;a href="http://www.xoocode.org/"&gt;xoocode.org&lt;/a&gt; project.
&lt;h2&gt;Next stop: the xoocode.org project&lt;/h2&gt;
&lt;p&gt;
This project is actually a crazy idea: I'm not really satisfied with the services offered by open source hosting providers like sourceforge, java.net, google code or javaforge. I would like an hosting solution as easy to use as google code, but with at least as many services as sourceforge. I'd also like to have continuous integration for all hosted projects.
&lt;p&gt;
Thus I've started xoocode.org as a small hosting solution which is not currently accepting projects, because there isn't much added value right now. 
&lt;p&gt;
To provide the services I want, I've started two open source projects:&lt;br/&gt;
&lt;a href="http://xoosent.xoocode.org"&gt;XooSent&lt;/a&gt;, a very simple issue tracking system, developed in less than a week. It is still very rudimentary right now, but I hope it will later become the tool I imagine.&lt;br/&gt;
&lt;a href="http://xooctory.xoocode.org"&gt;Xooctory&lt;/a&gt;, yet another continuous integration server, for which we &lt;a href="http://xooctory.xoocode.org/news/xooctory-0.1.html"&gt;announced the 0.1 version&lt;/a&gt; today.
&lt;p&gt;
Many will wonder why creating new projects when you can already find pretty good open source tools out there. The answer is based on two main things:
&lt;ul&gt;
&lt;li&gt;features&lt;/li&gt;
I want a tightly integrated development platform, where linking from one tool to another is super easy. I want a massively scalable continuous integration system. And I want even more, but I think you'll think I'm crazy enough with only this!
&lt;li&gt;interest&lt;/li&gt;
Developing a massively scalable continuous integration server is a very interesting challenge. Trying to find solutions to develop quickly a mostly data centric tool like an issue tracker is very useful. And that's also the power of open source: you can choose what you wanna do, and I'm a passionate developer.
&lt;/ul&gt;
&lt;p&gt;
So I've setup a server with:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;subversion browsing with &lt;a href="http://websvn.tigris.org/"&gt;websvn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://subetha.tigris.org/"&gt;subetha&lt;/a&gt; based mailing lists also usable as a forum&lt;/li&gt;
&lt;li&gt;a very simple site, based on a project I start for Ivy web site: &lt;a href="http://xooki.sourceforge.net/"&gt;xooki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;very rudimentary issue tracking, based on xoosent&lt;/li&gt;
&lt;li&gt;basic continuous integration, based on xooctory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Where will I go next?&lt;/h2&gt;
&lt;p&gt;
In the near future xooctory development has my priority. Later I hope to find enough time or community interest to continue XooSent development. Ivy is still pretty high in my priorities, but it already has a community, which is not the case for the xoocode project. I would also like to develop xooki to introduce some server side features to make it possible to edit pages online, while still keeping the offline edition feature. And I hope I'll be able to contribute to the wicket-contrib-push project on which I was recently promoted to the committer rank.
&lt;p&gt;
Then when the platform will begin to be stable and feature rich, I hope I'll find enough money and community interest to accept external projects hosting, to provide the services I was dreaming about to any open source project.
&lt;p&gt;
Where all of this will really lead me I don't know, maybe one day I'll wake up wondering I spent so much time of my life just for the pleasure of developing crazy ideas. But right now the pleasure to develop and discuss challenging things with smart people is worth much more than all the money I could make by being a more conventional developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-4388020517113147215?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/4388020517113147215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=4388020517113147215' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4388020517113147215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4388020517113147215'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/05/my-road-to-open-source-world.html' title='My road to the open source world'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-1310574269314592677</id><published>2007-04-04T17:17:00.001+02:00</published><updated>2007-04-04T17:18:41.867+02:00</updated><title type='text'>JavaMail, Java6 and Classloader issue</title><content type='html'>I'm currently on a small application in which I need to send e-mails. Using the JavaMail API from the&lt;a href="http://jakarta.apache.org/commons/email/"&gt; jakarta commons-email API&lt;/a&gt; make it pretty simple, and I got my app sending e-mail in a matter of minutes in development.&lt;br/&gt;&lt;br/&gt;

But when I tried to deploy my application I ran into a strange issue:
&lt;pre&gt;
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type plain/text
&lt;/pre&gt;

Uh, what's the problem. Googling on the subject I quickly found an &lt;a href="http://www.jguru.com/faq/view.jsp?EID=237257"&gt;entry on jGuru's FAQ&lt;/a&gt;. According to this entry, it may be due either to badly registered mime type (pretty strange for text/plain), or to some classloading or version issues between javax.mail and the java beans activation framework (JAF)... But what's the difference between my development environment and my deployed environment: mainly a classloader (since I use Ivy to launch my app, it is actually loaded in a ClassLoader created by Ivy). But what is strange is that I ahve only one version of javax.mail and of activation.jar, and they are both loaded by the same classloader (from Ivy).&lt;br/&gt;&lt;br/&gt;

After some research, I found a small entry on the &lt;a href="https://glassfish.dev.java.net/javaee5/mail/"&gt;new home of javax.mail&lt;/a&gt; stating that JAF is part of glassfish... and of Java SE 6.  And since I'm using Java SE 6, it means that JAF is loaded from the main ClassLoader, while javax.mail is loaded by Ivy ClassLoader, thus leading to this strange exception.&lt;br/&gt;&lt;br/&gt;

Fortunately I have enough control over my classpath and classloader,  and asa workaround I've now added javax.mail jar to my jvm classpath, instead of loading it from Ivy classloader, and removed activation.jar from my deployment configuration in Ivy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-1310574269314592677?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/1310574269314592677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=1310574269314592677' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1310574269314592677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1310574269314592677'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/04/javamail-java6-and-classloader-issue.html' title='JavaMail, Java6 and Classloader issue'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-6034953070979822102</id><published>2007-03-30T10:58:00.000+02:00</published><updated>2007-03-31T07:24:01.767+02:00</updated><title type='text'>A new logging experience!</title><content type='html'>I've been using &lt;a href="http://logback.qos.ch/"&gt;logback &lt;/a&gt;for a few months now, and I'm impressed!
&lt;br/&gt;&lt;br/&gt;
With excellent documentation and support, neat logging features, blazing performance and an innovating eclipse plugin, I've finally found a good replacement for the good old log4j.
&lt;br/&gt;&lt;br/&gt;
The first thing I really appreciate compared to log4j or the java logging api is the &lt;a href="http://logback.qos.ch/documentation.html"&gt;documentation&lt;/a&gt;. The guide is well written, they have a nice &lt;a href="http://logback.qos.ch/demo.html"&gt;demo&lt;/a&gt;, and you are up to speed in a few minutes.
&lt;br/&gt;&lt;br/&gt;
&lt;h2&gt;Neat logging features&lt;/h2&gt;
There are some very simple features which makes the life so much easier, such as the intelligent logger name reduction when it's too long: instead of simply truncating the name, it put the first letter of each package:
&lt;pre&gt;
09:59:04.203 [main] INFO o.x.x.web.XoosentApplication - starting XooSent
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
The &lt;a href="http://logback.qos.ch/manual/mdc.html"&gt;Mapped Diagnostic Context&lt;/a&gt; (MDC) is also a killing feature. It allows to associate metadata to the current thread, to correlate messages to their context. For instance in a web application with authentication, you can associate the user name to the the thread and add this user name to all log messages, without any change to your log calls.
For instance, you add this at user authentication time:
&lt;pre&gt;
MDC.put("user", username);
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Then in your logback configuration you can use %Xuser in your pattern, and you will see the authenticated user name. It's that simple, and in multithreaded environment where multiple traces overlap, it really helps.&lt;br/&gt;
&lt;em&gt;Updated: As Jorg pointed out, this isn't a feature introduced by logback, as log4j already supports NDC and MDC.&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;

&lt;h2&gt;Performance&lt;/h2&gt;

The parametrized logging is a key feature of logback, which improves performance by avoiding a toString() call when your message is not logged:
&lt;pre&gt;
logger.debug("Hello, my name is {}, I am {} years old", username, age);
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
Note that obviously the performance gain applies only if you don't enclose your logging statements with if (logger.isDebugEnabled()) statements).
But if you look at a &lt;a href="http://www.nabble.com/logback-performance-clarification-tf3374513.html#a9451902"&gt;benchmark &lt;/a&gt; run by Sebastien Pennec, one the developers of logback, it's really impressive:
&lt;pre&gt;
Log4j direct debug call: 442
Log4j tested (isDebugEnabled) debug call: 19
Logback direct debug call: 435
Logback tested (isDebugEnabled) debug call: 10
Logback parametrized debug call: 15
&lt;/pre&gt;

OK, we all know how we should consider benchmarks, especially when written by someone biased as Sebastien obviously is, but these numbers can't be completly wrong, and what's interesting is that a logback parametrized call takes approximately the same time as a log4j isDebugEnabled call. Really cool!
&lt;br/&gt;&lt;br/&gt;
Still on the performance area, logback introduces TurboFilters, which allows to filter logging before the logging event is actually constructed, saving a lot of unnecessary time.
&lt;br/&gt;&lt;br/&gt;
&lt;h2&gt;Beyond console and files&lt;/h2&gt;

Beyond classical ways to track and configure your logs, you have very interesting features with logback, such as a JMX configuration, and a new &lt;a href="http://logback.qos.ch/consolePlugin.html"&gt;Eclipse plugin&lt;/a&gt; which is really neat.
&lt;br/&gt;&lt;br/&gt;
One of the thing I like the most with this plugin is the option to go to the source which is at the origin of the log. &lt;b&gt;Double click on the log, and it will open your source editor at the line where the log call is performed!&lt;/b&gt; Awesome! How many times did I use the search tool to find where a particular log call is performed in a big application, and waste time because the message was the result of a concatenation and thus my search failed...
&lt;br/&gt;&lt;br/&gt;
Another interesting thing is the option to change the pattern and apply it to all the logs, including previous one.
&lt;br/&gt;&lt;br/&gt;
And you have also a good filter option, where you can apply any logback filter expressions. This still need to be improved IMO to be able to apply the filter in real time to previous logs, but hey, it's only the first version of this plugin!
&lt;br/&gt;&lt;br/&gt;
&lt;h2&gt;Excellent support&lt;/h2&gt;

Last but not least the support is amazing. There isn't much traffic on the user mailing list for the moment (their documentation is so good :-)), but very often developers take time to answer your questions with a lot of details, trying to reproduce your environment, and providing whole configuration snippets. Great work, kudos to Sebastien, Jean-Noel and Ceki!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-6034953070979822102?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/6034953070979822102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=6034953070979822102' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/6034953070979822102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/6034953070979822102'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/03/new-logging-experience.html' title='A new logging experience!'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-853898247707335055</id><published>2007-03-27T19:55:00.001+02:00</published><updated>2007-03-27T19:59:08.808+02:00</updated><title type='text'>Adding license header to a whole code base</title><content type='html'>I'm currently working to prepare the first release of &lt;a href='http://incubator.apache.org/ivy/'&gt;Apache Ivy&lt;/a&gt; in the Apache Incubator, and there is a lot of administrative work to do to comply to Apache requirements. &lt;br/&gt;&lt;br/&gt;

I think it will worth it, joining Apache has already increased the feedback from the community even if we haven't released anything at Apache for the moment. But for the moment I have to update Ivy to comply to Apache rules, and one of them is to have an Apache License header on all distributed files, java, html, xml, properties, ...&lt;br/&gt;&lt;br/&gt;

So I wrote a simple ruby script to help me add these headers:&lt;br/&gt;
&lt;pre&gt;
exts = ['html', 'xml', 'properties', 'java']

# check license in files, add it if not present
require 'find'

updated = 0
conform = 0
exts.each() do |ext|
 puts "--- processing #{ext} files"
 license = IO.readlines('license.'+ext).join()
 Find.find('./') do |f|
  if File.file?(f) &amp;&amp; File.extname(f) == '.'+ext
   content = ''
   header = ''
   IO.readlines(f).each() do |line|
    if content.length == 0 &amp;&amp; (ext == 'xml' || ext == 'html') &amp;&amp; (line.index('&amp;lt;?') == 0 || (line.index('&amp;lt;!') == 0 &amp;&amp; line.index('&amp;lt;!--') != 0))
     header += line
    else
     content += line
    end
   end
   if content.index(license) != 0
    File.open(f, 'w') do |f2|
     f2.puts header + license + content
    end
    puts "#{f} updated"
    updated += 1
   else
    conform += 1
   end
  end
 end
end
puts "------------------------------------------------"
puts "#{updated} files updated, #{conform} already compliant"
&lt;/pre&gt;
&lt;br/&gt;
The main problem I faced is that xml files do not allow to have comments before the processing instructions (if any), so I had to add the ugly test to isolate the header in the files. But that's only a one shot script, so pragmatism was my main focus.
&lt;br/&gt;&lt;br/&gt;
To be useful this script requires a license file for each kind of files to which you want to add a license header.
In my case I used four files (for html, xml, java and properties) with Apache License.
&lt;br/&gt;&lt;br/&gt;
If you have similar needs, you can download the script and the license files I used &lt;a href='http://xavier.hanin.free.fr/licenseup.zip'&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-853898247707335055?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/853898247707335055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=853898247707335055' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/853898247707335055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/853898247707335055'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/03/adding-license-header-to-whole-code.html' title='Adding license header to a whole code base'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-2760036488629815953</id><published>2006-11-25T19:39:00.000+01:00</published><updated>2006-11-25T19:47:51.556+01:00</updated><title type='text'>IE7 support for XmlHttpRequest</title><content type='html'>I'm currently working on a client side documentation engine, and had some compatibility issues with IE7.&lt;br/&gt;&lt;br/&gt;

Indeed I use XMLHttpRequest to load a file (a template), this file can be either a remote one or a local one, using the file: protocol for its URL.&lt;br/&gt;&lt;br/&gt; 

The problem I had is that what was working with IE6 doesn't work with IE7: IE7 has a direct support for XMLHttpRequest object, as have Firefox. But the problem is that this object does not allow to send a synchronous request on a file: URL, in this case you get an "access refused" exception.&lt;br/&gt;&lt;br/&gt;

The solution is to use the ActiveX XMLHttpRequest even in IE7, which properly supports sending a synchronous request on a file: URL!&lt;br/&gt;&lt;br/&gt;

So my code snippet to obtain the XMLHttpRequest object is the following one:
&lt;textarea cols="50" rows="19"&gt;
function newXmlHttpRequest() {
// we first try to use ActiveX, because IE7 has a direct support for XmlHttpRequest object, 
// but which doesn't work with file urls
 req = false;
 if(window.ActiveXObject)
 {
  try { req = new ActiveXObject("Msxml2.XMLHTTP");
  } catch(e) {
   try { req = new ActiveXObject("Microsoft.XMLHTTP");
   } catch(e) { req = false; }
  }
 }
 else if(window.XMLHttpRequest) {
  try { req = new XMLHttpRequest();
  } catch(e) { req = false; }
 }

 return req; 
}
&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-2760036488629815953?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/2760036488629815953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=2760036488629815953' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/2760036488629815953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/2760036488629815953'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/11/ie7-support-for-xmlhttprequest.html' title='IE7 support for XmlHttpRequest'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-4823897960162172252</id><published>2006-11-17T19:37:00.000+01:00</published><updated>2006-11-17T19:41:08.648+01:00</updated><title type='text'>JSR 277 again: Stanley and Andreas interviewed by InfoQ</title><content type='html'>I've just stumble upon this article on infoQ:&lt;br/&gt;
&lt;a href="http://www.infoq.com/news/2006/11/jsr77_jsr294_qa"&gt;http://www.infoq.com/news/2006/11/jsr77_jsr294_qa&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
Even if the comments say there is nothing to read, I found it quite interesting, with some answers to questions raised by the community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-4823897960162172252?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/4823897960162172252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=4823897960162172252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4823897960162172252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/4823897960162172252'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/11/jsr-277-again-stanley-and-andreas.html' title='JSR 277 again: Stanley and Andreas interviewed by InfoQ'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-1825396518946194029</id><published>2006-11-07T19:44:00.000+01:00</published><updated>2006-11-12T22:35:45.501+01:00</updated><title type='text'>JSR 277 feedback from the community</title><content type='html'>As I said in &lt;a href="http://xhab.blogspot.com/2006/10/java-module-system-early-draft.html"&gt;my previous post&lt;/a&gt; JSR 277 has released its first early draft for review by the community, and fortunately the community has reacted.&lt;br/&gt;
&lt;br/&gt;
Here are the links I've collected so far in no particular order:&lt;br/&gt;
&lt;a href="http://robilad.livejournal.com/1672.html"&gt;http://robilad.livejournal.com/1672.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.javalobby.org/java/forums/t82769.html"&gt;http://www.javalobby.org/java/forums/t82769.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.osgi.org/blog/2006/10/jsr-277-review.html"&gt;http://www.osgi.org/blog/2006/10/jsr-277-review.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://milinkovich.blogspot.com/2006/10/java-component-war.html"&gt;http://milinkovich.blogspot.com/2006/10/java-component-war.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.jroller.com/page/murphee?entry=jsr_277_vs_osgi_here"&gt;http://www.jroller.com/page/murphee?entry=jsr_277_vs_osgi_here&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.eclipsezone.com/eclipse/forums/t83134.rhtml"&gt;http://www.eclipsezone.com/eclipse/forums/t83134.rhtml&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://weblogs.java.net/blog/stanleyh/archive/2006/10/jsr277_early_dr.html"&gt;http://weblogs.java.net/blog/stanleyh/archive/2006/10/jsr277_early_dr.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.infoq.com/news/jsr277-early-draft"&gt;http://www.infoq.com/news/jsr277-early-draft&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.mernst.org/blog/archives/10-01-2006_10-31-2006.html#120"&gt;http://www.mernst.org/blog/archives/10-01-2006_10-31-2006.html#120&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://epirsch.blogspot.com/2006/10/jsr-277-at-last-module-system-for-java.html"&gt;http://epirsch.blogspot.com/2006/10/jsr-277-at-last-module-system-for-java.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://underlap.blogspot.com/2006/11/public-discussion-of-jsr-277.html"&gt;http://underlap.blogspot.com/2006/11/public-discussion-of-jsr-277.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://www.java.net/pub/pq/125"&gt;http://www.java.net/pub/pq/125&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://blogs.sun.com/andreas/entry/first_public_specification_of_the"&gt;http://blogs.sun.com/andreas/entry/first_public_specification_of_the&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://weblogs.java.net/blog/patrikbeno/archive/2006/10/jsr_277_review_1.html"&gt;http://weblogs.java.net/blog/patrikbeno/archive/2006/10/jsr_277_review_1.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://weblogs.java.net/blog/stanleyh/archive/2006/11/more_jsr277_ear.html"&gt;http://weblogs.java.net/blog/stanleyh/archive/2006/11/more_jsr277_ear.html&lt;/a&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-1825396518946194029?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/1825396518946194029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=1825396518946194029' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1825396518946194029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1825396518946194029'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/11/jsr-277-feedback-from-community.html' title='JSR 277 feedback from the community'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7987515209086367926</id><published>2006-10-12T10:23:00.000+02:00</published><updated>2006-10-12T10:27:59.451+02:00</updated><title type='text'>Java Module System: early draft available for review</title><content type='html'>I have the chance to be a member of the JSR 277 expert group, and thus participate to the discussions which give shape to this important JSR.&lt;br/&gt;
The JSR has just published an early draft available for community review, so I would like to give some insight on its content to raise your curiosity, so that you read the document and provide feedback to the JSR.&lt;br/&gt;
&lt;br/&gt;
Here is the link to the JSR homepage where you will find the early draft:&lt;br/&gt;
&lt;a href="http://jcp.org/en/jsr/detail?id=277"&gt;http://jcp.org/en/jsr/detail?id=277&lt;/a&gt;&lt;br/&gt;

&lt;h1&gt;But first, why do I consider this JSR important? &lt;/h1&gt;
In a few words, the goal of this JSR is to introduce a new packaging and deployment mechanism for the Java platform. It's targeted for inclusion in Java7, and may thus change our life in a near future. Change our life? Yes, I think that this JSR is something that will really change how we develop application or libraries. We will now have a true module system, and thus be able to package applications or libraries in modules. &lt;br/&gt;
&lt;br/&gt;
&lt;h1&gt;So what's the difference compared to JARs? &lt;/h1&gt;
&lt;h2&gt;The file format&lt;/h2&gt;
First, a module is packaged in a JAM file, which can contain classes and resources as a JAR, but also contain module metadata, and may even contain legacy jars. It will thus be possible to package a whole application in one JAM, in a way similar to how JavaEE developers where used to package applications in EAR or WAR.&lt;br/&gt;
&lt;br/&gt;
But the aim is not to provide an application deployment format (as for EAR or WAR), but a module one. Thus a very important part of this new module system is how it deals with interactions between modules.&lt;br/&gt;
&lt;h2&gt;New encapsulation features&lt;/h2&gt;
First, the module system defines a way to expose only part of the classes and interfaces of a module to the external world. What does it mean? This means that where you were used to be able to access to all public classes and interfaces available in the classpath whatever how they were deployed, you will now be restricted to only those the module has chosen to expose. This means that as a module developer this will give you more control over your module encapsulation, and thus increase reusability. As a module user, this means that you will have a narrower view on the module you depend on, and thus ease to focus only on what is useful... if the module developer has taken the right choices, or at least the choices that fit your needs.&lt;br/&gt;
&lt;br/&gt;
So I think there will be a time of adaptation required to think in module and make good choice to expose only the relevant part of the API of our modules. Fortunately, it should always be possible to access an hidden part using the reflection API, providing that you have enough security rights in the JVM your code is running.&lt;br/&gt;
&lt;br/&gt;
&lt;h2&gt;Dealing with dependencies&lt;/h2&gt;
Another important part of the Module System is the way it deals with dependencies between modules. Until now you were used to deploy an application with all its dependencies, in complete isolation from other java applications deployed on the system. The problem is that this often lead to have the same JAR deployed a lot of times on the system (try to find log4j.jar for example on your machine, and you may be surprised). This lead to problems of maintenance, when a JAR needs to be fixed with a security update, you have to search and replace it, which can be very cumbersome.&lt;br/&gt;
&lt;br/&gt;
So the new module system attempts to solve this problem by providing the concept of repository and declared dependencies between modules. &lt;br/&gt;
&lt;h3&gt;The module repository&lt;/h3&gt;
A repository in JSR277 is a location where modules are deployed and are accessible by the system. In the specification, two main repositories are available: a local repository and an url repository. I want to underline that the URL based repository is not aimed to deal with a large scale public repository, like ibiblio. Its purpose is closer to what people used to JNLP where used to: deploy a small set of modules required for one application and give access to it through the network.&lt;br/&gt;
&lt;h3&gt;Version Policy and Versioning&lt;/h3&gt;
Having a repository is a good thing, but then you need to view your application runtime in a completly different point of view. You no longer have a static classpath, but your application need to determine which modules, and which versions of these modules, should be used, considering what is deployed in the repository.&lt;br/&gt;
&lt;br/&gt;
To do so, the system has to know which modules are available in the repository, and especially which versions. Then each module has to determine its dependencies, and select a version for each dependency. This is what is done by the VersionPolicy. &lt;br/&gt;
&lt;br/&gt;
It also has to know which version is greater than another one (i.e. more recent), when a module choose to select the latest version of a dependency. Thus a versionning mechanism is defined by the specification, and all modules will have to adhere to this versionning system.&lt;br/&gt;

&lt;h4&gt;A new kind of problem&lt;/h4&gt;
This part is very important, especially to my biased eyes :-)&lt;br/&gt;
I think it's important because it can introduce problems we were not used to. Why? Because if it happens that two modules used in the same application loads two different versions of the same module, then the classes from the two versions will be considered different by the JVM, and thus will be the objets.&lt;br/&gt;
This may lead to things very strange that JavaEE developers sometimes see. Imagine the following:&lt;br/&gt;
&lt;br/&gt;
A class Baz in module baz, identical in both version 1.0.0 and 1.0.1:&lt;br/&gt;
&lt;textarea cols="50" rows="8"&gt;
package baz;

public class Baz {
  int number = 0;
  public int add(Baz b) {
    return number + b.number;
  } 
}
&lt;/textarea&gt;
&lt;br/&gt;
A class Foo in module foo which depends on module baz 1.0.0.&lt;br/&gt;
&lt;textarea cols="50" rows="8"&gt;
package foo;

public class Foo {
  public baz.Baz getFooBaz() {
    return new baz.Baz();
  }
}
&lt;/textarea&gt;
&lt;br/&gt;
A class Bar in module bar which depends on module baz 1.0.1.&lt;br/&gt;
&lt;textarea cols="50" rows="8"&gt;
package bar;

public class Bar {
  public baz.Baz getBarBaz() {
    return new baz.Baz();
  }
}
&lt;/textarea&gt;
&lt;br/&gt;
Your application which depends on module foo and bar:&lt;br/&gt;
&lt;textarea cols="50" rows="8"&gt;
package com.acme;

public class MyApp {
  public int addBaz(foo.Foo f, bar.Bar b) {
    return f.getFooBaz().add(b.getBarBaz());
  }
}
&lt;/textarea&gt;
&lt;br/&gt;
So what is the result of calling addBaz in MyApp? You guess? a ClassCastException!&lt;br/&gt;
&lt;br/&gt;
I'm not sure that the average Joe will be able to understand the ClassCastException saying that the JVM cannot cast baz.Baz in baz.Baz... So first I think there will be an effort to give better error messages in such cases, and I hope we will see something like "cannot cast baz.Baz(1.0.0) in baz.Baz(1.0.1)". This would be a huge improvement, ClassCastException messages are already very poor, in the Module System case they will be even more important.&lt;br/&gt;
&lt;br/&gt;
But we can imagine even worse scenarios! Imagine module bar depends on baz 1.0+ instead of 1.0.1. This would mean that MyApp could work perfectly on a system where only version 1.0.0 of baz is available in the repository, but fail when both version 1.0.0 and 1.0.1 of baz are available!&lt;br/&gt;
&lt;br/&gt;
Moreover, do I really care to be able to understand the ClassCastException if I'm not able to fix it? No, that's why I think it's very important to consider the dependencies on versions carefully. The early draft does not address this particular point which is very difficult to address cleanly, but your feedback is already welcome on the subject.&lt;br/&gt;

&lt;h4&gt;Comparing versions&lt;/h4&gt;
Another point I'm concerned with is the versioning chosen in the early draft. We didn't agree completly in the Expert Group on this subject, that's why I would like to have your opinion.&lt;br/&gt;
&lt;br/&gt;
As you can see in chapter 5 on page 40 of the early draft, when versions are compared, the qualifier is compared using plain string comparison. What does it mean? It means that if you choose to name your versions like that:&lt;br/&gt;
1.0-b1&lt;br/&gt;
1.0-b2&lt;br/&gt;
&lt;br/&gt;
Then you will have the surprise if you reach 1.0-b10, that it will be considered lower than 1.0-b1:&lt;br/&gt;
1.0-b1 &lt; 1.0-b10 &lt; 1.0-b2&lt;br/&gt;
&lt;br/&gt;
This is stated clearly in the specification on page 42, but I'm not sure everybody will be aware of that and I'm afraid it may lead to a lot of problems. My opinion is that we should consider a sequence of digits as a number in the qualifier, and compare them as numbers. But again, what matter is what you think, so your feedback is welcome!&lt;br/&gt;
&lt;br/&gt;
OK, I think I already lost you in much details with this entry on the subject, but the community review will only last until november 13th, so we need your input now!&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7987515209086367926?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7987515209086367926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7987515209086367926' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7987515209086367926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7987515209086367926'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/10/java-module-system-early-draft.html' title='Java Module System: early draft available for review'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-1261689417515048481</id><published>2006-10-06T21:52:00.000+02:00</published><updated>2006-10-06T22:13:42.428+02:00</updated><title type='text'>Open Source documentation dilemna</title><content type='html'>As the creator of Ivy, I have been confronted to a dilemna many open source developers have faced: how to write documentation for the project.&lt;br/&gt;&lt;br/&gt;

I usually see two ways to support the documentation:
&lt;ul&gt;   &lt;li&gt;generated from structured text files, like what is done in maven&lt;/li&gt;   &lt;li&gt;edited online with an ad hoc engine, a wiki for example, like confluence&lt;/li&gt;   &lt;li&gt;
  &lt;/li&gt; &lt;/ul&gt; 

For Ivy we decided more than a year ago to use drupal for documentation writing. We are pretty happy with this solution, even if we had to write our own module to have a clean offline version of the documentation.&lt;br/&gt;&lt;br/&gt;

So, what are the pros and cons of each of these solutions? Documentation generated from structured text files is interesting because it allows to edit the documentation offline, and also it let users contribute to documentation through patches. The downside is that such writing is usually more painful, the generation step before actually seeing your changes is not helpful, and needing to upload your page after the generation after a simple typo correction is not a very straightforward task. Moreover you need your whole toolkit to be able to make any documentation update, instead of needing only a web access as with online documentation engines.&lt;br/&gt;&lt;br/&gt;

On the other hand, the online documentation engine is usually easier to maintain, especially if the tool is good, and pages reorganisation is easier. The syntax is often easy to learn and quite powerful. As a matter of fact, I've often seen projects which have chosen such documentation engine to have a better documentation. Look at &lt;a href="http://stripes.mc4j.org/confluence/display/stripes/Home"&gt;Stripes&lt;/a&gt; or &lt;a href="http://mule.mulesource.org/wiki/display/MULE/Home"&gt;Mule &lt;/a&gt;for instance and I think you'll understand what I mean. The downside is that you cannot edit your documentation offline (and many open source developers like to work offline in airplane for example), and it's simply not possible for users without writing rights to your site to contribute documentation update.&lt;br/&gt;&lt;br/&gt;

So, what is the best choice between the two? I'm still puzzled by this question, but the more I wonder the more I think there could be a tool with both offline and online edition features, joining the best of both worlds. Maybe I'd need to start a new open source project... What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-1261689417515048481?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/1261689417515048481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=1261689417515048481' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1261689417515048481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1261689417515048481'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/10/open-source-documentation-dilemna.html' title='Open Source documentation dilemna'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7180239280762850025</id><published>2006-10-05T10:51:00.000+02:00</published><updated>2006-10-05T11:07:24.446+02:00</updated><title type='text'>Code Search: the giant comes into the dance</title><content type='html'>In my last post I was talking about a great resource I found for searching developer related information, like code, but also articles or projects.&lt;br/&gt;&lt;br/&gt;

Now I've just found that the search giant google offers a code search facility:&lt;br/&gt;
&lt;a href="http://google.com/codesearch"&gt;google code search&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;

Nothing revolutionary here, except that it's google, and that they search also in code located in zip files, for example.&lt;br/&gt;&lt;br/&gt;

As developers, we now have a good set of tools to search for existing answers to our problems. Here is the short list of those I know:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://google.com/codesearch"&gt;google code search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.krugle.com/"&gt;krugle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.koders.com/"&gt;koders&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

Krugle has my preference because it does much more than just code search, and has a great user interface. But it's always good to have more than one tool in your toolbox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7180239280762850025?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7180239280762850025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7180239280762850025' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7180239280762850025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7180239280762850025'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/10/code-search-giant-comes-into-dance.html' title='Code Search: the giant comes into the dance'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-352760738274346529</id><published>2006-09-20T17:33:00.000+02:00</published><updated>2006-09-20T17:51:03.841+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='source'/><title type='text'>Searching and browsing source code</title><content type='html'>While browsing the web today I found two very interesting tools for developers.&lt;br/&gt;&lt;br/&gt;

The first one is not dedicated to one particular language, it's a search site focused on developer centric searches, called &lt;a href="http://www.krugle.com/"&gt;krugle&lt;/a&gt;. And it's really awesome. Try it yourself, have a look at their very well realised demo, these guys have a great product. Not only the search seems to be very accurate (at least for the simple tests I've done so far), but it's very responsive, and the UI and the navigation is simply excellent! &lt;br/&gt;&lt;br/&gt;

For search accuracy, for example, I've tried to search for Ivy. It's pretty difficult to find our website home with google, because Ivy is a very common word. With google you will find pages related to the plant or to the band. If you try to give better keywords you will add java or ant and find pages related to Ivy, but we still don't manage to get our home page ranked well in google. So you often have to go through an old javalobby announcement to find our web site if you just remember the name.&lt;br/&gt;&lt;br/&gt;

With kruggle it's really simple, type Ivy in the search box and you will get Ivy home page at third position. This is good. They do not index our source code, but we do not use standard open source hosting, so I can't blame them for that! I will see if I can submit a svn url for their indexing.&lt;br/&gt;&lt;br/&gt;

Another neat tool I found also today is an open source java source code cross referencing tool: &lt;a href="http://weblogs.java.net/blog/kohsuke/archive/2006/09/sorcerer_a_bett.html"&gt;Sorcerer&lt;/a&gt;. And it looks really nice! It's only in version 0.1 but it seems to work already pretty well, at least what I've seen on the &lt;a href="https://sorcerer.dev.java.net/nonav/sample-report/"&gt;sample report&lt;/a&gt; is very promising.&lt;br/&gt;&lt;br/&gt;

Another tool which I didn't found today but which has a set of features in the same order of idea is &lt;a href="http://www.worldofjava.org/"&gt;World Of Java&lt;/a&gt;. The idea here is different, it focuses on IDE integration (eclipse, netbeans, IDEA) to offer java source code and javadoc directly in your IDE as if you had spent time configuring all your dependencies.&lt;br/&gt;&lt;br/&gt;

It seems that there are more and more great tools for accessing code related information, this may influence the way code reuse is leveraged in our developments. I really like that!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-352760738274346529?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/352760738274346529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=352760738274346529' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/352760738274346529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/352760738274346529'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/09/searching-and-browsing-source-code.html' title='Searching and browsing source code'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-3159869831076787122</id><published>2006-09-19T15:01:00.000+02:00</published><updated>2006-09-19T15:40:20.920+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='ivy'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Ant+Ivy vs Maven: my biased opinion</title><content type='html'>I recently read a post on Carlos Sanchez's Blog about &lt;a href="http://jroller.com/page/carlossg?entry=the_black_magic_inside_maven"&gt;The black magic inside Maven&lt;/a&gt;. He himself reacted to a post on Sylvain Wallez's blog: &lt;a href="http://bluxte.net/blog/2006-09/17-52-51.html"&gt;Spring switching to Maven? Oh no, think twice!&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;

These entries are interesting, and as &lt;a href="http://www.jayasoft.org/Ivy"&gt;Ivy&lt;/a&gt; creator and project Leader, I would like to share my biased opinion on the subject.&lt;br/&gt;&lt;br/&gt;

Obviously, what I strongly agree on with Carlos is that Sylvain, Carlos and I, and anybody giving an opinion, is biased. I often see people choosing a tool or another one simply because they've seen on a blog someone saying "&lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; is great!" or "&lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; rocks!". &lt;br/&gt;&lt;br/&gt;

I don't think that choosing a tool or a set of tools for the build management, or software configuration management, should be done like that. These kind of tools are very important in the way you build your software, and building the software is the ultimate step to transform source code which only interest developers and IDEs, into an actual software which will be useful (at least we hope so).&lt;br/&gt;&lt;br/&gt;

These tools are very important because they are both used day to day by developers, but also used once a while in a very important step in the software development process: when you release your software. And if building for developers is important and should be straightforward, I think that the release part is even more important. Why? Because it occurs less often, and so you will often forget about how it works between two releases. Because it must ensure that what you do will be absolutely reproducible in the future. Because it must be predictable. Simply because it's the ultimate separation between a bunch of source code and the software which will be used.&lt;br/&gt;&lt;br/&gt;

And that's because the build and release management system is so important that I strongly share the opinion of Sylvain and Leo Simons in his comment on &lt;a href="http://jroller.com/page/carlossg?entry=the_black_magic_inside_maven"&gt;Carlos blog&lt;/a&gt;:
&lt;blockquote&gt;I don't want automagically or out of the box, I want safe, controlled, consistent, predictable, repeatable, documented, with no surprises.&lt;/blockquote&gt;

This is an important point, even if being easily usable out of the box is an advantage, at least it can help to evaluate easily, what is most important is to be able to keep control over your build and release and truly understand how it works.&lt;br/&gt;&lt;br/&gt; 

So if you are very confortable with Maven, if you have experts in your team, I think it's definitly the good choice. There are some concepts in Maven that I really like. Describing your project at a high level and then applying rules to perform your build tasks, this is a good idea. What I don't like with Maven is that its lack of flexibility. Maven guys seem to know better than anyone else on the world how building a software should be done. How you should layout your projects. How you should work in a team. And maybe they are right, maybe they know that. &lt;br/&gt;&lt;br/&gt;

But what I believe is that each case is different, the environment and the constraints are always different, and there is no single solution to this problem. So that's what I like with a tool like ant: it's really flexible. So yes it's often more painful when you start from scratch to have a first build. But then you can truly understand and control what it does. &lt;br/&gt;&lt;br/&gt;

And that's also Ivy philosophy, to be flexible, to adapt to your environment and your constraint. It's Ivy philosophy to be safe, predictable and repeatable (even if there are unknown bugs as in any software, more and more are discovered and fixed by the community). That's also why we try to have a good reference documentation, even if we still lacks of examples, guides and tutorials, the reference documentation is the ultimate place to get knowledge about a tool, and we try to keep it up to date and accurate.&lt;br/&gt;&lt;br/&gt;

So, whatever you think after reading this post or other truly interesting ones, take time to get your own opinion on the subject considering your own environment and your constraints. This will later save you a lot of headaches!&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-3159869831076787122?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/3159869831076787122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=3159869831076787122' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3159869831076787122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3159869831076787122'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/09/antivy-vs-maven-my-biased-opinion.html' title='Ant+Ivy vs Maven: my biased opinion'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-6315501219433163860</id><published>2006-09-19T11:51:00.001+02:00</published><updated>2008-01-03T11:58:21.284+01:00</updated><title type='text'>Interesting discussions about Maven vs Ant+Ivy comparison</title><content type='html'>&lt;p&gt;&lt;em&gt;This post is a copy from a news originally posted on jayasoft.org site&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the beginning there was a news from the SpringFramework &lt;a href="http://blog.interface21.com/main/2006/09/15/yes-i-know-its-now-the-most-voted-for-issue-in-the-jira/"&gt;contemplating about migrating to maven&lt;/a&gt; for their build.&lt;/p&gt;
&lt;p&gt;Then there was the reaction of &lt;a href="http://bluxte.net/blog/2006-09/17-52-51.html"&gt;Sylvain Wallez on his blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And this post triggered interesting discussions, both in the comments, and on several other blogs. &lt;a href="http://jroller.com/page/carlossg?entry=the_black_magic_inside_maven"&gt;Carlos Sanchez&lt;/a&gt;, &lt;a href="http://www.1060.org/blogxter/entry?publicid=FAA51080D35EFFA3709C5329B534DB67"&gt;Steve Loughran&lt;/a&gt;, &lt;a href="http://www.bearaway.org/wp/?p=518"&gt;Stephane Baillez&lt;/a&gt; gave their interesting point of view on what goes much further than Ivy, Ant or Maven discussion, and more about the build and release systems requirements.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow up: I've later blogged in a more opinionated way &lt;a href="http://xhab.blogspot.com/2006/09/antivy-vs-maven-my-biased-opinion.html"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-6315501219433163860?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/6315501219433163860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/6315501219433163860'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/09/interesting-discussions-about-maven-vs.html' title='Interesting discussions about Maven vs Ant+Ivy comparison'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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></entry><entry><id>tag:blogger.com,1999:blog-4336468578069957483.post-1438574651895690661</id><published>2006-09-19T02:42:00.000+02:00</published><updated>2006-09-19T03:32:54.043+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ivy'/><title type='text'>Intense end of my californian experience...</title><content type='html'>My stay in Northern California is about to end up in less than a week, and I've seldom been so busy!&lt;br/&gt;&lt;br/&gt;

I'm finishing a full time contract where I helped introduce Ivy and review the build and release system of a well known university. This contract was really interesting, with many challenges, a lot of work with Ant and Ivy, and finally a customer who really seem to be happy, and I like that. I think it's the most rewarding part of my job, with customers or with community users, when you see that you can help and improve things.&lt;br/&gt;&lt;br/&gt;

They now have a brand new build and release system, with easy workspace management (like checkout or update a project with all its dependencies), and a release system which will change the way they see it. With a couple of commands they can release an application and all the modules actually requiring to be released, i.e. modules which have changed since the last release. They can identify easily which modules are part of each release, in which version, with the associated tag. They can also query the repository to know for a single module version with which application it has been released.&lt;br/&gt;&lt;br/&gt;

The installation is also fully automatic, they can install any application build easily (be it a release or an integration build). The system I set up also keeps track of each installation, so that they can know for each release where and when and in which configuration it has been installed.&lt;br/&gt;&lt;br/&gt;

This was quite a lot of work, but it's only my day job... then can some the night, and since I spent my last 3 months most of the time alone I found time to make many improvements and implement new features in Ivy. I've just &lt;a href="http://www.jayasoft.org/ivy/announce/1.4-RC1"&gt;released the 1.4-RC1&lt;/a&gt; version yesterday, and with the help of the community and other commiters we managed to ship more than 90 new features, improvements and bug fixes in this version. That's a lot of stuff, I won't detail things here, I already wrote about this on the &lt;a href="http://www.jayasoft.org/ivy/doc/releasenotes/1.4"&gt;new and noteworthy page&lt;/a&gt; of the upcoming 1.4 release.&lt;br/&gt;&lt;br/&gt;

With this release my last week-end was very intense, but that's not all. I worked with yet another customer, a belgian company, which contracted us to introduce Ivy to better manage dependencies in what they call the soft split of their software. These guys are building very complex software, and used to have only a few units of work. But as complexity grows they decided to break out units in modules. To avoid changing everything, they decided to do a soft split: split the unit in modules but keep the modules together in the unit, so that you can still work on the whole unit but ensure a good isolation between modules, by compiling them separately for example. This is a very good way to deal with this kind of problem, and can ease a lot the migration to an even more modular system.&lt;br/&gt;&lt;br/&gt;

To deal with that system, they already set up a build system relying on properties files to describe dependencies. The problem they face is that whenever dependencies change in one module they have to modify dependencies of all modules depending on it. Needless to say that they lose a lot of time dealing with that, especially when they have to merge several modifications of this type!&lt;br/&gt;&lt;br/&gt;

So they called us to ask if it was possible to introduce Ivy to automatically deal with dependencies inside the unit transitively. With a four day contract I am on the way to finish, they will now have automatic transitive dependencies management, with as a bonus a graph of all dependencies in their modules generated automatically, and the build order for these modules calculated automatically. And with no migration cost: my work integrates completly with their former build system and the storage of dependencies in properties file with which they were already confortable. This will save a lot of time to all the developers and they will have better insight on their dependencies. I think they will be pretty happy with their choice, and I'm glad to contribute to such an improvement.&lt;br/&gt;&lt;br/&gt;

So my last days here were very intense, I think that once I'll get back to France I'll need some vacations, and spend time with my wife after a quarter year without seeing her! But before I still have to finish my work with both my belgian and californian customers, publish a new version of IvyDE, and share some bordeaux wine with the so nice people I met here! I think I'll be pretty busy til the end of the week :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-1438574651895690661?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/1438574651895690661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=1438574651895690661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1438574651895690661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/1438574651895690661'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/09/intense-end-of-my-californian.html' title='Intense end of my californian experience...'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-846324613701727568</id><published>2006-08-30T05:34:00.000+02:00</published><updated>2006-08-30T05:42:27.355+02:00</updated><title type='text'>IE7 RC1: first impressions</title><content type='html'>I've just downloaded the Release Candidate 1 of IE7, and I should say I was expecting a better quality for a release candidate.

With my configuration (windows XP SP2 running on a dell laptop), I have problems with images transparency (both with GIF and PNG):
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2923/529354074471430/1600/ie7-rc1-2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2923/529354074471430/400/ie7-rc1-2.png" alt="" border="0" /&gt;&lt;/a&gt;I also have trouble with microsoft community site itself!
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2923/529354074471430/1600/ie7-rc1-3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2923/529354074471430/400/ie7-rc1-3.jpg" alt="" border="0" /&gt;&lt;/a&gt;Notice especially the truncated popup menu (OK, the image is very small, but if you have good eyes you will see it in the middle).

To finish on a good point, I like the quick preview of all tabs, easily accessible (ctrl+Q), fast (but no special effect à la Exposé), and useful:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2923/529354074471430/1600/ie7-rc1-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2923/529354074471430/400/ie7-rc1-1.jpg" alt="" border="0" /&gt;&lt;/a&gt;So I will stick with firefox for the moment, and wait til they improve the quality of their rendering engine, especially for image transparency, before even considering a switch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-846324613701727568?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/846324613701727568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=846324613701727568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/846324613701727568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/846324613701727568'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/08/ie7-rc1-first-impressions.html' title='IE7 RC1: first impressions'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-714979085148954239</id><published>2006-08-20T00:01:00.000+02:00</published><updated>2006-08-20T00:13:11.852+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ant java'/><title type='text'>Constructing ant path via contribution</title><content type='html'>&lt;span style="font-style: italic;"&gt;I already post this recently on my former &lt;a href="http://jroller.com/page/xavierhanin?entry=constructing_ant_path_via_contribution"&gt;jroller blog&lt;/a&gt;, but I would like to see how easy (or difficult) it is to post code snippets on blogger.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;

I'm currently setting up a build system, and I try to make it modular. I try to separate each feature of the build in a separate build file imported from a common one. This eases maintenance a lot.&lt;br/&gt;&lt;br/&gt;

The problem I faced today was to introduce &lt;a href="http://emma.sourceforge.net/"&gt;emma&lt;/a&gt;  code coverage tool in the build. As a separate feature, I created a separate ant build file dealing with all emma aspects.&lt;br/&gt;&lt;br/&gt;

But my problem is that emma needs to interact with the junit task in several ways:
&lt;ul&gt;&lt;li&gt;add system property specifying the output file and some parameters&lt;/li&gt;&lt;li&gt;replace regular classes by instrumented ones&lt;/li&gt;&lt;li&gt;add emma in the junit classpath&lt;/li&gt;&lt;/ul&gt;
All of this should be done only when emma is enabled...&lt;br/&gt;&lt;br/&gt;

Adding system property was pretty easy with the propertyset feature of ant.
Replacing regular classes by instrumented one can easily be done, either by actually replacing them on the filesystem, or by replacing the reference to the path corresponding to the classes.&lt;br/&gt;&lt;br/&gt;

But adding emma in the junit classpath is not an easy task: the junit path is defined elsewhere, so to keep things modular I don't want to redefine it completly with the emma lib and replace the reference. Neither do I want to put some if/unless targets to deal with my cases at the moment I define the classpath for junit: it introduces a high dependency between the two. So I thought that it would be nice to be able to modify an existing path to add some other path elements, either at the beginning or at the end.&lt;br/&gt;&lt;br/&gt;

I googled to find a solution with no result. So I decided to write a custom ant task, which is actually very basic but now I can do things like this:&lt;br/&gt;
&lt;textarea cols="50"&gt;
&lt;addpath topath="run.test.classpath"&gt;
  &lt;path refid="emma.classpath"/&gt;
&lt;/addpath&gt;
&lt;/textarea&gt;
or
&lt;textarea cols="50"&gt;
&lt;addpath first="true" topath="run.test.classpath"&gt;
  &lt;path location="${instrumented.classes.dir}"/&gt;
&lt;/addpath&gt;
&lt;/textarea&gt;
To put the instrumented classes before anything else.&lt;br/&gt;&lt;br/&gt;

This is quite useful for my modular build, if some of you I've checked it in Ivy sources, but feel free to copy and use it outside Ivy (even if using Ivy could be a good idea to improve your ant based build system :-)).&lt;br/&gt;&lt;br/&gt;

You can view the code &lt;a href="http://svn.jayasoft.org/projects/tools/ivy/src/java/fr/jayasoft/ivy/ant/AddPathTask.java"&gt;here&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;

&lt;span style="font-style: italic;"&gt;Damned, I found no ease way to post xml code snippet! I add to replace manually the tags to make them appear on the page. On this point jroller was better... I'll post a feature request somewhere on blogger, and hope google smart people will be able to fix that soon.&lt;br/&gt;&lt;br/&gt;

Updated one day later: I finally found a pretty satisfying way to post code: I use the textarea tag, I set the cols attribute, and I disable the auto line break option of blogger. This is not amazing but it works.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-714979085148954239?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/714979085148954239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=714979085148954239' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/714979085148954239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/714979085148954239'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/08/i-already-post-this-recently-on-my.html' title='Constructing ant path via contribution'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-2591297522586304202</id><published>2006-08-19T21:00:00.000+02:00</published><updated>2006-08-19T21:12:18.599+02:00</updated><title type='text'>Blogger beta</title><content type='html'>I just realizeed that I'm actually using a brand new version of blogger, in beta since only a few days. I used my google account to login, and didn't notice that I was using a beta version (and there are so many things in beta with google :-).

It seems that I've been lucky to fall on the beta version, since at least the rich html editor and the tag system are new with the beta. So are some templates.

So I'm pretty happy to now be a beta tester of this new version, but I already had a first problem with it: I tried to use the blog this button in picasa, and I didn't managed to log in using my google account. It seems that the account are not the same between the beta and the current release, and I assume picasa only works with the release.

So I'll have to wait to easily add my photo on the profile. Sorry for you, you won't see my beautiful face until some time :-)

Oh, but it seems that I can add an image directly on the post. So here is one:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/2923/529354074471430/1600/IMG_4072.0.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger2/2923/529354074471430/400/IMG_4072.jpg" alt="" border="0" /&gt;&lt;/a&gt;
I believed you guesses this is not me! This is a picture I take during my trip to yosemite last week-end. I may tell more about this later, right now I'm hungry, it's time to unplug from my internet addiction!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-2591297522586304202?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/2591297522586304202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=2591297522586304202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/2591297522586304202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/2591297522586304202'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/08/blogger-beta.html' title='Blogger beta'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-7224665274208266279</id><published>2006-08-19T20:39:00.000+02:00</published><updated>2006-08-19T20:45:21.598+02:00</updated><title type='text'>Moving to Blogger</title><content type='html'>I've been &lt;a href="http://jroller.com/page/xavierhanin"&gt;using jroller &lt;/a&gt;for a while now, and even if I do not blog very often, I must say that I'm a bit fed up with the user interface for creating and editing blogs.&lt;br/&gt;&lt;br/&gt;

The remember me option rarely work, the UI for posting an item is not very nice, well, some little things which let me thought that it may be interesting trying another blog web site...&lt;br/&gt;&lt;br/&gt;

And here I am! It's still difficult to say if this one will really fit my needs, but right now the user interface seems clean and quite easy to use.&lt;br/&gt;&lt;br/&gt;

So maybe here will come my next random thoughts...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-7224665274208266279?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xhab.blogspot.com/feeds/7224665274208266279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4336468578069957483&amp;postID=7224665274208266279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7224665274208266279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/7224665274208266279'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2006/08/moving-to-blogger.html' title='Moving to Blogger'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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-4336468578069957483.post-3098144692356393798</id><published>2005-06-26T19:43:00.002+02:00</published><updated>2009-12-30T10:51:54.643+01:00</updated><title type='text'>About</title><content type='html'>Welcome to my blog!
&lt;p&gt;
I use this blog to dump random thoughts about Java, Ivy, Xooctory, and software development in general.
&lt;p&gt;
For those interested by these details, I'm an independent Java consultant providing services to people seeking for talented Java developer or architect.
&lt;p&gt;
I regularly provide trainings on Hibernate, Spring, EJB3, Ant and Ivy. I'm also often involved in software architecture review or expert consulting on dependency management.
&lt;p&gt;
I spend a large amount of my time in the open source community, I'm the creator of &lt;a href="http://ant.apache.org/ivy/"&gt;Ivy&lt;/a&gt;, &lt;a href="http://xooki.sourceforge.net/"&gt;Xooki&lt;/a&gt; and &lt;a href="http://xooctory.xoocode.org/"&gt;Xooctory&lt;/a&gt;, and a committer on WicketStuff.
&lt;p&gt;
For those who are not afraid by french, my &lt;a href="http://xhaj.blogspot.com/2005/09/propos.html"&gt;resume&lt;/a&gt; is available on &lt;a href="http://xhaj.blogspot.com/"&gt;my french blog&lt;/a&gt;.
&lt;p&gt;
&lt;p&gt;
I'm also involved in a commercial public web site project, started in 2010, based on google app engine. The project, called &lt;a href="http://www.nextautoz.com/"&gt;NextAutoz&lt;/a&gt; and available at &lt;a href="http://www.nextautoz.com/"&gt;http://www.nextautoz.com/&lt;/a&gt; is a french portal delivering announces of car selling by professionals.
&lt;/p&gt;
You can reach me at xavier DOT hanin AT gmail DOT com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4336468578069957483-3098144692356393798?l=xhab.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3098144692356393798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4336468578069957483/posts/default/3098144692356393798'/><link rel='alternate' type='text/html' href='http://xhab.blogspot.com/2007/06/about.html' title='About'/><author><name>Xavier Hanin</name><uri>http://www.blogger.com/profile/06817947075459199523</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></entry></feed>
