Wednesday, December 10, 2008

Answering questions at JavaRanch + free books

I am doing a session on Hibernate Search all this week at JavaRanch. Manning will give away free books of Hibernate Search in Action for the occasion.

If you have questions on Hibernate Search, express yourself :)

Friday, December 5, 2008

JBoss AS 5 is out, Hibernate Search 3.1, Devoxx is warming up and

Great news this week:

  • JBoss AS 5 is out. Congratulations to Dimitris and the many people in and out of JBoss who contributed to it.

  • Hibernate Search 3.1 is out. A lot of good stuffs like performance improvements at indexing and querying time and some cool new features like the analyzer declaration framework (allowing declarative phonetic, synonym, n-gram indexing and searches)

  • Devoxx is very close. Come see the JBoss folks and topics and come to the Seam meetup after the BOF of course :)

Also, on the Bean Validation (JSR 303) side, I am finalizing the last changes in the spec for the public draft. We made a lot of progress in the last two weeks on various subjects including type-safe groups and JPA / JSF / EE integration (with the finalized draft, I will officially contact the EE expert group). Stay tuned, hopefully the draft should be out in a week or two.

Finally, Hibernate Search in Action is supposed to be released in final PDF monday (still not believing in it till I see that one ;) ).

Great week on my side. See you at Devoxx for a drink or two.

Monday, December 1, 2008

Hibernate Search 3.1 RefCard

DZone has a nice Hibernate Search 3.1 6-pages ref card. It is packed with:

  • The list of annotations and their descriptions
  • Hibernate Search's main APIs
  • Lucene's most useful query types
  • Quick examples involving mappings and API usage (including the new analyzer declaration framework)

It's free but you need to register.

Speaking of the devil. John and I have given back our last edits for Hibernate Search in Action. So we are still on target for releasing the book in december. I personally still can't believe I am done, so I will play the St Thomas and will wait till I can touch the paper :)

You can get the paper book at Amazon or on the Manning website. Manning also offers the PDF version.

Tuesday, October 7, 2008

Book review and NHibernate Search

Ayende, one of the active bees behind the NHibernate portfolio, has a nice review of Hibernate Search in Action on his blog.

By the way, Ayende has ported Hibernate Search to .net : NHibernate.Search. I don't think there is documentation specific to the project but the Hibernate Search documentation is just as useful.

I don't know Ayende personally, but I can only admire someone that blogs more that I can tweet and still have a full time job :)

Thursday, September 11, 2008

Hibernate Search book preview final review: hitting where it hurts for the better

We just had our third review of Hibernate Search in Action. Receiving this feedback has been a humble experience. Lot's of good reviews (good) and some critical ones (even better). Every imperfection we left aside came back in the spot lights of our reviewers.

Based on this feedback, we have been working hard the last two weeks to improve a lot the manuscript:

  • clearer code transcripts with more inline annotations
  • better separation between different parts of the same example (Hibernate API versus Java Persistence API)
  • the code has been updated to the latest Hibernate Search version and cleaned up a lot (no more warning, same comments as in the book)
  • the code now contains README files for easier navigation, ant scripts, Eclipse and IntelliJ descriptors
  • a nice appendix summarizing all annotations, Hibernate Search APIs and Lucene Query classes
  • added an index: I wish I could plug Hibernate Search on the book, that one was painful
  • added a section on testing (mocking, in-memory integration testing, performance testing)
  • better explanation on how query and analyzer are interwoven
  • add the Explanation API description
  • clearer introduction for each chapter
  • much more references than before making book navigation easier
  • all references in the book are up to date. No more Chapter XX ;)
  • improvements on the clustering chapter

The code is almost ready for prime time, we will publish it as soon as we find the right vehicle for it.

Thanks to all our reviewers. While I am not sure I appreciate the recent sleep depravation, this definitely improved the book a lot.

As usual, you can get the preview version electronically at Manning, it has all the chapters and I hope to get the latest changes uploaded soon.

Friday, August 29, 2008

JarInspector on Mac OS X

There is a tiny little utility that let's you inspect JAR/WAR/EAR files on the Mac OS platform. The software is available here. Install it. To open a JAR, simply right click and chose JarInspector as the application. I personally did not set JarInspector as my default .jar application to let the default JAR launcher kicks in but I have been very close to.

Amongst the useful features:

  • navigate in your jars recursively
  • edit/view files (useful for MANIFEST.MF)
  • decompile a class
  • find a file/class by name

By the way, this utility also opens zip files.

Enjoy.

Thursday, August 21, 2008

Top 5 reasons why Out Of Office messages are wrong

I have always been annoyed quite a bit by automatic Out of Office messages. This summer was no exception. So here are my top reasons for not doing it.

  1. Nobody cares about your trip is Egypt really! If I am sending you an email, I am not on vacations. Do you really want to piss me off?
  2. Email is an asynchronous media. Nobody should expect a synchronous response. If you don't answer a message, a) you are not there b) you don't care: in both cases, there is no point in knowing you are having a good time with uncle Bobby  by the lake.
  3. You pollute mailing lists. When someone, who probably don't even know you, send a message to a mailing list you are a member of, what do you think happen? He receives your vacations post card. Oh and since you are not the only one, he receives vacations cards from 20 other bozos as well.
  4. People forget to disable the out of office message. When you receive a message claiming a person is meant to be back 4 days ago, you wonder if he has been fired or is dead.
  5. Don't reply or send emails when you are in Out of Office Reply. There is nothing more frustrating than being asked a question by mail, reply within 5 minutes and receive a message like "I will not have access to my emails this week"

Please don't overuse this tool. If you need to set that kind of message, it means your organization has flaws.

Monday, August 11, 2008

Hibernate Search in Action: all chapters written

That's now official, I handed over the last chapter to the publisher yesterday. All chapters will be available to the early access program in the next few days. The journey is not finished yet. A lot of reviewing and correction are at sight. If you have feedback, now is the time :)

The last last few chapters out cover:

  • Hibernate Search filters
  • Performance
  • Cluster and scalability

Filters are a neat feature allowing to apply cross cutting restrictions on Lucene queries: you might want to filter to the latest month item creations or filter according to the security level the user is granted. Filters do just that in a declarative fashion: enable one or more of them by their names.

The chapter of performance is a mix of existing content and new content focused around performance at various stages: indexing and searching. It also includes an explanation about index sharding.

The last chapter describes problems that arise when you try to cluster Lucene and how Hibernate Search addresses them. We primarily describe the asynchronous clustering approach implemented out of the box in Hibernate Search (using JMS). The chapter also describes how to customize Hibernate Search to your own clustering strategy to meet your architectural needs.

Now off to the correction marathon :)

Tuesday, August 5, 2008

Remotely send and consume messages with JMS in JBoss AS 5.0

This tutorial will show you how to create a queue in JBoss AS 5 (which uses JBoss Messaging 1.4.1), send a message to a remote queue and listen to the queue using a Message Driven Bean.

I have been playing with JMS queues and MDBs in JBoss AS 5 today to complete the clustering chapter of Hibernate Search in Action and went through more bumps than I should have. Let me share what I've learnt. Disclaimer, I am a JMS noob: this tutorial will go only over the basic concepts. In particular, I will not cover subjects like security, message persistence and so on. This tutorial can be partly reused by Hibernate Search users using clustering (just ignore the part when we send and consume messages as Hibernate Search does that under the hood).

First of all, get a fresh version of JBoss AS 5.0 (currently in Release Candidate 1) here. We will launch two instances of JBoss AS in parallel. If you are lucky enough, run them in two different machines (virtual image or not). If you are not, you will have to remap a few ports to avoid any conflict and this is what I will just describe now.

Go to JBOSS_HOME/server and copy the default directory as master.

cp -r default master

We now have two versions of the JBoss configuration. default will contain our slave instance configuration and master will contain our master instance configuration. Let's now change the default ports on the master configuration. In the master directory, open each file described and change the following ports

  • conf/jboss-service.xml from port 1099 to 1199 (JNDI)
  • conf/jboss-service.xml from port 8083 to 8084 (WebServices)
  • conf/jboss-service.xml from port 1098 to 1097 (RMI)
  • conf/jboss-service.xml from port 4446 to 4447 (Remoting)
  • deploy/ejb3-connectors-service.xml from port 3873 to 3874
  • deploy/jbossweb.sar/server.xml from 8080 to 8081 (HTTP)
  • deploy/jbossweb.sar/server.xml from 8009 to 8010 (Apache connector)
  • deploy/http-invoker.sar/META-INF/jboss-service.xml from port 8080 to 8081
  • deploy/jmx-remoting.sar/META-INF/jboss-service.xml from port 1090 to 1091
  • deploy/messaging/remoting-bisocket-service.xml from port 4457 to 4458
  • deploy/remoting-service.xml from port 4444 to 4443
  • deploy/remoting-service.xml from port 4445 to 4442

This step is only required if you use the same server to run both instances. There is an alternative and more elegant approach described here (thanks Julien for tweeting me the answer after I did all the hard work :) )

You need to make sure JBoss Messaging has a different ServerPeerID between different instances. Update deploy/messaging/messaging-service.xml, and set ServerPeerID to 1 (the default configuration uses 0)

We will now create the queue in the master instance. Open deploy/messaging/destinations-service.xml, and add the following fragment

<mbean code="org.jboss.jms.server.destination.QueueService"

      name="jboss.messaging.destination:service=Queue,name=hibernatesearch"

      xmbean-dd="xmdesc/Queue-xmbean.xml">

      <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>

      <depends>jboss.messaging:service=PostOffice</depends&gt;

</mbean>

A queue is an MBean object, you can refine it's configuration as explained in the JBoss Messaging documentation. As a start, you can simply copy the fragment and replace hibernatesearch by the name of your queue. The queue will be available in JNDI under queue/hibernatesearch (this can be overridden if needed). If you start the master instance of JBoss AS (go to JBOSS_HOME/bin and launch ./run.sh -c master), you should see the following lines in the console

19:27:46,403 INFO [QueueService] Queue[/queue/hibernatesearch] started, fullSize=200000, pageSize=2000, downCacheSize=2000

The next step is to publish a message from the default JBoss AS instance into the queue. Here is a simple servlet doing so:

@Override

public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    QueueConnectionFactory factory;

    Queue queue;

    try {

        Properties jndiProps = new Properties();

        jndiProps.setProperty("java.naming.provider.url", "jnp://localhost:1199")

        InitialContext initialContext = new InitialContext( jndiProps );

        factory = (QueueConnectionFactory) initialContext.lookup( "/ConnectionFactory" );

        queue = (Queue) initialContext.lookup( "queue/hibernatesearch" );

    }

    catch (NamingException e) {

        throw new Exception( "Unable to lookup queue", e );

    }


    QueueConnection cnn;

    QueueSender sender;

    QueueSession session;

    try {

        cnn = factory.createQueueConnection();

        session = cnn.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE );


        TextMessage message = session.createTextMessage();

        message.setText("Pass it along");

        sender = session.createSender( queue );

        sender.send( message );

        session.close();

    }

    catch (JMSException e) {

        throw new Exception( "Unable to send message to JMS queue", e );

    }

    finally {

        try {

            if (cnn != null) cnn.close();

        }

        catch ( JMSException e ) {

            log.warn( "Unable to close JMS connection", e );

        }

    }

}

A few things are noticeable here:

  • we override the JNDI URL to point to the master JNDI host and port: if you run the master instance on a different machine (without remapping ports), the URL will look like jnp://master.host:1099.
  • to look up the factory we use /ConnectionFactory. Do not use java:/ConnectionFactory as this value points to your local instance (I lost a few hours here, thanks Clebert for the hand!). If you want to change this name, open deploy/messaging/connection-factories-service.xml and add a new binding under the JNDIBindings attribute.
  • always close your connection in a finally block to avoid connection leaks

On the master side, you can deploy a MDB (a trivial task with EJB 3 as no deployment descriptor is needed).

@MessageDriven(activationConfig = {

    @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),

    @ActivationConfigProperty(propertyName="destination", propertyValue="queue/hibernatesearch"),

    @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")

} )

public class MDBPassOnController implements MessageListener {

    private final Logger log = LoggerFactory.getLogger( MDBPassOnController.class );


    public void onMessage(Message message) {

        if ( !( message instanceof TextMessage ) ) {

            log.error( "Incorrect message type: {}", message.getClass() );

            return;

        }

        TextMessage textMessage = (TextMessage) message;

        System.out.println( textMessage.getText() );

    }

}

The new embedded console (to come with JBoss AS 5 final) based on a stripped down version of JBoss ON will make some of these steps much easier but now that you have gone the roots way, don't you feel stronger? :)

Friday, July 11, 2008

*Breaking* news: Apple Inc acquires Twitter...

... and uses it as their iTunes Store infrastructure. Now it's broke!

I updated my iPhone firmware this morning *as requested by Apple* and the process is hung because the iTunes Store is down. I now have a totally bricked legit iPhone: no call, no text. Great!

Apple, I am very angry at you. Why are you penalizing your legit customers by not allowing the phone to be activated without your blessing. People who want, will jailbreak it anyway. Please this is the 21st century, be smarter.

PS: sorry Twitter to pick on you. I love your service, and it helped me to discover I was not stuck alone in this madness. Summize is a totally awesome pulse checker.

Thursday, May 29, 2008

Two third of Hibernate Search in Action out!

We have just pushed another set of chapters for Hibernate Search in Action and reached the symbolic limit of 2/3. Yoohoo! We have also enhanced some of the existing chapters based on the feedbacks we received and the perseverance of our editor. They have just shipped as part of the early access program available in ebook format. I am very happy with the new chapters especially the description of analyzers in chapter 5.

I describe the use of Hibernate Search and the new Solr integration (coming up in Hibernate Search 3.1) to enable synonym, phonetic, n-gram and snowball search. Snowball is an algorithm that deduces the root of a word enabling searches for words of the same family: work, working, worker will all be reduced to the same root (called stemmer). The chapter both aims at demystifying analyzers and providing a concrete approach on how to use them. I really enjoyed writing it, I hope you will like reading it.

Beyond analyzers, here is a small list of the subjects I am personally happy with in the book:

  • the introduction gives you a nice picture of what search is, why it matters nowadays and how it can be implemented in todays applications
  • custom bridges: chapter 4 gives some nice examples of custom bridges including how to write one for composite identifiers
  • mapping associations has always been a confusing subject for beginners. Chapter 4 comes with some nice diagrams that should clarify this topic
  • chapter 5 explores when and how to use synchronous indexing, asynchronous indexing and clustered indexing (through JMS) and describes what is going on under the hood

We (and by we, I mean John) also have finished the Lucene dedicated content. While Hibernate Search hides the gory details of indexing and searching, its let you use all the flexibility of Lucene queries. Understanding Lucene is key and we have added the necessary knowledge you need for your daily work with Hibernate Search.

Let us know what you think and, of course, go buy the e-book :)

Thursday, May 1, 2008

JSR 303 interviews

I have been talking, writing, preaching Bean Validation in the past six months.
A few interesting links came up recently:
  • The list of blog entries I wrote. Probably the most palatable content but long.
  • An interview with Dick Wall and Carl Quinn from the Javaposse I did at Javapolis 07 (newly renamed Javoxx) . I hated to listen to myself, hopefully you won't. The interview also covers Hibernate Search, Seam and Web Beans.
  • An article published by InfoQ that goes beyond the standard set of questions on JSR 303
Many thanks to Dick and Charles for setting the interviews up.

Free bonus: a very interesting talk about free time and participation in a post TV-only age. No relation to Java, not by me, so surely very interesting :o)

Wednesday, April 30, 2008

TimeMachine backs up too much?

I just discovered the reason why TimeMachine was backing up so much data. I forgot to exclude my Maven and Ivy repositories :o)

Here is a good tip to discover which files are backed up. You need to have the Developer Tools installed.

When TimeMachine backs up
  • Launch /Developer/Applications/Instruments
  • Select File Activity
  • Open the default target combo box and attach the backupd process.
  • Start recording
  • Enjoy the list.

I wish there were a less geeky solution.

Thursday, April 24, 2008

Why would you pay for JBoss products?

Andy posted some of the reasons why you would want to use the JBoss subscription based platforms rather than the .org projects. During this exercise, he hinted some of the reasons why JBoss moved from a model where the community version was supported to a model where an enterprise platform is supported. He did not go far enough in his explication for my taste.

One of the fundamental reason (other than the financial one) for such a split is that supporting all the community releases do not work in the long run. Some customers want 5+ years of support on a product line and it is simply impossible to support every single community release for 5 years.

There are two main strategies from here:
  • slow down the release cycle and freeze innovation to match the 5 years customers
  • leave the community projects release early, release often, innovate like crazy and fork them to do an Enterprise pace version
The first model is not viable: it can work great for proprietary software but is fatal for open source software.
In the second model, an enterprise version is created every n community versions. This is where the support, packaging, service and advanced QA is provided. Packaging and QA are the ice on the cake, the five year support is really the meat (assuming a meat cake with ice is good :) )

Speaking of QA, yes deep internal QA is important and leverage bugs upfront but I trust the community QA more than any internal QA (more hands, more eyes, more time). I wish good luck to MySQL on their enterprise only features (semi-closed or closed source) but I think that will lower the quality of these particular features (less eyes, less hands, less time): my bet would simply to use the MySQL Enterprise version but not the "select" features. As Sacha like to say, in the JBoss Entreprise versions we remove features, we don't add them: unstable or experimental features are removed from the enterprise version. It's about less not more.

Generally speaking the support problem is interesting and usually kicks a company around its 5th birthday. The wannabee Platform as a Service contenders will face the same problem... in 5 years. "What do you mean the cloud where my data lives is too old??? Which version of the Cloud are you at?"

Productivity tools

With my regular job(s), the Hibernate Search book and a life going on at the same time, I had to find ways to boost my productivity.

Here is a list of some tools I am using in no particular order:
  • ThinkingRock (ad the GTD methodology): I am reading Getting Things Done by David Allen and ThinkingRock is the best tool I have found to help you follow the methodology. GTD is all about putting all your thoughts somewhere, organize them and decide what will be the next action on each of them. Some sort of superpower todo list, but one you actually use.
  • FreeMind: it's a software implementing the concept of Mind Mapping. It's a fantastic tool to organize your ideas on a given subject. Despite it's clumsy interface, I use it extensively to organize each chapter of the book. I also use it to build presentations.
  • OmniOutliner: a fantastic outliner tool. It somewhat competes with FreeMind but keep things a bit more organized and the interface is very efficient.
  • OmniGraffle: every diagram in the book is done with OmniGraffle. Fantastic tool, very productive and makes very nice diagrams without effort. Microsoft Visio but done well.
  • IntelliJ IDEA: I switched from Eclipse back in the dark days of annotations. I tried to come abck a couple of times, but I am too much of a happy user to jump back.
  • Keynote: Powerpoint without the useful features and annoying glitches.
  • no email: I try to avoid unread emails, when I open my inbox, I process all emails and put some todos if needed in ThinkingRock. If I read an email and keep it unread, I will process it over and over. annoying
  • KeepassX: Some people keep all your passwords in a text file. This is efficient and cross-platform. I keep mine in KeepassX: it's a bit more secure, it has a search box and open the websites for you. There is a Windows version as well (the original version indeed). The file is readable by both versions AFAIR.
  • Mac OS X: a ton of tiny little details
  • Time Machine + Time Capsule: A software + hardware solution to seamlessly backup your data on a Mac. Not so much a productivity tool as no major catastrophe has happened so far but that's the first time I do backup my data consistently. I don't even have to think about it.
  • XMLEditor XMLMind: my part of the book is written in docbook as I find it more productive and easier to focus on the content rather than the style. XMLMind is the best Wysiwyg editor for Docbook (could be better but the best I've found so far). I use the pro version simply because it has on the fly autocorrect feature. It's expensive for a tiny little feature but it is worth the time it saves me.
  • Hg (Mercurial): I am not using this tool yet but I am very curious about Distributed SCM. I wonder if it would help me integrate patches quicker and make the contributor's life easier (it's for another post I guess)
  • No TV: pretty obvious. I check the news on Google News and Le Monde ; I rent DVDs when I feel like it.
  • Google Reader: I don't run after the tech news, they are waiting for me on Google Reader. so when I have some spare time, I go read a couple of entries.
I hope you will find some interesting gems, feel free to share your favorite productivity tool as well. In a future blog entry, I will talk about how I waste the time I hardly gained :)

Tuesday, March 18, 2008

Mac OS X Leopard and internet downloads

If Leopard asks you if "you are sure you want to open this application which was downloaded from the web" every single time, read further.

I installed Mac OS X Leopard yesterday. Leopard started to warn me about applications downloaded from the Internet. Every single time I open them (not only the first time) I have to confirm it's a safe app.

I first thought Apple believed I was both stupid (can't take care of my security) and with huge memory issues (yes I am trying to open this troyan app 8 times in a row, thank you for reminding me I forgot).

Apparently, this is a small bug. If you download an application with one user account but do not open it with the same account, the security flag is never lift up. To work around that, log on your original account, open all you downloaded apps (27 for me, the dock was a nice christmas tree :) ), accept the security warning for all of them. Next time you open one of them, the security warning will not appear, pfffeu!

Another tip for free. If, like me, you want your old iLife applications back after a clean OS install, go download Pacifist, extract the iThing packages from the Tiger CDs and install them.

It was nevertheless the smoothest clean reinstall experience I've ever had (Carbon Copy Cloner and the Migration Assistant are fantastic).

Wednesday, March 12, 2008

Philly's search

I will be at the Philadelphia's Emerging Technologies for the Enterprise conference speaking about Hibernate Search on March 27th (Thursday).
The conference has some interesting talks around the new wave of development frameworks (Seam, Rails and so on). There is even a Battle of the frameworks! a Rountable Debate which sounds very promising. I will definitely try to sneak into it ;)
Come by and say hi. If people are interested we could have a chat about the future of Hibernate Search as we are shaping it as we speak (or you can show up on the hibernate dev list if you don't like Philly ;) ).

Thursday, March 6, 2008

Hibernate Annotations and EntityManager fix-athlon

Hibernate Annotations 3.3.1.CR1 and Hibernate EntityManager 3.3.2.CR1 are available for download here. I have done a fix-athlon in the last few days to ready them for JBoss AS 5.
There is a ton of bug fixes especially in the Java Persistence scanning area and in edge mapping supports.
Some minor new features have been added as well (transparent integration with the latest Hibernate Search collection events, @Any, @NaturalId).

Check the changelogs here and here.

Unless huge bugs are discovered, these versions will be embedded in the next JBoss AS 5 release.

Go try them.

Wednesday, February 27, 2008

Lucene users (2.3): migrate to Lucene 2.3.1

In some specific cases, Lucene 2.3.0 can corrupt your index. It happens in very specific cases:
  • you use autoCommit=false on IndexWriter
  • or multiple threads are adding documents where some have term-vector enabled fields and some don't
These particular situations do not occur in the regular use of Hibernate Search, but upgrading to Lucene 2.3.1 works fine, so go upgrade, you won't be bitten later. Native Lucene users should upgrade as well.

Here is the official Lucene team announcement

Lucene Java 2.3.1 available

This release contains fixes for serious bugs in 2.3.0 that could cause index corruptions in autoCommit=false mode or in cases where multiple threads are adding documents where some have term-vector enabled fields and some don't. The autoCommit option was added to IndexWriter with release 2.2.0. If not explicitly set to false, the IndexWriter runs in autoCommit=true mode.

See CHANGES.txt for a detailed listing of changes.

2.3.1 does not contain any new features, API or file format changes, which makes it fully compatible to 2.3.0.

We would like to encourage everyone who is currently using Lucene Java 2.3.0 to upgrade to 2.3.1 to prevent possible index corruptions!



Lucene is available at apache.org.

Tuesday, February 26, 2008

Hibernate Search in Action book

I am very please to announce that a book on Hibernate Search is on its way. John Griffin and I are co-authoring Hibernate Search in Action from Manning.

The goal of this book is to give a good practical understanding of Hibernate Search and guide people through the steps of adding full text search capability into their Hibernate based application. The book also covers the necessary Lucene knowledge you need to use Hibernate Search on a daily basis.

An early version of the book is already available through the MEAP program. Five chapters are already out there. If you are interested, give it a try, we welcome your feedback!

Tuesday, January 29, 2008

SpringSource's strategy

It has been interesting to follow the recent communications made by Rod Johnson as you can transparently read SpringSource's strategy. I wanted to blog about it during the last vacations but never fully finished the entry (they were vacations after all). Some elements are outdated now (including SpringSource acquiring covalent) but here it goes just refreshed with links.

Rod Johnson has been quite aggressive against JBoss AS in the last few weeks. It did not really bother me per se but the move is interesting. While it is well known that some JBoss folks and some Interface21 folks has been having tensions in the past, it came to a surprise that Rod joins the arena. Since Rod does not attack people for emotional reasons contrary to other folks, let's try a guess what's going on.

Interface21 (now SpringSource) received VC funding last year. Don't be naive, VC do transform a company, they are seeking for quick returns on their investment. Interface21 was mainly a consulting oriented company (in term of business) around the Spring portfolio. While this is a very steady and nobel business, it cannot provide the ROI VC people want to get: SpringSource's strategy had to be adjusted, the most obvious, safe and well defined solution is to follow the JBoss Inc model: go for the support money.

Well, to sell support, you need runtime. Unfortunately for SpringSource, Spring as a framework is not appealing enough for customers to jump into the support model. I think SpringSource did some interesting partnership / support deals with the folks at IBM, BEA and possibly Oracle (something JBoss never really did well because of the direct competition), but the only reasonable way to scale up the business is to have and support your own runtime. By the way, you can see the partnership going on in Rod's blogs, his tone is very sympathetic to IBM, BEA and Sun (I will come back to Sun later on). Generally speaking, the broader your platform is, the more likely you will be able to sell support. So SpringSource needs a platform to "sell and support".

Writing your own proprietary set of platform API is not so much in the air (to unquote Steve Jobs). That's why SpringSource joined the JCP and started to bless Sun and the Java EE 6 efforts, especially the profile effort. They need a mini-EE they can reach implementation-wise. If I were SpringSource, I would then try and get the smallest web-ish profile as possible out of the Java EE expert group, implement it and then raise the Java EE compliant flag to sell supports.

Side note on profiles. While everybody agrees Java EE needs some profile, I am sure nobody agrees on what to put in which profile: every application has different needs. What people really need is an ability to deploy and buy infrastructure components a la carte (whether it be one vendor or several) with the warranty of well defined API / SPI so that the whole platform keep a coherent vision freeing the customer from any integration work (component integration or programmatic model integration). Nothing a rigid profiling set can do. But that is a hard job.

Back to the main story. Even with the smallest possible Java EE profile, SpringSource is lacking some important pieces, the first one being the servlet container. And here comes the reason why Rod has been trying to not so subtly sent the message that JBoss AS is crap (I summarize here) and Tomcat is great. The only obvious choice for SpringSource is Tomcat. They need to enter the platform/runtime by the low end and gain market share (as in support market share). I would not be surprised if SpringSource announce a fully supported platform effort based on Tomcat and Spring at it's core. Of course, they need to hire some of the key contributors of Tomcat to gain some credibility. Let's imagine this done, the first competition they think they will face is JBoss AS, so seeing Rod poopooing on JBoss AS and EJB 3 is not a surprise. The first competition they will face though is people that do not want support for Tomcat: JBoss has been offering Tomcat support for a long time but not surprisingly monetizing Tomcat never succeeded. Most applications deployed on Tomcat do not want need (of course exceptions apply). Maybe Tomcat + Spring will be the silver bullet but I seriously doubt it for a bunch of reasons. The second biggest competition will probably be their own ecosystem. When you start to compete with them, your partners tend to be pissed, that's life. Ask Larry about that.

By the way, Rod does not seem to know that JBoss uses an enhanced version of Tomcat as a web container named JBoss Web. Remy (Tomcat) and Mladen (Apache httpd) sat down and wrote a native integration between Tomcat and APR to make this server the best of both Tomcat and Apache httpd. Maybe he wants to check it out and fork it :) Oh, one more thing, anybody that has been charged by an elephant tend to smile at the cat vs elephant analogy.

Tomcat + Spring will still be a weak platform, SpringSource will have to beef it up with some additional components:
- a persistence framework (and no Spring is not a persistence framework :) )
- a transaction manager
- a messaging system
- maybe some webservices thingy stuffs

and a few more components. They probably will also have to announce a developer tooling strategy around that.
I will only comment on the persistence piece of their platform as I know the field quite well. They can technically chose between Hibernate, OpenJPA, and Toplink. Hibernate would be the smartest move for them and the most aligned with their customer base but this probably will be a tough call for Rod. The two alternative strategie are Toplink (aka EclipseLink) and OpenJPA. If I were them, I guess I would go for OpenJPA as a second choice but they will have to invest R&D in the pieces that differenciate OpenJPA from Kodo.

Rod, please be more open with your strategy. I always liked Marc Fleury's own way to tell everyone what strategy he was following and what will be the next moves. To everyone, including the competition :)

Good luck anyway, I am eager to have competition in this field as I think JBoss AS, Seam, Web Beans and the technologies around them (JPA, EJB 3, JSF and so on) are more appealing to the next leap forward.

Usual disclamer, this represents my own thoughts not necessarily my current, past, future, potential employer, etc etc.

Paris JUG

For the fellows based in Paris or nearby, a new Java User Group has been formed. I expect lots of good content from this user group thanks to some cross-pollination with the OSSGTP group and the industry knowledge of the two founders.
The first meeting is planned for February 12th, check out the announcement here.