<?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-1699950446304666715</id><updated>2012-01-30T12:50:11.875-05:00</updated><category term='mobile'/><category term='logging'/><category term='bpel'/><category term='bpm'/><category term='flash'/><category term='sonar'/><category term='JPA'/><category term='html5'/><category term='web'/><category term='movies'/><category term='books'/><category term='dashboards'/><category term='development'/><category term='soa'/><category term='Hibernate'/><category term='maven'/><category term='gwt'/><category term='printing'/><category term='camel'/><category term='nature'/><category term='adobe'/><category term='spring integration'/><category term='open source'/><category term='cloud foundy'/><category term='latin america'/><category term='RIA'/><category term='validation'/><category term='travel'/><category term='jrecruiter'/><category term='spring'/><category term='rails'/><category term='rss'/><category term='AJUG'/><category term='email'/><category term='developer'/><category term='germany'/><category term='eclipse'/><category term='business process'/><category term='Persistence'/><category term='SpringSource'/><category term='renewable energy'/><category term='scala'/><category term='java'/><category term='security'/><category term='functional languages'/><category term='roundup'/><category term='devnexus'/><category term='panama'/><category term='home improvement'/><category term='cloud'/><category term='flex'/><category term='pdf'/><category term='OpenID'/><category term='oracle'/><category term='rest'/><category term='android'/><category term='integration'/><category term='atlanta'/><category term='build'/><category term='groovy'/><category term='mac'/><category term='book review'/><category term='JavaScript'/><category term='eip'/><category term='webflow'/><category term='ide'/><category term='json'/><category term='ruby'/><category term='education'/><category term='smtp'/><category term='jdbc'/><category term='workflow'/><category term='charting'/><category term='nfjs'/><category term='environment'/><category term='documentary'/><category term='event'/><category term='websockets'/><category term='I18N'/><category term='conference'/><category term='javaposse'/><category term='gradle'/><category term='agile'/><category term='python'/><category term='computer'/><category term='jackson'/><category term='jmx'/><category term='teaching'/><category term='database'/><category term='presentations'/><category term='computer science'/><category term='saving water'/><category term='ajax'/><category term='meeting'/><category term='jvm'/><category term='netbeans'/><category term='sharks'/><category term='sql'/><category term='drought'/><category term='Linux'/><category term='proxying'/><category term='twitter'/><category term='career'/><category term='jruby'/><category term='profiling'/><title type='text'>Gunnar Hillert's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default?start-index=101&amp;max-results=100'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>138</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-579737041683804073</id><published>2012-01-30T12:48:00.010-05:00</published><updated>2012-01-30T12:48:00.039-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus 2012 Early Bird Ends in 48 Hours!</title><content type='html'>This is a friendly reminder that the Early Bird pricing for DevNexus 2012 ends in 48 hours on February 1 at 11:59pm. Therefore, please register for &lt;b&gt;DevNexus&lt;/b&gt; at &lt;b&gt;&lt;a href="http://www.devnexus.com/"&gt;http://www.devnexus.com/&lt;/a&gt;&lt;/b&gt; in order to secure your ticket for this wonderful conference at the low price of &lt;b&gt;$185&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Date: &lt;b&gt;March 21-22, 2012&lt;/b&gt;&lt;br /&gt;Place: Cobb Galleria, Atlanta, GA&lt;br /&gt;Cost: $185 (early bird price), $200 after February 1st.&lt;br /&gt;&lt;br /&gt;DevNexus is the South-East's biggest conference for Java developers! We provide the best software professional development content at the lowest possible&lt;br /&gt;price, bringing some of the world's best speakers &amp;amp; most interesting topics to Atlanta!&lt;br /&gt;&lt;br /&gt;For 2012, we have an amazing line-up of speakers and sessions. Here is what you can expect:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;2 days&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;6 tracks&lt;/b&gt; (2 more than last year!!)&lt;/li&gt;&lt;li&gt;&lt;b&gt;48 sessions&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;3 keynote presentations&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Food and beverages will be provided&amp;nbsp;&lt;/li&gt;&lt;li&gt;Cocktail-hour with free sponsored drinks at the end of the first day&lt;/li&gt;&lt;li&gt;Raffles and give-aways (e.g. books)&lt;/li&gt;&lt;li&gt;Great networking opportunities&lt;/li&gt;&lt;li&gt;Ridiculously cost-effective value&lt;/li&gt;&lt;li&gt;DevNexus is organized by community volunteers (pro-bono) for the community!&lt;/li&gt;&lt;/ul&gt;Here is a list of topics that we will cover:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Core Java (Java 7+8, Joda-Time, Guava)&lt;/li&gt;&lt;li&gt;Mobile (PhoneGap, Android, Titanium Mobile)&lt;/li&gt;&lt;li&gt;HTML5&lt;/li&gt;&lt;li&gt;JavaScript (Node.js, jQuery)&lt;/li&gt;&lt;li&gt;Spring (Spring 3.1, Spring MVC 3.1, Spring Integration)&lt;/li&gt;&lt;li&gt;JBoss (Delta Spike, JBoss 7)&lt;/li&gt;&lt;li&gt;Cloud (Heroku, Cloud Foundry, Google App Engine)&lt;/li&gt;&lt;li&gt;Gradle&lt;/li&gt;&lt;li&gt;Groovy&lt;/li&gt;&lt;li&gt;Git&lt;/li&gt;&lt;li&gt;Scala&lt;/li&gt;&lt;li&gt;NoSQL (Neo4J, Cassandra)&lt;/li&gt;&lt;li&gt;Play Framework&lt;/li&gt;&lt;li&gt;EhCache&lt;/li&gt;&lt;li&gt;REST&lt;/li&gt;&lt;li&gt;Continuous deployment&lt;/li&gt;&lt;li&gt;Talks on Agile Methodologies and Architecture&lt;/li&gt;&lt;/ul&gt;The DevNexus website already contains 32 session abstracts which you can browse at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/presentations"&gt;http://www.devnexus.com/s/presentations&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More presentation abstracts will be added shortly. We are also super-excited to offer 3 keynote presentations at DevNexus 2012. The opening keynote presenter will be Patrick Curran, Chair of the Java Community Process organization (JCP):&lt;br /&gt;&lt;br /&gt;"Java User Groups and the Java Community Process: a winning combination"&lt;br /&gt;&lt;br /&gt;Our second keynote presenter will be our very own Barry Hawkins, a veteran in our industry as speaker, developer, and agile coach and mentor.&lt;br /&gt;&lt;br /&gt;"How We Got Here, And What To Do About It"&lt;br /&gt;&lt;br /&gt;Please find more information about our keynote speakers, including keynote details, on our website at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/speakers"&gt;http://www.devnexus.com/s/speakers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is &lt;b&gt;THE&lt;/b&gt; conference you must not miss. Therefore, come join us for this incredible event.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Don't hesitate, sign up for DevNexus 2012 today at: &lt;a href="http://www.devnexus.com/"&gt;http://www.devnexus.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We would also like to thank our Sponsors that greatly help us to keep DevNexus so affordable:&lt;br /&gt;&lt;br /&gt;Gold Sponsors:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Terracotta&lt;/li&gt;&lt;li&gt;IntercontinentalExchange (ICE)&lt;/li&gt;&lt;li&gt;JBoss&lt;/li&gt;&lt;li&gt;The Intersect Group&lt;/li&gt;&lt;/ul&gt;Silver Sponsors:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apex Systems&lt;/li&gt;&lt;li&gt;Anteo Group&lt;/li&gt;&lt;/ul&gt;Lastly, please feel free to send this note to your present &amp;amp; past co-workers in the local software development community. Group discounts of 5 or more apply.&lt;br /&gt;&lt;br /&gt;If you have any questions please contact us at:&lt;br /&gt;&lt;br /&gt;info at ajug dot org&lt;br /&gt;678-908-9067&lt;br /&gt;&lt;br /&gt;See you all at DevNexus 2012!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-579737041683804073?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/579737041683804073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=579737041683804073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/579737041683804073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/579737041683804073'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2012/01/devnexus-2012-early-bird-ends-in-48.html' title='DevNexus 2012 Early Bird Ends in 48 Hours!'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-333712489179418102</id><published>2012-01-13T03:15:00.007-05:00</published><updated>2012-01-13T03:23:30.424-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='sonar'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Sonar and Gradle Multi-Module Projects</title><content type='html'>I love &lt;a href="http://www.sonarsource.org/"&gt;Sonar&lt;/a&gt;. It is a wonderful way to collect some metrics for your Java projects - hassle-free and wrapped in a sweet-looking UI. &amp;nbsp;For Maven-based projects Sonar literally works out of the box. Just start up your Sonar instance (assuming you are using the default settings running on localhost) and then you simply fire it off using:&lt;br /&gt;&lt;pre&gt;$ mvn sonar:sonar&amp;nbsp;&lt;/pre&gt;A few moments later you should have the metrics available at:&lt;br /&gt;&lt;pre&gt;http://localhost:9000/&lt;/pre&gt;Well, the past few days I was setting up a multi-module &lt;a href="http://gradle.org/"&gt;Gradle&lt;/a&gt; project for Sonar. Let me start by stating that Gradle is awesome. Having the ability to declare dependencies as one-liners and also being able to customize your scripts easily, yet having sensible defaults, is very nice. Kind of the best of both worlds.&lt;br /&gt;&lt;br /&gt;Setting up Sonar for a multi module project, though,&amp;nbsp;is unfortunately a bit more complicated, compared to what I am used to in the Maven world. It is not&amp;nbsp;awfully&amp;nbsp;complicated, but it took me a while to collect all the pieces of information.&lt;br /&gt;&lt;br /&gt;Getting your Sonar plugin to just doing something is fairly simple. Just follow the basic steps outlined in the plugin documentation at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://gradle.org/docs/current/userguide/sonar_plugin.html"&gt;http://gradle.org/docs/current/userguide/sonar_plugin.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;One differentiator between the Sonar Plugin for Gradle and Maven is, that the Gradle version does not automatically run code coverage analysis. This needs to be manually setup. This is where the official doc just vaguely refers to Cobertura.&lt;br /&gt;&lt;br /&gt;First, I tried using Cobertura for code coverage, but I seemed to run into difficulties for my multi-module projects. The Cobertura Plugin is here:&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/valkolovos/gradle_cobertura/wiki"&gt;https://github.com/valkolovos/gradle_cobertura/wiki&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;By chance I realized that the Sonar guys have a GitHub repository with samples on how to setup sonars for various build systems, including Gradle:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/SonarSource/sonar-examples/"&gt;https://github.com/SonarSource/sonar-examples/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;In their examples, they are using &lt;a href="http://www.eclemma.org/jacoco/"&gt;JaCoCo&lt;/a&gt;, which is not mentioned in the original Gradle docs and maybe I could have continued with Cobertura but it seemed that Sonar was&amp;nbsp;preferring&amp;nbsp;JaCoCo and thus I continued with that.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some Gradle Sonar Plugin Limitations&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Gradle Sonar Plugin has an annoying limitation, where I can run it for the ROOT project OR for the sub-projects individually. See the following Gradle Jira ticket for details:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://issues.gradle.org/browse/GRADLE-1813"&gt;http://issues.gradle.org/browse/GRADLE-1813&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Furthermore, I hit the minor issue that I cannot set the links in the Sonar dashboard. This seems to be related to the following Sonar Jira issue:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://jira.codehaus.org/browse/SONAR-2749"&gt;https://jira.codehaus.org/browse/SONAR-2749&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The JaCoCo code coverage plugin is "slightly less" supported by the Gradle Sonar Plugin, e.g. the &amp;nbsp;Gradle Plugin &lt;a href="http://gradle.org/docs/current/groovydoc/org/gradle/api/plugins/sonar/model/SonarProject.html"&gt;does not have an explicit setter&lt;/a&gt; for the &lt;i&gt;JacocoReportPath&lt;/i&gt;&amp;nbsp;and it assumes the "target" folder as the build directory by default. Therefore you must set explicitly:&lt;/div&gt;&lt;pre&gt;props["sonar.jacoco.reportPath"] &amp;nbsp;= "${buildDirName}/jacoco.exec"&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;div&gt;Lastly, I deviated a bit from the SonarSource Gradle example, and instead of System properties, I wanted to use &lt;a href="http://gradle.org/docs/current/userguide/tutorial_this_and_that.html"&gt;Gradle properties&lt;/a&gt; to allow for users to provide non-default Sonar configuration settings (databasem url, jdbc parameters etc.).&amp;nbsp;Well, while setting that up I ran into yet another Gradle Jira issue:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://issues.gradle.org/browse/GRADLE-1826"&gt;http://issues.gradle.org/browse/GRADLE-1826&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;But at the the end, I am happily able to run a multi-module Gradle project with Sonar and collecting Code Coverage statistics. &amp;nbsp;Here is the relavant code from my &lt;b&gt;build.gradle&lt;/b&gt; file:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="brush: groovy"&gt;apply plugin: 'sonar'&lt;br /&gt;&lt;br /&gt;sonar {&lt;br /&gt;&lt;br /&gt;    if (rootProject.hasProperty('sonarHostUrl')) {&lt;br /&gt;        server.url = rootProject.sonarHostUrl&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    database {&lt;br /&gt;        if (rootProject.hasProperty('sonarJdbcUrl')) {&lt;br /&gt;            url = rootProject.sonarJdbcUrl&lt;br /&gt;        }&lt;br /&gt;        if (rootProject.hasProperty('sonarJdbcDriver')) {&lt;br /&gt;            driverClassName = rootProject.sonarJdbcDriver&lt;br /&gt;        }&lt;br /&gt;        if (rootProject.hasProperty('sonarJdbcUsername')) {&lt;br /&gt;            username = rootProject.sonarJdbcUsername&lt;br /&gt;        }&lt;br /&gt;        if (rootProject.hasProperty('sonarJdbcPassword')) {&lt;br /&gt;            password = rootProject.sonarJdbcPassword&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    project {&lt;br /&gt;        dynamicAnalysis  = "reuseReports"&lt;br /&gt;        withProjectProperties { props -&amp;gt;&lt;br /&gt;            props["sonar.core.codeCoveragePlugin"] = "jacoco"&lt;br /&gt;            props["sonar.jacoco.reportPath"]       = "${buildDirName}/jacoco.exec"&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    println("Sonar parameters used: server.url='${server.url}'; database.url='${database.url}'; database.driverClassName='${database.driverClassName}'; database.username='${database.username}'")&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;subprojects { subproject -&amp;gt;&lt;br /&gt;&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;    // See http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:configurations&lt;br /&gt;    // and http://www.gradle.org/docs/current/dsl/org.gradle.api.artifacts.ConfigurationContainer.html&lt;br /&gt;    configurations {&lt;br /&gt;        jacoco //Configuration Group used by Sonar to provide Code Coverage using JaCoCo&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // dependencies that are common across all java projects&lt;br /&gt;    dependencies {&lt;br /&gt;        ...&lt;br /&gt;        jacoco group: "org.jacoco", name: "org.jacoco.agent", version: "0.5.3.201107060350", classifier: "runtime"&lt;br /&gt;        ...&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    test {&lt;br /&gt;        jvmArgs "-javaagent:${configurations.jacoco.asPath}=destfile=${buildDir}/jacoco.exec,includes=org.your.project.*"&lt;br /&gt;    }&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;I hope this is useful information for all Gradle users out there.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-333712489179418102?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/333712489179418102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=333712489179418102' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/333712489179418102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/333712489179418102'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2012/01/sonar-and-gradle-multi-module-projects.html' title='Sonar and Gradle Multi-Module Projects'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5733282765927069567</id><published>2011-12-30T23:10:00.192-05:00</published><updated>2011-12-31T01:49:13.482-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='SpringSource'/><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><title type='text'>Method Validation With Spring 3.1 and Hibernate Validator 4.2</title><content type='html'>&lt;a href="http://jcp.org/en/jsr/detail?id=303"&gt;JSR 303&lt;/a&gt; and &lt;a href="http://www.hibernate.org/subprojects/validator.html"&gt;Hibernate Validator&lt;/a&gt; have been some awesome additions to the Java ecosystem, giving you a standard way to validate your domain model across application layers. Combined with the annotations of the Java Persistence API (JPA) you have some very nice tools at your disposal to ensure that only valid data enters your database.&lt;br /&gt;&lt;br /&gt;However, one piece of missing functionality was the ability to also validate method calls. For example, wouldn't it be nice if you could use normal JSR 303 annotations to safeguard business layer calls as well?&lt;br /&gt;&lt;br /&gt;Of course you can enforce constraints&amp;nbsp;programmatically, e.g. prevent the passing of Null parameters. Spring for instance provides the&lt;a href="http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/util/Assert.html"&gt;&amp;nbsp;org.springframework.util.Assert&lt;/a&gt; class.&amp;nbsp;However, it would be desirable, if constraints placed on input parameters as well as return values were part of the method contract.&lt;br /&gt;&lt;br /&gt;Enter &lt;i&gt;Hibernate Validator&lt;/i&gt; 4.2, which was released in June of 2011. It provides now method validation and Gunnar Morling, one of the committers, has an excellent write-up on this on his blog at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-hibernate.html"&gt;http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-hibernate.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Also, check out the &lt;a href="http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html_single/#validator-customoptions-methodvalidation"&gt;Hibernate validator documentation&lt;/a&gt;&amp;nbsp;regarding method validation. Gunnar Morling also provides some preliminary Spring support available at GitHub:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/gunnarmorling/methodvalidation-integration"&gt;https://github.com/gunnarmorling/methodvalidation-integration&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;But the news for Spring&amp;nbsp;aficionados&amp;nbsp;is getting even better - Direct support for&amp;nbsp;Method Validation With Hibernate Validator is now available in the lastest &lt;i&gt;Spring 3.1&lt;/i&gt; release that went GA just two weeks ago.&lt;br /&gt;&lt;br /&gt;Specifically Spring 3.1 provides the following support in regards to method validation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/validation/beanvalidation/MethodValidationInterceptor.html"&gt;org.springframework.validation.beanvalidation.MethodValidationInterceptor&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.html"&gt;org.springframework.validation.beanvalidation.MethodValidationPostProcessor&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;In order to get started, make sure that you are using Spring 3.1.0.RELEASE and that you have Hibernate Validator 4.2 in your classpath. That's all what you need to begin using JSR 303 annotations on the method level. For example, now you can annotate your methods using e.g.:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;@Validated&lt;br /&gt;public interface BusinessService {&lt;br /&gt;    @NotNull String convertToUpperCase(@NotEmpty String input);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The &lt;a href="http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/validation/annotation/Validated.html"&gt;@Validated&lt;/a&gt; Annotation indicates that the methods in the class are to be included for method validation. Keep in mind that you can specify your own annotation that will be enabling method level validation for the annotated class. Specify your own annotation by calling&amp;nbsp;&lt;a href="http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.html#setValidatedAnnotationType(java.lang.Class)"&gt;setValidatedAnnotationType&lt;/a&gt; on the &lt;i&gt;MethodValidationPostProcessor&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;However, placing the annotations themselves will not enforce the constraints 'automagically'. In fact Spring will be using AOP (Aspect Oriented Programming) Advices under the covers that delegate to Hibernate Validator. The easiest way to enable these advices is to declare a&amp;nbsp;&lt;b&gt;MethodValidationPostProcessor&lt;/b&gt; bean in your Spring application context as shown below.&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&lt;br /&gt;  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;context:component-scan base-package="com.hillert.spring.validation" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean id="validator"&lt;br /&gt;      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/&amp;gt;&lt;br /&gt;      &lt;br /&gt;    &amp;lt;bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/pre&gt;For more details, I have published a small project over at GitHub that illustrates method level validation using Hibernate Validator:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/ghillert/spring-hibernate-validator-sample"&gt;https://github.com/ghillert/spring-hibernate-validator-sample&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;In order to get get started:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Clone the repository using&amp;nbsp;&lt;i&gt;&lt;b&gt;$ git clone git://github.com/ghillert/spring-hibernate-validator-sample.git&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;$ cd&amp;nbsp;spring-hibernate-validator-sample&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Build the sample using Maven&amp;nbsp;&lt;i&gt;&lt;b&gt;$ mvn clean package&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Run it with&lt;b&gt;&lt;i&gt;$ mvn exec:java&lt;/i&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;The command-line based sample provides a simple String conversion service, that converts Strings to upper-case. You can insert those Strings&amp;nbsp;from the command line. The Service layer will enforce the following constraints using method level Hibernate Validator annotations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The input String must not be empty (not null and not an empty String)&lt;/li&gt;&lt;li&gt;The conversion service will never return null&lt;/li&gt;&lt;/ul&gt;In order to trigger validation exceptions you can enter some special strings:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pressing just enter (no string entered) will cause an empty String parameter to be set&lt;/li&gt;&lt;li&gt;Submitting "null" (The String), will cause a null parameter to be set&lt;/li&gt;&lt;li&gt;When entering "returnnull", the&amp;nbsp;underlying&amp;nbsp;business method will return Null&lt;/li&gt;&lt;/ul&gt;The Main method will catch the occurring&amp;nbsp;&lt;a href="http://docs.jboss.org/hibernate/validator/4.2/api/org/hibernate/validator/method/MethodConstraintViolationException.html"&gt;MethodConstraintViolationExceptions&lt;/a&gt;&amp;nbsp;and print some details to the command prompt.&lt;br /&gt;&lt;br /&gt;Lastly, the current method validator support via Spring is specifically targetting Hibernate Validator. However, there are standardization efforts underway as part of the &lt;a href="http://jcp.org/en/jsr/detail?id=349"&gt;Bean Validation 1.1 specification&lt;/a&gt; (&lt;b&gt;JSR-349&lt;/b&gt;). In order to follow the progress, please follow also &lt;a href="http://beanvalidation.org/"&gt;http://beanvalidation.org/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Spring will provide support for JSR-349 as soon as the official standard has been ratified. In order&amp;nbsp;to track inclusion into the Spring framework, please follow also&amp;nbsp;&lt;i&gt;Spring Framework&lt;/i&gt; Jira ticket &lt;a href="https://jira.springsource.org/browse/SPR-8199"&gt;SPR-8199&lt;/a&gt;&amp;nbsp;.&amp;nbsp;As of today this feature should be available in the next &lt;i&gt;Spring 3.2&lt;/i&gt; release.&lt;br /&gt;&lt;br /&gt;I hope this blog entry and the&amp;nbsp;accompanying&amp;nbsp;sample have showed you how easy it is to get started with &amp;nbsp;method level validation using Spring and Hibernate Validator.&amp;nbsp;Please let me know if you have further questions or run into issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5733282765927069567?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5733282765927069567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5733282765927069567' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5733282765927069567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5733282765927069567'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/12/method-validation-with-hibernate.html' title='Method Validation With Spring 3.1 and Hibernate Validator 4.2'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-2283582199333777411</id><published>2011-12-27T13:00:00.019-05:00</published><updated>2011-12-27T15:47:05.094-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='printing'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Java Print Service Frustrations</title><content type='html'>This is probably not the most exciting "toy" to play with for the holidays, but I wanted to explore some use-cases that involve printing through Java back-end services. Basically, in an enterprise environment you may run into requirements, where the documents you receive or generate also are required to be printed out for whatever reasons. In all honesty, I never had to deal with Java's print Apis and thus started from scratch.&lt;br /&gt;&lt;br /&gt;It turns out, that there are 2 approaches (reminds me of the multitude of Date implementations...). One approach dates back to the 1990s and is called the &lt;a href="http://java.sun.com/products/java-media/2D/forDevelopers/sdk12print.html"&gt;Java 2 Print API&lt;/a&gt; and is tied more to User Interfaces (UI) triggering the printing process. With Java 1.4, the&amp;nbsp;Java &lt;a href="http://docs.oracle.com/javase/6/docs/technotes/guides/jps/index.html"&gt;Print Service API&lt;/a&gt; (JPS) was introduced (&lt;a href="http://www.jcp.org/en/jsr/detail?id=6"&gt;JSR 6&lt;/a&gt;) which serves as a super-set of the the Java 2 Print Api.&lt;br /&gt;&lt;br /&gt;The JPS Api is certainly workable but I ran into some serious trouble. For my initial use-case, I may receive simple text documents, e.g. XML that I want to send to a definable printer as plain text.&lt;br /&gt;&lt;br /&gt;I was unable to get that to work on my Mac using Mac OS X 10.6.8. However, on my Windows JVM it worked flawlessly and my text files were printed out without any complaints. On my Mac, though, my little Java test application finishes without any errors but my printer queue states: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Error: pstopdffilter/pstocupsraster failed with err number -31000&lt;/pre&gt;&lt;br /&gt;Googling did not help much either. There seemed to be some anecdotal evidence that other people might have had trouble with text printing as well but I was unable to uncover definite answers (Many of the information is years old). The question I have is whether this is an issue with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My Printer, which is a&amp;nbsp;Brother &lt;i&gt;HL-4070CDW&lt;/i&gt;&lt;/li&gt;&lt;li&gt;The Mac JVM (Mine is: build &lt;i&gt;1.6.0_29-b11-402-10M3527&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cups.org/"&gt;CUPS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;something else&lt;/li&gt;&lt;/ul&gt;If any of the readers has encountered similar issues or is able to shed some more light into this issue, please let me know (&lt;b&gt;THANKS!&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;While searching for explanations,&amp;nbsp;I stumbled across the following thread on &lt;i&gt;stackoverflow.com&lt;/i&gt;:&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/1655297/print-to-specific-printer-ipp-uri-in-java"&gt;http://stackoverflow.com/questions/1655297/print-to-specific-printer-ipp-uri-in-java&lt;/a&gt;. There they mentioned the following CUPS specific libraries:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CUPS4J (&lt;a href="http://www.cups4j.org/"&gt;http://www.cups4j.org/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;jipsi (&lt;a href="http://sourceforge.net/projects/jipsi/"&gt;http://sourceforge.net/projects/jipsi/&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Jipsi aparently changed names and moved to Google code:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JSPI (&lt;a href="http://code.google.com/p/jspi"&gt;http://code.google.com/p/jspi&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;As I need a generic solution that works not only on Mac using CUPS but also on Windows I have not experimented with any of the libraries above. Nevertheless I wanted to mention them.&lt;br /&gt;&lt;br /&gt;I have also tried various other&amp;nbsp;&lt;i&gt;DocFlavors&lt;/i&gt; and settings but to no avail. What is interesting, though, is that the printing of PDF files works fine. Printing image files such as PNG or JPG fails as well.&lt;br /&gt;&lt;br /&gt;Here is the trivial application that I am using:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;&lt;br /&gt;import javax.print.Doc;&lt;br /&gt;import javax.print.DocFlavor;&lt;br /&gt;import javax.print.DocPrintJob;&lt;br /&gt;import javax.print.PrintException;&lt;br /&gt;import javax.print.PrintService;&lt;br /&gt;import javax.print.PrintServiceLookup;&lt;br /&gt;import javax.print.SimpleDoc;&lt;br /&gt;import javax.print.attribute.HashPrintRequestAttributeSet;&lt;br /&gt;import javax.print.attribute.PrintRequestAttributeSet;&lt;br /&gt;import javax.print.attribute.standard.Copies;&lt;br /&gt;import javax.print.attribute.standard.Sides;&lt;br /&gt;&lt;br /&gt;public class PrintPS {&lt;br /&gt;&lt;br /&gt;  public static void main(String args[]) throws FileNotFoundException, PrintException {&lt;br /&gt;    FileInputStream textStream = new FileInputStream(args[0]); &lt;br /&gt;    DocFlavor myFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;&lt;br /&gt;    Doc myDoc = new SimpleDoc(textStream, myFormat, null); &lt;br /&gt;  &lt;br /&gt;    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); &lt;br /&gt;  &lt;br /&gt;    aset.add(new Copies(1)); &lt;br /&gt;    aset.add(Sides.ONE_SIDED); &lt;br /&gt;  &lt;br /&gt;    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();&lt;br /&gt;  &lt;br /&gt;    System.out.println("Printing to default printer: " + printService.getName());&lt;br /&gt;  &lt;br /&gt;    DocPrintJob job = printService.createPrintJob(); &lt;br /&gt;    job.print(myDoc, aset); &lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Furthermore, I looked at the follwing Java-based Text editors to see how they accomplish printing (Which works fine on my Mac as well):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RTEXT (&lt;a href="http://rtext.fifesoft.com/"&gt;http://rtext.fifesoft.com&lt;/a&gt;)&amp;nbsp;&lt;/li&gt;&lt;li&gt;jEdit (&lt;a href="http://www.jedit.org/"&gt;http://www.jedit.org&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;RTEXT uses the DocFlavor: &lt;a href="http://docs.oracle.com/cd/E17409_01/javase/7/docs/api/index.html?javax/print/DocFlavor.SERVICE_FORMATTED.html"&gt;DocFlavor.SERVICE_FORMATTED.PRINTABLE&lt;/a&gt;&amp;nbsp;which in turn uses a component that implements the&amp;nbsp;&lt;a href="http://docs.oracle.com/cd/E17409_01/javase/7/docs/api/java/awt/print/Printable.html"&gt;java.awt.print.Printable&lt;/a&gt;&amp;nbsp;Interface.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I guess, as a next step I have two options...go down into the trenches of Java2D or have some fun generating PDF files...And all I wanted was to print some simple text that works across Operating Systems.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-2283582199333777411?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/2283582199333777411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=2283582199333777411' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2283582199333777411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2283582199333777411'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/12/java-print-service-frustrations.html' title='Java Print Service Frustrations'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5530096881067664278</id><published>2011-12-07T20:43:00.001-05:00</published><updated>2011-12-07T20:44:51.251-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><title type='text'>DevNexus 2012 - Registration is Open</title><content type='html'>The Atlanta Java Users Group is delighted to announce that registration for &lt;b&gt;DevNexus 2012&lt;/b&gt; is now open. In order to reserve your ticket, please go to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.devnexus.com/"&gt;&lt;b&gt;http://www.devnexus.com/&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;DevNexus 2012 will be held on &lt;b&gt;Wednesday, March 21st and Thursday, March 22nd&lt;/b&gt; at the Cobb Galleria Centre in Atlanta, GA. We already confirmed many amazing presenters covering a wide array of crucial technology topics.&lt;br /&gt;&lt;br /&gt;In addition to providing great content for Java developers, DevNexus is a very valuable networking opportunity. This event attracts Java/JVM talent from diverse backgrounds, be it large corporations, consulting organizations or independent technology connoisseurs. You will have an opportunity to discover what other development teams are using as their favorite tools and practices.&lt;br /&gt;&lt;br /&gt;Why should you attend DevNexus 2012:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Best Value: &lt;b&gt;$185 Early Bird price&lt;/b&gt; (until Feb 1) for two full days of technology immersion and comaraderie.&lt;/li&gt;&lt;li&gt;Ask questions to world-class experts and fellow developers&lt;/li&gt;&lt;li&gt;Learn how to move your applications into the cloud (covering &lt;a href="http://cloudfoundry.com/"&gt;Cloud Foundry&lt;/a&gt;, &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt;, &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;, &lt;a href="https://openshift.redhat.com/app/"&gt;OpenShift&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Learn Agile Best Practices &amp;amp; Tools&lt;/li&gt;&lt;li&gt;Learn more about core Java topics as well as other languages on the JVM&lt;/li&gt;&lt;li&gt;Learn more about building rich (mobile) web-application applications, e.g. using &lt;a href="http://www.html5rocks.com/en/"&gt;HTML5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Hear about the latest developments from JBoss and SpringSource&lt;/li&gt;&lt;/ul&gt;We have already lined-up some impressive speakers, with many more to be announced in the upcoming weeks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tim Berglund - Covering NoSQL topics&lt;/li&gt;&lt;li&gt;Patrick Curran - Chairman of the JCP, keynote speaker&lt;/li&gt;&lt;li&gt;Hans Dockter&amp;nbsp; - Founder of Gradle&lt;/li&gt;&lt;li&gt;Ben Evans - Covering various core Java topics including Java 8&lt;/li&gt;&lt;li&gt;Mark Fisher - Spring Integration Lead, covering Enterprise Integration Patterns (EIP) and Cloud Foundry&lt;/li&gt;&lt;li&gt;Barry Hawkins - Covering Agile Methodologies&lt;/li&gt;&lt;li&gt;Josh Long - Spring Developer Advocate&lt;/li&gt;&lt;li&gt;Pratik Patel - Mobile/Web, Java &lt;/li&gt;&lt;li&gt;Rossen Stoyanchev - Spring MVC Lead&lt;/li&gt;&lt;li&gt;James Ward - Covering Heroku and Play framework&lt;/li&gt;&lt;/ul&gt;Fore more details on speakers please visit:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/speakers"&gt;http://www.devnexus.com/s/speakers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We also would like to thank our sponsors for their support in making DevNexus a success:&lt;br /&gt;&lt;br /&gt;Gold Sponsors&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://www.theice.com/careers.jhtml"&gt;Intercontinental Exchange &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jboss.com/"&gt;JBoss&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theintersectgroup.com/"&gt;The Intersect Group&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Silver Sponsor&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.anteogroup.com/"&gt;Anteo Group&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;We hope to see you all at DevNexus, and please register for this incredibly valuable event at:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.devnexus.com/"&gt;&lt;b&gt;http://www.devnexus.com/&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5530096881067664278?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5530096881067664278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5530096881067664278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5530096881067664278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5530096881067664278'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/12/devnexus-2012-registration-is-open.html' title='DevNexus 2012 - Registration is Open'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1410146197310946011</id><published>2011-12-01T01:21:00.000-05:00</published><updated>2011-12-01T01:21:48.040-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud foundy'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='spring integration'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Cloud Foundry for Spring Developers - Slides</title><content type='html'>Yesterday, I presented "Cloud Foundry for Spring Developers", at&amp;nbsp;the &lt;a href="http://www.meetup.com/AtlantaSpring/events/39659132/"&gt;Atlanta Spring User Group&lt;/a&gt;.&amp;nbsp;I finally got around to upload the presentation slides to Slideshare:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/hillert/cloud-foundry-for-spring-developers"&gt;http://www.slideshare.net/hillert/cloud-foundry-for-spring-developers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would like to thank everyone for coming to the presentation! &lt;a href="http://www.cloudfoundry.com/"&gt;Cloud Foundry&lt;/a&gt; rocks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1410146197310946011?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1410146197310946011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1410146197310946011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1410146197310946011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1410146197310946011'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/12/cloud-foundry-for-spring-developers.html' title='Cloud Foundry for Spring Developers - Slides'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-6331262404776752378</id><published>2011-11-29T11:00:00.000-05:00</published><updated>2011-11-29T11:00:57.418-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud foundy'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Cloud Foundry for Spring Developers</title><content type='html'>&lt;br /&gt;I will be presenting at the Atlanta Spring User Group tonight (Nov 29, 2011) at 6:30pm. For more details, including directions, please visit:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.meetup.com/AtlantaSpring/"&gt;http://www.meetup.com/AtlantaSpring/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Title:&amp;nbsp;&lt;/b&gt;Cloud Foundry for Spring Developers&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Session abstract:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This session provides an overview of how to build and deploy Spring-based applications to the Cloud Foundry platform.&lt;br /&gt;The session will cover application configuration parameters, binding services to your application, deployment options using using STS, the vmc command tool, as well as the new Apache Maven plugin for Cloud Foundry. Gunnar will demonstrate how to deploy applications to both micro and public Cloud Foundry and will also show how debugging works with Cloud Foundry and how you can inspect services remotely using Caldecott.&lt;br /&gt;&lt;br /&gt;Gunnar will also show various options to keep your War-files deployable to both Cloud Foundry and stand-alone Servlet Containers using Auto-Reconfiguration, the Cloud namespace, and Spring 3.1 profiles.&lt;br /&gt;&lt;br /&gt;Lastly, he will give a high-level overview how you can use Cloud Foundry together with Spring Integration in order to create scalable Spring applications.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-6331262404776752378?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/6331262404776752378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=6331262404776752378' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6331262404776752378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6331262404776752378'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/11/cloud-foundry-for-spring-developers.html' title='Cloud Foundry for Spring Developers'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-2343797067181529486</id><published>2011-11-02T09:40:00.000-04:00</published><updated>2011-11-02T09:40:08.919-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><title type='text'>DevNexus 2012 - Call For Papers Now Open</title><content type='html'>&lt;br /&gt;&lt;div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;The &lt;b&gt;DevNexus™ 2012&lt;/b&gt; developer conference is taking place &lt;b&gt;March 21-22&lt;/b&gt;. We are delighted to announce the Call for Papers is now open. We are looking forward to receiving your amazing proposals covering one of the following topics:&lt;/div&gt;&lt;ul style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1.5em; margin-left: 0px; margin-right: 1.5em; margin-top: 0px; padding-bottom: 0px; padding-left: 1.5em; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Java and JVM Languages&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Cloud&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;NoSQL&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Web (incl. Mobile Development, HTML5, JavaScript)&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Methodologies and Tools&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;We do not encourage overt marketing pitches. Sessions are 75 minutes long and we encourage breakout sessions, work-shops and case studies. Please include the following information:&lt;/div&gt;&lt;ul style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1.5em; margin-left: 0px; margin-right: 1.5em; margin-top: 0px; padding-bottom: 0px; padding-left: 1.5em; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Name&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Job Title&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Email&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Twiter id&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Company&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Presentation Title&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Audience Level (General, Beginner, Intermediate, Advanced)&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Presentation Abstract&lt;/li&gt;&lt;li style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Your Bio&lt;/li&gt;&lt;/ul&gt;&lt;div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Please submit your proposals as soon as possible to &lt;b&gt;info at ajug.org&lt;/b&gt;. The Call for Papers closes January 15, 2012.&lt;/div&gt;&lt;div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;The planning committee will carefully review your proposals, and you will get a confirmation whether your talks are selected or not for the DevNexus™ conference.&lt;/div&gt;&lt;div style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; margin-bottom: 1.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;For more information, please visit: &lt;a href="http://www.devnexus.com/"&gt;&lt;b&gt;http://www.devnexus.com/&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-2343797067181529486?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/2343797067181529486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=2343797067181529486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2343797067181529486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2343797067181529486'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/11/devnexus-2012-call-for-papers-now-open.html' title='DevNexus 2012 - Call For Papers Now Open'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8655179084994413179</id><published>2011-09-22T16:54:00.003-04:00</published><updated>2011-09-22T17:14:16.116-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud foundy'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='SpringSource'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven and Cloud Foundry - The plugin is here!</title><content type='html'>It has been an amazing time so far for me working at SpringSource for the past couple of months and today I have finally published my first blog post for the official SpringSource blog. The blog post also marks the Milestone 1 (M1) release of the &lt;a href="https://github.com/vmware-ac/vcap-java-client"&gt;Cloud Foundry Maven Plugin&lt;/a&gt;&amp;nbsp;which will make it much easier for Maven users to deploy their applications to&amp;nbsp;&lt;a href="http://www.cloudfoundry.org/"&gt;Cloud Foundry&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thus, checkout the &lt;a href="http://blog.springsource.com/2011/09/22/rapid-cloud-foundry-deployments-with-maven/"&gt;blog post&lt;/a&gt;, use the plugin&amp;nbsp;and follow the &lt;a href="https://github.com/cloudfoundry/vcap-java-client/tree/master/cloudfoundry-maven-plugin"&gt;project over at GitHub&lt;/a&gt;. Please provide plenty of feedback - it is highly appreciated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-8655179084994413179?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8655179084994413179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8655179084994413179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8655179084994413179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8655179084994413179'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/09/maven-and-cloud-foundry-plugin-in-is.html' title='Maven and Cloud Foundry - The plugin is here!'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1785545960068745542</id><published>2011-07-29T02:35:00.000-04:00</published><updated>2011-07-29T02:35:12.184-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>OSCON 2011 - Mission Accomplished</title><content type='html'>&lt;br /&gt;OSCON 2011 - Mission Accomplished and a week of amazing learning and networking is finally coming to an end. I had flown in not only for OSCON Java but also for the Community Leadership Summit, that took place last Saturday and Sunday (but Sunday, I attended the JVM languages day instead, which was wonderful as well).&lt;br /&gt;&lt;br /&gt;I was super-impressed with the variety of people from all over the planet, not only the US but also Europe and the Americas. E.g. if you saw somebody wrapped in a flag…that was Bruno Souza, the man that has put Brazil on the map for Java developers. Furthermore, all the cool open-source companies that you could ever think of were present as well. Just an awesome level of energy there.&lt;br /&gt;&lt;br /&gt;Also, I was able to connect with a ton of VMware/SpringSource folks at the event that I hadn’t met personally before, yet. Just to give you an idea of how awesome the open-source community is: On Tuesday we went out for some great food at McMenamins Kennedy School. It is housed in an old school with everything left intact/restored (incl. the showers in the rest rooms). That place has 5 bars, restaurant and excellent outdoor seating.&lt;br /&gt;&lt;br /&gt;Anyway, our group included Dan Allen from JBoss (member of the Seam, Weld and Arquillian projects), Peter Neubauer from Neo4J (Founder, good chance for me to speak some German ;-), William &amp;nbsp;Rowe from SpringSource (Apache Foundation Vice President, HTTP Server), David Blevins from IBM (Co-founder of Geronimo and OpenEJB), Mark Johnson from SpringSource &amp;nbsp;(President of NEJUG), &amp;nbsp;Bruce Snyder from SpringSource (ActiveMQ comitter), Josh Long from SpringSource (Developer advocate and author), Steve Mayzak from SpringSource (Author). Seriously, to me, this was like being backstage! Thanks for having the chance to meet you all!&lt;br /&gt;&lt;br /&gt;Back to OSCON here are the sessions I was able to attend:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Monday&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Theory of Caching (Greg Luck)&lt;/li&gt;&lt;li&gt;Java Puzzlers – Scraping the Bottom of the Barrel (Josh Bloch, Bob Lee)&lt;/li&gt;&lt;li&gt;The Ghost in the VM: A Reference to References (Bob Lee)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Tuesday&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Everything You Wanted to Know about Open Source that Nobody Told You (Jeff Genender)&lt;/li&gt;&lt;li&gt;Managing Thousands of Cloud Instances with Java (Patrick Lightbody)&lt;/li&gt;&lt;li&gt;ActiveMQ in Action – Common Problems and Solutions (Bruce Snyder)&lt;/li&gt;&lt;li&gt;The Evolution of Java: Past, Present, and Future (Josh Bloch)&lt;/li&gt;&lt;li&gt;From Ruby on Rails to Java: The Gory Details (Steve Jenson)&amp;nbsp;&lt;/li&gt;&lt;li&gt;A Giant Hop Forward with Spring Roo (Steve Mayzak and Josh Long&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1785545960068745542?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1785545960068745542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1785545960068745542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1785545960068745542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1785545960068745542'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/07/oscon-2011-mission-accomplished.html' title='OSCON 2011 - Mission Accomplished'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-4626566946329435094</id><published>2011-07-21T23:15:00.000-04:00</published><updated>2011-07-21T23:15:40.198-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring integration'/><category scheme='http://www.blogger.com/atom/ns#' term='eip'/><title type='text'>Priority Channels in Spring Integration</title><content type='html'>As somebody was asking about a Priority Channel example for &lt;a href="http://www.springsource.org/spring-integration"&gt;Spring Integration&lt;/a&gt;&amp;nbsp;in the forums&amp;nbsp;today, I went ahead and created a simple example. You can grab the source code over at GitHub:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/ghillert/spring-integration-examples/tree/master/priority-channel-example"&gt;https://github.com/ghillert/spring-integration-examples/tree/master/priority-channel-example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For some additional information check out the related forum entry:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.springsource.org/showthread.php?112368-PriorityQueue-example-needed"&gt;http://forum.springsource.org/showthread.php?112368-PriorityQueue-example-needed&lt;/a&gt;&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/1699950446304666715-4626566946329435094?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/4626566946329435094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=4626566946329435094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4626566946329435094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4626566946329435094'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/07/priority-channels-in-spring-integration.html' title='Priority Channels in Spring Integration'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-3936340671892527905</id><published>2011-07-04T10:45:00.004-04:00</published><updated>2011-07-05T11:15:22.829-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='websockets'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><title type='text'>HTML5 WebSockets for JVM Developers</title><content type='html'>Anything related around HTML5 seems to be a hot button topic these days and lucky for me that I got an opportunity to take a deep dive into WebSockets. Thus, I will use this blog to post my findings over the next few days and I will present some simple code examples as well. &lt;br /&gt;&lt;br /&gt;Anyway, WebSockets allow Servers to basically "push" data back to subscribed Browser clients in an effective manner instead of using workarounds such as long-polling. The WebSockets API is being standardized by the W3C (&lt;a href="http://dev.w3.org/html5/websockets/"&gt;http://dev.w3.org/html5/websockets/&lt;/a&gt;) and the actual protocol is being defined by the Hypertext-Bidirectional (HyBi) working group (Part of IETF) - &lt;a href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-09"&gt;http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-09&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For further reading and to learn more about WebSockets in general, please also check out the following resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.html5rocks.com/en/tutorials/websockets/basics/%20"&gt;http://www.html5rocks.com/en/tutorials/websockets/basics/ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://websocket.org/"&gt;http://websocket.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/WebSockets"&gt;https://developer.mozilla.org/en/WebSockets&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/WebSockets"&gt;http://en.wikipedia.org/wiki/WebSockets&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;It turns out, though, that the only browsers, that support WebSockets out of the box right now, are Safari and Chrome. Wait - Firefox is not supported? Well, Firefox does support WebSockets but it is disabled by default due to security issues with the implemented draft version of the WebSocket protocol (Firefox 4+5). You can find more information about this here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/"&gt;http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="https://developer.mozilla.org/en/WebSockets" rel="nofollow"&gt;https://developer.mozilla.org/en/WebSockets&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Nonetheless, if you're interested, you can re-activate WebSockets in Firefox 4 and 5 quite easily. Take a look at the following link for more information on how to do this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://techdows.com/2010/12/turn-on-websockets-in-firefox-4.html"&gt;http://techdows.com/2010/12/turn-on-websockets-in-firefox-4.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Firefox 6 is supposed to bring back websockets support, albeit using a newer draft of the websocket protocol (&lt;a class="external text" href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07" rel="nofollow"&gt;hybi-07&lt;/a&gt;), which is not backwards compatible. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;What about Web Servers?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Okay, so WebSockets look cool, yet with limited browser support. Furthermore, different webservers have varying stages of support for asynchronous messaging, with Jetty and Glassfish being the best options currently a provide native websocket support. It looks like Resin also has direct websocket support. See also:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.dzone.com/articles/creating-websocket-chat"&gt;http://java.dzone.com/articles/creating-websocket-chat&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Tomcat 7 currently does not support WebSockets, yet. Check out the following issue tracker entry to learn more about the current state of affairs in Tomcat 7: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=51181"&gt;https://issues.apache.org/bugzilla/show_bug.cgi?id=51181 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;What's next? &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, essentially what we want is some kind of framework that supports "graceful degradation": when available a suitable framework shall use websockets, but if not available, the framework should fall back to more traditional push work-arounds such as long-polling. &lt;br /&gt;&lt;br /&gt;On the server-side, I am running Java, and therefore, I need a respective implementation on that platform. Choices, though, seem to be rather limited and I came up with the following list of options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Atmosphere (&lt;a href="http://atmosphere.java.net/"&gt;http://atmosphere.java.net/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Socket.IO (&lt;a class="external-link" href="http://socket.io/" rel="nofollow"&gt;http://socket.io/&lt;/a&gt;) - Orginally for &lt;a href="http://node.js/"&gt;Node.JS&lt;/a&gt; there are Java implementations available&lt;/li&gt;&lt;li&gt;jWebSocket (&lt;a class="external-link" href="http://jwebsocket.org/" rel="nofollow"&gt;http://jwebsocket.org/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Stomp Websocket for HornetQ and ActiveMQ (&lt;a class="external-link" href="http://jmesnil.net/stomp-websocket/doc/" rel="nofollow"&gt;http://jmesnil.net/stomp-websocket/doc/&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Just for reference, there seems to be quite some activity going on outside of Java:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/maccman/juggernaut"&gt;https://github.com/maccman/juggernaut&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/socky/socky-server-ruby"&gt;https://github.com/socky/socky-server-ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="https://github.com/igrigorik/em-websocket" rel="nofollow"&gt;https://github.com/igrigorik/em-websocket&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;My choice for now &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Socket.IO looks like it has quite some traction but the default implementation is for Node.JS. There are Java implementations available but they did not seem to have much traction. jWebSocket actually looks promising but its licensing (LGPL) is too restrictive to me (My choice needs to be Apache license compatible ;-).&lt;br /&gt;&lt;br /&gt;Out of the list above, I chose Atmosphere (&lt;a href="http://atmosphere.java.net/"&gt;http://atmosphere.java.net/&lt;/a&gt;). Atmosphere has pretty much all the features you would like to have incl. detecting server-side capabilities and using the best possible approach transparently. Atmosphere comes with a &lt;a href="http://jfarcand.wordpress.com/2010/06/15/using-atmospheres-jquery-plug-in-to-build-applicationsupporting-both-websocket-and-comet/"&gt;jQuery plugin&lt;/a&gt; that abstracts away the implementation details (same Api for using long-polling vs. websockets)&lt;br /&gt;&lt;br /&gt;While Atmosphere comes with quite a few examples, they are interestingly mostly for JAX-RS and there are no examples for Spring MVC. Also, the documentations is rather limited but luckily you get very swift and helpful responses from Atmosphere mailing list. &lt;br /&gt;&lt;br /&gt;In my next posting, I will provide a little example integrating Spring MVC and Atmosphere. So stay tuned.&lt;br /&gt;&lt;br /&gt;Nevertheless,&lt;b&gt; if you have other WebSocket recommendations and/or thoughts, please leave comments! &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;PS:&lt;br /&gt;&lt;br /&gt;A funny thing, I just realized that Burr Sutter, a friend of mine and fellow &lt;a href="http://www.ajug.org/"&gt;AJUG&lt;/a&gt; board member wrote down his WebSockets research experiences as well. It is a small world. Go check it out at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://burrsutter.blogspot.com/2011/02/html5-websockets-adventure.html"&gt;http://burrsutter.blogspot.com/2011/02/html5-websockets-adventure.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-3936340671892527905?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/3936340671892527905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=3936340671892527905' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3936340671892527905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3936340671892527905'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/07/html5-websockets-for-jvm-developers.html' title='HTML5 WebSockets for JVM Developers'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7147243872166214351</id><published>2011-05-24T01:30:00.004-04:00</published><updated>2011-05-24T01:52:28.779-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Testing Email Notifications with Apache James 3.0</title><content type='html'>On windows machines I have been using &lt;a href="http://tedorg.free.fr/fr/projects.php"&gt;Mailster&lt;/a&gt; for testing email notifications. Unfortunately, I had issues with Mailster in the past running on non-Windows machines. Thus, on Mac I have been using a local Postfix instance, which forwarded email to dedicated (real) mailboxes. But, it involved a bit of customization and ultimately I had to "know" to which mailboxes I wanted to send notifications to.&lt;br /&gt;&lt;br /&gt;However, ideally I don't really care about email addresses. Instead I typically want to verify that the format and layout of the generated emails are good, be it text emails ort Html emails. Ultimately, it would be nice, if for testing, all notification sent ended up in ONE mailbox for development testing purposes.&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://james.apache.org/"&gt;Apache James&lt;/a&gt;. Not long ago I came across this wonderful blog posting below about using Apache James 2.x in order to test application email notifications:&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_180219424"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://livingtao.blogspot.com/2007/05/testing-application-generated-emails.html"&gt;http://livingtao.blogspot.com/2007/05/testing-application-generated-emails.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IT is amazing to see that this is pretty much the only dedicated blog posting on the internet regarding a seemingly very common issue. You would think that almost every serious enterprise application has to sent out email notifications, and be it solely for the "forgot password" feature. What is so fantastic about using Apache James, is that it allows you to test Email notifications, while sitting on a plane with no internet in sight. Just run everything locally.&lt;br /&gt;&lt;br /&gt;Anyway, the steps illustrated in the blog above also work nicely for James 3.0 (currently milestone 2). What is pretty cool about Apache James is that it is now &lt;a href="http://www.springsource.org/"&gt;Spring-based&lt;/a&gt; :-)&lt;br /&gt;&lt;br /&gt;Here are the simple steps to get things set up for Apache James 3.0:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://james.apache.org/download.cgi#Apache_James_Server"&gt;Download Apache James 3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Unzip the downloaded archive&lt;/li&gt;&lt;li&gt;Edit &lt;i&gt;mailetcontainer.xml&lt;/i&gt; in directory /&lt;i&gt;conf/&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Search for "&lt;i&gt;&amp;lt;processor name="transport"&amp;gt;&lt;/i&gt;"&lt;/li&gt;&lt;li&gt;Replace the entire element that starts with "&lt;i&gt;&amp;lt;mailet match="All" class="RemoteDelivery"&amp;gt;&lt;/i&gt;" with: "&lt;span class="Apple-style-span" style="color: #333333; font-family: 'courier new'; font-size: 13px; line-height: 20px;"&gt;&amp;lt;mailet match="All" class="Forward"&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'courier new'; font-size: 13px; line-height: 20px;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;forwardto&amp;gt;test@localhost&amp;lt;/forwardto&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'courier new'; font-size: 13px; line-height: 20px;"&gt;&amp;lt;/mailet&amp;gt;&lt;/span&gt;"&lt;/li&gt;&lt;li&gt;Startup Apache James 3.0 using&amp;nbsp;&lt;i&gt;sudo /bin/run.sh&lt;/i&gt; (Sudo is needed for local permissions)&lt;/li&gt;&lt;li&gt;Connect via Telnet to Apache James using: &amp;nbsp;&lt;i&gt;telnet localhost 4555&lt;/i&gt; (User: &lt;i&gt;root&lt;/i&gt; password: &lt;i&gt;root&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;Type:&amp;nbsp;&lt;i&gt;adduser test test&lt;/i&gt; &amp;lt;return&amp;gt;&lt;/li&gt;&lt;li&gt;Setup Thunderbird (or your favority email application)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-LagpEHdwHJs/TdsiTBIsIHI/AAAAAAAAHLg/P5qaPJWpzE0/s1600/thunderbird3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://1.bp.blogspot.com/-LagpEHdwHJs/TdsiTBIsIHI/AAAAAAAAHLg/P5qaPJWpzE0/s320/thunderbird3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1BtjzyRl2Pw/TdsiPs9Q-HI/AAAAAAAAHLY/FIDElhKLi8s/s1600/thunderbird-account1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://4.bp.blogspot.com/-1BtjzyRl2Pw/TdsiPs9Q-HI/AAAAAAAAHLY/FIDElhKLi8s/s320/thunderbird-account1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QnWe0sW2hdM/TdsiSiU6rYI/AAAAAAAAHLc/7JbUMfhZ5SI/s1600/thunderbird2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://3.bp.blogspot.com/-QnWe0sW2hdM/TdsiSiU6rYI/AAAAAAAAHLc/7JbUMfhZ5SI/s320/thunderbird2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I hope this gives you enough starting points for setting up email notification testing. Please leave comments &amp;nbsp;if you see areas I can improve upon. Onward...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-7147243872166214351?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/7147243872166214351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=7147243872166214351' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7147243872166214351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7147243872166214351'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/05/testing-email-notifications-with-apache.html' title='Testing Email Notifications with Apache James 3.0'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-LagpEHdwHJs/TdsiTBIsIHI/AAAAAAAAHLg/P5qaPJWpzE0/s72-c/thunderbird3.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8638066266376847044</id><published>2011-04-30T11:10:00.002-04:00</published><updated>2011-04-30T11:18:40.098-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring 3.1 Bean Definition Profiles - Use Case</title><content type='html'>As I am diving deeper into VMware's &lt;a href="http://www.cloudfoundry.com/"&gt;Cloud Foundry&lt;/a&gt;, I decided to make the &lt;a href="http://www.devnexus.com/"&gt;DevNexus&lt;/a&gt; conference web-application fit for &lt;a href="http://www.cloudfoundry.com/"&gt;Cloud Foundry&lt;/a&gt;. However, instead of creating an explicit version of the application for Cloud Foundry, my goal is to have one War file that can be deployed without&amp;nbsp;modifications&amp;nbsp;to either CloudFoundry or a stand-alone servlet container.&lt;br /&gt;&lt;br /&gt;Here one new Spring 3.1 feature comes in handy: &lt;a href="http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/" style="color: #336699;"&gt;Bean definition profiles&lt;/a&gt;. Bean definition profiles allow you to conditionally load Spring beans. There are some great resources already out there on how to use Bean definition profile, and thus I won't go into the details here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/"&gt;http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/"&gt;http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://it-republik.de/jaxenter/artikel/Spring-3.1-%96-Was-gibt%92s-Neues-3693.html"&gt;http://it-republik.de/jaxenter/artikel/Spring-3.1-%96-Was-gibt%92s-Neues-3693.html&lt;/a&gt; (German)&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.iprofs.nl/2011/02/27/spring-3-1-environment-specific-configuration/"&gt;http://blog.iprofs.nl/2011/02/27/spring-3-1-environment-specific-configuration/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.jetbrains.com/idea/2011/04/new-in-105-spring-31-bean-definition-profiles/"&gt;http://blogs.jetbrains.com/idea/2011/04/new-in-105-spring-31-bean-definition-profiles/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;How am I using Bean Definition Profiles for the DevNexus web-application?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Personally, I like to develop web applications that can run in a wide variety of environments with as little configuration as necessary. For my use-case, I want to create a single war file that can be deployed to the cloud, &amp;nbsp;but which can also be deployed into your locally running Tomcat, Jetty, etc.&lt;br /&gt;&lt;br /&gt;Furthermore, I believe that bean definition profiles can also be very useful for demo/integration testing purposes. For web applications, I like the concept of "application home directories". They contain configuration files (e.g. DB connectivity parameters), data files such as for Hibernate Search etc.) and the web application will reference the home directory either through a system property, environment variable or looks in a default directory in your user directory. But what if the home directory does not exist?&lt;br /&gt;&lt;br /&gt;If the home directory does not exist, then the application runs in demo mode (or embedded mode), which means, the application use an embedded database for persistence and to also loads a set of seed+demo data at application startup-up.&lt;br /&gt;&lt;br /&gt;Summarizing, I can think of the following&amp;nbsp;Web application "modes" aka profiles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Embedded mode (Integration testing and Demo mode)&lt;/li&gt;&lt;li&gt;Cloud Foundry mode (e.g. reference the MySql service, don't use file-system properties)&lt;/li&gt;&lt;li&gt;Stand-alone deployment mode (Uses home directory)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Thus, I can create a dedicated Bean definition profile in my Spring application context for each mode. Here is an example I have:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt; &amp;lt;beans profile="default"&amp;gt;&lt;br /&gt;        &amp;lt;bean id="propertyConfigurer"&lt;br /&gt;            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&amp;gt;&lt;br /&gt;            &amp;lt;property name="searchSystemEnvironment" value="true" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="locations"&amp;gt;&lt;br /&gt;                &amp;lt;list&amp;gt;&lt;br /&gt;                    &amp;lt;value&amp;gt;file:${TING_HOME}/ting.properties&amp;lt;/value&amp;gt;&lt;br /&gt;                &amp;lt;/list&amp;gt;&lt;br /&gt;            &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;/bean&amp;gt;&lt;br /&gt;        &amp;lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&lt;br /&gt;            destroy-method="close"&amp;gt;&lt;br /&gt;            &amp;lt;property name="driverClassName" value="${database.jdbc.driverClassName}" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="url" value="${database.jdbc.url}" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="username" value="${database.jdbc.username}" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="password" value="${database.jdbc.password}" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="maxActive" value="100" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="maxIdle" value="30" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="maxWait" value="1000" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="poolPreparedStatements" value="true" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="defaultAutoCommit" value="true" /&amp;gt;&lt;br /&gt;        &amp;lt;/bean&amp;gt;&lt;br /&gt;        &amp;lt;bean id="entityManagerFactory"&lt;br /&gt;            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&amp;gt;&lt;br /&gt;            &amp;lt;property name="dataSource" ref="dataSource" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="persistenceUnitName" value="base" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="jpaProperties"&amp;gt;&lt;br /&gt;                &amp;lt;props&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.dialect"&amp;gt;${database.hibernate.dialect}&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.query.substitutions"&amp;gt;true '1', false '0'&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.generate_statistics"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.use_second_level_cache"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.use_query_cache"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.region.factory_class"&amp;gt;net.sf.ehcache.hibernate.EhCacheRegionFactory&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.show_sql"&amp;gt;${database.hibernate.show_sql}&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.format_sql"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;/props&amp;gt;&lt;br /&gt;            &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;/beans&amp;gt;&lt;br /&gt;    &amp;lt;beans profile="cloud"&amp;gt;&lt;br /&gt;        &amp;lt;cloud:data-source id="devnexus-db"/&amp;gt;&lt;br /&gt;        &amp;lt;bean id="entityManagerFactory"&lt;br /&gt;            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&amp;gt;&lt;br /&gt;            &amp;lt;property name="dataSource" ref="devnexus-db" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="persistenceUnitName" value="base" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="jpaProperties"&amp;gt;&lt;br /&gt;                &amp;lt;props&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.dialect"&amp;gt;org.hibernate.dialect.MySQLDialect&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.query.substitutions"&amp;gt;true '1', false '0'&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.generate_statistics"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.use_second_level_cache"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.use_query_cache"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.region.factory_class"&amp;gt;net.sf.ehcache.hibernate.EhCacheRegionFactory&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.show_sql"&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.format_sql"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.hbm2ddl.auto"&amp;gt;create-drop&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;/props&amp;gt;&lt;br /&gt;            &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;/beans&amp;gt;&lt;br /&gt;    &amp;lt;beans profile="embedded"&amp;gt;&lt;br /&gt;        &amp;lt;jdbc:embedded-database type="H2" id="dataSource"/&amp;gt;&lt;br /&gt;        &amp;lt;bean id="entityManagerFactory"&lt;br /&gt;            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&amp;gt;&lt;br /&gt;            &amp;lt;property name="dataSource" ref="dataSource" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="persistenceUnitName" value="base" /&amp;gt;&lt;br /&gt;            &amp;lt;property name="jpaProperties"&amp;gt;&lt;br /&gt;                &amp;lt;props&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.dialect"&amp;gt;org.hibernate.dialect.HSQLDialect&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.query.substitutions"&amp;gt;true '1', false '0'&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.generate_statistics"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.use_second_level_cache"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.use_query_cache"&amp;gt;true&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.cache.region.factory_class"&amp;gt;net.sf.ehcache.hibernate.EhCacheRegionFactory&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.show_sql"&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt;                    &amp;lt;prop key="hibernate.format_sql"&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt;                &amp;lt;/props&amp;gt;&lt;br /&gt;            &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;/bean&amp;gt;&lt;br /&gt;    &amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;What about integration testing?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As of writing this blog posting the latest Spring 3.1 release is:&amp;nbsp;3.1.0.M1 and there is no explicit support for selecting profiles in your test declaratively. There is, though, the following new feature request Jira:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://jira.springsource.org/browse/SPR-7960"&gt;https://jira.springsource.org/browse/SPR-7960&lt;/a&gt; -&amp;nbsp;"TestContext framework should support declarative configuration of bean definition profiles"&lt;br /&gt;&lt;br /&gt;This feature is scheduled for Spring 3.1 M2, but in the meantime, I use a static block which does the trick:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(&lt;br /&gt;        locations={&lt;br /&gt;          "classpath:spring/applicationContext-core-data.xml",&lt;br /&gt;          "classpath:spring/mainApplicationContext.xml"&lt;br /&gt;                 })&lt;br /&gt;public abstract class BaseDaoIntegrationTest {&lt;br /&gt; &lt;br /&gt;static {&lt;br /&gt;  System.setProperty("spring.profiles.active", "embedded");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;    protected @PersistenceContext(unitName="base") EntityManager entityManager;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Over the next few days I hope to deploy an updated DevNexus application to Cloud Foundry, so stay tuned for updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-8638066266376847044?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8638066266376847044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8638066266376847044' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8638066266376847044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8638066266376847044'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/04/spring-31-bean-definition-profiles-for.html' title='Spring 3.1 Bean Definition Profiles - Use Case'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-265709169111280796</id><published>2011-04-14T14:40:00.006-04:00</published><updated>2011-04-14T15:11:30.111-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>First explorations into SpringSource's CloudFoundry</title><content type='html'>I received my credentials last night for SpringSource's &lt;a href="http://cloudfoundry.com/"&gt;CloudFoundry&lt;/a&gt; and I am now in the process of going through the examples. Next, I plan to make some of my applications (home-projects) work on the cloud. The general documentation so far seems to be a still a bit scattered. Therefore, below I summarize all the documentation and&amp;nbsp;resources I have used so far to immerse myself into the services provided by the CloudFoundry. Hopefully it provides a good starting point for you as well.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Background information&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2011/04/12/launching-cloud-foundry/"&gt;http://blog.springsource.com/2011/04/12/launching-cloud-foundry/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/cloudfoundry"&gt;http://www.youtube.com/cloudfoundry&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;There are quite a few &lt;b&gt;examples posted on GitHub&lt;/b&gt;, that are a tremendous help in getting started:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/SpringSource/cloudfoundry-samples/"&gt;https://github.com/SpringSource/cloudfoundry-samples/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Deploy Applications to the cloud from within Eclipse (STS)&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2011/04/13/using-cloud-foundry-from-sts/"&gt;http://blog.springsource.com/2011/04/13/using-cloud-foundry-from-sts/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Deploy Applications to the cloud using the command line tool vmc&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://cloudfoundry.zendesk.com/entries/20012337-getting-started-guide-command-line-vmc-users"&gt;http://cloudfoundry.zendesk.com/entries/20012337-getting-started-guide-command-line-vmc-users&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Spring Roo Support&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.springsource.org/roo/guide?w=base-cloud-foundry"&gt;http://www.springsource.org/roo/guide?w=base-cloud-foundry&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Groovy/Grails&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/"&gt;http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Further reading&lt;/b&gt;&lt;br /&gt;Mark Fisher published a great general article covering both, the vmc command line tool and Eclipse:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2011/04/12/cloud-foundry-for-spring-developers/"&gt;http://blog.springsource.com/2011/04/12/cloud-foundry-for-spring-developers/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Make also sure you hit the &lt;b&gt;forums&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://cloudfoundry.zendesk.com/forums"&gt;http://cloudfoundry.zendesk.com/forums&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;And when you really want to look under the hood, take a look at the source code for&amp;nbsp;&lt;a href="http://cloudfoundry.com/"&gt;CloudFoundry&lt;/a&gt;&amp;nbsp;at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://cloudfoundry.org/"&gt;http://cloudfoundry.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;It seems like that when checking out CloudFoundry, it is also a great opportunity to familiarize yourself with &lt;b&gt;Spring 3.1 &lt;/b&gt;(see this&amp;nbsp;&lt;a href="http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/"&gt;Spring blog post&lt;/a&gt; detailing some of the new features). While I think it is not strictly required it provides functionality that is quite useful for cloud deployment scenarios such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/"&gt;Bean definition profiles&lt;/a&gt; (Useful to cover both, local and cloud deployment)&lt;/li&gt;&lt;li&gt;Spring's new &lt;a href="http://blog.springsource.com/2011/02/15/spring-3-1-m1-unified-property-management/"&gt;Environment abstraction&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;More details on that in my next blog post. Back to the cloud...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-265709169111280796?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/265709169111280796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=265709169111280796' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/265709169111280796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/265709169111280796'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/04/first-explorations-of-springsources.html' title='First explorations into SpringSource&apos;s CloudFoundry'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-4195910473368015429</id><published>2011-04-04T01:08:00.003-04:00</published><updated>2011-04-04T01:13:55.463-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='spring integration'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='eip'/><title type='text'>Spring Integration - Camellos Continued</title><content type='html'>We had a great DevNexus conference this year and we were extremely blessed, that the project leads of both, &lt;a href="http://camel.apache.org/"&gt;Apache Camel&lt;/a&gt; (Claus Ibsen) and &lt;a href="http://www.springsource.org/spring-integration"&gt;Spring Integration&lt;/a&gt; (Mark Fisher), spoke at the conference. In my opinion both frameworks are probably the best integration frameworks on the JVM! &lt;br /&gt;&lt;br /&gt;Back in late 2009 I had written a &lt;a href="http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-ii.html"&gt;blog post&lt;/a&gt;, where I presented some results from my Apache Camel learning experience. Now in 2011 it is time to do the same for Spring Integration. I am in the process of creating a few examples for Spring Integration that I create while learning it. So my hope is to create a little series of blog posts covering Spring Integration and &lt;a href="http://www.eaipatterns.com/"&gt;Enterprise Integration Patterns&lt;/a&gt; (EIP) in general. &lt;br /&gt;&lt;br /&gt;Nevertheless, don't forget to check out the wonderful examples that are provided via the Spring Integration Git repo at: &lt;a href="http://git.springsource.org/spring-integration/samples/"&gt;http://git.springsource.org/spring-integration/samples/&lt;/a&gt;. It contains a sophisticated list of examples and is the best place to get started.&lt;br /&gt;&lt;br /&gt;Well, let's get started - The source code for my example is available via &lt;a href="https://github.com/ghillert/"&gt;GitHub&lt;/a&gt;, and will be successively expanded with additional examples in the coming weeks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/ghillert/camellos-spring-integration"&gt;https://github.com/ghillert/camellos-spring-integratio &lt;/a&gt;&lt;/li&gt;&lt;li&gt;git://github.com/ghillert/camellos-spring-integration.git&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;For right now the implemented core Spring Integration functionality in &lt;i&gt;Camellos si&lt;/i&gt; is the following: &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LzF-V8ajTis/TZf9qr-0v3I/AAAAAAAAGa0/mVU29BTg2bs/s1600/spring-integration-compress-route.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="66" src="http://4.bp.blogspot.com/-LzF-V8ajTis/TZf9qr-0v3I/AAAAAAAAGa0/mVU29BTg2bs/s400/spring-integration-compress-route.png" width="400" /&gt;&amp;nbsp;&lt;/a&gt; &lt;/div&gt;&lt;ol&gt;&lt;li&gt;A user drops a file in a local directory (&lt;i&gt;/camellos-si/data/inbox/&lt;/i&gt;), that is continuously polled by Spring Integration.&lt;/li&gt;&lt;li&gt;The file is picked up by Spring Integration and converted to a byte array with the original file being deleted.&lt;/li&gt;&lt;li&gt; The resulting byte array is sent to an in-memory channel.&lt;/li&gt;&lt;li&gt;A custom transformer will pick up the data array and compress the data using a ZipOutputStream&lt;/li&gt;&lt;li&gt;The resulting byte array is yet again being sent to another channel.&lt;/li&gt;&lt;li&gt;Finally an Outbound Channel Adapter will grab the data from the channel and send it via Ftp to an embedded Ftp server (stored under: &lt;i&gt;/camellos-si/data/ftp/&lt;/i&gt;).&lt;/li&gt;&lt;/ol&gt;In order to try it out - just download &lt;b&gt;camellos-si-distribution-1.0.zip &lt;/b&gt;from the downloads section at &lt;a href="https://github.com/ghillert/camellos-spring-integration"&gt;https://github.com/ghillert/camellos-spring-integration&lt;/a&gt;. Unzip it and start the application by executing:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;java -jar camellos-si.jar&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;That's it. Spring Integration should boot up and you can drop files you want to zip up into '&lt;i&gt;/camellos-si/data/inbox/'.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;* * * &lt;br /&gt;&lt;br /&gt;Some interesting additional features covered by my example:&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Maven Shade Plugin&lt;/b&gt; (&lt;a href="http://maven.apache.org/plugins/maven-shade-plugin/"&gt;http://maven.apache.org/plugins/maven-shade-plugin/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;The Maven Shade Plugin can be a nice simplifier in stand-alone deployment scenarios. Let's say you have a project with multiple jar dependencies, then you can use this plugin to merge all jar dependencies into one single jar. You can also configure the Maven Shade Plugin so that it generates the &lt;i&gt;Main-Class&lt;/i&gt; property in &lt;i&gt;META-INF/MANIFEST.MF&lt;/i&gt; and consequently, you can deliver a single jar (No class-path hell) and execute the application like my simple example:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;java -jar camellos-si.jar&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Maven Assembly Plugin&lt;/b&gt; (&lt;a href="http://maven.apache.org/plugins/maven-assembly-plugin/"&gt;http://maven.apache.org/plugins/maven-assembly-plugin/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;The Maven Assembly plugin helps with creating distributable packages. For instance for my example I need not only the compiled jar file but I also need a few directories in the right place, e.g. Apache FtpServer requires the &lt;i&gt;users.properties&lt;/i&gt; file to be an actual file (having it as a class path resource embedded in your jar won't work).&lt;br /&gt;&lt;br /&gt;Basically, you can use the Maven Assembly Plugin to move things around and to mold your resulting distributable package (a Zip file in my case). &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Embedded Ftp Server&lt;/b&gt; using Apache FtpServer (&lt;a href="http://mina.apache.org/ftpserver/"&gt;http://mina.apache.org/ftpserver/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Something I always find intriguing with Spring is the simple embedability of additional services such as running &lt;a href="http://activemq.apache.org/"&gt;ActiveMQ&lt;/a&gt; embedded in your Spring context by just adding a single line of Xml, or in this case embedding Apache FtpServer. I know it is a blurry line where you start building your own application server but mentally I still find it easier to do it in Spring than using an app server, particularly when you only want to do it for testing, showcasing etc. and move on to use external ActiveMQ, Ftp Server instances for production etc.&lt;br /&gt;&lt;br /&gt;I hope this example has been enlightening for your own Spring Integration discoveries - stay tuned for more.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&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/1699950446304666715-4195910473368015429?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/4195910473368015429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=4195910473368015429' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4195910473368015429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4195910473368015429'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/04/spring-integration-camellos-continued.html' title='Spring Integration - Camellos Continued'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LzF-V8ajTis/TZf9qr-0v3I/AAAAAAAAGa0/mVU29BTg2bs/s72-c/spring-integration-compress-route.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7733515850040814848</id><published>2011-03-08T07:56:00.001-05:00</published><updated>2011-03-08T08:03:46.888-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus 2011 - Tools to Get Stuff Delivered</title><content type='html'>Dear fellow developers,&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DevNexus 2011&lt;/b&gt; is only &lt;b&gt;2 weeks away&lt;/b&gt; (&lt;b&gt;March 21-22&lt;/b&gt;) and if you haven't registered, yet, please seize the moment and register at&lt;a href="http://www.devnexus.com/" style="color: #0000cc;" target="_blank"&gt;&lt;b&gt;http://www.devnexus.com/&lt;/b&gt;&lt;/a&gt;. Please hurry as registration is closing in one week.&lt;br /&gt;Already, we are pleased to note that we surpassed the number of attendees compared to last year's conference. A big THANK YOU to all of you that registered so far!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;We will be having several raffles:&lt;/b&gt;an iPod Nano provided by JBoss, a Flash Builder 4 Premium license provided by Adobe and we will raffle a selection of books. Zero Turnaround is giving to &lt;b&gt;every attendee&lt;/b&gt; a JRebel + Enterprise Add-on licenses (for 4 months).&lt;br /&gt;&lt;br /&gt;And that is not all! We will have a &lt;b&gt;cocktail hour&lt;/b&gt; on March 21st, which is an awesome opportunity to network, talk to speakers and enjoy free drinks.&lt;br /&gt;&lt;br /&gt;DevNexus 2011 is your chance to learn about the latest trends in mobile application development, UI frameworks, NoSQL, core Java technologies and the latest from JBoss, Springsource and much more.&lt;br /&gt;&lt;br /&gt;This year we also have a focus on&amp;nbsp;&lt;b&gt;Tools and Best Practices&lt;/b&gt;&amp;nbsp;that make you more productive as a developer which encompasses an exciting set of sessions such as:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Git Foundations and&amp;nbsp;Advanced Git Tricks&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/presentations#1119" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;presentations#1119&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/presentations#1120" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;presentations#1120&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gradle&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/presentations#1115" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;presentations#1115&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Arquillian&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/presentations#1152" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;presentations#1152&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Selenium RC&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.devnexus.com/s/presentations#1158" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;presentations#1158&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are many more sessions to choose from - a total of&amp;nbsp;&lt;b&gt;35 sessions&lt;/b&gt;&amp;nbsp;(incl.&amp;nbsp;&lt;b&gt;3 keynotes&lt;/b&gt;) across&amp;nbsp;&lt;b&gt;4 parallel tracks&lt;/b&gt;. Our schedule is now finalized - Take a look at:&amp;nbsp;&lt;a href="http://www.devnexus.com/s/schedule" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;schedule&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;We would also like to thank our sponsors, who help us tremendously by off-setting much of the substantial costs associated with this event:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;Gold Sponsors&lt;/u&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="margin-left: 15px;"&gt;Terracotta&lt;/li&gt;&lt;li style="margin-left: 15px;"&gt;The Intersect Group&lt;/li&gt;&lt;li style="margin-left: 15px;"&gt;Automated Logic Corporation&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;Silver Sponsors&lt;/u&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="margin-left: 15px;"&gt;Blackberry&lt;/li&gt;&lt;li style="margin-left: 15px;"&gt;Anteo Group&lt;/li&gt;&lt;li style="margin-left: 15px;"&gt;4t Networks&lt;/li&gt;&lt;li style="margin-left: 15px;"&gt;ICE&lt;/li&gt;&lt;li style="margin-left: 15px;"&gt;JBoss&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;Cocktail Hour Sponsor&lt;/u&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="margin-left: 15px;"&gt;MATRIX&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Please join us for this amazing event and&amp;nbsp;&lt;b&gt;register at&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.devnexus.com/" style="color: #0000cc;" target="_blank"&gt;&lt;b&gt;http://www.devnexus.com/&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thank you all and we will be delighted to see you in&amp;nbsp;&lt;b&gt;2 weeks&lt;/b&gt;!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;span style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #888888;"&gt;Gunnar&lt;/span&gt;&lt;/div&gt;&lt;span style="color: #888888;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-7733515850040814848?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/7733515850040814848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=7733515850040814848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7733515850040814848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7733515850040814848'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/03/devnexus-2011-tools-to-get-stuff.html' title='DevNexus 2011 - Tools to Get Stuff Delivered'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1837156725133916534</id><published>2011-03-03T01:24:00.001-05:00</published><updated>2011-03-03T10:16:28.220-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><title type='text'>Advanced Java, JRuby, Spring, Google, JBoss and DevNexus 2011</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;DevNexus 2011&lt;/b&gt; - March 21st &amp;amp; 22nd (&lt;b&gt;&lt;a href="http://www.devnexus.com/" style="color: #0000cc;" target="_blank"&gt;www.devnexus.com&lt;/a&gt;&lt;/b&gt;) - Registration will be closing soon.&lt;br /&gt;&lt;br /&gt;Several large teams have already registered and this is the best event to have your team attend - the injection of new technologies, techniques and ideas from some of the world's best technologists as well has having other professional software developers to mingle with. We will soon hit max capacity for the event so please complete your registrations today.&lt;br /&gt;&lt;br /&gt;The DevNexus organizing committee looks for the best speakers and hottest topics in the software development industry and this year we have had a tremendous response from notable presenters. The following are just a few of the DevNexus speakers:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;Jevgeni Kabanov&lt;/b&gt; - the founder and CTO of ZeroTurnaround (JRebel) will be addressing JVM memory management and classloading - these are excellent sessions for your most hardcore Java coders&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;Dick Wall&lt;/b&gt; - of the JavaPosse will dive into functional languages and overall best practices for software practitioners&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;Bob McWhirter&lt;/b&gt; - the prolific founder of open source solutions such as Codehaus.org, Drools and Groovy will address Ruby/JRuby on his new project TorqueBox - the power of Ruby raised to the power of JBoss&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;Claus Ibsen&lt;/b&gt; - the project lead for Camel and co-auther of the "Camel in Action" book will focus on enterprise integration&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;Mark Fisher&lt;/b&gt; - the project lead for Spring Integration will address AMQP and the "Cloudy Future of Integration"&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;Hans Dockter&lt;/b&gt; - the founder and project lead for Gradle will focus on automated build systems&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;And many more notable speakers discussing great topics...&lt;a href="http://www.devnexus.com/s/speakers" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.&lt;wbr&gt;&lt;/wbr&gt;com/s/speakers&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Hadoop&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Git&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Scala&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Arquillian&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Flex&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt; jQuery&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Sproutcore &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Selenium&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Gradle&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Apache Camel&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Spring Integration, Mobile, Social&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;JBoss&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;TorqueBox&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Apache Shiro&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;GWT&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Google App Engine&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;NoSQL&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;The Future of Java&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;If you wish to subscribe to future Atlanta Java Users Group Announcements, please visit&lt;br /&gt;&lt;a href="http://www.ajug.org/confluence/display/AJUG/MailingLists" style="color: #0000cc;" target="_blank"&gt;http://www.ajug.org/&lt;wbr&gt;&lt;/wbr&gt;confluence/display/AJUG/&lt;wbr&gt;&lt;/wbr&gt;MailingLists&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We look forward to seeing you at future AJUG Events and &lt;b&gt;&lt;a href="http://www.devnexus.com/"&gt;DevNexus 2011&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Sincerely,&lt;br /&gt;Burr&lt;br /&gt;770-714-3292&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1837156725133916534?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1837156725133916534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1837156725133916534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1837156725133916534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1837156725133916534'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/03/advanced-java-jruby-spring-google-jboss.html' title='Advanced Java, JRuby, Spring, Google, JBoss and DevNexus 2011'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1902334149384044931</id><published>2011-02-22T13:41:00.000-05:00</published><updated>2011-02-22T13:41:25.550-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus 2011 - Craft Rich (Mobile) Internet Applications</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Times; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;div style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;Dear fellow developers,&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;DevNexus 2011&lt;/b&gt;, the south-east's premiere developer conference is only a few weeks away and will take place&amp;nbsp;&lt;b&gt;March 21-22 in Atlanta, GA&lt;/b&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://www.devnexus.com/" style="color: #0000cc;" target="_blank"&gt;&lt;b&gt;Come join us&lt;/b&gt;&lt;/a&gt;&amp;nbsp;and learn the techniques and technologies that will boost your corporate projects and personal skills to the next stage of excellence.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;We are currently living in an age of massive changes that are transforming our industry. No longer is it acceptable to release static web applications as we did back in the Struts 1.x days. Our customers demand more - rich, interactive and responsive applications that also need to be available across multiple devices - not only desktops but also smart phones and tablets. It is becoming the new reality - Prepare yourself!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;DevNexus will help you discover the possibilities and techniques to master this exciting world of Rich Internet Applications (RIA). And thus, we dedicated an entire track to cover:&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="font-family: arial,sans-serif; font-size: 13px; margin-left: 15px;"&gt;&lt;b&gt;GWT&lt;/b&gt;&amp;nbsp;- David Chandler from Google will show you the latest developments around GWT 2.1&lt;/li&gt;&lt;li style="font-family: arial,sans-serif; font-size: 13px; margin-left: 15px;"&gt;&lt;span style="border-collapse: separate; font-family: arial; font-size: x-small;"&gt;&lt;span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;b&gt;PhoneGap&lt;/b&gt;&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style="border-collapse: collapse; color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;Josh Marinacci from HP/Palm will show you how to develop mobile web applications using GWT and PhoneGap&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: arial,sans-serif; font-size: 13px; margin-left: 15px;"&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;b&gt;jQuery&lt;/b&gt;&amp;nbsp;- Learn from Pratik Patel how you can use jQuery 1.5 to built great UIs and how it helps you to loose the fear of JavaScript. Also learn how&amp;nbsp;&lt;b&gt;jQuery Mobile&lt;/b&gt;&amp;nbsp;can help you create&lt;/span&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;b&gt;HTML5&lt;/b&gt;&amp;nbsp;based cross-device compatible mobile web applications. (The mobile web version of DevNexus.com is powered by jQuery Mobile -&amp;nbsp;&lt;a href="http://www.devnexus.com/s/index?site_preference=mobile" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;index?site_preference=mobile&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: arial,sans-serif; font-size: 13px; margin-left: 15px;"&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;b&gt;SproutCore&lt;/b&gt;&amp;nbsp;- Did you know that both Apple's MobileMe and iWork.com are powered by SproutCore? Yehuda Katz will show you the possibilities that this exciting JavaScript framework offers.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: arial,sans-serif; font-size: 13px; margin-left: 15px;"&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;b&gt;Flex&lt;/b&gt;&amp;nbsp;- James Ward covers the new features in the upcoming Flex 4.5 release that will allow you to develop mobile applications across multiple devices (Android, RIM's Playbook, iPhone)&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: arial,sans-serif; font-size: 13px; margin-left: 15px;"&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;b&gt;Spring Mobile&lt;/b&gt;&amp;nbsp;- Need to serve mobile and desktop content from the same domain and or even the same Urls? Come and listen to Roy Clarkson's and Keith Donald's presentation on &amp;nbsp;Spring Mobile&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: arial,sans-serif; font-size: 13px; margin-left: 15px;"&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;b&gt;Spring Social&lt;/b&gt;&amp;nbsp;- SpringSource co-founder Keith Donald will show you how to add "social features" to your applications using a common Api to integrate Twitter, Facebook and LinkedIn&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse; color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;Furthermore, we will have a keynote by Yehuda Katz, member of the jQuery and&amp;nbsp;&lt;/span&gt;&lt;span style="border-collapse: collapse; color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;Ruby on Rails c&lt;/span&gt;&lt;span style="border-collapse: collapse; color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;ore team. Yehuda will show us how to build web applications in a multi-device world covering among other things&amp;nbsp;&lt;b&gt;HTML5&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif;"&gt;&lt;span style="border-collapse: collapse; font-size: 12px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif;"&gt;&lt;span style="border-collapse: collapse; font-size: 12px; line-height: 18px;"&gt;This is an incredible line-up of sessions covering (mobile) web application development. What is even better - This is just one track. There are&amp;nbsp;&lt;b&gt;3 more tracks&lt;/b&gt;&amp;nbsp;covering core Java topics, NoSQL and many more crucial topics.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif;"&gt;&lt;span style="border-collapse: collapse; font-size: 12px; line-height: 18px;"&gt;Take a look at our schedule at:&amp;nbsp;&lt;a href="http://www.devnexus.com/s/schedule" style="color: #0000cc;" target="_blank"&gt;http://www.devnexus.com/s/&lt;wbr&gt;&lt;/wbr&gt;schedule&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif;"&gt;This is AJUG's biggest DevNexus event ever!&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif;"&gt;&lt;span style="border-collapse: collapse; font-size: 12px; line-height: 18px;"&gt;Don't hesitate, take the plunge and&amp;nbsp;&lt;b&gt;p&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="border-collapse: collapse; color: #222222; font-family: 'Helvetica Neue',Arial,Helvetica,sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;b&gt;lease register&lt;/b&gt;&amp;nbsp;at&amp;nbsp;&lt;b&gt;&lt;a href="http://www.devnexus.com/" style="color: #0000cc;" target="_blank"&gt;http://www.&lt;wbr&gt;&lt;/wbr&gt;devnexus.com/&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1902334149384044931?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1902334149384044931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1902334149384044931' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1902334149384044931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1902334149384044931'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/02/devnexus-2011-craft-rich-mobile.html' title='DevNexus 2011 - Craft Rich (Mobile) Internet Applications'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5724530266878164564</id><published>2011-02-07T00:30:00.080-05:00</published><updated>2011-02-07T00:40:06.165-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring Mobile M3 - Site Preference</title><content type='html'>A few weeks ago I started playing with &lt;a href="http://www.springsource.org/spring-mobile"&gt;Spring Mobile&lt;/a&gt;. For my app I want to use existing Spring MVC controllers to render different views depending on whether the client is a mobile device or a classic browser.&lt;br /&gt;&lt;br /&gt;For that purpose Spring Mobile is really a very helpful asset (See my &lt;a href="http://hillert.blogspot.com/2011/01/spring-mobile-jquery-mobile-and.html"&gt;last Spring Mobile related blog post&lt;/a&gt; for more details).Back then I investigated a feature that allows you to manage a user's site preference. For example, the normal use case is that a user with a mobile device only sees the mobile version of your website.&lt;br /&gt;&lt;br /&gt;Wouldn't it be desirable, though, to allow the user to switch to the full version of the website as well?&amp;nbsp; While hopefully not a regular use-case, your site's visitor may be for instance interested in some additional content that is unavailable in the mobile version. A good example for me is Wikipedia. For normal use, the mobile web version of Wikipedia is certainly quite functional. However, I am also bi-lingual (plus aspiring to learn Spanish), so I often use Wikipedia to look up articles, let's say in German, but then I want to switch over to the Spanish version of the same article in order to find certain translations. Because I can't do the language switch in the mobile web version, I at least have the option to change back to the full Wikipedia version and switch the article's language there. &amp;nbsp; &lt;br /&gt;&lt;br /&gt;Well, Spring Mobile has a feature for site preference but unfortunately that feature (when I checked in the M2 release) had some limitations. It only worked with the &lt;a href="http://static.springsource.org/spring-mobile/docs/1.0.x/api/org/springframework/mobile/device/switcher/SiteSwitcherHandlerInterceptor.html"&gt;SiteSwitcherHandlerInterceptor&lt;/a&gt;. This interceptor assumes you want to redirect the user to a dedicated mobile sub-domain that is hosting your application's mobile version.&lt;br /&gt;&lt;br /&gt;In my simple use-case, however, I want to keep the mobile and non-mobile content on one domain (same urls) but let mobile users change to the full version of the website and stay on that full version for the duration of their session (or set via cookie for the duration of multiple visits).&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;Unfortunately, the "site preference" feature back then was somewhat embedded in the M2 release and you could not use it stand-alone easily. Well, I headed over to the Spring forums and &lt;a href="http://forum.springsource.org/showthread.php?t=100350"&gt;posted my issue there&lt;/a&gt; and within 3 days, Keith had implemented and commited improvements for my requirements (&lt;b&gt;I was truly impressed with the feedback!&lt;/b&gt;)&lt;br /&gt;&lt;br /&gt;Well, &lt;i&gt;only a month later&lt;/i&gt;, I finally found the time to look at the latest changes regarding the site preference feature. This has coincided also with the &lt;a href="http://www.springsource.org/spring-mobile/news/1.0.0.m3-released"&gt;Spring Mobile M3 release&lt;/a&gt; 1 day later, which contains all the latest features.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Checking out and building Spring Mobile&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;But in case you want to anyway, you can check out and build the Spring Mobile project easily yourself using Git and Gradle. You will find the sources here: &lt;a href="http://git.springsource.org/spring-mobile"&gt;http://git.springsource.org/spring-mobile &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just FYI, I was unable to check out the Spring Mobile project using Eclipse's &lt;a href="http://www.eclipse.org/egit/"&gt;EGit&lt;/a&gt;. It looks like Egit does not support (??) &lt;a href="http://book.git-scm.com/5_submodules.html"&gt;Git submodules&lt;/a&gt;, a feature used by Spring Mobile. However, checking out the project from the command line using worked well: &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-txt"&gt;git clone --recursive git://git.springsource.org/spring-mobile/spring-mobile.git&lt;/pre&gt;&lt;br /&gt;Building project using Gradle is trivial. Under the spring-mobile directory execute either &lt;i&gt;./gradlew &lt;/i&gt;build or &lt;i&gt;gradlew.bat&lt;/i&gt;. You don''t even have to have Gradle installed locally - it downloads Gradle for you. I am Maven fan but that was impressive!! I really owe it to myself to look at Gradle more closely &lt;b&gt;very soon&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Spring Mobile M3 Changes regarding Site Preference&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Anyway, the changes regarding the site preference feature in the M3 release are satisfying my needs perfectly. The site-preference functionality has been refactored out into its own feature and Spring Mobile now provides the following separate features:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Device Resolution &lt;/li&gt;&lt;li&gt;&lt;b&gt;Site Preference Management&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Site Switching &lt;/li&gt;&lt;/ol&gt;The documentation has also been updated and is reflecting the feature changes and is quite helpful in that regard. Here is the configuration necessary to configure site-preference for my use-case:&lt;br /&gt;&lt;br /&gt;I updated my Maven dependencies to:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;     &amp;lt;dependency&amp;gt;&lt;br /&gt;         &amp;lt;groupId&amp;gt;org.springframework.mobile&amp;lt;/groupId&amp;gt;&lt;br /&gt;         &amp;lt;artifactId&amp;gt;spring-mobile-device&amp;lt;/artifactId&amp;gt;&lt;br /&gt;         &amp;lt;version&amp;gt;1.0.0.M3&amp;lt;/version&amp;gt;&lt;br /&gt;     &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I updated my spring web context xml file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  &amp;lt;mvc:interceptors&amp;gt;&lt;br /&gt;       &amp;lt;bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" /&amp;gt;&lt;br /&gt;       &amp;lt;bean class="org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor" /&amp;gt;&lt;br /&gt;  &amp;lt;/mvc:interceptors&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In order to dependency inject:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;org.springframework.mobile.device.site.SitePreference&lt;/li&gt;&lt;li&gt;org.springframework.mobile.device.Device&lt;/li&gt;&lt;/ul&gt;into your Spring MVC controllers, you need to add custom argument resolvers:&lt;br /&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;&amp;lt;bean &lt;span class="hl-keyword"&gt;class&lt;/span&gt;=&lt;span class="hl-string"&gt;"org.springframework.mobile.device.DeviceWebArgumentResolver"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;pre class="programlisting"&gt;&amp;lt;bean &lt;span class="hl-keyword"&gt;class&lt;/span&gt;=&lt;span class="hl-string"&gt;"org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver"&lt;/span&gt; /&amp;gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://static.springsource.org/spring-mobile/docs/1.0.0.M3/reference/html/device.html#spring-mobile-site-preference"&gt;Chapter 2.4.4 of the Spring Mobile documentation&lt;/a&gt; for details. An interesting observation: If you're using the site preference feature, you probably only need to inject: &lt;i&gt;org.springframework.mobile.device.site.SitePreference&amp;nbsp;&lt;/i&gt;&lt;br /&gt;into your controllers. For example if users don't explicitly set the site preference through the request parameter ('currentSitePreference'), &lt;i&gt;SitePreference &lt;/i&gt;will fall back to what &lt;i&gt;Device&lt;/i&gt; would tell you. &lt;br /&gt;&lt;br /&gt;I like the documentation change that instead of using a CustomWebArgumentResolverInstaller, the documentation now configures the resolvers directly in the context, which makes things easier to understand. I am impressed that with the M3 release the documentation looks very good.&lt;br /&gt;&lt;br /&gt;Oh and in case you wondered how it works in practice - Check out &lt;a href="http://www.devnexus.com/"&gt;http://www.devnexus.com/&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;It is admittedly (volunteer-) work in progress but I think the site preference feature is working nicely for my project now. Next, I need to beef up my &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; skills to mobile-web-enable the entire site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5724530266878164564?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5724530266878164564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5724530266878164564' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5724530266878164564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5724530266878164564'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/02/spring-mobile-m3-site-preference.html' title='Spring Mobile M3 - Site Preference'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-3181575697608752668</id><published>2011-01-25T01:15:00.015-05:00</published><updated>2011-01-25T01:33:35.575-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jackson'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><title type='text'>Marshal Json data using Jackson in Spring MVC with Jaxb Annotations</title><content type='html'>The title is quite a mouthful but let me explain...For the &lt;a href="http://devnexus.com/"&gt;DevNexus.com&lt;/a&gt; website I want to provide the website's data not only via XML but also via &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; in order to provide maximum flexibility for other consuming services. E.g. &lt;a href="http://www.mypatelspace.com/"&gt;Pratik Patel&lt;/a&gt; pinged me the other day that he intends building an IPad client and &lt;a href="http://www.screaming-penguin.com/blog/1"&gt;Charlie Collins&lt;/a&gt; is planning to update his DevNexus Android client, which he originally created for the 2010 conference (The pressure is on gentleman ;-).&lt;br /&gt;&lt;br /&gt;The DevNexus website is based on &lt;a href="http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html"&gt;Spring MVC 3.0&lt;/a&gt; and provides RESTful Urls that render Html views of the data (Targeting traditional browser clients as well as mobile client using Spring Mobile and jQuery Mobile). &lt;br /&gt;&lt;br /&gt;Thus, I configured Restful endpoints as described in &lt;a href="http://hillert.blogspot.com/2011/01/rest-with-spring-contentnegotiatingview.html"&gt;my last blog post&lt;/a&gt;. The easiest way to marshal JSON in Spring MVC is via the &lt;a href="http://jackson.codehaus.org/"&gt;Jackson Java JSON-processor&lt;/a&gt;. Spring has a few documentation pointers regarding that. Theoretically, the setup is fairly simple and in its simplest forms means to just put the Jackson jar file onto your class path and adding &lt;i&gt;mvc:annotation-driven&lt;/i&gt; to your Spring Xml Context file (See &lt;a href="http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html"&gt;Chapter 15.12.1&lt;/a&gt; of the Spring documentation). No sweat.&lt;br /&gt;&lt;br /&gt;To get started more specifically with Jackson, here are some blog entries that I came accross while diving deeper into it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.dzone.com/articles/how-serialize-javautildate"&gt;http://java.dzone.com/articles/how-serialize-javautildate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rwehner.wordpress.com/2010/06/09/2-ways-to-create-json-response-for-ajax-request-in-spring3/"&gt;http://rwehner.wordpress.com/2010/06/09/2-ways-to-create-json-response-for-ajax-request-in-spring3/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ondra.zizka.cz/stranky/programovani/java/jaxb-json-jackson-howto.texy"&gt;http://ondra.zizka.cz/stranky/programovani/java/jaxb-json-jackson-howto.texy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;While the tutorials may make you think that serializing JSON is happening defacto automatically, it turned out, that I had to fine-tune my domain model for Jackson. My domain model objects have bi-directional relationships and and I was getting a ton of errors of type:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;java.lang.StackOverflowError -&amp;nbsp;org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;You can configure Jackson's marshalling behavior by annotating your domain model objects. However, those annotations are Jackson specific and I already was annotating my obejects with Jaxb annotations for the Xml marshalling of data.&lt;br /&gt;&lt;br /&gt;Well - cool beans - , it turns out, &lt;a href="http://wiki.fasterxml.com/JacksonJAXBAnnotations"&gt;Jackson can indeed use Jaxb annotations&lt;/a&gt; to renders Json data (added with version 1.1 of Jackson).&lt;a href="http://wiki.fasterxml.com/JacksonJAXBAnnotations"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But how do I configure Jackson? How do I make it work in my Spring environment? I came across 2 blogs, that combined, provided the necessary solution.&lt;br /&gt;&lt;br /&gt;The first example I found &lt;a href="http://ondra.zizka.cz/stranky/programovani/java/jaxb-json-jackson-howto.texy"&gt;here&lt;/a&gt;, which provides a really nice example. &lt;br /&gt;&lt;br /&gt;Furthermore, I not only wanted to configure Jackson to use Jaxb annotations, but I also needed to make it work for my Spring environment. For that Kyrill Alyoshin has some good information &lt;a href="http://kyrill007.livejournal.com/2577.html"&gt;on his blog&lt;/a&gt; (&lt;br /&gt;He also details how to make Jackson work better with Hibernate, which sounds interesting and I may return to his blog entry more specifically for that.).&lt;br /&gt;&lt;br /&gt;Basically the best way to integrate Jackson and Spring is to create a custom  ObjectMapper class that enables Jaxb support and which can then be injected into Spring's MappingJacksonJsonView.&lt;br /&gt;&lt;br /&gt;Here are the things that were needed to get things going for my project -&lt;br /&gt;&lt;br /&gt;First, add the following Maven Dependencies (&lt;a href="http://jackson.codehaus.org/1.7.0/javadoc/org/codehaus/jackson/xc/package-summary.html"&gt;jackson-xc&lt;/a&gt; provides the additional Jaxb support):&lt;br /&gt;&lt;pre&gt;&amp;lt;!-- Jackson JSON Mapper --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;     &amp;lt;groupId&amp;gt;org.codehaus.jackson&amp;lt;/groupId&amp;gt;&lt;br /&gt;     &amp;lt;artifactId&amp;gt;&lt;b&gt;jackson-core-lgpl&lt;/b&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;     &amp;lt;version&amp;gt;1.6.4&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;     &amp;lt;groupId&amp;gt;org.codehaus.jackson&amp;lt;/groupId&amp;gt;&lt;br /&gt;     &amp;lt;artifactId&amp;gt;&lt;b&gt;jackson-mapper-lgpl&lt;/b&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;     &amp;lt;version&amp;gt;1.6.4&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;     &amp;lt;groupId&amp;gt;org.codehaus.jackson&amp;lt;/groupId&amp;gt;&lt;br /&gt;     &amp;lt;artifactId&amp;gt;&lt;b&gt;jackson-xc&lt;/b&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;     &amp;lt;version&amp;gt;1.6.4&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;br /&gt;The custom ObjectMapper:&lt;br /&gt;&lt;pre&gt;import org.codehaus.jackson.map.AnnotationIntrospector;&lt;br /&gt;import org.codehaus.jackson.map.ObjectMapper;&lt;br /&gt;import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;&lt;br /&gt;&lt;br /&gt;public class JaxbJacksonObjectMapper extends ObjectMapper {&lt;br /&gt;&lt;br /&gt; public &lt;b&gt;JaxbJacksonObjectMapper&lt;/b&gt;() {&lt;br /&gt;  final AnnotationIntrospector introspector&lt;br /&gt;      = new JaxbAnnotationIntrospector();&lt;br /&gt;  super.getDeserializationConfig()&lt;br /&gt;       .setAnnotationIntrospector(introspector);&lt;br /&gt;  super.getSerializationConfig()&lt;br /&gt;       .setAnnotationIntrospector(introspector);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;The SpringContext configuration that wires everything together:&lt;br /&gt;&lt;pre&gt;    &amp;lt;bean class="org.springframework.web.servlet.view&lt;br /&gt;        .ContentNegotiatingViewResolver"&amp;gt;&lt;br /&gt;        &amp;lt;property name="order" value="1" /&amp;gt;&lt;br /&gt;        &amp;lt;property name="ignoreAcceptHeader" value="true" /&amp;gt;&lt;br /&gt;        &amp;lt;property name="mediaTypes"&amp;gt;&lt;br /&gt;            &amp;lt;map&amp;gt;&lt;br /&gt;                &amp;lt;entry key="xml"  value="application/xml"/&amp;gt;&lt;br /&gt;                &amp;lt;entry key="json" value="application/json"/&amp;gt;&lt;br /&gt;            &amp;lt;/map&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="defaultViews"&amp;gt;&lt;br /&gt;            &amp;lt;list&amp;gt;&lt;br /&gt;                &amp;lt;bean class="org.springframework.web.servlet.view&lt;br /&gt;          .xml.MarshallingView"&amp;gt;&lt;br /&gt;                    &amp;lt;property name="marshaller" &lt;br /&gt;                      ref="jaxbMarshaller"/&amp;gt;&lt;br /&gt;                &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;b&gt;                &amp;lt;bean&lt;br /&gt;                    class="org.springframework.web&lt;br /&gt;.servlet.view.json.MappingJacksonJsonView"&amp;gt;&lt;br /&gt;                    &amp;lt;property name="objectMapper"&lt;br /&gt; ref="jaxbJacksonObjectMapper"/&amp;gt;&lt;br /&gt;                &amp;lt;/bean&amp;gt;&lt;/b&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            &amp;lt;/list&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-3181575697608752668?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/3181575697608752668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=3181575697608752668' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3181575697608752668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3181575697608752668'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/01/marshal-json-data-using-jackson-in.html' title='Marshal Json data using Jackson in Spring MVC with Jaxb Annotations'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8575903030831312220</id><published>2011-01-21T00:10:00.002-05:00</published><updated>2011-01-21T01:00:42.088-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>REST with Spring - ContentNegotiatingViewResolver vs. HttpMessageConverter+ResponseBody Annotation</title><content type='html'>&lt;b&gt;Disclaimer: &lt;/b&gt;This blog posting reflects experiences while learning to implement RESTful services. Thus, certain elements of my blog posting may turn our to be not correct. Therefore, if you encounter errors, please let me know and I will post corrections as soon as possible. Please proceed with caution... &lt;br /&gt;&lt;br /&gt;As I posted in my previous blog "&lt;a href="http://hillert.blogspot.com/2011/01/making-devnexuscom-more-restful.html"&gt;Making DevNexus.com more Restful&lt;/a&gt;", I am in the process of making more of the data from &lt;a href="http://www.devnexus.com/"&gt;DevNexus.com&lt;/a&gt; consumable by other services, by exposing JSon and XML based endpoints. The website/application is implemented using &lt;a href="http://www.springsource.org/documentation"&gt;Spring MVC 3.0&lt;/a&gt; in the view layer using Spring's REST support.&lt;br /&gt;&lt;br /&gt;Here are a few good reads that I came across that provide some helpful information:&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/"&gt;http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2009/03/16/adding-an-atom-view-to-an-application-using-springs-rest-support/"&gt;http://blog.springsource.com/2009/03/16/adding-an-atom-view-to-an-application-using-springs-rest-support/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rwehner.wordpress.com/2010/06/09/2-ways-to-create-json-response-for-ajax-request-in-spring3/"&gt;http://rwehner.wordpress.com/2010/06/09/2-ways-to-create-json-response-for-ajax-request-in-spring3/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/web/library/wa-restful/"&gt;http://www.ibm.com/developerworks/web/library/wa-restful/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://forum.springframework.org/showthread.php?p=337206"&gt;http://forum.springframework.org/showthread.php?p=337206&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html"&gt;http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html &lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;/ul&gt;As it turns out, there are 2 ways of implementing REST endpoints: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;use a &lt;a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.html"&gt;ContentNegotiatingViewResolver&lt;/a&gt;&lt;/li&gt;&lt;li&gt;use &lt;a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/http/converter/HttpMessageConverter.html"&gt;HttpMessageConverters&lt;/a&gt; in combination with the @ResponseBody annotation&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Using a ContentNegotiatingViewResolver&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When you use a ContentNegotiatingViewResolver your web controllers return ModelAndViews or view names and the ContentNegotiatingViewResolver will, based on various criteria, choose the right data representation strategy.&lt;br /&gt;&lt;br /&gt;The highest priority hereby has the file extension which is used if available in the request. Next, the ViewResolver will look for a (definable) request parameter that identifies the view. If that does not help, the ViewResolver uses the Java Activation Framework to determine the Content-Type. If all fails, use the the HTTP Accept header. Of course the steps can be individually disabled.&lt;br /&gt;&lt;br /&gt;A key takeaway though is, that your controllers will return a single ModelAndView/Viewname that will resolve into a specific view such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;pre&gt;org.springframework.web.servlet.view.json.MappingJacksonJsonView&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;org.springframework.web.servlet.view.xml.MarshallingView &lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;org.springframework.web.servlet.view.documentClass.AbstractPdfView&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;etc...&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;However, this may feel a little unnatural for certain data representations such as XML (using Jaxb annotations) or Json (using Jackson), where a dedicated view may not be necessary. Luckily, you can configure the ContentNegotiatingViewResolver to use default views which kind of solves the issue.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using HttpMessageConverters&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is where HttpMessageConverters potentially could help. Whenever you use the &lt;b&gt;@ResponseBody &lt;/b&gt;annotation you will be using a HttpMessageConverter (See also the Spring reference documentation, chapter "15.3.2.5 Mapping the request body with the @RequestBody annotation" and "18.3.2 HTTP Message Conversion").&lt;br /&gt;&lt;br /&gt;What this means is, that instead of returning a &lt;a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/ModelAndView.html"&gt;ModelAndView&lt;/a&gt; or view name, you will actually return data, e.g. a Collection of Objects.&lt;br /&gt;&lt;br /&gt;If you use the Spring Context&amp;nbsp; &lt;b&gt;&amp;lt;mvc:annotation-driven/&amp;gt; &lt;/b&gt;then support for XML and JSON marshalling is activated by default, provided the respective class libraries (Jaxb and/or Jackson) are present in your class-path (See the Spring documentation for details at chapter "15.12.1 mvc:annotation-driven")&lt;br /&gt;&lt;br /&gt;Here is the interesting problem, if you use &lt;b&gt;&amp;lt;mvc:annotation-driven/&amp;gt; &lt;/b&gt;you can set additional conversion services but you cannot set additional HttpMessageConverters. Consequently, if you want to do that then you have to use explicit bean declarations and remove the  &lt;b&gt;&amp;lt;mvc:annotation-driven/&amp;gt; &lt;/b&gt;tag from your context. This was something not too well covered in article [6] &lt;a href="http://www.ibm.com/developerworks/web/library/wa-restful/"&gt;http://www.ibm.com/developerworks/web/library/wa-restful/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ultimately, I am using the following bean declaration instead of the  &lt;b&gt;&amp;lt;mvc:annotation-driven/&amp;gt;&lt;/b&gt;&amp;nbsp; tag: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;     &amp;lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&amp;gt;&lt;br /&gt;        &amp;lt;property name="webBindingInitializer"&amp;gt;&lt;br /&gt;            &amp;lt;bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"&amp;gt;&lt;br /&gt;                &amp;lt;property name="conversionService" ref="conversionService"/&amp;gt;&lt;br /&gt;                &amp;lt;property name="validator" ref="validator"/&amp;gt;&lt;br /&gt;            &amp;lt;/bean&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;       &amp;lt;property name="messageConverters"&amp;gt;&lt;br /&gt;           &amp;lt;list&amp;gt;&lt;br /&gt;               &amp;lt;ref bean="jsonConverter" /&amp;gt;&lt;br /&gt;               &amp;lt;ref bean="marshallingConverter" /&amp;gt;&lt;br /&gt;               &amp;lt;ref bean="atomConverter" /&amp;gt;&lt;br /&gt;           &amp;lt;/list&amp;gt;&lt;br /&gt;       &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;My choice&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This was a bit tricky. Both approaches are somewhat overlapping and I wish the documentation would give you better guidance on which approach to use under which cicumstances. Certainly the ContentNegotiatingViewResolver option seems to be the better documented solution. On the other side, you don't need to configure explicit views when using HttpMessageConverters and the ResponseBody annotation and therefore, that setup looks a bit more streamlined.&lt;br /&gt;&lt;br /&gt;One issue I was running into was, that for my application I can return both pure data views (Json, XML) and also Html/Jsp responses. Somehow I was not able to configure my controller easily+cleanly, to respond to the same Url with multiple controller methods (one using @ResponseBody and the other returning a JSP view)&lt;br /&gt;&lt;br /&gt;Secondly, I wanted to also support file extensions to use the correct view or converter.&amp;nbsp; As it turns out though, HttpMessageConverters don't support that - Although there was an example somewhere for using request parameters. But that approach would require me creating additional custom classes...&lt;br /&gt;&lt;br /&gt;Anyway, I went ahead chose the ContentNegotiatingViewResolver approach to implement my Restful services.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Further issues &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Once I made my decision, everything seemed to go smoothly. I got my services implemented quickly and they worked perfectly in Firefox. Here is an example of the intended Url structure:&lt;br /&gt;&lt;br /&gt;http://www.devnexus.com/s/speakers&lt;br /&gt;http://www.devnexus.com/s/speakers.html&lt;br /&gt;http://www.devnexus.com/s/speakers.xml&lt;br /&gt;http://www.devnexus.com/s/speakers.json&lt;br /&gt;&lt;br /&gt;With that I thought to have covered all bases: Support file extensions, but also allow clients to connect to &lt;a href="http://www.devnexus.com/s/speakers"&gt;http://www.devnexus.com/s/speakers&lt;/a&gt; and retrieve all data representations using the respective Http Accept header.&lt;br /&gt;&lt;br /&gt;I deployed the app into production, but then the next day at the monthly Atlanta Users Group meeting - people informed me that the DevNexus site were down. That was odd, as I had accessed the site just minutes prior to the meeting.&lt;br /&gt;&lt;br /&gt;Well, as it turned out, Google Chrome, Safari and Internet Explorer transmit a wild mixture of Http Accept headers. Consequently, when users accessed http://www.devnexus.com/s/index then the server would try to return an Xml view because Chrome and Safari requested Xml data rather than Html data.&lt;br /&gt;&lt;br /&gt;For more details on Accept headers, please see the following fascinating:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gethifi.com/blog/browser-rest-http-accept-headers"&gt;http://www.gethifi.com/blog/browser-rest-http-accept-headers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What also threw me off, was that quite a few sources, incl. the Spring documentation imply that using the Http Accept header might be a actually a viable way of determining the correct view to return to clients.&lt;br /&gt;&lt;br /&gt;To illustrate the chaos -Here is an interesting posting from the webkit mailing list:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lists.webkit.org/pipermail/webkit-dev/2010-January/011188.html"&gt;https://lists.webkit.org/pipermail/webkit-dev/2010-January/011188.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ultimately, I got my servlet context configured in a way I think works best for me, though. The extension-less Url will always return Html now and for other data representations the file extension is mandatory. I also configured the ContentNegotiatingViewResolver to ignore Http Accept header by setting:&lt;br /&gt;&lt;pre&gt;&amp;lt;property name="ignoreAcceptHeader" value="true" /&amp;gt;&lt;/pre&gt;Many thanks to &lt;a href="http://www.rickherrick.com/?q=node/63"&gt;this blog posting&lt;/a&gt; by Rick Herrick. Thus, now my servlet-context.xml file contains:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    &amp;lt;bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"&amp;gt;&lt;br /&gt;        &amp;lt;property name="order" value="1" /&amp;gt;&lt;br /&gt;        &amp;lt;property name="ignoreAcceptHeader" value="true" /&amp;gt;&lt;br /&gt;        &amp;lt;property name="mediaTypes"&amp;gt;&lt;br /&gt;            &amp;lt;map&amp;gt;&lt;br /&gt;                &amp;lt;entry key="xml"  value="application/xml"/&amp;gt;&lt;br /&gt;                &amp;lt;entry key="json" value="application/json"/&amp;gt;&lt;br /&gt;            &amp;lt;/map&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="defaultViews"&amp;gt;&lt;br /&gt;            &amp;lt;list&amp;gt;&lt;br /&gt;                &amp;lt;bean class="org.springframework.web.servlet.view.xml.MarshallingView"&amp;gt;&lt;br /&gt;                    &amp;lt;property name="marshaller" ref="jaxbMarshaller"/&amp;gt;&lt;br /&gt;                &amp;lt;/bean&amp;gt;&lt;br /&gt;                &amp;lt;bean&lt;br /&gt;                    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"&amp;gt;&lt;br /&gt;                    &amp;lt;property name="objectMapper" ref="jaxbJacksonObjectMapper"/&amp;gt;&lt;br /&gt;                &amp;lt;/bean&amp;gt;&lt;br /&gt;            &amp;lt;/list&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;bean class="org.springframework.web.servlet.view.BeanNameViewResolver"&amp;gt;&lt;br /&gt;        &amp;lt;property name="order" value="2"/&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&amp;gt;&lt;br /&gt;        &amp;lt;property name="prefix" value="/WEB-INF/jsp/"/&amp;gt;&lt;br /&gt;        &amp;lt;property name="suffix" value=".jsp"/&amp;gt;&lt;br /&gt;        &amp;lt;property name="order"  value="3"/&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That was a rather long day to get things working as intended but a good learning experience nonetheless. There is certainly something intriguing about having clean Urls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-8575903030831312220?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8575903030831312220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8575903030831312220' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8575903030831312220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8575903030831312220'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/01/rest-with-spring-contentnegotiatingview.html' title='REST with Spring - ContentNegotiatingViewResolver vs. HttpMessageConverter+ResponseBody Annotation'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-4178258153982430644</id><published>2011-01-19T22:49:00.000-05:00</published><updated>2011-01-19T22:49:33.569-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='panama'/><title type='text'>Review Starfish Reef Resort, Bocas del Toro, Panama</title><content type='html'>&lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }&lt;/style&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Ourfamily of four stayed at &lt;a href="http://www.vrbo.com/171658"&gt;Starfish Reef&lt;/a&gt; for three and a half weeks atthe end of 2010.  We have two small children, ages two and threemonths.  There were several things about our stay that were verynice, such as:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Our hosts, Jack and Kelly made dinner for us twice&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Jack and Kelly called water taxis for us whenever we asked&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;A few times Jack drove us in his water taxi to places we requested(for a fee), and soon after we first arrived he took several hours toshow us around Almirante and help us with our shopping there&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Jack picked us up in his mule (a small ATV) the last few days of ourtrip.  For the first three weeks of our stay it was unavailable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;The snorkeling on Starfish Reef was very nice, and we saw an octopus,a manta ray, and lots of small fish&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Jack and Kelly installed a safety latch on the outside door of theroom our two year old slept in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Jack and Kelly recommended a &lt;a href="http://www.countryinns.com/panama-city-hotel-pa-8001/pancanal"&gt;lovely hotel in Panama City&lt;/a&gt; for our staythere, as well as a local tour guide who was knowledgeable andhelpful&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;However,we would not recommend Starfish Reef for several reasons, including:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Shepherd Island, where Starfish Reef is located, has a terrible&lt;a href="http://en.wikipedia.org/wiki/Ceratopogonidae"&gt;chitra&lt;/a&gt; (&lt;a href="http://www.blogger.com/goog_172235076"&gt;sand fly &lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Ceratopogonidae"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;or no-see-ums&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;)problem.  However, Starfish Reef only offers mosquito nets forsleeping.  Importantly, chitras are much smaller than mosquitoes, sothe nets do not provide much if any coverage from chitras.  Jack andKelly do recommend using smoke coils to keep the chitras away (whichwe bought at our expense).  These smoke coils do work well, however,it is a very heavy smell and not something we were pleased to usearound our children, much less ourselves. &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Wewere very irritated that readily available finer chitra-repellingnetting wasn't used for the beds.  And no netting was provided forour son's crib initially, we had to ask for it.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Internet is very important to us, since my wife has her own business,and I work in the IT field.  We specifically asked aboutinternet coverage when deciding where we would stay in Bocas delToro.  Jack and Kelly informed us that their internet is in all ofthe houses.  However,  we had hardly any internet coverage for thefirst week we were guests at Starfish Reef.  Gunnar repeatedly spokewith Jack about it, and Jack finally had it fixed approximately oneweek into our vacation.  However, even then, it was not throughoutour house.  It was only available in certain parts of the house,excluding the living room and most of the main bedroom.  And evenonce it was fixed, it still had almost daily outages.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Jack and Kelly charge $6 for each load of laundry.  Since weoriginally were going to stay with them for five weeks (more on thatbelow), and since we have two small children, we were doing personallaundry twice a week.  One garnet was ruined in each of our firstseveral loads of laundry.  We ended up losing five garments - fourpieces of clothes and a crib sheet that we had for over two years,and which was now far too small to fit the pack and play.  We did notdo the laundry, it was done for us.  After a new shirt given to ourdaughter was ruined (it had a hole in it that three pencils would fitthrough), we approached Jack about it.  He said that he was awarethat the washing machine had some problems, and he showed us thefilthy shirt he was wearing as further proof of this.  This boggledour minds.  If he knew that his washing machine was not workingproperly and was in fact ruining clothes, why did he not previouslytell us?  And how could he charge us for this service?!  And Jackactually suggested that we place a patch on our daughter's shirt tocover up the hole!  When we told Kelly about our ruined items, shetold us that we should not have brought nice clothes with us onvacation!  When we told her that t-shirts and baby onesies are not"nice clothes", she had no response.  And when we showedher a t-shirt of Gunnar's that had a large stain on it after theywashing it, she said that it looked like it was worn already.  Yes,Kelly actually said this to paying guests.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Jack and Kelly provided us with written information which stated"Taxi Service: Bocas Marine Tours $8pp each way to Almirante orBocas to and from Shepherd Island (minimum 2 persons or $16) until 6pm.  Night taxi service with Fabian."  They neglected to tell usthat Bocas Marine Taxi (BMT) may refuse to go to Shepherd Island ininclement weather.  We learned this the hard way.  One afternoon wearrived at the taxi port at 5:45pm expecting to make the 6pm taxi. Instead, we were told that the last water taxi had left around 4pmdue to the inclement weather.  We ended up paying $60.00 for aprivate taxi to take us back to Starfish Reef.  The same trip withthe water taxi service would have been $16.00 for all of us.  Jackand Kelly had no response when we told them of this incident.  Whenwe were leaving Starfish Reef, Jack repeatedly said that they couldnot be expected to tell us about all of the issues we may haveencountered while were were their guests.  However, common sensedicates that they would have told us if the taxi service did nottransport during inclement weather.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Shepherd Island is about a 20 minute boat ride from Bocas del Toro ingood weather.  As stated above, Starfish Reef has, or had, a dealwith BMT to transport its guests.  This worked fine in good, andrelatively good, weather.  However, when the weather was poor, BMTdid not want to come out to Starfish Reef.  On at least twooccasions, BMT said that it was not sure that it would be able tocome out to pick us up.  It did come out, but not at the stated timesand much earlier than expected.  We kept the taxi service waitingthese two times because it arrived 10-15 minutes early.  Thereafter,beginning on December 15&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;sup&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;th&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;,BMT refused to pick us up.  Jack and Kelly told us that the servicetold them that it was because we kept them waiting (which Jackexplicitly told us he knew was not fair), and when we personallyasked BMT, we were told that it was because of the inclement weatherand the dangers it posed.  Notably, BMT makes several trips duringthe day between Bocas del Toro and Almirante.  Both locations provideit with several passengers.  Going to Starfish Reef in bad weather,for two paying customers, likely was not worth the time, gas andpotential danger.  Regardless, the sudden lack of taxi service was asevere problem for us since it was our means of transportation.  Whenthis happened, Jack offered to bring us to Almirante to pick up BMTthere.  However, this would have increased our trip times by morethan double, since Almirante was a 15-20 minute ride in Jack's boat,and we would then have to wait for the water taxi.  So, a 20 minutetrip would become a 45-50 minute trip, each way.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-We repeatedly had to remind Jack that our house needed weeklycleaning, and had to specifically ask that our linens be washedweekly.  These are service that Jack and Kelly previously told uswere included.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Several of the steps leading to and from the dock to the houses arewashed out.  Since it is a fairly steep walk, and since we werewalking it almost daily with two small children, we were disappointedthat the steps were in such deteriorated and potentially dangerouscondition.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-The written information provided to us by Jack and Kelly on the daywe arrived states that they charge $10.00 per couple to go to RanaAzul, a restaurant about twenty minutes by boat.  We were insteadcharged $16.00 per couple.  We only learned that we were to have beencharged $10.00 after we re-read the paperwork several days into ourstay.  If there was a rate change, we should have been informed ofthis prior to taking the trips.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Jack invited us to join him for Thanksgiving dinner at Rana Azul. Immediately before the dinner was an at sea funeral for a friend andneighbor of his who recently passed away.  Jack was going directlyfrom the funeral to Rana Azul.  Jack asked us several times if wewould like to join him for both events.  We had nothing else plannedfor the day, and since it was Thanksgiving, we agreed.  After thedinner, Jack then asked us for $16.00 as our fare to Rana Azul (whichshould have been $10.00).  Not once previously did he mention thatthere would be a charge.  This annoyed us since he had severalopportunities to tell us that he would charge us, AND because it wasclear that he was going to the funeral and dinner afterwards with orwithout us.  It certainly made us feel that we were being nicked anddimed by Starfish Reef.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-Jack and Kelly offer several excursions, with rates ranging from$20.00 to $550.00.  We asked that they take us on the chocolate tourat Green Acres Farm no fewer than five or six times before theyscheduled a visit for us.  Notably, this is their cheapest excursion.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-The website states that the property has "a working greenrainforest&amp;nbsp;and&amp;nbsp;Cacao&amp;nbsp;plantation".  This led us tobelieve that the property contained a cacao plantation.  It does not. It has cacao trees, but no working cacao (or chocolate) plantation.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;-The two-way radio between our house and Jack and Kelly's house oftendid not work because, as Jack and Kelly said, their radio "needednew batteries."  We would then communicate by yelling to eachother from the porches of our houses.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Weoriginally planned to stay at Starfish Reef for five weeks, and weprepaid for five weeks.  We decided to leave Starfish Reef five daysearly, on December 20&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;sup&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;th&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;,because we were very disappointed with our lodgings and the property,and because we were spending so much time there due to the very rainyweather.  If the weather was better and we were out of the house andoff the island more, many of the problems stated above would not havebothered us as much.  We asked for a refund for those five days, andwere told that we would not get one because, as Jack said, "singlyor collectively", the issues we raised did not qualify for arefund.  We were shocked by this response in light of all of theproblems we had during our stay.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Weended up leaving five days earlier than that because, on December15&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;sup&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;th&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;,both BMT stopped coming to Starfish Reef (as per the above), andbecause there was no water in our house.  Jack had installed a newvalve on the water pump on December 14&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;sup&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;th&lt;/span&gt;&lt;/sup&gt;&lt;/span&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;. The water was leaking for several hours after Jack's installation. We were gone that afternoon, and when we returned in the earlyevening and heard running water, we tried reaching Jack and Kelly totell them that we thought there was a problem.  We tried them on thetwo-way radio beginning at approximately 6pm.  No one answered.  Wetried off and on until 11pm, but there was no answer.  We also yelledfor them from our balcony, to no avail.  The next morning we wokethem up at 6:30am by yelling at them from our balcony.  When we toldthem that we had been trying to reach them all evening and into thenight, Jack said that he turns off the two-way radio at night(meaning that we have no means of communicating with our hosts atnight).  When we told him that we tried reaching him in the earlyevening, he had no response.  He later repeatedly asked us if we usedup all of the water.  We told him that we did not, that we were gonethat afternoon, and that we heard the pump running for several hoursand kept trying to inform him of it.  It was evident to us that theproblem likely stemmed from the work Jack did on the pump earlierthat day, but he sought to blame us instead.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Twocomments in closing.  What bothered us the most was that Jack andKelly did not accept responsibility for obvious problems at StarfishReef - their laundry machine not working properly, their internet notworking and/or not working throughout the entire house, the waterpump, etc.  They never once said "We're sorry, how can we makethis up to you?"  We travel quite a bit and usually do not haveany complaints.  Here, we were faced with many problems at StarfishReef that made our stay far less enjoyable, and when we raised theseissues, Jack and Kelly's response was always to deflect it back ontous.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;Secondly,we would not recommend this property for a family or for anyonestaying for more than a week.  However, if the internet is notimportant to you, you are not doing a laundry, chitras don't botheryou much, and BMT is traveling again to Starfish Reef, etc., you mayenjoy this property.  There is a lot of beauty there and the housesare spacious and modern.  If you are looking to get away for a fewdays to a week and aren't bothered by what we wrote above, this maybe the place for you.  But for us, it was clearly far less than wewere led to believe we would find.  We were over-promised, and werevery disappointed to find a dilapidated property, with hosts who donot take responsibility for problems on their property.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in; orphans: 2; widows: 2;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Helvetica,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: #010101;"&gt;&lt;span style="font-family: Times New Roman,serif;"&gt;AlysaFreeman and Gunnar Hillert, January 2011.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-4178258153982430644?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/4178258153982430644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=4178258153982430644' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4178258153982430644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4178258153982430644'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/01/review-starfish-reef-resort-bocas-del.html' title='Review Starfish Reef Resort, Bocas del Toro, Panama'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-368096445173500354</id><published>2011-01-18T01:00:00.029-05:00</published><updated>2011-01-18T01:30:15.811-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><title type='text'>Making DevNexus.com more Restful</title><content type='html'>A few people had ask me, whether I can make the data of &lt;a href="http://www.devnexus.com/"&gt;DevNexus.com&lt;/a&gt; consumable for other clients (e.g. Android or iPhone). Sure, no sweat - As I expose the URL in a somewhat RESTful fashion already, I thought exposing a variety of different data representations is not hard but it turned out to be a bit more tricky than I thought but I will blog about that in the next 1-2 days or so.&lt;br /&gt;&lt;br /&gt;Under the covers I am using Spring MVC 3.0 that provides the Rest infrastructure, &lt;a href="http://jackson.codehaus.org/"&gt;Jackson&lt;/a&gt; for the Json marshalling and &lt;a href="http://jaxb.java.net/"&gt;Jaxb&lt;/a&gt; for marshalling the XML data.&amp;nbsp; &lt;br /&gt; &lt;br /&gt;First of all, here is what I have accomplished: The page that returns a list of presentations and the page that returns a list of speakers, will both return the data in either XML or JSON as well. Bear in mind this is still a fairly rough cut and the data representation may still change quite a bit.&lt;br /&gt; &lt;br /&gt;Anyway, these are the exposed endpoints so far:&lt;br /&gt; &lt;br /&gt;&lt;b&gt;http://www.devnexus.com/s/presentations&lt;/b&gt;&lt;br /&gt;Returns any of the other following 3 data representations depending of the Accept Http header. (However, a defined file extension always wins over the Accept header.)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://www.devnexus.com/s/presentations.html&lt;/li&gt;&lt;li&gt;http://www.devnexus.com/s/presentations.xml&lt;/li&gt;&lt;li&gt;http://www.devnexus.com/s/presentations.json&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;http://www.devnexus.com/s/speakers&lt;/b&gt;&lt;br /&gt;Returns any of the other following 3 data representations depending of the Accept Http header. (However, a defined file extension always wins over the Accept header.)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://www.devnexus.com/s/speakers.html&lt;/li&gt;&lt;li&gt;http://www.devnexus.com/s/speakers.xml&lt;/li&gt;&lt;li&gt;http://www.devnexus.com/s/speakers.json&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;As Accept headers the following values are acceptable and handled right now:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;application/xml&lt;/li&gt;&lt;li&gt;application/json&lt;/li&gt;&lt;li&gt;text/html&lt;/li&gt;&lt;/ul&gt;For testing the Firefox plugin "Rest Client" works really well:&amp;nbsp; &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/restclient/"&gt;https://addons.mozilla.org/en-US/firefox/addon/restclient/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As mentioned above, I will blog about the technical details and encountered issues in the next couple of days. Also, if you try to consume the data and run into issues and or have suggestions - ping me and add a comment! &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-368096445173500354?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/368096445173500354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=368096445173500354' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/368096445173500354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/368096445173500354'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/01/making-devnexuscom-more-restful.html' title='Making DevNexus.com more Restful'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-2973317228376096658</id><published>2011-01-04T01:01:00.001-05:00</published><updated>2011-01-04T02:35:40.100-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring Mobile, jQuery Mobile and SiteMesh</title><content type='html'>I just realized that I haven't published a blog entry in a while. Time just flies by. Anyway, I am in the midst with several other volunteers to prepare for the Atlanta-based &lt;a href="http://www.devnexus.com/"&gt;DevNexus&lt;/a&gt; developer conference which will take place March 21-22.&lt;br /&gt;&lt;br /&gt;For this year's conference I reworked the conference website application using Spring (MVC) 3.0, JPA 2.0 etc. In addition to standard clients, I started looking into supporting mobile clients as well.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_A3zK3AEsRRU/TSKj4lIe9II/AAAAAAAAFtY/ZoiAgxtvYjI/s1600/iphone-devnexus2011.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_A3zK3AEsRRU/TSKj4lIe9II/AAAAAAAAFtY/ZoiAgxtvYjI/s320/iphone-devnexus2011.png" width="164" /&gt;&lt;/a&gt;&lt;/div&gt;My requirement was to provide a decent looking mobile interface in a reasonable amount of time (heck, it is all done during my spare-time afterall). Plus, I wanted to support multiple mobile devices at once. Out of that reason I ruled out a native client implementation (at least for now).&lt;br /&gt;&lt;br /&gt;Another option, would have been to look at other development frameworks such as &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; and &lt;a href="http://www.appcelerator.com/"&gt;Appcelerator&lt;/a&gt;, something I may still have to do down the road.&lt;br /&gt;&lt;br /&gt;As I have been using &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; quite a bit, I started exploring it using either &lt;a href="http://www.jqtouch.com/"&gt;jQTouch&lt;/a&gt; or &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt;. I opted into looking at jQuery Mobile as it is the official jQuery sanctioned project.&lt;br /&gt;&lt;br /&gt;As it turns out, you can easily create create some nice looking UIs using jQuery Mobile. As an example, just point, your mobile browser, e.g. Android to &lt;a href="http://www.devnexus.com/"&gt;http://www.devnexus.com/&lt;/a&gt;. This is pretty impressive considering that I have been using an Alpha 2 version with just standard theming and functionality.&lt;br /&gt;&lt;br /&gt;I still have to work on the detail pages, but the main landing page looks fairly nice out of the box using minimal amounts of code.&lt;br /&gt;&lt;br /&gt;On the server-side, I am using &lt;a href="http://www.springsource.org/spring-mobile"&gt;Spring Mobile&lt;/a&gt;, which currently is available as a M2 release. What Spring Mobile allows you to do is to detect from within your Spring MVC controllers, whether the incoming request originates from a mobile device or not.&lt;br /&gt;&lt;br /&gt;If you need to detect specific device capabilities, you can even use a &lt;a href="http://static.springsource.org/spring-mobile/docs/1.0.x/api/org/springframework/mobile/device/wurfl/WurflDeviceResolver.html"&gt;WurflDeviceResolver,&lt;/a&gt; but for my use case I simply need to know whether a mobile device request is coming in or not. If so, forward to a mobile version of the respective controller's jsp page.&lt;br /&gt;&lt;br /&gt;One, question I had to solve was how to make everything work with SiteMesh, which I use for templating purposes. As I use the same Urls for mobile and standard clients (No site-switching), I ended up needing to create a custom SiteMesh DecoratorMapper extending AbstractDecoratorMapper.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;public class SpringMobileParameterDecoratorMapper extends AbstractDecoratorMapper {&lt;br /&gt;    private String decoratorName = null;&lt;br /&gt;&lt;br /&gt;    public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {&lt;br /&gt;        super.init(config, properties, parent);&lt;br /&gt;        decoratorName = properties.getProperty("decorator.name", "mobile");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Decorator getDecorator(final HttpServletRequest request, final Page page) {&lt;br /&gt;&lt;br /&gt;        final Device device = DeviceResolverHandlerInterceptor.getCurrentDevice(request);&lt;br /&gt;&lt;br /&gt;        if (device != null &amp;amp;&amp;amp; device.isMobile()) {&lt;br /&gt;         return getNamedDecorator(request, decoratorName);&lt;br /&gt;        } else {&lt;br /&gt;         return super.getDecorator(request, page);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;It may not be the bestapproach to have a hard dependency onto Spring Mobile in my SiteMesh DecoratorMapper...but it works nicely so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-2973317228376096658?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/2973317228376096658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=2973317228376096658' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2973317228376096658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2973317228376096658'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2011/01/spring-mobile-jquery-mobile-and.html' title='Spring Mobile, jQuery Mobile and SiteMesh'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_A3zK3AEsRRU/TSKj4lIe9II/AAAAAAAAFtY/ZoiAgxtvYjI/s72-c/iphone-devnexus2011.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7370981997542689419</id><published>2010-08-18T08:00:00.001-04:00</published><updated>2010-08-18T09:34:50.021-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><title type='text'>Google, Oracle and JUGs</title><content type='html'>One might think that developing software (web-applications in my case) is a pretty involved endeavor. It is a constant learning experience: from understanding the business domain of your customers for each and every project, to figuring out which frameworks to choose (How many web-frameworks to we have?), all the way to understanding the broader IT landscape.&lt;br /&gt;&lt;br /&gt;Thus, in a nutshell life as a developer is busy...and then Oracle sues Google, adding just a tad more complexity to the mix (Things were also much easier back when it was all about Microsoft versus he rest of the world :-). Additionally, as the leader of the &lt;a href="http://www.ajug.org/"&gt;Atlanta Java Users Group&lt;/a&gt;, I wonder what kind of implication this development will have for our community of Java developers.&lt;br /&gt;&lt;br /&gt;Following the various information sources, there is certainly no black-and-white battle going one, albeit Google seems to be certainly in a more favorable position among developers. A good source for gauging the mood within the Java community is to follow the mailing list of the global &lt;a href="http://community.java.net/jugs/"&gt;JUG community&lt;/a&gt;. Sentiments there have been ranging from surprise to shock.&lt;br /&gt;&lt;br /&gt;Bruno Souza, THE Java advocate in Brazil (he also spoke at AJUG in Atlanta in May 2007) made probably the most balanced statements regarding the just started litigation process between Oracle and Google. Thus, from a technical/legal perspective you may very well argue in either direction, in favor of Google or in favor of Oracle.&lt;br /&gt;&lt;br /&gt;However, I am concerned about the impact this may have in regards to our community and the leading edge open-source developers, that may again increasingly look elsewhere (Remember the wave of developers that left for Ruby on Rails a few years back?).&amp;nbsp; &lt;br /&gt;&lt;br /&gt;I will cautiously follow the developments over the next couple of months and I hope that the negative impact to our community can be minimized. I mean, there is certainly the hope that Oracle and Google come to a quick agreement and maybe make Android an official part of the Java platform (too overly optimistic?)&lt;br /&gt;&lt;br /&gt;Here are some pointers for further information:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;InfoQ&lt;/b&gt; had a short article summarizing the latest developments:&lt;a href="http://www.infoq.com/news/2010/08/oracle_sues_google"&gt; http://www.infoq.com/news/2010/08/oracle_sues_google&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Javalobby&lt;/b&gt; has an insightful article regarding Oracle's open-source activities, e.g. essentially shutting down OpenSolaris: &lt;a href="http://java.dzone.com/articles/oracle-and-open-source-list%20"&gt;http://java.dzone.com/articles/oracle-and-open-source-list &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JavaWorld&lt;/b&gt; takes it even a step further and ask whether SpringSource should be worried as well: &lt;a href="http://www.javaworld.com/community/?q=node/4919"&gt;http://www.javaworld.com/community/?q=node/4919&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Many high-ranking Java advocates left Oracle in recent months, and Java inventor &lt;b&gt;James Gosling&lt;/b&gt; is becoming increasingly outspoken. His blog provides some interesting insights:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.dzone.com/articles/oracle-and-open-source-list%20"&gt;http://nighthacks.com/roller/jag/entry/the_shit_finally_hits_the &lt;/a&gt;&lt;br /&gt;&lt;a href="http://nighthacks.com/roller/jag/entry/quite_the_firestorm"&gt;http://nighthacks.com/roller/jag/entry/quite_the_firestorm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nighthacks.com/roller/jag/entry/cynical_chuckles"&gt;http://nighthacks.com/roller/jag/entry/cynical_chuckles&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Interestingly, looks like too many people were trying to read read James Gosling's blog on 2010-08-16 because his blog was not accessible for a good portion of the day)&lt;br /&gt;&lt;br /&gt;The following link points to an official statement by Oracle regarding its patent policy in 1994. Things seemed to have changed since then, unfortunately:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bustpatents.com/articles/oracle.htm"&gt;http://www.bustpatents.com/articles/oracle.htm&lt;/a&gt;&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/1699950446304666715-7370981997542689419?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/7370981997542689419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=7370981997542689419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7370981997542689419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7370981997542689419'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/08/google-oracle-and-jugs.html' title='Google, Oracle and JUGs'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5917518586028914740</id><published>2010-08-11T10:50:00.000-04:00</published><updated>2010-08-11T10:50:59.097-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Function based indexes in Oracle</title><content type='html'>If you ever have to query tables in Oracle containing million of records using "is null" in the where clause, then you will notice that your normal indexes won't kick in. They work as prescribed for "is not null", though.&lt;br /&gt;&lt;br /&gt;Using a function-based index you can work around that issue. Take a look at the following article which might be quite helpful if you run into the issue:&lt;a href="http://www.dba-oracle.com/oracle_tips_null_idx.htm"&gt;http://www.dba-oracle.com/oracle_tips_null_idx.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5917518586028914740?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5917518586028914740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5917518586028914740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5917518586028914740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5917518586028914740'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/08/function-based-indexes-in-oracle.html' title='Function based indexes in Oracle'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7297794219356738748</id><published>2010-05-06T02:00:00.000-04:00</published><updated>2010-05-06T02:00:02.637-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Using Hibernate's SchemaExport Feature from within a Spring/JPA Context</title><content type='html'>My Spring-based application uses the &lt;a href="http://en.wikipedia.org/wiki/Java_Persistence_API"&gt;Java Persistence Api&lt;/a&gt; (JPA) with Hibernate as persistence provider. As business requirement, I have the need to generate the SQL schema from my JPA annotated classes at application startup (As a disclaimer: I used the &lt;a href="http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/"&gt;Maven Hibernate3 plugin&lt;/a&gt; in the past and there is also an Ant task provided by Hibernate, however in my case I needed a programmatic approach to have some more flexibility). Anyway, A logic choice for this would be Hibernate's &lt;a href="http://docs.jboss.org/hibernate/stable/core/api/org/hibernate/tool/hbm2ddl/SchemaExport.html"&gt;SchemaExport&lt;/a&gt; class.&lt;br /&gt;&lt;br /&gt;The problem is that Hibernate's SchemaExport class requires a &lt;a href="http://docs.jboss.org/hibernate/stable/core/api/org/hibernate/cfg/Configuration.html"&gt;org.hibernate.cfg.Configuration&lt;/a&gt; class to be passed in. Configuring this within Spring based applications is sparsely documented (Furthermore, the Configuration class is not easy to get hold off) but nevertheless there are some good pointers on how to get the Configuration object, when using straight Hibernate e.g:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://forum.springsource.org/archive/index.php/t-65818.html"&gt;http://forum.springsource.org/archive/index.php/t-65818.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Unfortunately, I am a bit on the cutting edge and I configured my persistence using &lt;br /&gt;&lt;ul&gt;&lt;li&gt;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean and&lt;/li&gt;&lt;li&gt;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter&lt;/li&gt;&lt;/ul&gt;How do you make that work? The best, albeit limited, information I found (as usual) on &lt;a href="http://stackoverflow.com/"&gt;Stackoverflow&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/297438/auto-generate-data-schema-from-jpa-annotated-entity-classes"&gt;http://stackoverflow.com/questions/297438/auto-generate-data-schema-from-jpa-annotated-entity-classes&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;That discussion pointed to the following blog post:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jandrewthompson.blogspot.com/2009/10/how-to-generate-ddl-scripts-from.html"&gt;http://jandrewthompson.blogspot.com/2009/10/how-to-generate-ddl-scripts-from.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;That was pretty much it. The blog post gave me some ideas about where to look next for answers (the Hibernate and Spring source code ;-), but the example just felt a bit heavy for my use-case. Everything was already configurred using Spring/JPA in my environment. Why shouldn't I be able to reuse my existing infrastructure to use the SchemaExport class?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The solution&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After some more searching, I think I found a workable example:&lt;br /&gt;&lt;br /&gt;In my class I inject the &lt;i&gt;LocalContainerEntityManagerFactoryBean&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;@Autowired LocalContainerEntityManagerFactoryBean fb;&lt;br /&gt;&lt;br /&gt;Then I use the following code to setup SchemaExport:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;org.hibernate.ejb.Ejb3Configuration cfg = new org.hibernate.ejb.Ejb3Configuration();&lt;/code&gt;&lt;br /&gt;&lt;code&gt;org.hibernate.ejb.Ejb3Configuration configured =&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cfg.configure(fb.getPersistenceUnitInfo(), fb.getJpaPropertyMap()); org.hibernate.tool.hbm2ddl.SchemaExport schemaExport =&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;new org.hibernate.tool.hbm2ddl.SchemaExport(configured.getHibernateConfiguration());&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;And then do whatever you need to, such as printing the SQL Schema DDL to the console: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;schemaExport.create(true, false);&lt;br /&gt;&lt;br /&gt;Not that bad after all. If you have similar needs, hopefully the Google gods are with you and this blog posting showed up in your search results. See you next time.&amp;nbsp; &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/1699950446304666715-7297794219356738748?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/7297794219356738748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=7297794219356738748' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7297794219356738748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7297794219356738748'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/05/using-hibernates-schemaexport-feature.html' title='Using Hibernate&apos;s SchemaExport Feature from within a Spring/JPA Context'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8078836740132259775</id><published>2010-04-29T10:57:00.001-04:00</published><updated>2010-04-29T10:58:22.381-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>Martin Fowler in Atlanta - DSLs, Agile, CI</title><content type='html'>I went to Martin Fowler's talk last night night at the Crowne Plaza Hotel next to Perimeter Mall. &lt;a href="http://www.thoughtworks.com/martin-fowler"&gt;Martin Fowler&lt;/a&gt; is the Chief Scientist at &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt; and it has been a great experience to finally hear him speak personally. He have three mini presentations: &lt;br /&gt;&lt;br /&gt;His first talk was about domain specific languages (DSL) covering all the different variation of DSLs - external DSLs (XML, custom language) and internal DSLs (e.g Ruby). Martin Fowler also had a slide about &lt;i&gt;Language Workbenches&lt;/i&gt; - I saw an &lt;a href="http://martinfowler.com/articles/languageWorkbench.html"&gt;article on his website&lt;/a&gt; covering that subject, which I need to look at in the next few days. &lt;br /&gt;&lt;br /&gt;An interesting point I thought he raised was, to focus on making codified business concerns "readable" through DSLs rather than making the DSL available to business people to write rules, business logic etc. as this would be so much harder to achieve. &lt;br /&gt;&lt;br /&gt;In his second presentation segment, Martin Fowler answered questions, that were submitted by the audience prior to his presentation, which covered various aspect of agile software development. He mentioned that the British newspaper &lt;a href="http://www.guardian.co.uk/"&gt;The Guardian&lt;/a&gt;, is &lt;b&gt;releasing software&lt;/b&gt; changes into production &lt;b&gt;every 2 weeks&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The way to achieve this is through total test automation. He mentions that at Thoughtworks manual QA is reduced to exploratory testing and that any test plans etc. are part of the automated build process (More details about this at the end of this blog post)&lt;br /&gt;&lt;br /&gt;A popular question these days also seems to be whether Java has peaked and whether also languages shall be considered. Martin Fowler, stated that "Java stalled" but it is not going away. However, he&amp;nbsp; also pointed to the fact, that you should &lt;b&gt;consider more productive languages&lt;/b&gt; (especially for new projects). He mentioned an internal and informal Thoughtworks survey in which developers on average attested a &lt;b&gt;0.5-2.5x increase in productivety when using alternative languages&lt;/b&gt; (Ruby, Groovy, Scala, Clojure etc.). Martin Fowler himself expressed his preference for Ruby. &amp;nbsp; &lt;br /&gt;&lt;br /&gt;His last talk was about &lt;b&gt;continuous integration&lt;/b&gt; and &lt;b&gt;continuous delivery&lt;/b&gt;. He talked a bit about different approaches regarding managing your source code in your respective source repository (e.g. Subversion). Specifically he talked about having &lt;i&gt;feature branches&lt;/i&gt; versus just a single &lt;i&gt;trunk&lt;/i&gt; (for the most part). It was interesting to hear him talk about that as at work we recently had that same discussion and we finally settled on having just a single trunk for all our regular development efforts. He said feature branches are just too painful when doing merges.&lt;br /&gt;&lt;br /&gt;Moving on, he suggested to commit your code at least once a day, preferably even more often.&lt;br /&gt;&lt;br /&gt;He then talked about continuous delivery, meaning to continuously push code into production in a controlled fashion. He mentioned a Suisse Insurances company that would deploy code into production once a day. As far as I remember he said that at Thoughtworks they typically deploy into production every two weeks to once a month.&lt;br /&gt;&lt;br /&gt;In order to achieve that you must have really good automated testing at which point Martin Fowler talked about having a "build pipeline" which consists of the following phases:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Commit&lt;/b&gt; Stage - Build project run tests (unit-tests), execution shouldn't take longer than 10 minutes. Deploy artifacts to artifacts repository&lt;/li&gt;&lt;li&gt;&lt;b&gt;Acceptance &lt;/b&gt;Stage - Deploy the application, run smoke tests, run acceptance tests. This stage may take much longer (e.g. 1-2 hours)&lt;/li&gt;&lt;li&gt; &lt;b&gt;Performance&lt;/b&gt; Stage - Run Performance Tests - This may take a very long time&lt;/li&gt;&lt;li&gt;&lt;b&gt;Deployment&lt;/b&gt; Stage - Deploy the application into production - It is important to be able to deploy by just&amp;nbsp; pressing one button. However, have a rollback option&lt;/li&gt;&lt;/ol&gt;Then he talked a little bit about &lt;a href="http://www.thoughtworks-studios.com/cruise-release-management"&gt;Cruise&lt;/a&gt;, Thoughtwork's product to help implement that kind of continuous delivery. There is also a book coming out from Addison Wesley called &lt;a href="http://vig.pearsonhighered.com/educator/academic/product/0,3110,0321601912,00.html"&gt;Continuous Delivery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That basically conclded his talk - there was one further question from the audience that caught my attention. Chris Curtin (CTO of Silverpop) asked him about the &lt;b&gt;Devops movement&lt;/b&gt;. Personally I was unaware of that term. In my understanding, this fairly new concept brings developers and operation teams closer together.&lt;br /&gt;&lt;br /&gt;Martin Fowler found that concept to be a very positive thing saying that if a production issue was caused by a developer, he should carry the pager for that and fix it. I have to learn more about the Devops movement - here is an interesting blog entry that seems to summarize it quite well: &lt;a href="http://www.jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway/"&gt;http://www.jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway/&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;A great evening - learned a lot.&lt;br /&gt;&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/1699950446304666715-8078836740132259775?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8078836740132259775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8078836740132259775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8078836740132259775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8078836740132259775'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/04/martin-fowler-in-atlanta-dsls-agile-ci.html' title='Martin Fowler in Atlanta - DSLs, Agile, CI'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-94345795723229290</id><published>2010-03-23T02:22:00.001-04:00</published><updated>2010-03-23T02:23:20.584-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaposse'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='roundup'/><title type='text'>Java Posse Roundup 2010 - Summary</title><content type='html'>I am sitting in the plane right now returning back to Atlanta from Denver, Colorado. It has been an incredible week. As you may have seen my Twitter tweets, I spent last week at the &lt;a href="http://www.javaposse.com/"&gt;Java Posse &lt;/a&gt;Roundup in Crested Butte, Colorado. It was simply amazing. Some of the brightest minds in our industry were there and the conference setting was very cozy with around 40 attendees. It was a very diverse crowd with attendees from all parts of the US (incl. 4 people from Atlanta and 1 from Nashville) as well as quite a few folks from Europe (UK, Denmark, Norway) as well as Israel. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_A3zK3AEsRRU/S6hd35i_IzI/AAAAAAAAFAs/vf6rjLVSLEo/s1600-h/TheJavaPosse2010CrestedButte_mod.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_A3zK3AEsRRU/S6hd35i_IzI/AAAAAAAAFAs/vf6rjLVSLEo/s400/TheJavaPosse2010CrestedButte_mod.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;James Ward was there (Flex Evangelist for Adobe), &lt;a href="http://www.mindviewinc.com/"&gt;Bruce Eckel&lt;/a&gt; (Author of "Thinking in Java"), ???? &lt;a href="http://blogs.sun.com/darcy/"&gt;Joe Darcy&lt;/a&gt; (Lead at Oracle for Project “Coin” [JDK7]), &lt;a href="http://www.cs.umd.edu/%7Epugh/"&gt;Bill Pugh&lt;/a&gt; (&lt;a href="http://findbugs.sourceforge.net/"&gt;Findbugs&lt;/a&gt;) and many more. &lt;br /&gt;&lt;br /&gt;Here are the sessions I attended at the Roundup:&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Tuesday&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NoSQL Databases&lt;/li&gt;&lt;li&gt;Apple and HTML 5 versus Flash (What Does the Future hold) and UI Framework experiences GWT vs Flex vs ?&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Wednesday&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Measurable ≠ Meaningful (Business)&lt;/li&gt;&lt;li&gt;Architecture standardisation&lt;/li&gt;&lt;li&gt;JavaFX - What else do we want?&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Thursday&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Alternative Views of SW Development (Convention over configuration, static vs. dynamic, Rockstar dependencies)&lt;/li&gt;&lt;li&gt;When companies transition from awesome to sucky corporate environments&lt;/li&gt;&lt;li&gt;Project Coin, JDK7, Language Evolution&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Friday&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Source Control Systems (Server based (SVN) vs. Distributed VCS (Git, Mercurial)&lt;/li&gt;&lt;li&gt;When the wheels come off agile&lt;/li&gt;&lt;li&gt;Share your IDE/Editor tips and tricks&lt;/li&gt;&lt;/ul&gt;On Tuesday and Wednesday, there were Lightning Talks. Every attendee could sign up for 5 minute mini-presentations on any topic (technical, personal, informational you name it). This was really cool. Did you ever attend an IT conference where you could see fire eating? Bill Pugh did it!!! &lt;br /&gt;&lt;br /&gt;On Thursday, I did a lightning talk on &lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt; and &lt;a href="https://jawr.dev.java.net/"&gt;JAWR&lt;/a&gt; which I think went pretty well (considering that I only prepared for it 1 hour in the afternoon that same day). &lt;br /&gt;Thursday night, the 300th episode of the JavaPosse was recorded. It has been a lot of fun. &lt;a href="http://www.javaposse.com/index.php?post_id=595077"&gt;The podcast episode&lt;/a&gt; was released on Friday! &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_A3zK3AEsRRU/S6heGJKTy9I/AAAAAAAAFA0/2JNkmvj27Qc/s1600-h/TheJavaPosse2010CrestedButte-Conclusion_mod.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_A3zK3AEsRRU/S6heGJKTy9I/AAAAAAAAFA0/2JNkmvj27Qc/s400/TheJavaPosse2010CrestedButte-Conclusion_mod.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This was my first JavaPosse Roundup conference. I am sure that I will return next year. It was an incredible learning experience and a ton of fun! A massive THANK YOU to &lt;a href="http://dickwallsblog.blogspot.com/"&gt;Dick Wall&lt;/a&gt;, &lt;a href="http://blogs.sun.com/tor/"&gt;Tor Norbye&lt;/a&gt;, &lt;a href="http://twitter.com/CQuinn"&gt;Carl Quinn&lt;/a&gt;, &lt;a href="http://joeracer.blogspot.com/"&gt;Joe Nuxoll&lt;/a&gt; and Bruce Eckel for organizing this amazing experience! &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/1699950446304666715-94345795723229290?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/94345795723229290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=94345795723229290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/94345795723229290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/94345795723229290'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/03/java-posse-roundup-2010-summary.html' title='Java Posse Roundup 2010 - Summary'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_A3zK3AEsRRU/S6hd35i_IzI/AAAAAAAAFAs/vf6rjLVSLEo/s72-c/TheJavaPosse2010CrestedButte_mod.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-541350441681117382</id><published>2010-03-09T00:37:00.000-05:00</published><updated>2010-03-09T00:37:30.983-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus Day One</title><content type='html'>Alright, this is just a super quick update on day one of our &lt;a href="http://www.devnexus.com/"&gt;DevNexus&lt;/a&gt; conference. Day 1 went very smoothly with no major hick-ups. We have around 340 attendees (Incl. sponsors, speakers etc.), which constitutes a 40% growth compared to last year!!! Thanks to all that attended!&lt;br /&gt;&lt;br /&gt; I attended the following sessions:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;"Better Software with Java and Flex" (James Ward)&lt;/li&gt;&lt;li&gt;"Next Generation Development Infrastructure: Maven, M2Eclipse, Nexus &amp;amp; Hudson" (Jason van Zyl)&lt;/li&gt;&lt;li&gt;"Google App Engine: Cloud vs Cluster" (Toby Reyelts)&lt;/li&gt;&lt;li&gt;"The 90-Day Startup with Google AppEngine: A Case Study" (David Chandler)&lt;/li&gt;&lt;li&gt;"Effective Java" (Venkat Subramaniam)&lt;/li&gt;&lt;li&gt;"Smithing in the 21st Century" (Neal Ford)&lt;/li&gt;&lt;/ol&gt;The day finished off with a cocktail hour and I met some nice folks from The Home Depot and I spent the rest of the eventing chatting with the hard core of the crowd which involved mostly speakers such as Toby Reyelts, Charlie Collins, Barry Hawkins, James Ward, Pratik Patel and Greg Luck. After dropping Greg off at his hotel, I finally made it home right around midnight.&lt;br /&gt;&lt;br /&gt;This has been a very good day. Time to get some sleep. See you all tomorrow at day 2!&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/1699950446304666715-541350441681117382?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/541350441681117382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=541350441681117382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/541350441681117382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/541350441681117382'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/03/devnexus-day-one.html' title='DevNexus Day One'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8234803085857973143</id><published>2010-03-01T08:40:00.000-05:00</published><updated>2010-03-01T08:40:37.331-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>DevNexus has its own Android App</title><content type='html'>Pretty cool - &lt;a href="http://www.google.com/profiles/charlie.collins"&gt;Charlie Collins&lt;/a&gt; created the first Android phone app for the &lt;a href="http://www.devnexus.com/"&gt;DevNexus&lt;/a&gt; conference. Check it out at: &lt;a href="http://code.google.com/p/and-conference/"&gt;http://code.google.com/p/and-conference/&lt;/a&gt;. Thanks Charlie!&lt;br /&gt;&lt;br /&gt;Also, in case you haven't registered for DevNexus, yet. &lt;b&gt;Please sign-up&lt;/b&gt; because registration is closing &lt;b&gt;March 3rd&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-8234803085857973143?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8234803085857973143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8234803085857973143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8234803085857973143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8234803085857973143'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/03/devnexus-has-its-own-android-app.html' title='DevNexus has its own Android App'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-134981995592443638</id><published>2010-02-02T00:18:00.000-05:00</published><updated>2010-02-02T00:18:18.123-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><title type='text'>Atlanta DevNexus 2010 Conference - Status</title><content type='html'>We at &lt;a href="http://www.ajug.org/"&gt;AJUG&lt;/a&gt; are humming along preparing for &lt;a href="http://www.devnexus/"&gt;DevNexus&lt;/a&gt; (&lt;b&gt;March 8-9, 2010&lt;/b&gt;). Today we got confirmation that Jason van Zyl from &lt;a href="http://www.sonatype.com/"&gt;Sonatype&lt;/a&gt; is speaking at our event. He is the founder of &lt;a href="http://maven.apache.org/"&gt;Apache Maven&lt;/a&gt; and Sonatype. I added his bio and abstract to the website tonight. Thus, check out our &lt;a href="http://www.devnexus.com/site/presentations"&gt;presentation line-up&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;Also, we got our very own Twitter account (Many thanks to &lt;a href="http://www.yepthatsme.com/"&gt;&lt;b&gt;Barry Hawkins&lt;/b&gt;&lt;/a&gt; for organizing this!!). Over the next few day I will add it to the DevNexus website and we will post noteworthy updates through that channel.&lt;br /&gt; &lt;br /&gt;Thus, &lt;b&gt;start following us&lt;/b&gt; at: &lt;a href="http://twitter.com/devnexus/"&gt;http://twitter.com/devnexus/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-134981995592443638?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/134981995592443638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=134981995592443638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/134981995592443638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/134981995592443638'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/02/atlanta-devnexus-2010-conference-status.html' title='Atlanta DevNexus 2010 Conference - Status'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-321637984038205662</id><published>2010-01-30T15:54:00.000-05:00</published><updated>2010-01-30T15:54:58.619-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Plaxo OpenID Recipe</title><content type='html'>&lt;a href="http://www.plaxo.com/"&gt;Plaxo&lt;/a&gt; was probably one of the first main sites where I saw &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; support for your user credentials. But only today did I notice that they also have a really nice write-up of of their OpenID implementation, which could serve you as a guide/recipe for implementing your own OpenID supporting user registration process.&lt;br /&gt;&lt;br /&gt;Check it out at: &lt;a href="http://www.plaxo.com/api/openid_recipe"&gt;http://www.plaxo.com/api/openid_recipe&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-321637984038205662?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/321637984038205662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=321637984038205662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/321637984038205662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/321637984038205662'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/01/plaxo-openid-recipe.html' title='Plaxo OpenID Recipe'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-2324924030326675030</id><published>2010-01-27T00:15:00.014-05:00</published><updated>2010-01-27T09:08:36.143-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Automating User Registrations with OpenID and Spring Security 3.0 - Part 3</title><content type='html'>Preparing heavily for &lt;a href="http://www.devnexus.com/"&gt;DevNexus 2010&lt;/a&gt;, I did not have as much time as I hoped for in order to continue my series on using &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; with the new &lt;a href="http://static.springsource.org/spring-security/site/"&gt;SpringSecurity&lt;/a&gt; 3.0 (See &lt;a href="http://hillert.blogspot.com/2010/01/automating-user-registrations-with.html"&gt;Part 2&lt;/a&gt; for details) Thus, today I would just like to cut and paste some of the code from my little 'home-POC'. In the coming weeks I still hope to incorporate it properly into jRecruiter.&lt;br /&gt;&lt;br /&gt;Here is the JSP snippet for the OpenID login form:&lt;br /&gt;&lt;code&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;&amp;lt;div&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openid-registration"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;form&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;'oidf'&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;action&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;'/jrecruiter-web/j_spring_openid_security_check'&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;method&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;'POST'&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;fieldset&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIdLoginSection"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;legend&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;Login with OpenID Identity&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;legend&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;div&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"required"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;label&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openid_identifier"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;Identity&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;label&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;s&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;:textfield &lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openid_identifier"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openid_identifier"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;required=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"true"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;maxlength&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"80"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;tabindex&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"1"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;size&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"30"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;div&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;div&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"submit"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;input&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"submit"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"Login"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;div&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;fieldset&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;form&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #b03060;"&gt;&lt;b&gt;div&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here is the relevant piece of my Spring context file:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:http&amp;nbsp;&amp;nbsp;auto-config=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"true"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;access-decision-manager-ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"accessDecisionManager"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:intercept-&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;pattern=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/s/admin/**"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;access=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"ADMIN"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;requires-channel=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"https"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:intercept-&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;pattern=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/**"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"IS_AUTHENTICATED_ANONYMOUSLY"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;requires-channel=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"any"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:form-login login-page=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/login.html"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;default-&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;target&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;-&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/admin/index.html"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; authentication-failure-&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/login.html?status=error"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:logout logout-&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/logout.html"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;invalidate-session=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"true"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;logout-success-&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/show.jobs.html"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:session-management&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:concurrency-control max-sessions=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"1"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;error-if-maximum-exceeded=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"false"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:session-management&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:custom-filter ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilter"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; position=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"OPENID_FILTER"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;security&lt;span style="color: #458b74;"&gt;:http&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilter"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"org.jrecruiter.web.security.RegistrationAwareOpenIDAuthenticationFilter"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"authenticationManager"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"authenticationManager"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"consumer"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"attributeAwareOpenIDConsumer"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"authenticationSuccessHandler"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilterSuccess"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"authenticationFailureHandler"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilterFailure"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"registrationTargetUrlRequestHandler"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilterRedirectToRegistration"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilterRedirectToRegistration"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"org.jrecruiter.web.security.RegistrationTargetUrlRequestHandler"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"defaultTargetUrl"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/registration/signup.html"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilterSuccess"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"defaultTargetUrl"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/admin/index.html"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"openIDFilterFailure"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;property&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"defaultFailureUrl"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"/login.html?status=error"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"attributeAwareOpenIDProvider"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"org.jrecruiter.web.security.AttributeAwareOpenIDProvider"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;scope&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"prototype"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;constructor-arg&lt;span style="color: #458b74;"&gt;&amp;nbsp;ref=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"userService"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;/&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #458b74;"&gt;&amp;lt;&lt;/span&gt;bean&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"attributeAwareOpenIDConsumer"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #458b74;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b;"&gt;"org.jrecruiter.web.security.AttributeAwareOpenIDConsumer"&lt;/span&gt;&lt;span style="color: #458b74;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;I did some customization:&lt;code&gt;&lt;span style="color: #008b00;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008b00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;AttributeAwareOpenIDConsumer &lt;span style="color: #008b00;"&gt;&lt;b&gt;extends&lt;/b&gt;&lt;/span&gt;&amp;nbsp;OpenID4JavaConsumer {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008b00;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&amp;nbsp;AttributeAwareOpenIDConsumer()&amp;nbsp;&lt;span style="color: #008b00;"&gt;&lt;b&gt;throws&lt;/b&gt;&lt;/span&gt;&amp;nbsp;ConsumerException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008b00;"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;(Arrays.asList(UsedOpenIdAttribute.FIRST_NAME.getOpenIdAttribute(), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsedOpenIdAttribute.LAST_NAME.getOpenIdAttribute(), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsedOpenIdAttribute.EMAIL.getOpenIdAttribute(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsedOpenIdAttribute.AX_FIRST_NAME.getOpenIdAttribute(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsedOpenIdAttribute.AX_LAST_NAME.getOpenIdAttribute(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsedOpenIdAttribute.NAME_PERSON.getOpenIdAttribute()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;I also created a custom class AttributeAwareOpenIDProvider which extends &lt;i&gt;org.springframework.security.openid.OpenIDAuthenticationProvider.&lt;/i&gt; It overrides &lt;b&gt;public Authentication authenticate(Authentication authentication) &lt;/b&gt;Thus, I can hook into the actual authentication process and inject my own logic.&lt;br /&gt;&lt;br /&gt;For example,&amp;nbsp; if the OpenID authentication succeeds it does not necessarily mean that your account exists, yet. Therefore, if OpenID authentication succeeds (if (status == OpenIDAuthenticationStatus.SUCCESS)), I try loading the user from my application's database (userDetailsService). If then a UsernameNotFoundException is thrown I collect a series of OpenID attributes from the &lt;i&gt;org.springframework.security.openid.OpenIDAuthenticationToken&lt;/i&gt;. Once finished, I am throwing a custom &lt;i&gt;AuthenticationSucessButMissingRegistrationException&lt;/i&gt;. I use it to redirect to the registration page and pre-populate the registration form with some of the collected OpenID attributes.&lt;br /&gt;&lt;br /&gt;I hope this gives you some ideas of how you can integrate OpenID into your SpringSecurity infrastructure. I am myself still in the early learning phase regarding OpenID and I still need to figure out how to best manage multiple authentication realms within my application. But that may be a reason for another blog post.&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/1699950446304666715-2324924030326675030?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/2324924030326675030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=2324924030326675030' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2324924030326675030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2324924030326675030'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/01/automating-user-registrations-with_27.html' title='Automating User Registrations with OpenID and Spring Security 3.0 - Part 3'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-2780348858907199039</id><published>2010-01-22T23:38:00.002-05:00</published><updated>2010-01-22T23:44:50.278-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jmx'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><title type='text'>Remote Profiling of JBoss using VisualVM</title><content type='html'>&lt;div style="font-family: inherit;"&gt;I ran into an issue while trying to setup profiling (using &lt;a href="https://visualvm.dev.java.net/"&gt;VisualVM&lt;/a&gt;) of a remote JBoss server instance. It turns out that the default steps I have found on the internet, assume that your target server (Where JBoss is running on) is accessible via the hostname not only by IP address. Well, just in case you live in an environment where you can access your server via IP but not via hostname, this blog post may hopefully save you an hour googling the solution. In order to setup remote profiling I did:&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;To my run.conf file (JBoss/bin) I added:&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: x-small;"&gt;JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=6789"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=IP_ADDRESS_OF_MY_JBOSS"&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;Particularly, the last line was very important. Without it I was able to telnet to port 6789, thinking everything is cool, however I was unable to connect to it via VisualVM.&lt;/span&gt; This missing line caused a few frustrations.&lt;br /&gt;&lt;br /&gt;Anyway, once these lines were added, you need to configure &lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstatd.html"&gt;jstatd&lt;/a&gt;. I created a policy file (I called it tools.policy) for the JVM containing:&lt;br /&gt;&lt;br /&gt;grant {&lt;br /&gt;&amp;nbsp; permission java.security.AllPermission;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Then, I would be able to start up jstatd:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;jstatd -p 1099 -J-Djava.security.policy=tools.policy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;And finally, I was able to startup JBoss and connect to my server from VisualVM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-2780348858907199039?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/2780348858907199039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=2780348858907199039' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2780348858907199039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2780348858907199039'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/01/remote-profiling-of-jboss-using.html' title='Remote Profiling of JBoss using VisualVM'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1077696152035593700</id><published>2010-01-14T00:48:00.000-05:00</published><updated>2010-01-14T00:48:22.735-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>Registration Opens for DevNexus 2010</title><content type='html'>&lt;div style="line-height: 150%; margin-bottom: 0in; margin-top: 0.2in;"&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;Here is an annoucement that I would like to get out regarding the Atlanta Java Users Group's (AJUG) &lt;a href="http://www.devnexus.com/"&gt;professional developer conference&lt;/a&gt;: &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 150%; margin-bottom: 0in; margin-top: 0.2in;"&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;The DevNexus conference will be held in Atlanta &lt;/span&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;b&gt;March 8–9, 2010&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt; and registration is now open. DevNexus covers a wide range of the most exciting topics related to the Java™ platform. &lt;/span&gt; &lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 150%; margin-bottom: 0in; margin-top: 0.2in;"&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;This year, our sophisticated line-up of speakers covers dynamic programming languages such as Scala and Groovy, as well as Rich Internet Applications (RIA) such as Adobe Flex and Google Web Toolkit (GWT). Furthermore, we have a dedicated track on Google technologies, which not only covers GWT but also Google App Engine and Google Wave. Additionally, DevNexus has sessions covering popular open source projects such as Spring, Maven and HtmlUnit, as well as presentations on software architecture, agile software development methodologies and much more!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 150%; margin-bottom: 0in; margin-top: 0.2in;"&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;Please join us for this exceptional event.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 150%; margin-bottom: 0in; margin-top: 0.1in;"&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;The organizers of DevNexus are focused on making sure the conference provides the best possible educational value by offering attendees a special early bird rate of &lt;/span&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;b&gt;$150&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt; if they register between now and February 16.  Regular admission for the two-day conference is $185, a group discount is also available. The ticket price includes the two-day conference pass as well as meals.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 150%; margin-bottom: 0in; margin-top: 0.1in;"&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;This is the second DevNexus event, which is the continuation of the annual AJUG developer conferences that started in 2004.  &lt;/span&gt; &lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 150%; margin-bottom: 0in; margin-top: 0.1in;"&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;For further information: &lt;/span&gt;&lt;span style="color: navy;"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;span style="font-weight: normal;"&gt;http://www.devnexus.com/&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1077696152035593700?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1077696152035593700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1077696152035593700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1077696152035593700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1077696152035593700'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/01/registration-opens-for-devnexus-2010.html' title='Registration Opens for DevNexus 2010'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5738839388884450097</id><published>2010-01-12T00:20:00.002-05:00</published><updated>2010-01-12T00:21:54.260-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus 2010 Conference Updates</title><content type='html'>I have spent a few late nights lately, to get the preparations for the Atlanta DevNexus conference into the final stage. The line-up of speakers is getting fuller by the day. I am personally really excited that James Ward (Adobe), Keith Donald (SpringSource) and Lex Spoon (Google) are presenting and we have many, many more presenters covering a ton of material.&lt;br /&gt;&lt;br /&gt;I will try my best to update the website (&lt;a href="http://www.devnexus.com/"&gt;http://www.devnexus.com&lt;/a&gt;) with the current list of speakers and presentations, soon.&lt;br /&gt;&lt;br /&gt;Which also reminds me to finalize our press-release to announce the conference...I hope to get all that done within the next 2 days. Thus, watch &lt;a href="http://www.devnexus.com/"&gt;http://www.devnexus.com/&lt;/a&gt; for updates. &lt;b&gt;And please sign-up!&lt;/b&gt;&lt;br /&gt;For that price, you won't get a better educational value (...brought to you by your friendly &lt;a href="http://www.ajug.org/"&gt;Atlanta Java Users Group&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5738839388884450097?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5738839388884450097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5738839388884450097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5738839388884450097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5738839388884450097'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/01/devnexus-2010-conference-updates.html' title='DevNexus 2010 Conference Updates'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7059009546063411252</id><published>2010-01-01T14:10:00.032-05:00</published><updated>2010-01-27T00:33:01.686-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Automating User Registrations with OpenID and Spring Security 3.0 - Part 2</title><content type='html'>This is the continuation of &lt;a href="http://hillert.blogspot.com/2009/12/automating-user-registrations-with.html"&gt;part 1&lt;/a&gt;. See also &lt;a href="http://hillert.blogspot.com/2010/01/automating-user-registrations-with_27.html"&gt;part 3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Spring Security provides support for &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; out of the box. It is fairly easy to setup basic OpenID authentication. It even can automatically generate the respective login forms for you. But for my use case I wanted something more elaborate. Here is a basic flow of my "Spring Security OpenID integration solution" (early working draft):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1:&lt;/b&gt; User starts the login process using OpenID.&lt;br /&gt;Note that the 'OpenID' between providers varies quite a bit.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Google uses a generic login String that is the same for every user (&lt;a href="http://www.google.com/accounts/o8/id"&gt;http://www.google.com/accounts/o8/id&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.myopenid.com/"&gt;MyOpenID&lt;/a&gt; has a unique URI identifier for each user (e.g. &lt;i&gt;http://mysupercoolusernmae.myopenid.com/&lt;/i&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_A3zK3AEsRRU/SzrbRkVkrLI/AAAAAAAAEB0/ihKGJENxVgI/s1600-h/login-screen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_A3zK3AEsRRU/SzrbRkVkrLI/AAAAAAAAEB0/ihKGJENxVgI/s400/login-screen.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Step 2:&lt;/b&gt; After pressing the Login button, Spring Security processes the request and using &lt;a href="http://code.google.com/p/openid4java/"&gt;openid4java&lt;/a&gt; under the hood, you are redirected to the login page of your OpenID provider in this case Google.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/_A3zK3AEsRRU/SzrbeL4TMRI/AAAAAAAAEB8/67iac9mCQX4/s1600-h/google-login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_A3zK3AEsRRU/SzrbeL4TMRI/AAAAAAAAEB8/67iac9mCQX4/s400/google-login.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Step 3: &lt;/b&gt;In step 2 you authenticated successfully (with Google in this case), but you don't have a valid account with jRecruiter itself, yet: In this instance, grab all the useful information that is available through the OpenID account/profile and then forward (Redirect) to the registration page. There pre-fill the form with the grabbed information (E.g. email, first name, last name etc.)&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_A3zK3AEsRRU/Szrbja_H3EI/AAAAAAAAECE/TTb5eQp_KYs/s1600-h/signup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_A3zK3AEsRRU/Szrbja_H3EI/AAAAAAAAECE/TTb5eQp_KYs/s400/signup.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Of course I need to add some more sophistication around my user registration process. Nevertheless, I hope the general flow is clear. While OpenID is a fairly widely adopted standard, there seems to be a bit of fluctuation in regards to what data sets providers will allow you to fetch, as well as how to fetch them (e.g. different name-spaces). Thus, it looks like in order to automated an OpenID-supported registration process, you need to be aware (code for) specific providers. I need to explore that area a bit more.&lt;br /&gt;&lt;br /&gt;In my next posting I will finally provide some source code. If find some time, take a look and play around with &lt;a href="http://code.google.com/p/openid4java/"&gt;openid4java&lt;/a&gt;. The OSS project provides various examples, and the 'simple-openid' example is really helpful for understanding the actual openID registration process. Stay tuned.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-7059009546063411252?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/7059009546063411252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=7059009546063411252' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7059009546063411252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7059009546063411252'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2010/01/automating-user-registrations-with.html' title='Automating User Registrations with OpenID and Spring Security 3.0 - Part 2'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_A3zK3AEsRRU/SzrbRkVkrLI/AAAAAAAAEB0/ihKGJENxVgI/s72-c/login-screen.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-302520595240860099</id><published>2009-12-27T17:48:00.004-05:00</published><updated>2010-01-01T14:13:38.733-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Automating User Registrations with OpenID and Spring Security 3.0 - Part 1</title><content type='html'>Having a few days of vacation is nice. Besides spending some precious time with my family, it also gave me some time to work on jRecruiter. I upgraded &lt;a href="http://static.springsource.org/spring-security/site/"&gt;Spring Security&lt;/a&gt; to the final 3.0.0 version, which was released just a few days ago.&lt;br /&gt;&lt;br /&gt;The upgrade process was relatively painless, though it is not a simple Jar drop-in as the packages of many of the classes changed. But it was fairly straight-forward.&lt;br /&gt;&lt;br /&gt;The biggest hassle, was upgrading &lt;a href="http://www.jasypt.org/"&gt;Jasypt&lt;/a&gt; as the latest released version is not playing nice with Spring Security 3.0, yet. But the code is already committed to Jasypt's source code repository, and with minor modifications, I was able to compile a custom version.&lt;br /&gt;&lt;br /&gt;But while I was looking through the changes of Spring Security 3, I started reading a little bit more about its support for &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt;.Which then let to the question, whether there is a good use case for &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; in my &lt;a href="http://code.google.com/p/jrecruiter/"&gt;home project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Places where I saw the use of OpenID are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://www.plaxo.com/signin"&gt;https://www.plaxo.com/signin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/"&gt;http://stackoverflow.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Here is actually a pretty good blog post regarding OpenID:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001121.html"&gt;http://www.codinghorror.com/blog/archives/001121.html&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Security Concerns&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Then of course, there are also a few security concerns regarding allowing for OpenID authentication:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://serverfault.com/questions/7005/is-there-a-danger-in-fake-openid-providers"&gt;http://serverfault.com/questions/7005/is-there-a-danger-in-fake-openid-providers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/182258/are-there-any-security-risks-associated-with-me-using-openid-as-the-authenticatio"&gt;http://stackoverflow.com/questions/182258/are-there-any-security-risks-associated-with-me-using-openid-as-the-authenticatio&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.identityblog.com/wp-content/images/2008/02/OpenID/Normal/OpenIDPhish.html"&gt;http://www.identityblog.com/wp-content/images/2008/02/OpenID/Normal/OpenIDPhish.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/86090/openid-providers-what-stops-malicious-providers"&gt;http://stackoverflow.com/questions/86090/openid-providers-what-stops-malicious-providers&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;If that's not enough:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/tagged?tagnames=openid&amp;amp;sort=votes&amp;amp;pagesize=50"&gt;http://stackoverflow.com/questions/tagged?tagnames=openid&amp;amp;sort=votes&amp;amp;pagesize=50&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Thus, while I probably wouldn't use OpenID for a banking application, I feel it is a nice fit for my home project, it is used by local recruiters to post job postings. Up to this point every account holder had to provide her own username (email) and a password.&lt;br /&gt;&lt;br /&gt;None of the information stored by jRecruiter is extremely sensitive and thus, OpenID might actually help improve the user experience of people posting jobs through the system.&amp;nbsp; Over the past few years I saw a common issue that account holder are unable to remember their password, or even their username (which made me to change over to more of a email-based username approach). Ultimately, there were quite a few duplicate registrations in the past. &lt;br /&gt;&lt;br /&gt;An interesting question though is, is it advisable to restrict access to a limited amount of &lt;a href="http://openid.net/get-an-openid/"&gt;OpenID providers&lt;/a&gt;? (Such as myOpenID, Google or Yahoo)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Use Case&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Well, this is were things are getting interesting, OpenID does not only define the notion of pure authentication but it can also gives you access to &lt;a href="http://openid.net/specs/openid-attribute-exchange-1_0.html"&gt;various pieces&lt;/a&gt; of your OpenID profile (e.g. first name, last name, email address etc.). This feature seems to vary, though, between providers (Have to see how that works out)&lt;br /&gt;&lt;br /&gt;Thus, for jRecruiter I envision the following use case. When a user starts the login process:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;she or he has a choice of either loggin in the traditional way using a username/password combination or&amp;nbsp;&lt;/li&gt;&lt;li&gt;by selecting the OpenID route.&amp;nbsp;&lt;/li&gt;&lt;li&gt;If the user logs in via OpenID and the authentication succeeds, but the user account within jRecruiter does not exists, yet, then the potential user is redirected to the registration pages and the fields of the registration form shall be pre-populated (as much as possible) using inforamtion from the user's OpenID profile.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;In my next blog installment I would like to give you some insights of how I created a first draft implementation using Spring Security 3.0. Keep in mind that this is an ongoing (learning) process...Thus, if you see issues, let me know.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hillert.blogspot.com/2010/01/automating-user-registrations-with.html"&gt;Continue with part 2&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-302520595240860099?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/302520595240860099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=302520595240860099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/302520595240860099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/302520595240860099'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/12/automating-user-registrations-with.html' title='Automating User Registrations with OpenID and Spring Security 3.0 - Part 1'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8225758450769554912</id><published>2009-12-08T08:35:00.001-05:00</published><updated>2009-12-09T09:35:43.593-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><title type='text'>Warbler and JRuby on Netbeans</title><content type='html'>Have been brushing up my Rails skills last night. I installed the latest &lt;a href="http://netbeans.org/"&gt;Netbeans&lt;/a&gt; version (NetBeans IDE 6.8 Release Candidate 2)&lt;br /&gt;&lt;br /&gt;Everything looked great but during project setup, I selected the option to use &lt;a href="http://kenai.com/projects/warbler/pages/Home"&gt;Warbler&lt;/a&gt; (&lt;i&gt;'Add Rake Targets to Support App Server Deployment (.war)'&lt;/i&gt;). As it turns out, setting up Warbler during project setup just 'breaks'. I have been using the "Built-in JRuby 1.4.0". It seems to be a path issue on my Mac running Snow Leopard (there were some indications on the web).&lt;br /&gt;&lt;br /&gt;Ultimately, I was able to solve that issue by installing a dedicated JRuby version that had a nice shorter path. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_A3zK3AEsRRU/Sx8gJGPr2gI/AAAAAAAAD_Q/1A1uv8SOTHU/s1600-h/jruby_warbler_netbeans.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_A3zK3AEsRRU/Sx8gJGPr2gI/AAAAAAAAD_Q/1A1uv8SOTHU/s400/jruby_warbler_netbeans.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Before:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #134f5c;"&gt;"/Applications/NetBeans/NetBeans 6.8 RC2.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/bin/jruby" -S gem unpack warbler&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #134f5c;"&gt;rake aborted!&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #134f5c;"&gt;Command failed with status (127): ["/Applications/NetBeans/NetBeans 6.8 RC2.a...]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #134f5c;"&gt;/Applications/NetBeans/NetBeans 6.8 RC2.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:995:in `sh'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #134f5c;"&gt;(See full trace by running task with --trace)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;After:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #134f5c;"&gt;/Users/hillert/_APPS/jruby-1.4.0/bin/jruby -S gem unpack warbler&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #134f5c;"&gt;Unpacked gem: '/Users/hillert/NetBeansProjects/DX2010/vendor/plugins/warbler-0.9.14'&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I haven been running into a few other issues to finally get a simple &lt;a href="http://guides.rails.info/getting_started.html"&gt;Rails&lt;/a&gt; deployment working on my Tomcat instance, but that is a new blog post to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-8225758450769554912?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8225758450769554912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8225758450769554912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8225758450769554912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8225758450769554912'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/12/warbler-and-jruby-on-netbeans.html' title='Warbler and JRuby on Netbeans'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_A3zK3AEsRRU/Sx8gJGPr2gI/AAAAAAAAD_Q/1A1uv8SOTHU/s72-c/jruby_warbler_netbeans.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1474724950042976144</id><published>2009-12-04T00:00:00.002-05:00</published><updated>2009-12-04T00:55:30.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='meeting'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Great Time at the Scala Meeting</title><content type='html'>I had a great time at the &lt;a href="http://www.meetup.com/atlanta-scala/"&gt;Scala meeting&lt;/a&gt; here in Atlanta, tonight. This was the first time for the &lt;b&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;&lt;/b&gt; group to meet in a central location (Same place as the &lt;a href="http://www.ajug.org/"&gt;AJUG&lt;/a&gt; meetings) and the group was able to double their attendance to almost 20 attendees.&lt;br /&gt;&lt;br /&gt;For me it was also very nice to meet &lt;a href="http://www.lexspoon.org/"&gt;Lex Spoon&lt;/a&gt;, co-author of 'the book' on Scala '&lt;a href="http://www.artima.com/shop/programming_in_scala"&gt;Programming in Scala&lt;/a&gt;'. Also, this is a small world - As a &lt;a href="http://www.javaposse.com/"&gt;Java Posse&lt;/a&gt; fan, it was interesting to realize that John Weathers, the organizer for the Scala Meetup Group and Dick Wall worked together in Atlanta. Besides being a big advocate for Java, Dick is also very involved with the &lt;a href="http://svscala.ning.com/"&gt;Scala scene in the Bay Area&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, seeing the potential of Scala combined with the talent we are having here in Atlanta, there is a great bright future for the Scala community, and with it the larger JVM community. These are exciting times!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1474724950042976144?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1474724950042976144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1474724950042976144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1474724950042976144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1474724950042976144'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/12/great-time-at-scala-meeting.html' title='Great Time at the Scala Meeting'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-6191917143516972239</id><published>2009-11-25T00:01:00.000-05:00</published><updated>2009-11-25T00:01:56.743-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala Meetup in Atlanta (3 Dec 2009)</title><content type='html'>Just updated the &lt;a href="http://www.ajug.org/"&gt;AJUG&lt;/a&gt; website. recognizing that various JVM languages are gaining popularity, we will be starting to sponsor the Atlanta Scala Meetup (With meeting space). The next meeting is on December 3rd, 2009 at the usual AJUG location (&lt;a href="http://www.meetup.com/atlanta-scala/venue/?eventId=11917381&amp;amp;popup=true&amp;amp;venueId=698986"&gt;Holiday Inn Select&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;For more details, please visit: &lt;a href="http://www.ajug.org/"&gt;http://www.ajug.org/&lt;/a&gt; and &lt;a href="http://www.meetup.com/atlanta-scala/"&gt;http://www.meetup.com/atlanta-scala/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;¡Viva La JVM!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-6191917143516972239?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/6191917143516972239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=6191917143516972239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6191917143516972239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6191917143516972239'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/11/scala-meetup-in-atlanta-3-dec-2009.html' title='Scala Meetup in Atlanta (3 Dec 2009)'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1423638389505893016</id><published>2009-11-20T08:30:00.040-05:00</published><updated>2009-11-20T09:19:23.794-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><title type='text'>Oracle, Flex and MOS - a sign for Java FX?</title><content type='html'>Ok, while we are still waiting for the Oracla/Sun purchase to go through, there is also lots of speculating about what might happen with Sun's technology portfolio moving forward.&lt;br /&gt;&lt;br /&gt;Since the world is moving towards richer UI interfaces for the browser, I am always in the struggle to assess which technology stacks are most appropriate to learn (GWT, Flex, plain HTML + your choice of JavaScript library such as JQuery, YUI etc.). Thus, particularly as a Java developer I am of course interested in the outlook of &lt;a href="http://java.sun.com/javafx/"&gt;JavaFX&lt;/a&gt; - I certainly "wish" it be successful, but it still seems to be lacking in various areas (Component libraries, JVM modularization, 'community'). Furthermore, there has not been any Oracles/Sun statements about the future of JavaFX as far as I know (&lt;i&gt;Please comment if I am wrong&lt;/i&gt;)&lt;br /&gt;&lt;br /&gt;There was a higher-level article in InfoWorld yesterday discussing the future of Sun's technologies:&lt;br /&gt;&lt;a href="http://www.infoworld.com/d/developer-world/java-what-does-its-future-hold-978"&gt;http://www.infoworld.com/d/developer-world/java-what-does-its-future-hold-978&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Oracles involvmen into Flex&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This brings me to the main trigger point that caused me to this blog entry. A few days back, I read a news article at &lt;a href="http://www.heise.de/"&gt;Heise Online&lt;/a&gt;, a large German IT news portal, stating that Oracle has some major issues while switching over to their new support system '&lt;a href="https://support.oracle.com/"&gt;My Oracle Support&lt;/a&gt;' (&lt;b&gt;MOS&lt;/b&gt;): &amp;nbsp;&lt;b&gt; &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.heise.de/ix/meldung/Oracles-neues-Support-Portal-aergert-Kunden-856450.html"&gt;http://www.heise.de/ix/meldung/Oracles-neues-Support-Portal-aergert-Kunden-856450.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can read more the issues here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.oracle.com/Support/"&gt;http://blogs.oracle.com/Support/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://forums.oracle.com/forums/thread.jspa?threadID=984482&amp;amp;tstart=0%20"&gt;http://forums.oracle.com/forums/thread.jspa?threadID=984482&amp;amp;tstart=0 &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.computerworld.com/s/article/9140708/Oracle_support_portal_woes_could_erode_users_trust"&gt;http://www.computerworld.com/s/article/9140708/Oracle_support_portal_woes_could_erode_users_trust&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://modalinc.com/blog/2009/10/flash-for-flash-sake/"&gt;http://modalinc.com/blog/2009/10/flash-for-flash-sake/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rhinocerus.net/forum/databases-oracle-server/600734-metalink-still-unuseable-2nd-day.html"&gt;http://www.rhinocerus.net/forum/databases-oracle-server/600734-metalink-still-unuseable-2nd-day.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The more interesting fact, though, is that their entire new support system is implemented in &lt;a href="http://www.adobe.com/products/flex/"&gt;Adobe Flex&lt;/a&gt;. Unfortunately, I was unable to find more technical details via Google, but that is a fairly substantial deployment.&lt;br /&gt;&lt;br /&gt;I found another interesting little piece of information on stackoverflow:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1601444/flex-oracle-open-world-2009"&gt;http://stackoverflow.com/questions/1601444/flex-oracle-open-world-2009&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;According to &lt;a href="http://www.jamesward.com/blog/"&gt;James Ward&lt;/a&gt; (Flex evangelist at Adobe), Oracle showed more Flex-based applications this year at &lt;a href="http://www.oracle.com/us/openworld/"&gt;Oracle OpenWorld 2009&lt;/a&gt; including: My Oracle Support, Social CRM, Siebel Gadgets and Enterprise Manager.&lt;br /&gt;&lt;br /&gt;Can you draw any conclusions out of this regarding the future of JavaFX? Probably (hopefully) not, but it shows that Oracle has already made a significant investment into Adobe Flex.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adobe Flex and JavaFX in Atlanta&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To give you some idea of how the market looks like here in Atlanta, Ga:&lt;br /&gt;&lt;br /&gt;At the last meeting of the &lt;a href="http://www.ajug.org/"&gt;Atlanta Java Users Group&lt;/a&gt; (November 2009), Burr Sutter our group's president asked the group (80+ attendees) whether they use Adobe Flex and a considerable amount of hands went up (I guess at least 1/3).&amp;nbsp; Nobody in the rooms did anything with JavaFX...&lt;br /&gt;&lt;br /&gt;* * * *&lt;br /&gt;&lt;br /&gt;&lt;i&gt;PS: &lt;/i&gt;On a more frustrating side-note: While writing this blog post I visited &lt;a href="http://www.javafx.com/"&gt;http://www.javafx.com/&lt;/a&gt; and my browsers froze (FF on Mac), causing me to re-type a good portion of my blog entry (&lt;i&gt;Sigh&lt;/i&gt;).&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1423638389505893016?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1423638389505893016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1423638389505893016' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1423638389505893016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1423638389505893016'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/11/oracle-flex-and-mos-sign-for-java-fx.html' title='Oracle, Flex and MOS - a sign for Java FX?'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-4472514668252320386</id><published>2009-11-08T23:13:00.001-05:00</published><updated>2009-11-09T00:51:57.499-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='dashboards'/><category scheme='http://www.blogger.com/atom/ns#' term='charting'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><title type='text'>Geeking out with Adobe Flex</title><content type='html'>Just some quick notes...I had some extra time this weekend and watched several excellent online presentations mostly about Adobe Flex. Adobe is doing a really good job of making their conference presentations freely available.&lt;br /&gt;&lt;br /&gt;I worked my way through the following &lt;a href="http://2009.max.adobe.com/"&gt;Adobe Max 2009&lt;/a&gt; presentations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://2009.max.adobe.com/online/session/277"&gt;MAX 2009: Model-Driven Development Using Flash Builder 4 and LiveCycle Data Services ES&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://2009.max.adobe.com/online/session/217"&gt;MAX 2009: Photoshop CS4: The Essentials of Image Enhancement for Web and Flash Designers&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://2009.max.adobe.com/online/session/288"&gt;MAX 2009: What's New in Flex 4&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://2009.max.adobe.com/online/session/360"&gt;MAX 2009: Flash Builder 4 Advanced Tips and Tricks&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://2009.max.adobe.com/online/session/403"&gt;MAX 2009: Professional Flex Data Visualization: Going One Step Further&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also, in the past I must have seriously overlooked &lt;a href="http://tv.adobe.com/"&gt;Adobe TV&lt;/a&gt;. Seems to be a pretty neat educational resource. There I watched: &lt;a href="http://tv.adobe.com/watch/adc-presents/using-the-flex-charting-components/"&gt;Using the Flex Charting Components &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lastly, I ended the weekend by watching &lt;a href="http://tv.adobe.com/watch/360flex-conference/data-visualization-and-dashboards-by-thomas-gonzalez/"&gt;Data Visualization and Dashboards&lt;/a&gt; by Thomas Gonzales (from 360|Flex Conference). By the way you should also seriously check out his blog: &lt;a href="http://www.twgonzalez.com/blog/"&gt;http://www.twgonzalez.com/blog/&lt;/a&gt;. There is some good stuff there.&lt;br /&gt;&lt;br /&gt;In his presentation, Thomas showed some need examples. This one causes some serious drooling: &lt;a href="http://www.brightpointinc.com/flexdemos/googlefinance.html"&gt;http://www.brightpointinc.com/flexdemos/googlefinance.html&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_A3zK3AEsRRU/Svejv6wIVNI/AAAAAAAAD90/FpyuKw3_Oy8/s1600-h/cool_flex_dashboard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_A3zK3AEsRRU/Svejv6wIVNI/AAAAAAAAD90/FpyuKw3_Oy8/s400/cool_flex_dashboard.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And just in case you need a gauge on your dashboards: &lt;a href="http://www.twgonzalez.com/blog/?p=34"&gt;http://www.twgonzalez.com/blog/?p=34&lt;/a&gt; Oh, yeah.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-4472514668252320386?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/4472514668252320386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=4472514668252320386' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4472514668252320386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4472514668252320386'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/11/geeking-out-with-adobe-flex.html' title='Geeking out with Adobe Flex'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_A3zK3AEsRRU/Svejv6wIVNI/AAAAAAAAD90/FpyuKw3_Oy8/s72-c/cool_flex_dashboard.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-174719299141020232</id><published>2009-11-07T22:30:00.038-05:00</published><updated>2009-11-07T22:49:25.467-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='charting'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Rich Charting Options for your RIA/Webapps</title><content type='html'>I started revisiting my charting solution in &lt;a href="http://www.jrecruiter.org/"&gt;jRecruiter&lt;/a&gt;. For this fairly basic Java web application, I have been using &lt;a href="http://www.jfree.org/jfreechart/"&gt;JFreeChart&lt;/a&gt; to provide basic charts (E.g. to illustrate the number of posted jobs over time).&lt;br /&gt;&lt;br /&gt;While JFreeChart works great, and it pretty much provides all the charting features you may ever want, it has one disadvantage: &lt;i&gt;It is static&lt;/i&gt;. Compared to all the interactive goodness that is possible with RIAs such as Flex, JFreeChart lacks the sugary icing on the top (Mouse overs, AJAX interaction, dynamic drill-down etc.). Therefore, I was investigating my options to add some &lt;i&gt;richness&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Additionally, at work, I am using &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; (GWT) and thus wanted to get an overview about the charting capabilities I have using GWT. One of the options there is &lt;a href="http://code.google.com/p/gchart/"&gt;gchart&lt;/a&gt;. It looks okay, alas not great. What's worse, the project owner abandoned his project; see: &lt;a href="http://code.google.com/p/gchart/"&gt;http://code.google.com/p/gchart/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Another option is &lt;a href="http://code.google.com/p/flot/"&gt;flot&lt;/a&gt; which comes along as a &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; plugin and uses the &lt;a href="http://en.wikipedia.org/wiki/Canvas_%28HTML_element%29"&gt;HTML canvas tag&lt;/a&gt; to do charting.&amp;nbsp; There is a also a GWT wrapper for flot available called &lt;a href="http://code.google.com/p/gflot/"&gt;gflot&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The most interesting alternative for GWT, I came across is &lt;a href="http://code.google.com/p/ofcgwt/"&gt;ofcgwt&lt;/a&gt;. It uses &lt;a href="http://www.blogger.com/post-edit.g?blogID=1699950446304666715&amp;amp;postID=174719299141020232" name="Overview"&gt;Open Flash Chart 2&lt;/a&gt; under the hood and looks pretty good. You could argue that if you use Flash-based charting for your GWT app, why not just implement the entire app in Flex ;-).&lt;br /&gt;&lt;br /&gt;On the pure Flash/Flex side, there are first of all the charting components that come with Flexbuilder. In contrast to the open-sourced Flex SDK, the charting components are not free, though.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;While, I was &lt;i&gt;googling&lt;/i&gt; for some other options, I saw &lt;a href="http://www.axiis.org/examples.html"&gt;Axiis&lt;/a&gt; - Simply beautiful! Yet, another option is &lt;a href="http://www.ilog.com/"&gt;IBM ILOG Elixir&lt;/a&gt;, which is free for free sites. They have a very nice compilation of examples: &lt;a href="http://www.ilog.com/products/ilogelixir/demos/"&gt;http://www.ilog.com/products/ilogelixir/demos/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On a low level, you also may want to look at &lt;a href="http://www.degrafa.org/index.html"&gt;Degrafa&lt;/a&gt; (Even if it is just for the gorgeous examples). You can find one interesting charting example at this blog: &lt;a href="http://merhl.com/?p=138"&gt;Nike+ graph using Degrafa/Flex 3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lastly, if you don't mind spending some money, you may also look at &lt;a href="http://www.fusioncharts.com/"&gt;FusionCharts&lt;/a&gt;. At one of my prior engagements we used used in very successfully in a Struts2-based web application. Fusion Charts also comes along in a flavor for Flex - &lt;a href="http://www.fusioncharts.com/flex/demos/"&gt;see the samples&lt;/a&gt;. There is also a Google Code hosted GWT wrapper available. &lt;br /&gt;&lt;br /&gt;This, concludes my little 30k-feet overview/list of 'Rich' charting options. If I missed a good one, please leave a comment!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-174719299141020232?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/174719299141020232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=174719299141020232' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/174719299141020232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/174719299141020232'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/11/rich-charting-options-for-your.html' title='Rich Charting Options for your RIA/Webapps'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1306671650270490268</id><published>2009-10-25T23:40:00.000-04:00</published><updated>2009-10-25T23:42:29.742-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='nfjs'/><title type='text'>NFJS Conference Atlanta 2010 - Day 3</title><content type='html'>The last day is over. It's been a great conference. Without a doubt, JVM language alternatives dominated the conference sessions. Since I won a &lt;a href="http://pragprog.com/titles/vsscala/programming-scala"&gt;book on Scala&lt;/a&gt; yesterday, I will checkout that language out next :-)&lt;br /&gt;&lt;br /&gt;Today, I attended two sessions by &lt;a href="http://kensipe.blogspot.com/"&gt;Ken Sipe&lt;/a&gt;: "&lt;i&gt;Architecture and Scaling&lt;/i&gt;" and "&lt;i&gt;So you want to be an Architect&lt;/i&gt;". I particularly enjoyed the latter one, as Ken gave a very pragmatic overview of his view on what the qualifications of an architect ought to be. I had to smile when somebody from the audience asked Ken how as an architect you can possibly keep up with the constant technical innovations and the sheer breath of required knowledge and Ken responded that he doesn't watch any TV. Well, I catch myself weekly listening to the Java Posse, SE Engineering Radio, Parleys.com etc. while doing the dishes, cleaning up etc. And with planning for AJUG meetings, the next Devnexus conference etc. there is not much time left for TV either (Although I still leave some space for my weekly dose of Southpark ;-)&lt;br /&gt;&lt;br /&gt;I guess you really have to like what you're doing in order to fulfill the requirements of an Architect. &amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;During the Birds of Feather (BOF) session I asked the panelists on their opinion about &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, which was never even mentioned at the conference but which at the same time is heavily used in computer science teaching at colleges in Georgia. Their opinion was, that it's white-space issue is just too much of a limiting factor for using it in HTML scripting, using it as a DSL etc. and also that there are some issues with the user community itself. And thus, they said, there were just better alternatives at this point.&lt;br /&gt;&lt;br /&gt;During the afternoon I attended 2 sessions by Ted Neward&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Busy Java Developer's Guide to Advanced Collections&lt;/li&gt;&lt;li&gt;The Busy Java Developer's Guide to Hacking with the JDK&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Both sessions were interesting but I wish Ted had given some more real world examples for use cases of &lt;a href="http://commons.apache.org/collections/"&gt;Apache Commons Collections&lt;/a&gt; and the &lt;a href="http://code.google.com/p/google-collections/"&gt;Google Collections Library&lt;/a&gt;. In his latter talk he showed an example of how to add functionality to core JVM classes. Interesting, but talking about "experimental and highly hacky stuff".&lt;br /&gt;&lt;br /&gt;Overall, this was an absolutely wonderful conference. Looking forward to the next one! As always: Jay keep up the good work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1306671650270490268?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1306671650270490268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1306671650270490268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1306671650270490268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1306671650270490268'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/10/nfjs-conference-atlanta-2010-day-3.html' title='NFJS Conference Atlanta 2010 - Day 3'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5538594338390776198</id><published>2009-10-24T23:59:00.029-04:00</published><updated>2009-10-25T08:53:28.337-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='functional languages'/><category scheme='http://www.blogger.com/atom/ns#' term='nfjs'/><title type='text'>Don't use Java for New Projects - NFJS Day 2</title><content type='html'>Day 2 of the No Fluff Just Stuff (NFJS) conference here in Atlanta is over - It's been a good day. It has been another day of excellent speakers and topics. One thread you can see clearly throughout the presentations is:&lt;br /&gt;&lt;br /&gt;Java's days are numbered as a language for new development - Viva la JVM!!&lt;br /&gt;&lt;br /&gt;I got the sense that you should at least start thinking about an exit strategy. Stuart Halloway was even more outspoken: "Don't use Java for new greenfield development." (Saying that any of the talked about alternatives are better - Scala, Clojure, Ruby and Groovy).&lt;br /&gt;&lt;br /&gt;After going to a few sessions that dealt with concurrency, I am certainly not inclined (border-lined scared) to do that kind of stuff in Java. The two languages most talked about at the conference were Scala and Clojure.&lt;br /&gt;&lt;br /&gt;The nice thing is, that both language run on the JVM, so you can use the new language features, but are also able to use the vast power of Java libraries, if needed. Once drawback I saw is the fact that both Scala and Clojure can be fairly cryptic, which was an issue that was raised repeatatly by the audience and as well during conversations with fellow developers in between session breaks. Scala at least gives you the ability to write Java like code and then later on as you gain proficiency, you can make your code more concise . From a "power perspective", Scala looks awesome, though.&lt;br /&gt;&lt;br /&gt;The sessions I atended to today were:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Tackling Concurrency on the JVM (Venkat Venkat Subramaniam)&lt;/li&gt;&lt;li&gt;Advanced Topics in JMS (Mark Richards)&lt;/li&gt;&lt;li&gt;Java.next: Clojure, Groovy, JRuby, and Scala (Stuart Halloway)&lt;/li&gt;&lt;li&gt;What's New in Spring 3 (Ken Sipe)&lt;/li&gt;&lt;/ol&gt;Onto the last day now...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5538594338390776198?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5538594338390776198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5538594338390776198' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5538594338390776198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5538594338390776198'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/10/dont-use-java-for-new-projects-nfjs-day.html' title='Don&apos;t use Java for New Projects - NFJS Day 2'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-2329890238393739964</id><published>2009-10-24T01:08:00.002-04:00</published><updated>2009-10-24T01:11:11.564-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='nfjs'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>NFJS Conference Atlanta 2010 - Day 1</title><content type='html'>Today was the first day of the NFJS conference here in Atlanta. It's my third time and it is always a great experience in terms of sessions but it is also a good opportunity to network.&lt;br /&gt;&lt;br /&gt;First I went to two sessions of &lt;a href="http://www.agiledeveloper.com/blog/"&gt;Venkat Subramaniam&lt;/a&gt;: "Effective Java" and "Programming Scala", both excellent sessions. I get the feeling, it is really time to look beyond Java, particularly if you do anything around concurrency. Not sure if &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; will be it, there seemed to be some contention in the crowd regarding Scala's more cryptic syntax. Although, it looked manageable in my opinion. Nevertheless, I need to check out the &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; talk tomorrow. &lt;br /&gt;&lt;br /&gt;The third session I attended was "Transaction Pitfalls and Strategies" by &lt;a href="http://wmrichards.com/"&gt;Mark Richards&lt;/a&gt;. At first I was a bit hesitant attending the session but I was glad I did. A &lt;a href="http://www.ibm.com/developerworks/java/library/j-ts1.html"&gt;related article&lt;/a&gt; can be found at IBM DeveloperWorks. The presentation contained some really good stuff.&lt;br /&gt;&lt;br /&gt;The first day ended with a very good keynote by Ted Neward on Iconoclasm. Oh well, it is 1am already...better get some sleep for day two of the conference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-2329890238393739964?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/2329890238393739964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=2329890238393739964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2329890238393739964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2329890238393739964'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/10/nfjs-conference-atlanta-2010-day-1.html' title='NFJS Conference Atlanta 2010 - Day 1'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-941940419095749170</id><published>2009-10-23T22:05:00.003-04:00</published><updated>2009-10-23T22:17:45.240-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='computer science'/><title type='text'>How to Teach CS to Children</title><content type='html'>At the &lt;a href="http://www.ajug.org/"&gt;Atlanta Java Users Group&lt;/a&gt; (AJUG) we had an awesome presentation by Barbara Ericson on how to inspire children to learn more about computer science (CS). It was a really informative session. As director of Computing Outreach at Georgia Tech University she helps prepare curricular materials for high schools.&lt;br /&gt;&lt;br /&gt;As such, she gave us a detailed overview of the state of CS teaching in Georgia and the nation as a whole. Furthermore, she gave us an overview of all the cool software tools that help teach CS concepts including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.alice.org/"&gt;Alice&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mediacomputation.org/"&gt;Media Computation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.greenfoot.org/"&gt;Greenfoot&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;She also talked about some interesting robotic toys that help in her efforts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.picocricket.com/"&gt;PicoCrickets&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.roboteducation.org/"&gt;IPRE Robots&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pleoworld.com/"&gt;Pleo Robots&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mindstorms.lego.com/eng/Overview/"&gt;LEGO NXT robots&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I wish I had had the stuff when I grew up...&lt;br /&gt;&lt;br /&gt;There is even a website out there that provides free information on activities that teach CS concepts without a computer: &lt;a href="http://csunplugged.org/"&gt;http://csunplugged.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lastly, if you have children of your own, you should certainly check out &lt;a href="http://www.ajug.org/confluence/display/AJUG/The+Institute+for+Computing+Education+at+Georgia+Tech"&gt;Barbara Ericson's presentation&lt;/a&gt; and you can also find many more resources on her website: &lt;a href="http://coweb.cc.gatech.edu/ice-gt"&gt;http://coweb.cc.gatech.edu/ice-gt&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-941940419095749170?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/941940419095749170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=941940419095749170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/941940419095749170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/941940419095749170'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/10/how-to-teach-cs-to-children.html' title='How to Teach CS to Children'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7817330904190722598</id><published>2009-10-17T22:25:00.003-04:00</published><updated>2009-10-19T00:53:12.775-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='eip'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Apache Camel Alternatives</title><content type='html'>In &lt;a href="http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-i.html"&gt;part one&lt;/a&gt; of my mini series I provided a quick introduction to &lt;a href="http://camel.apache.org/"&gt;Apache Camel&lt;/a&gt; and in &lt;a href="http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-ii.html"&gt;part two&lt;/a&gt;, I continued with a simple example illustrating the very basics to get you started (which I extended a bit in &lt;a href="http://hillert.blogspot.com/2009/10/camellos-iii-zipping-files-with-apache.html"&gt;part three&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;In this posting, I would like to talk about some of the alternatives that I see might be interesting for you to investigate, when considering an open-source enterprise integration framework. Hereby however, things always get a bit fuzzy in my opinion, depending on your business requirements.&lt;br /&gt;&lt;br /&gt;On one side, you want to have components which allow you to communicate with other services, but on the other side you also want to have some sort of workflow-capabilities in order to orchestrate your business processes. Furthermore, you may be interested in monitoring and reporting functionality.&amp;nbsp; From a different view-angle, you may desire a higher-level solution versus a solution that embeds easily into existing code using plain Java APIs. The list could probably be expanded considerably, but I hope you get the picture.&lt;br /&gt;&lt;br /&gt;Ergo, depending on your specific business requirements, the following list of frameworks may or may not provide a better choice compared to Apache Camel: &amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Spring Integration&lt;/li&gt;&lt;li&gt;Spring Batch &lt;br /&gt;&lt;/li&gt;&lt;li&gt;JBPM&lt;/li&gt;&lt;li&gt;nexusBPM &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Drools &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hadoop/Cascading&lt;/li&gt;&lt;li&gt;Full ESBs such as Service Mix, Mule ESB, OpenESB, JBossESB &lt;/li&gt;&lt;/ul&gt;Actually, in my opinion the closest alternative to Apache Camel is &lt;a href="http://www.springsource.org/spring-integration"&gt;Spring Integration&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spring Integration &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before I was even aware of Apache Camel, I learned about Spring Integration at the &lt;a href="http://hillert.blogspot.com/2008/06/nfjs-atlanta-2008-report.html"&gt;No Fluff Just Stuff (NFJS) Java conference one year ago&lt;/a&gt;. Back then I thought that Spring Integration was the best thing since Nutella. Then a little later I learned about Apache Camel and tried to figure which one to take for a spin. As it turns out, comparative information on Google is rather sparse:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Matt Raible has some interesting tidbits &lt;a href="http://raibledesigns.com/rd/entry/taking_apache_camel_for_a"&gt;in one of his blog entries&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;There are some &lt;a href="http://blog.springsource.com/2009/02/13/982/#comment-149129"&gt;comments by Mark Fischer on the Spring Blog&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;Interestingly, Apache Camel &lt;a href="http://camel.apache.org/springintegration.html"&gt;provides a component&lt;/a&gt; that allows you to integrate Apache Camel with Spring Integration.&lt;br /&gt;&lt;br /&gt;To me a good argument for Apache Camel was the greater availability of components compared to Spring Integration, as well as its adoption by other frameworks such as &lt;a href="http://activemq.apache.org/"&gt;ActiveMQ&lt;/a&gt; and &lt;a href="http://servicemix.apache.org/home.html"&gt;ServiceMix&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Spring Batch&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If your business requirement is to process large amounts of data, you may also want to look at &lt;a href="http://static.springsource.org/spring-batch/"&gt;Spring Batch&lt;/a&gt; which is specifically designed for batch processing requirements. There are some pointers on the Spring Batch website for integrating it with Spring Integration. I considered it for one of my past projects, but unfortunately I do not have massively deep experience with it as we ultimately chose JBoss jBPM.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;jBPM&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In my opinion another option worth considering is &lt;a href="http://jboss.org/jbossjbpm/"&gt;jBPM from JBoss&lt;/a&gt;. I used it in one of my past projects. Integrating it back then with Spring was certainly a&amp;nbsp; bit tricky (especially asynchronous execution of Nodes), but it is doable. Interestingly, starting with version 4.0, JBPM provides native Spring integration. Unfortunately, I did not have any opportunity, yet, to try out JBPM 4.0.&amp;nbsp; JBPM is certainly much heavier compared to Apache Camel or Spring Integration. I would say that its focus is also slightly a different one. While it provides support for human task management during workflow executions, managing the state of your workflow nodes etc., it totally looses out compared to the available components, which are provided by Apache Camel. &lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;nexusBPM&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A little bit &lt;i&gt;jBPM on steroids&lt;/i&gt; is &lt;a href="http://nexusbpm.sourceforge.net/"&gt;nexusBPM&lt;/a&gt; (An older blog post of mine about it is &lt;a href="http://hillert.blogspot.com/2007/12/jbpm-meeets-nexusbpm.html"&gt;here&lt;/a&gt;). Developed by Intercontinental Hotels Group here in Atlanta, it is open-sourced at Sourceforge and provides a set of useful components in addition to the original JBpm distribution. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Drools&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You probably would not necessarily think of &lt;a href="http://jboss.org/drools/"&gt;Drools&lt;/a&gt; being a Workflow solution but what originally started out as a rules engine seems to venture increasingly into other areas as well. In fact, at least from a 30k foot view, it pretty much provides similar functionality as JBPM (Workflow, human task management etc.) and also provides a few components such as FTP, mail, executing system commands, etc.&lt;br /&gt;&lt;br /&gt;What kind of baffles me is the fact that JBoss is maintaining 2 very similar products...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cascading and Hadoop&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you need to process large amounts of file-based data, then &lt;a href="http://www.cascading.org/"&gt;Cascading&lt;/a&gt; might also be an interesting alternative. Cascading uses &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;MapReduce&lt;/a&gt; to handle chunks of data. Interestingly, you can also use it for creating workflows. Not too long ago I attended an interesting &lt;a href="http://hillert.blogspot.com/2009/07/mapreduce-hadoop-and-cascading-at-ajug.html"&gt;presentation on that subject at AJUG&lt;/a&gt;. The presentation can be found &lt;a href="http://www.slideshare.net/chriscurtin"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ESB like ServiceMix, Mule, OpenESB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last in my list of alternative frameworks to Apache Camel is an entire category of solutions: &lt;a href="http://en.wikipedia.org/wiki/Enterprise_service_bus"&gt;Enterprise Service Buses&lt;/a&gt; (ESB). Enterprise Service Buses are basically stand-alone products, and as such, have a much heavier foot-print than for example Apache Camel which is basically just a set of light-weight Java APIs. In fact Apache Service Mix 4.0 is using Apache Camel under the hood in order to provide message routing. Besides &lt;a href="http://servicemix.apache.org/"&gt;Apache ServiceMix&lt;/a&gt;, you may also look into these OSS products:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mulesoft.com/mule-esb-open-source-esb"&gt;Mule ESB&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://open-esb.dev.java.net/"&gt;OpenESB &lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jboss.org/jbossesb/"&gt;&lt;span id="main" style="visibility: visible;"&gt;&lt;span id="search" style="visibility: visible;"&gt;JBossESB&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="main" style="visibility: visible;"&gt;&lt;span id="search" style="visibility: visible;"&gt;&lt;a href="http://synapse.apache.org/"&gt;Apache Synapse&lt;/a&gt; (See: &lt;a href="http://servicemix.apache.org/how-does-servicemix-compare-to-synapse.html"&gt;Comparison ServiceMix and Synapse&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;This concludes my VERY high-level overview of frameworks/products that allow you to implement worklow and/or enterprise integration-based solutions. This whole subject could easily be extended into a more comprehensive article. Nevertheless, I hope I was able (within the limits of a blog post) to provide you with some good starting points.&lt;br /&gt;&lt;br /&gt;¡Hasta la próxima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-7817330904190722598?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/7817330904190722598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=7817330904190722598' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7817330904190722598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7817330904190722598'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/10/apache-camel-alternatives.html' title='Apache Camel Alternatives'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1701990415592384631</id><published>2009-10-04T12:04:00.001-04:00</published><updated>2009-10-04T23:14:39.787-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='camel'/><category scheme='http://www.blogger.com/atom/ns#' term='eip'/><title type='text'>Camellos III - Zipping Files with Apache Camel Example</title><content type='html'>I played a bit more with Apache Camel and I extended my little Camellos project (See &lt;a href="http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-ii.html"&gt;this blogpost&lt;/a&gt; for details, including for directions to get to the source code) by another simple Example:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;poll directory &lt;b&gt;zip-input&lt;/b&gt; for any type of files&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pack the files using the Zip data format &lt;br /&gt;&lt;/li&gt;&lt;li&gt;output files to the &lt;b&gt;zip-output&lt;/b&gt; directory&lt;/li&gt;&lt;/ol&gt;I thought this would be an easy example to get my feet a bit more wet with Camel. Apache Camel provides 2 data formats for zipping files:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://camel.apache.org/gzip-data-format.html"&gt;GZip Data Format&lt;/a&gt; (&lt;a href="http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/GzipDataFormat.java?view=markup"&gt;Source Code&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://camel.apache.org/zip-dataformat.html"&gt;Zip Data Format&lt;/a&gt; (&lt;a href="http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ZipDataFormat.java?view=markup"&gt;Source Code&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Interestingly, using the marshaller for the Zip data format, you're unable to generate standard zip file. Looking through the source code of the Zip daa format, it turns out that Apache Camel is using a DeflaterOutputStream to created the compressed data versus using a ZipOutputStream. A bug??&lt;br /&gt;&lt;br /&gt;Thus, what a great opportunity to create my fist customized Camel Data Format implementation :-) I basically just took the existing ZipDataFormat class and converted it to using a &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/zip/ZipOutputStream.html"&gt;ZipOutputstream&lt;/a&gt;, and by adding a single &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/zip/ZipEntry.html"&gt;ZipEntry&lt;/a&gt; for my file. This works quite well. &lt;br /&gt;&lt;br /&gt;I also added a reverse route for unzipping a file. One limitation exists. The zipfile can contain only one file. I am not sure, yet, how to solve the issue when you have more than one file in your zip file...I guess this may be a task for the &lt;a href="http://camel.apache.org/splitter.html"&gt;Splitter&lt;/a&gt; or &lt;a href="http://camel.apache.org/aggregator.html"&gt;Aggregator&lt;/a&gt; components.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1701990415592384631?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1701990415592384631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1701990415592384631' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1701990415592384631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1701990415592384631'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/10/camellos-iii-zipping-files-with-apache.html' title='Camellos III - Zipping Files with Apache Camel Example'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-2617719529453170887</id><published>2009-09-26T00:09:00.000-04:00</published><updated>2009-09-26T13:07:41.003-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='proxying'/><title type='text'>Proxying large Amounts of Data using UrlRewriteFilter</title><content type='html'>Finally, I found some time to submit a feature request with patch to the UrlRewriteFilter project.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/urlrewritefilter/issues/detail?id=53"&gt;http://code.google.com/p/urlrewritefilter/issues/detail?id=53&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In one of my projects we needed to provide functionality to post (upload) and download data via a servlet container to/from another url/port - basically we needed to implement proxying.&lt;br /&gt;&lt;br /&gt;A great library out there is &lt;a href="http://tuckey.org/urlrewrite/"&gt;UrlRewriteFilter&lt;/a&gt;, a Java library that provides Apache's &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt; functionality. Not only can you use it to make complex urls more user-fiendly, or re-map old url to new ones but it also provides &lt;a href="http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/3.2/index.html"&gt;proxying&lt;/a&gt; capabilities. &lt;br /&gt;&lt;br /&gt;UrlRewriteFilter uses &lt;a href="http://hc.apache.org/httpclient-3.x/"&gt;Apache HttpClient&lt;/a&gt; for doing proxying. Unfortunately, I ran into memory issues when proxying large amounts of data.&amp;nbsp; The issue is that the current version of UrlRewriteFilter (3.2) is doing buffered requests while proxying. This probably works fine for 90% of all use-cases but for the project I am working on we need to basically support unlimited amounts of data to be proxied (multiple 100s of MB).&lt;br /&gt;&lt;br /&gt;Thus I provided a patch, that worked really well in my project without increasing memory consumption. &lt;br /&gt;In Apache HttpClient you can implement a custom class using the &lt;a href="http://hc.apache.org/httpclient-3.x/performance.html"&gt;RequestEntity&lt;/a&gt; interface that allows you to stream the data directly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-2617719529453170887?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/2617719529453170887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=2617719529453170887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2617719529453170887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/2617719529453170887'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/09/proxying-large-amounts-of-data-using.html' title='Proxying large Amounts of Data using UrlRewriteFilter'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-4419149644687391555</id><published>2009-09-24T08:00:00.001-04:00</published><updated>2009-09-24T09:01:16.162-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='camel'/><category scheme='http://www.blogger.com/atom/ns#' term='eip'/><title type='text'>Camellos - Discovering Apache Camel II</title><content type='html'>As indicated in my &lt;a href="http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-i.html"&gt;last blog post&lt;/a&gt;, here is an example implementing a small &lt;a href="http://camel.apache.org/"&gt;Apache Camel&lt;/a&gt; example.&lt;br /&gt;&lt;br /&gt;You can pick up the source code from:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Checkout&lt;/span&gt;: &lt;a href="http://jrecruiter.googlecode.com/svn/trunk/camellos/"&gt;http://jrecruiter.googlecode.com/svn/trunk/camellos/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;View: &lt;a href="http://code.google.com/p/jrecruiter/source/browse/#svn/trunk/camellos"&gt;http://code.google.com/p/jrecruiter/source/browse/#svn/trunk/camellos&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Steps to get it running:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Check out the source&lt;/li&gt;&lt;li&gt;Using Maven run: &lt;span style="font-weight: bold;"&gt;mvn camel:run&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The Application should compile and start up correctly. &lt;/li&gt;&lt;li&gt;You can now drop files into the &lt;span style="font-weight: bold;"&gt;camellos/inbox&lt;/span&gt; directory&lt;/li&gt;&lt;li&gt;The files should get uploaded to its the FTP server running at &lt;span style="font-weight: bold;"&gt;localhost:3333&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The uploaded files should show up under &lt;span style="font-weight: bold;"&gt;camellos/ftp&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;Back to y example, for my little blog post example here I want to provide the following very simplistic &lt;b&gt;functionality&lt;/b&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;pick up files from an directory&lt;/li&gt;&lt;li&gt;make sure that you pick up no more than 3 files per 30 seconds&lt;br /&gt;&lt;/li&gt;&lt;li&gt;store them into a JMS queue&lt;/li&gt;&lt;li&gt;have a listener on that queue that picks up those files&lt;/li&gt;&lt;li&gt;and upload files to a remote FTP site&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-style: italic;"&gt;What do you think, how many lines of Java code does it take?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With Apache Camel you can get this simple task done with ZERO lines of Java code. Well, I needed 1 Main class with a few lines of code to load the Spring context and and the embedded FTP server. Nevertheless, I think that is quite impressive. In a sense all the heavy lifting is done in the Spring Application Context file:&lt;br /&gt;&lt;span style="font-family: monospace; font-size: xx-small;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;&amp;lt;?&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xml&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;version&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"1.0"&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;encoding&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;?&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;beans&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"&lt;a href="http://www.springframework.org/schema/beans"&gt;http://www.springframework.org/schema/beans&lt;/a&gt;"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;        &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xsi&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;        &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;camel&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"&lt;a href="http://camel.apache.org/schema/spring"&gt;http://camel.apache.org/schema/spring&lt;/a&gt;"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;        &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;ftpserver&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"&lt;a href="http://mina.apache.org/ftpserver/spring/v1"&gt;http://mina.apache.org/ftpserver/spring/v1&lt;/a&gt;"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;        &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;amq&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"&lt;a href="http://activemq.apache.org/schema/core"&gt;http://activemq.apache.org/schema/core&lt;/a&gt;"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;        &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;xsi&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;schemaLocation&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;       &lt;a href="http://www.springframework.org/schema/beans"&gt;http://www.springframework.org/schema/beans&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;       &lt;a href="http://camel.apache.org/schema/spring"&gt;http://camel.apache.org/schema/spring&lt;/a&gt; &lt;a href="http://camel.apache.org/schema/spring/camel-spring.xsd"&gt;http://camel.apache.org/schema/spring/camel-spring.xsd&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;       &lt;a href="http://mina.apache.org/ftpserver/spring/v1"&gt;http://mina.apache.org/ftpserver/spring/v1&lt;/a&gt; &lt;a href="http://mina.apache.org/ftpserver/ftpserver-1.0.xsd"&gt;http://mina.apache.org/ftpserver/ftpserver-1.0.xsd&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;       &lt;a href="http://activemq.apache.org/schema/core"&gt;http://activemq.apache.org/schema/core&lt;/a&gt; &lt;a href="http://activemq.apache.org/schema/core/activemq-core-5.2.0.xsd"&gt;http://activemq.apache.org/schema/core/activemq-core.xsd&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;amq&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;broker&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;useJmx&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"false"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;persistent&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"false"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;amq&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;transportConnectors&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;      &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;amq&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;transportConnector&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;uri&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"tcp://localhost:0"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;amq&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;transportConnectors&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;amq&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;broker&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;          &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;bean&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"activemq"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"org.apache.activemq.camel.component.ActiveMQComponent"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;property&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"brokerURL"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"vm://localhost"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;          &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;ftpserver&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;server&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"ftpServer"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;max-logins&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"10"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;                &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;anon-enabled&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"true"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;max-anon-logins&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"5"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;max-login-failures&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"3"&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;                &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;login-failure-delay&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"20"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;ftpserver&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;listeners&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;ftpserver&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;nio-listener&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"default"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;port&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"3333"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;local-address&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"localhost"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;ftpserver&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;listeners&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;ftpserver&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;file-user-manager&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;file&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"users.properties"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;encrypt-passwords&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"clear"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;ftpserver&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;server&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;camelContext&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;shouldStartContext&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"true"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;trace&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"true"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;package&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;com.hillert.camellos&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;package&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;route&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"route1"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;from&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;uri&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"file:camellos/inbox?move=.done"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;throttle&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;maximumRequestsPerPeriod&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"1"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;timePeriodMillis&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"10000"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;  &amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;to&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;uri&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"activemq:queue:camellos"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;throttle&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;route&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;route&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;id&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"route2"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;from&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;uri&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"activemq:queue:camellos"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; /&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;to&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt; &lt;/span&gt;&lt;span style="color: #008b00; font-family: courier new;"&gt;&lt;b&gt;uri&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;=&lt;/span&gt;&lt;span style="color: #4a708b; font-family: courier new;"&gt;"ftp://admin@localhost:3333?password=secret"&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;\&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;route&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: blueviolet; font-family: courier new;"&gt;camel&lt;/span&gt;&lt;span style="color: #0000ee; font-family: courier new;"&gt;&lt;i&gt;:&lt;/i&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;camelContext&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #458b74; font-family: courier new;"&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Apache Camel provides its own Maven plugin: &lt;a href="http://camel.apache.org/camel-maven-plugin.html"&gt;http://camel.apache.org/camel-maven-plugin.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Getting started&lt;/span&gt; with Apache Camel is simple. I recommend using &lt;a href="http://m2eclipse.sonatype.org/"&gt;m2Eclipse&lt;/a&gt; which is a Maven plugin for Eclipse. Basically Camel provides it's &lt;a href="http://camel.apache.org/camel-maven-archetypes.html"&gt;own Maven archetype&lt;/a&gt; which after running creates a simple project structure and which can be immediately run using &lt;b&gt;mvn camel:run&lt;/b&gt; after project creation. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_A3zK3AEsRRU/SrripU3ReVI/AAAAAAAADSs/QZ43Bu8Zx10/s1600-h/camel-eclipse-wizard.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5384865504077904210" src="http://3.bp.blogspot.com/_A3zK3AEsRRU/SrripU3ReVI/AAAAAAAADSs/QZ43Bu8Zx10/s400/camel-eclipse-wizard.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;For my implementation I followed Camel's &lt;a href="http://camel.apache.org/creating-a-new-spring-based-camel-route.html"&gt;tutorial for creating a Spring based Camel route&lt;/a&gt;.&lt;br /&gt;As my example uses a few more components for Apache Camel but also ActiveMQ for JMS and Apache Mina FTP Server, I needed some additional Maven dependencies.&lt;br /&gt;&lt;br /&gt;Getting all the Maven dependencies right took actually longer than implementing the actual application logic. Anyway, I hope this gives you a quick overview of some basic Apache Camel features. As time permits I will blog about more about it soon. See you then!&lt;br /&gt;&lt;br /&gt;PS: &lt;a href="http://mina.apache.org/ftpserver/"&gt;Apache Mina FtpServer&lt;/a&gt;, is itself a nice little nifty package. So if you for example have the need to boot-up dynamically FTP servers from within your application...check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-4419149644687391555?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/4419149644687391555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=4419149644687391555' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4419149644687391555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4419149644687391555'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-ii.html' title='Camellos - Discovering Apache Camel II'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_A3zK3AEsRRU/SrripU3ReVI/AAAAAAAADSs/QZ43Bu8Zx10/s72-c/camel-eclipse-wizard.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-3848960944748089638</id><published>2009-09-23T22:10:00.001-04:00</published><updated>2009-09-24T09:04:37.198-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='camel'/><category scheme='http://www.blogger.com/atom/ns#' term='eip'/><title type='text'>Camellos - Discovering Apache Camel I</title><content type='html'>&lt;span style="font-size: 100%;"&gt;Over the next couple of weeks or months (depending how much spare-time I am able to allocate), I will dive into the world of &lt;a href="http://camel.apache.org/"&gt;Apache Camel&lt;/a&gt; (Also take a look at &lt;a href="http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-ii.html"&gt;my second blog post&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Apache Camel is somewhat like a Swiss-army knife. As an integration framework (Message Routing API, Mediation Router), it implements all the &lt;a href="http://www.eaipatterns.com/"&gt;Enterprise Integration Patterns&lt;/a&gt; from the book with the same name.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_A3zK3AEsRRU/Srrbc3ibK5I/AAAAAAAADSk/Sv-w3fFctIQ/s1600-h/camel_photo.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5384857593466006418" src="http://3.bp.blogspot.com/_A3zK3AEsRRU/Srrbc3ibK5I/AAAAAAAADSk/Sv-w3fFctIQ/s400/camel_photo.jpg" style="cursor: pointer; display: block; height: 315px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;Next, Apache Camel provides a quite extensive &lt;a href="http://camel.apache.org/components.html"&gt;component library&lt;/a&gt; supporting an impressive amount of communication protocols. Also, it support an wide range of &lt;a href="http://camel.apache.org/data-format.html"&gt;data formats&lt;/a&gt; as well as integration points in terms of other frameworks such as &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;, &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt;, &lt;a href="http://servicemix.apache.org/"&gt;ServiceMix&lt;/a&gt;, &lt;a href="http://activemq.apache.org/"&gt;ActiveMQ&lt;/a&gt; et cetera.&lt;br /&gt;&lt;br /&gt;Well, that's all nice and dandy—However, what does this mean for me as a software developer?&lt;br /&gt;&lt;br /&gt;When you develop typical Java enterprise applications, you will sooner or later come across the requirement to connect to other systems or to add other asynchronous services to your applications. Something like:&lt;br /&gt;&lt;br /&gt;"Hey, we need to pick up this file that comes in every night, parse it, process it and then stuff its data into our database and, while we're at it, also make sure the original file is archived somewhere in the file system."&lt;br /&gt;&lt;br /&gt;Or maybe you just have some requirements where your application needs to send data to another server but you have to make sure, that the flow of data is "throttled" in order not to overburden your destination server during peak-processing times.&lt;br /&gt;&lt;br /&gt;In all those cases Apache Camel can greatly simplify the implementation effort. It is basically a mini ESB in the form of a simple Java API. But it is extremely modular so you can just bits and pieces from it. In my next blog post I will show you an example showing you how it is really dead simple to get started with Apache Camel.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-ii.html"&gt;second Camel related blog post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-3848960944748089638?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/3848960944748089638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=3848960944748089638' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3848960944748089638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3848960944748089638'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/09/camellos-discovering-apache-camel-i.html' title='Camellos - Discovering Apache Camel I'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_A3zK3AEsRRU/Srrbc3ibK5I/AAAAAAAADSk/Sv-w3fFctIQ/s72-c/camel_photo.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-982912336257468867</id><published>2009-09-19T22:00:00.000-04:00</published><updated>2009-09-19T22:09:07.348-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>GWT - Hosted Mode Gotcha in Windows</title><content type='html'>I ran into a small gotcha while running a GWT application I am working on in hosted mode. Usually I am developing my application in hosted mode but for quick stand-alone deployments I also need to deploy the application to a dedicated servlet-container. Since the default settings cause the application to compile rather slowly,  I have been trying to speed up GWT compilation times (Using GWT 1.7) by compiling against Firefox only (My browser of choice).&lt;br /&gt;&lt;br /&gt;To achieve this I set the following property in my GWT module's *.gwt.xml file:&lt;br /&gt;&lt;br /&gt;&lt;set-property name="'user.agent'" value="'gecko1_8'"&gt;&lt;br /&gt;&lt;br /&gt;Well, as it turns out, this caused me quite some pain in hosted mode. I did not realize that the aforementioned setting affects hosted mode. I new that under Windows Internet Explorer (IE) is the default browser but always assumed it only affects fully compiled GWT code - not code running in hosted mode. That was a painful lesson - It caused some rather obscure errors in hosted mode and nowhere were I able to find explicit information regarding this issue.&lt;/set-property&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-982912336257468867?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/982912336257468867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=982912336257468867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/982912336257468867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/982912336257468867'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/09/gwt-hosted-mode-gotcha-in-windows.html' title='GWT - Hosted Mode Gotcha in Windows'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5626920226598547211</id><published>2009-08-30T22:30:00.000-04:00</published><updated>2009-08-30T23:11:50.771-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='jrecruiter'/><title type='text'>jRecruiter is deployed and live</title><content type='html'>Finally...it took ways to long. Last Sunday I finally made a new production deployment (Version 2.0) of jRecruiter). jRecruiter is the job posting service of the &lt;a href="http://www.ajug.org/"&gt;Atlanta Java Users Group&lt;/a&gt; (AJUG). This version was a long time in the making. I hope that from now on I can make new feature deployments more swiftly. The new version is accessible at: &lt;a href="http://www.ajug.org/jrecruiter/"&gt;http://www.ajug.org/jrecruiter/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a list of changes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;(Almost) No more Struts XML-configuration files. jRecruiter uses the &lt;a href="http://cwiki.apache.org/S2PLUGINS/convention-plugin.html"&gt;Struts 2.1 convention plugin&lt;/a&gt; for annotation based configuration.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Many Spring Beans dependencies are now configured using annotations (Spring 3.0)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sophisticated data-grid support using &lt;a href="http://code.google.com/p/jmesa/"&gt;jMesa&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/maps/"&gt;Google Maps&lt;/a&gt; integration (web (Javascript), Pdf (Image) and Flex (Flash))&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.hibernate.org/410.html"&gt;Hibernate Search&lt;/a&gt; support&lt;/li&gt;&lt;li&gt;RSS feeds for the latest 20 jobs using &lt;a href="https://rome.dev.java.net/"&gt;ROME&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Social bookmarks on the job posting list&lt;/li&gt;&lt;li&gt;Application is now &lt;a href="http://struts.apache.org/"&gt;Struts 2.1&lt;/a&gt; based&lt;/li&gt;&lt;li&gt;Using &lt;a href="http://www.jasypt.org/"&gt;jasypt&lt;/a&gt; for password digesting&lt;/li&gt;&lt;li&gt;Administrative pages are SSL encrypted&lt;/li&gt;&lt;li&gt;Improved charting (&lt;a href="http://www.jfree.org/jfreechart/"&gt;JFreeCharts&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Using &lt;a href="http://recaptcha.net/"&gt;reCAPTCHA&lt;/a&gt; for the registration page&lt;/li&gt;&lt;li&gt;Implemented email account verification&lt;/li&gt;&lt;li&gt;Now job postings and updates are send to &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt; (&lt;a href="http://twitter.com/ajug_jobs/"&gt;http://twitter.com/ajug_jobs/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;PDF Export of Job Posting Details (using &lt;a href="http://www.lowagie.com/iText/"&gt;iText&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Switched from username-based logins to an email-based system (usernames are still supported on the backend (e.g. administrative logins)&lt;/li&gt;&lt;li&gt;Some performance improvements --&gt; CSS and JavaScript files are now merged, minified and GZipped using &lt;a href="https://jawr.dev.java.net/"&gt;JAWR&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;XML web services for providing job posting data to &lt;a href="http://www.indeed.com/"&gt;Indeed.com&lt;/a&gt; (Still need to do the actual integration but the XML feed is there)&lt;/li&gt;&lt;li&gt;Using &lt;a href="http://www.jquery.com/"&gt;jQuery&lt;/a&gt; for most Javascript needs&lt;/li&gt;&lt;li&gt;&lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; project consists of multiple modules now (web, server, flex)&lt;/li&gt;&lt;li&gt;I18N: Added partial support for German&lt;/li&gt;&lt;li&gt;Extra bonus: Added a simple &lt;a href="http://www.adobe.com/products/flex/"&gt;Adobe Flex&lt;/a&gt; front-end using &lt;a href="http://www.springsource.org/spring-flex"&gt;Spring Blaze DS&lt;/a&gt; for server integration&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5626920226598547211?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5626920226598547211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5626920226598547211' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5626920226598547211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5626920226598547211'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/08/jrecruiter-is-deployed-and-live.html' title='jRecruiter is deployed and live'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1259429067852189392</id><published>2009-07-29T02:15:00.004-04:00</published><updated>2009-07-29T22:50:50.314-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Integrate Twitter and bit.ly into your Java App</title><content type='html'>I am in the final stage of developing towards the 2.0 release of &lt;a href="http://www.jrecruiter.org/"&gt;jRecruiter&lt;/a&gt;. It is the job posting service of the &lt;a href="http://www.ajug.org/"&gt;Atlanta Java Users Group&lt;/a&gt; (AJUG) and as such I devote some of my spare-time towards it. It is a great way to explore all kinds of different technologies. Thus, last weekend I had the idea that it might be a cool idea to let the system "&lt;a href="http://www.twitter.com/"&gt;tweet&lt;/a&gt;" about job posting additions and updates. Here are my findings.&lt;br /&gt;&lt;br /&gt;First I &lt;a href="http://apiwiki.twitter.com/Libraries"&gt;looked&lt;/a&gt; at available Twitter libraries for Java:&lt;a href="http://repo1.maven.org/maven2/net/homeip/yusuke/twitter4j/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://yusuke.homeip.net/twitter4j/"&gt;Twitter4J&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/java-twitter/"&gt;java-twitter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.winterwell.com/software/jtwitter.php"&gt;JTwitter&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;   After some considerations, I chose Twitter4J. To me, it seemed to be the most active of the three projects. Even better, it has a BSD-style license. Using Twitter4J is super simple:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; Twitter twitter = new Twitter("username", "password");&lt;br /&gt;&lt;br /&gt; try {&lt;br /&gt;     twitter.updateStatus("My tweet");&lt;br /&gt; } catch (TwitterException e) {&lt;br /&gt;     …&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There is so much more you can with Twitter4J. Check out its &lt;a href="http://yusuke.homeip.net/twitter4j/en/code-examples.html"&gt;documentation&lt;/a&gt; for further details.&lt;br /&gt;&lt;br /&gt;Secondly, as each tweet contains a link back to the job detail page in the main application,  I was looking into ways to &lt;a href="http://en.wikipedia.org/wiki/URL_shortening"&gt;shorten URLs&lt;/a&gt;. That way, I can store more job posting related data within the only  140 characters available for each Twitter status update.&lt;br /&gt;&lt;br /&gt;The original service for this is &lt;a href="http://tinyurl.com/"&gt;TinyURL&lt;/a&gt;. However, it looks like &lt;a href="http://bit.ly/"&gt;bit.ly&lt;/a&gt; has more traction these days and is also used directly by Twitter itself. The nice thing about bit.ly is that they have developer accounts and are offering a web service API for doing URL shortening.&lt;br /&gt;&lt;br /&gt;Even better, there is already a Java library available for using bit.ly called &lt;a href="http://code.google.com/p/bitlyj/"&gt;bitlyj&lt;/a&gt;. Using bitlyj is actually almost as equally simple to use as Twitter4j:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;final Bitly bitly =&lt;br /&gt;    BitlyFactory.newInstance("username", "your_bitly_api_key");&lt;br /&gt;try {&lt;br /&gt;    BitlyUrl bUrl = bitly.shorten("http://www.google.com/");&lt;br /&gt;    URL url = bUrl.getShortUrl();&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;    …&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Unfortunately, you have to build bitlyj yourself, but thanks to &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; it is a piece of cake. One thing I noticed, is that the error handling of the library could be more robust. Accidentally, I was using my bit.ly password, initially. However, bit.ly provides an API Key. By the way if you ever wonder where you can get that API Key-It is right in your &lt;a href="http://bit.ly/account/"&gt;account page&lt;/a&gt;. Anyway, the library needs some attention but for my simple use-case it worked fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1259429067852189392?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1259429067852189392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1259429067852189392' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1259429067852189392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1259429067852189392'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/07/integrate-twitter-and-bitly-into-your.html' title='Integrate Twitter and bit.ly into your Java App'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8388728601936865488</id><published>2009-07-23T00:23:00.003-04:00</published><updated>2009-07-29T00:38:58.359-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><title type='text'>MapReduce, Hadoop and Cascading at AJUG</title><content type='html'>Yesderday Chris Curtin, CTO at &lt;a href="http://www.silverpop.com/"&gt;Silverpop&lt;/a&gt;, gave an awesome presentation on &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;MapReduce&lt;/a&gt;, &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt; and &lt;a href="http://www.cascading.org/"&gt;Cascading&lt;/a&gt;. I really enjoyed his wealth of real-world practical examples.&lt;br /&gt;&lt;br /&gt;His presentation is available at: &lt;a href="http://www.slideshare.net/chriscurtin"&gt;http://www.slideshare.net/chriscurtin&lt;/a&gt;&lt;br /&gt;Thanks to John Willis, there is also a video recording available at: &lt;a href="http://www.johnmwillis.com/ec2/hadoop-and-cascading-ajug-072109/"&gt;http://www.johnmwillis.com/ec2/hadoop-and-cascading-ajug-072109/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-8388728601936865488?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8388728601936865488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8388728601936865488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8388728601936865488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8388728601936865488'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/07/mapreduce-hadoop-and-cascading-at-ajug.html' title='MapReduce, Hadoop and Cascading at AJUG'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1435993180554935181</id><published>2009-06-07T14:15:00.002-04:00</published><updated>2009-06-07T17:22:00.706-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webflow'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='book review'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Book Review: Spring Web Flow 2 Web Development</title><content type='html'>&lt;a href="http://www.amazon.com/Spring-Web-Flow-Development/dp/1847195423/"&gt;Spring Web Flow 2 Web Development&lt;/a&gt; by Sven Lüppken and Markus Stäuble is the currently only available book on Spring Web Flow 2.0. The book covers all the components that are part of the Spring Web Flow distribution such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Spring Web Flow&lt;/li&gt;&lt;li&gt;Spring Faces&lt;/li&gt;&lt;li&gt;Spring JavaScript&lt;/li&gt;&lt;/ul&gt;Additionally, the book also provides an overview of &lt;a href="http://static.springsource.org/spring-security/site/index.html"&gt;Spring Security&lt;/a&gt;. The book comes with example code for many of the chapters.&lt;br /&gt;&lt;br /&gt;The provided examples, however, could have been a little more consistent. The main source example in this book is covered in chapter 5 (A simple bug tracker). I liked the given example, as it does not require a database. This makes it easy to understand the Spring Web Flow specific problem domain. However, considering the fact that the authors also talk about Spring Security in other chapters, it would have been nice, if they had used the bug tracker example throughout the book in order to create a “complete” application, that ties together Spring Web Flow, the persistence layer and Spring Security. Unfortunately, the code examples given in later chapters don't refer back to the bug tracker example. Instead, chapter 6, for example, uses a &lt;span style="font-style: italic;"&gt;shopping cart &lt;/span&gt;example.&lt;br /&gt;&lt;br /&gt;A further minor annoyance is that the source code for 2 of the chapters still contain the eclipse project files used by the authors. This may be confusing for some users as these project files still point to &lt;a href="http://www.microsoft.com/sqlserver/"&gt;Microsoft SQL Server&lt;/a&gt; drivers on a windows D: drive. I, for instance, use a Mac...&lt;br /&gt;&lt;br /&gt;In chapter 2 the book discusses on 4 pages &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; and &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;. I think it might have been simpler for the understanding of the book and the provided source code, if only one build system was used,  e.g. Maven. Some of the code examples provide Ant and Maven build scripts but some other ones provide support for Maven, only.&lt;br /&gt;&lt;br /&gt;Another anomaly was, that the book describes the installation of the Spring IDE plugins for &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt; and &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; on 7 pages but then the authors mention in passing only that they are using Microsoft SQL Server as underlying persistence store for their example. As many Java developers may not have a MS SQL Server license, it may have been better to use open-source Databases such as &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; or &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The example in Chapter 3 uses &lt;a href="http://hsqldb.org/"&gt;HSQLDB&lt;/a&gt; for its database but earlier (Chapter 2) the authors use MS SQL Server. For consistency and simplicity reasons the book could have stuck with one database.&lt;br /&gt;&lt;br /&gt;Chapter 4 deals with Spring Faces. The authors should have mentioned &lt;a href="http://jboss.com/products/seam"&gt;JBoss Seam&lt;/a&gt;, since Seam solves a similar problem as Spring Web Flow but having a default focus on JSF.&lt;br /&gt;&lt;br /&gt;The book provides an entire chapter on &lt;a href="http://java.sun.com/javaee/javaserverfaces/"&gt;JSF&lt;/a&gt; integration (Chapter 4). As JSF is a widely used framework and Spring Weblow provides native support for JSF. It would have been nice though, if support for other frameworks such as Struts 1 and 2 would have been illuminated.&lt;br /&gt;&lt;br /&gt;As part of chapter 5, the book also provides information on Spring JavaScript. While it is part of the official Spring Web Flow distribution it is not necessarily essential for the working of Spring Web Flow and even its spec lead Keith Donald mentioned at the &lt;a href="http://www.ajug.org/"&gt;Atlanta Java Users Group&lt;/a&gt; (AJUG) meeting in  November'08 that it maybe extracted into its own project in the future.&lt;br /&gt;&lt;br /&gt;The section in chapter 5 which starts on page 165, the Web Flow Configuration, felt repetitive to parts of Chapter 3 (pages 53) and should have probably merged with that section. Chapter 5 also contains a larger section on &lt;a href="http://tiles.apache.org/"&gt;Apache Tiles&lt;/a&gt; integration. One thing that I did not understand was how Tiles matters in terms of mastering Spring Web Flow. Generally I don't mind explaining additional pieces of information around the edges of your problem domain but if that happens on 5 percent of the book, it needs to matter within the context of the targeted subject. On a site-note: Take a look at &lt;a href="http://www.opensymphony.com/sitemesh/"&gt;SiteMesh&lt;/a&gt; for your templating needs. I strongly prefer it compared to Tiles.&lt;br /&gt;&lt;br /&gt;In chapter 6 the testing of your Spring Web Flows is explained. This was an informative chapter and I particularly liked mentioning of &lt;a href="http://easymock.org/"&gt;EasyMock&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In chapter 7 the book primarily details Spring Security. In my opinion, it provides too much Spring Security centric information. For example, the chapter describes how to create and write your own AccessDecisionVoter. In my opinion it does not help and is unnecessary for the understanding of Spring Web Flow. At most I would have chosen an example that uses a DB-backed security implementation using default Spring Security functionality.&lt;br /&gt;&lt;br /&gt;To me, chapter 7 was a bit strange. It provides 16 pages of information introducing Spring Security but the actual integration of Spring Web Flow with Spring Security is accomplished in merely 4 pages. Most interestingly, that's where the book simply ends. I missed something like a wrap-up, that summarizes what the book covered and where to continue on.&lt;br /&gt;&lt;br /&gt;In Appendix B the authors provide an overview of Springsource's &lt;a href="http://www.springsource.com/products/dmserver"&gt;dm Server&lt;/a&gt;. Personally, I think that dm Server is an interesting offering. However, I don't understand why this appendix even exists in this book. It is neither important for the understanding of Spring Web Flow, nor do the authors explain why this appendix exists.&lt;br /&gt;&lt;br /&gt;Here are some further thoughts: Throughout the book, I like the use of Maven for building the examples. It certainly makes it easy to understand the examples' structure.&lt;br /&gt;&lt;br /&gt;I think for the understanding of Spring Web Flow, it unnecessarily complicates things, if you present examples that require JNDI for establishing database connectivity. Furthermore it binds you to a concrete application server, which in this case is &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Except for a for a very brief mentioning on page 224, the book never talked about the applicability of Spring Web Flow in the context of RIA frameworks such as GWT, Flex etc. Is there a use case for Spring Web Flow e.g. for coarse grained server state for large, complex applications?&lt;br /&gt;&lt;br /&gt;It would have been nice if the book provided an overview of other frameworks that handle conversational state such as JBoss Seam. Additionally, since the books was published in March 2009, it could have described some of the planned conversational state management support planned for Spring 3.0.&lt;br /&gt;&lt;br /&gt;Furthermore, it would have been great if the book had also mentioned how &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; can be used to back Spring Web Flow conversations. Terracotta provides an &lt;a href="http://www.terracotta.org/web/display/orgsite/Web+App+Reference+Implementation"&gt;interesting reference application&lt;/a&gt; detailing that possibility.&lt;br /&gt;&lt;br /&gt;Anyway, the book follows generally the Spring Web Flow documentation. The question is how much more value does the book add compared to the reference documentation. Overall, I have a quite conflicted opinion about this book. I think, if you are interesting in JSF integration or the bulk of the additionally discussed technologies (E.g. Spring JavaScript), then this book may add enough information for you. It certainly provides some useful information regarding Spring Web Flow 2.0.&lt;br /&gt;&lt;br /&gt;Unfortunately, it contains quite a few inconsistencies and it is overall not an easy read. However, it is the only currently available book dealing with Spring Webflow 2.0. On Amazon, I gave the book 2 out of 5 stars.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1435993180554935181?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1435993180554935181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1435993180554935181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1435993180554935181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1435993180554935181'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/06/book-review-spring-web-flow-2-web.html' title='Book Review: Spring Web Flow 2 Web Development'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1835539018740210136</id><published>2009-06-03T03:00:00.002-04:00</published><updated>2009-06-03T07:04:19.064-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='book review'/><title type='text'>Book Review: Learning Flex 3</title><content type='html'>&lt;a href="http://www.amazon.com/Learning-Flex-Internet-Applications-Developer/dp/0596517327/"&gt;Learning Flex 3&lt;/a&gt; by &lt;a href="http://www.oreillynet.com/pub/au/3268"&gt;Alaric Cole&lt;/a&gt; is a great introductory book for &lt;a href="http://www.adobe.com/products/flex/"&gt;Adobe Flex 3&lt;/a&gt;. If you have some basic experience with &lt;a href="http://en.wikipedia.org/wiki/HTML"&gt;HTML&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Javascript"&gt;JavaScript&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Css"&gt;CSS&lt;/a&gt;, then you will learn the basics of Flex rapidly using this book as a guide. Some of the areas that are taught are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How to use &lt;a href="http://www.adobe.com/products/flex/features/flex_builder/"&gt;Flexbuilder&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Using &lt;a href="http://en.wikipedia.org/wiki/MXML"&gt;MXML&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ActionScript"&gt;ActionScript&lt;/a&gt; 3&lt;/li&gt;&lt;li&gt;Styling your application using CSS&lt;/li&gt;&lt;/ul&gt;However, if your professional background is in web-application development using Java or other &lt;a href="http://en.wikipedia.org/wiki/Object_oriented"&gt;OO&lt;/a&gt; languages, then you are probably more likely to skip or cross-read sections of the book. This is because the book  starts out with practically no initial pre-requirements, and thus you might be familiar with some of the discussed areas.&lt;br /&gt;&lt;br /&gt;The book gave me an excellent overview of Flex's capabilities, and they are all explained thoroughly and are easily understandable. Also, this may sound silly, but I particularly liked the refreshing fact that the book is in color, unlike most other IT books.&lt;br /&gt;&lt;br /&gt;Furthermore, the book explained Data Binding (Chapter 7) very well. This is something I was not familiar with coming from the Java world. The chapter illustrates the concepts of one-way binding, two-way binding and making your own variables “bindable” using a metadata declaration, which is basically an &lt;a href="http://en.wikipedia.org/wiki/Java_annotation"&gt;annotation in Java&lt;/a&gt; parlance.&lt;br /&gt;&lt;br /&gt;Another feature I liked a lot was View States (Chapter 12), which allows you to rearrange, group and reuse components within your application.&lt;br /&gt;&lt;br /&gt;I wish the book provided more information for further reading. I understand that certain concepts are beyond the scope of this book, but it would have been nice if those had been mentioned and links or recommendations for further reading were provided.&lt;br /&gt;&lt;br /&gt;For example, while &lt;a href="http://en.wikipedia.org/wiki/Action_Message_Format"&gt;AMF&lt;/a&gt; is mentioned on page 8 and on page 157 the book briefly talks about the Webservice and RemoteObject component, the book should have also mentioned &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS"&gt;BlazeDS&lt;/a&gt; as one of Flex's core technologies for communicating with back-end servers.&lt;br /&gt;&lt;br /&gt;And for more complex applications, the book could have at least pointed out some of the available MVC frameworks for Flex and some pointers of where to read more about them (E.g. &lt;a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm"&gt;Cairngorm&lt;/a&gt; and &lt;a href="http://puremvc.org/"&gt;PureMVC&lt;/a&gt;). Well, and then there is &lt;a href="http://www.degrafa.org/"&gt;Degrafa&lt;/a&gt;, the declarative graphics framework…&lt;br /&gt;&lt;br /&gt;While the author explains the aspects of using CSS in Flex applications very well, he could have further stressed that Flex uses a subset of CSS, which in certain areas behaves differently compared to CSS you more typically use in HTML pages. He should have enumerated some of those pitfalls.&lt;br /&gt;&lt;br /&gt;Having said all this, these issues mentioned above are minor in nature. Overall, the book was a fun read! And particularly to Java web-developers, Flex may very well be THE contender for application user interfaces moving forward. One of the great things about Flex is that even the standard components look very good (and should be good enough to please your boss), and your application looks and behaves consistently across various browsers. Oh, and yes you can run the same application on the desktop as well (Chapter 15).&lt;br /&gt;&lt;br /&gt;This book will definitely help you learn and master  Flex, and you should be able to produce functional user interfaces quickly. In order to learn more about integrating Flex with your Spring powered back-end you may want to also consider looking at “&lt;a href="http://www.amazon.com/Flex-Spring-Experts-Voice-Development/dp/1430218355"&gt;Pro Flex on Spring&lt;/a&gt;”.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1835539018740210136?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1835539018740210136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1835539018740210136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1835539018740210136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1835539018740210136'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/06/book-review-learning-flex-3.html' title='Book Review: Learning Flex 3'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-3913144757848597019</id><published>2009-05-14T09:45:00.000-04:00</published><updated>2009-05-14T12:52:35.982-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>JavaRebel + m2eclipse = Sweet Spot</title><content type='html'>One of the pain-points while developing Java-based web-applications  is the issue of the &lt;span style="font-style: italic;"&gt;bouncing server&lt;/span&gt;. Every time you change a class file, your web application context needs a restart. While this is mildly annoying for small applications, it is simply unbearable for anything more substantial.&lt;br /&gt;&lt;br /&gt;As far as I now the best and cheapest solution so far has been to use &lt;a href="http://www.myeclipseide.com/"&gt;MyEclipse&lt;/a&gt;. It worked great and I rarely had to restart web contexts.&lt;br /&gt;&lt;br /&gt;I always wondered why the standard IDEs (E.g. plain &lt;a href="http://www.eclipse.org/webtools/"&gt;Eclipse WTP&lt;/a&gt;, &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt; ) never solved that re-deployment issue. Well, at least I have not been able to get this sufficiently working in plain Eclipse+WTP or IDEA IntelliJ.&lt;br /&gt;&lt;br /&gt;Unfortunately, with the advent of &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;, MyEclipse started to loose come of its charm. For years, they were not able to provide an acceptable Maven integration (There was an entry on their forum for years demanding that feature) and on the other side, WTP started to become usable (I have not really tested the Maven integration introduced with MyEclipse 7 but I have read, that it is still not perfect). But one thing, that MyEclipse had nonetheless going for it, were its hot deployment capabilities.&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://www.zeroturnaround.com/"&gt;ZeroTurnaround&lt;/a&gt;'s &lt;a href="http://www.zeroturnaround.com/javarebel/"&gt;JavaRebel&lt;/a&gt;. Four weeks ago I started looking at JavaRebel and have been using it for the development of my OSS project since then. My verdict: It is awesome.&lt;br /&gt;&lt;br /&gt;I use it in conjunction with the m2eclipse plugin and it simply works. ZeroTurnaround provides guides regarding the Eclipse and Maven integration (&lt;a href="http://www.zeroturnaround.com/javarebel/configuration/maven/"&gt;here&lt;/a&gt; and &lt;a href="http://www.zeroturnaround.com/javarebel/installation/"&gt;here&lt;/a&gt;) that are fairly straigtforward. It also comes with support for Spring and Struts2 directly.&lt;br /&gt;&lt;br /&gt;The nice thing about JavaRebel is that it is agnostic to the used IDE as it simply hooks into the JVM as a Java agent. Therefore, you probably could also easily use it from the command line (in case you like to code using VI :-).&lt;br /&gt;&lt;br /&gt;One drawback is the &lt;a href="http://sales.zeroturnaround.com/"&gt;price&lt;/a&gt; which makes JavaRebel more expensive than &lt;a href="http://www.myeclipseide.com/index.php?module=htmlpages&amp;amp;func=display&amp;amp;pid=1"&gt;MyEclipse&lt;/a&gt;. On the other hand, there is not much in MyEclipse that you cannot have in plain Eclipse/WTP using free plugins. Thus, ultimately it may boil down to personal preference but to me JavaRebel with plain Eclipse WTP (or IntelliJ for that matter) is the much nicer package. And if you have a project with an OSS license you can get JavaRebel for free, and don't have to buy MyEclipse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-3913144757848597019?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/3913144757848597019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=3913144757848597019' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3913144757848597019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3913144757848597019'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/05/javarebel-m2eclipse-sweet-spot.html' title='JavaRebel + m2eclipse = Sweet Spot'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-4621635993848108630</id><published>2009-05-08T00:56:00.002-04:00</published><updated>2009-05-08T01:03:31.411-04:00</updated><title type='text'>Vi on a fresh Ubuntu installation - issue</title><content type='html'>I am in the process of setting up &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 9.04 on my &lt;a href="http://www.linode.com/"&gt;Linode&lt;/a&gt; instance. Looks like &lt;a href="http://en.wikipedia.org/wiki/Vi"&gt;Vi&lt;/a&gt; was behaving screwy (Keys did not work as expected). Luckily there is Google and the &lt;a href="http://ubuntuforums.org/showthread.php?t=449784"&gt;following link&lt;/a&gt; helped.&lt;br /&gt;&lt;br /&gt;I created a &lt;span style="font-weight: bold;"&gt;.vimrc&lt;/span&gt; file in my home directory:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;vi ~/.vimrc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and added the following line to it:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;set nocompatible&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That worked for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-4621635993848108630?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/4621635993848108630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=4621635993848108630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4621635993848108630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4621635993848108630'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/05/vi-on-fresh-ubuntu-installation-issue.html' title='Vi on a fresh Ubuntu installation - issue'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7777124712356862098</id><published>2009-04-28T00:55:00.002-04:00</published><updated>2009-04-28T01:09:11.262-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='smtp'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Postfix relay messages to different port</title><content type='html'>A frequent occurrence in applications is to send out emails. In order to test that behavior sufficiently during development, I usually use one of two options. On Windows you can use &lt;a href="http://tedorg.free.fr/en/projects.php?section=mailster"&gt;Mailster&lt;/a&gt; (preferred) or you can use &lt;a href="http://www.postfix.org/"&gt;postfix&lt;/a&gt; etc. on Mac/Linux (Have not been able to get Mailster going on my Mac)&lt;br /&gt;&lt;br /&gt;So far on my Mac until recently it was as easy as to simply do: &lt;span style="font-weight: bold; font-style: italic;"&gt;sudo postfix start&lt;/span&gt; and I was good to go. Unfortunately, my domain hoster does not accept mail on &lt;span style="font-weight: bold;"&gt;port 25&lt;/span&gt; anymore. And the simple relay stopped working.&lt;br /&gt;&lt;br /&gt;As it turns out though, you can easily relay to a different port (My hoster accepts port 26):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;sudo vi /etc/postfix/main.cf&lt;/span&gt;&lt;br /&gt;I added a line (near # INTERNET OR INTRANET):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;relayhost = myHost.com:26&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And finally I reloaded my postfix configuration using &lt;span style="font-style: italic; font-weight: bold;"&gt;sudo postfix reload&lt;/span&gt; and I was back in business once again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-7777124712356862098?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/7777124712356862098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=7777124712356862098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7777124712356862098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/7777124712356862098'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/04/postfix-relay-messages-to-different.html' title='Postfix relay messages to different port'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-3202741573518905696</id><published>2009-04-01T02:25:00.001-04:00</published><updated>2009-04-01T02:25:00.933-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='jdbc'/><title type='text'>Woes with Oracle's Jdbc Driver and BigDecimal</title><content type='html'>As other people &lt;a href="http://arhipov.blogspot.com/2008/12/oracle-10g-jdbc-driver-and.html"&gt;before me noticed&lt;/a&gt;, Oracle seems to have issues with BigDecimals. Well, I hit one of those issues today:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BigDecimal.valueOf(0.000000548) became 0.000000538 in the database&lt;/li&gt;&lt;li&gt;new BigDecimal("0.000000548") became 0.000000538 in the database&lt;/li&gt;&lt;li&gt;persisting a plain String "0.000000548" worked fine however&lt;/li&gt;&lt;li&gt;new BigDecimal("0.000000458") became 0.000000448 in the database&lt;/li&gt;&lt;/ul&gt;The table column, to which the values were saved, had plenty of "scale'n'precision".&lt;br /&gt;The issue occurred in Oracle's JDBC driver version 10.2.0.1.0. Luckily, after upgrading the drivers to version 10.2.0.4.0 the problems went away.&lt;br /&gt;&lt;br /&gt;This is by itself an amazing issue - Just imagine, you were running a larger financial app. You may not even notice this subtle issue until your app is long in production. Oh well...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-3202741573518905696?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/3202741573518905696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=3202741573518905696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3202741573518905696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/3202741573518905696'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/04/woes-with-oracles-jdbc-driver-and.html' title='Woes with Oracle&apos;s Jdbc Driver and BigDecimal'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5178162656496464282</id><published>2009-03-28T16:00:00.002-04:00</published><updated>2009-03-28T16:27:31.232-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus Report Part 2</title><content type='html'>In &lt;a href="http://hillert.blogspot.com/2009/03/devnexus-2009-report-part-1.html"&gt;part one&lt;/a&gt; I provided an overview of attended DevNexus sessions. Here are some more details I took away from the presentations. The first days of the conference started out with Neil Ford, who always seems to provide those excellent but more high-level-off-the-beaten-path-type presentations (The presentation certainly contained an interesting Angelina Jolie picture). In his presentation he talked mainly about a quality work environment and how to be more productive as a developer. In his opinion giving developers their own office would be the best as it allows them to fully concentrate on the given development tasks. If that is not feasible and you're not working for &lt;a href="http://www.joelonsoftware.com/"&gt;Joel&lt;/a&gt;, then an open room configuration is the next-best compromise. And finally the worst solution: cubicles. Those suckers simply slurp your brain dry…&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_A3zK3AEsRRU/Sc2h3EYxnOI/AAAAAAAABzk/dj1f-4VyVWc/s1600-h/devnexus_300.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_A3zK3AEsRRU/Sc2h3EYxnOI/AAAAAAAABzk/dj1f-4VyVWc/s400/devnexus_300.jpg" alt="" id="BLOGGER_PHOTO_ID_5318084702436957410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well, afterward I headed over to Ari Zilka's talk about &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt;. He gave an overview/introduction of Terracotta's capabilities.  The presentation was quite similar to the talk we had at our monthly AJUG meeting last year but since then Terracotta published a new reference web application (&lt;a href="http://www.terracotta.org/web/display/orgsite/Web+App+Reference+Implementation"&gt;Examinator&lt;/a&gt;) that really looks sharp and consist of a very good technology stack besides the fact that it uses Terracotta:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  Spring MVC&lt;/li&gt;&lt;li&gt;  Spring Webflow&lt;/li&gt;&lt;li&gt;  Spring Security&lt;/li&gt;&lt;li&gt;  JPA (Hibernate)&lt;/li&gt;&lt;li&gt;  FreeMarker&lt;/li&gt;&lt;li&gt;  SiteMesh&lt;/li&gt;&lt;li&gt;MySQL&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;One example he gave that stuck with me quite well, was the typical email registration process, when signing up for a new user account. You provide an email address, but before the account can be activated, you need to verify the email address using a verification email. However, using Terracotta, you're able to defer saving the email to the database until verification is complete and thus you can keep "state" information out of the database.&lt;br /&gt;&lt;br /&gt;Afterward, I listened to Charlie Hubbard's talk on &lt;a href="http://www.gridgain.com/"&gt;GridGain&lt;/a&gt;. This was an interesting talk in that GridGain is tackling distributed computing from a different angle than Terracotta. You are basically using it to farm out little chunks of data that are then processed by those nodes. It feels very reminiscent to using JMS with Publish/Subscribe with some processing logic bolted on.&lt;br /&gt;&lt;br /&gt;After this talk I attended Bill Burke's talk on REST. It is interesting how various frameworks converge to a common point these days - RestEasy looked like &lt;a href="http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/"&gt;Spring MVC 3.0&lt;/a&gt; :-)&lt;br /&gt;&lt;br /&gt;The last talk I visited was on Jared's Richardson's talk on 'using agile to optimize' which was a good talk. It reminds me that I still need to read his book &lt;a href="http://www.amazon.com/Practical-Guide-Successful-Software-Projects/dp/0974514047/"&gt;Ship It!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At the end of the day we all headed down to the bar and had a few drinks. I met a former colleque of mine and chatted a while with Charlie Hubbard and Lance Gleason. A long good day…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5178162656496464282?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5178162656496464282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5178162656496464282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5178162656496464282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5178162656496464282'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/devnexus-report-part-2.html' title='DevNexus Report Part 2'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_A3zK3AEsRRU/Sc2h3EYxnOI/AAAAAAAABzk/dj1f-4VyVWc/s72-c/devnexus_300.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-4347357020686251467</id><published>2009-03-26T02:15:00.002-04:00</published><updated>2009-03-26T02:15:01.028-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>RIA, Flex and Excitement</title><content type='html'>I cannot believe that already two weeks passed by since the Atlanta &lt;a href="http://www.devnexus.com/"&gt;DevNexus&lt;/a&gt; conference. Since then I have been quite busy learning &lt;a href="http://www.adobe.com/devnet/flex/"&gt;Flex&lt;/a&gt;. My desire to explore Flex started back when &lt;a href="http://www.jamesward.com/"&gt;James Ward&lt;/a&gt; talked at one of our &lt;a href="http://www.ajug.org/"&gt;AJUG&lt;/a&gt; meetings several months ago. Unfortunately,  beyond some initial explorations, I never found the time to make the next leap forward.&lt;br /&gt;&lt;br /&gt;The presentations at the DevNexus conference, though,  finally pushed me beyond that initial hump. At the conference I attended the talks for &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt;, &lt;a href="http://javafx.com/"&gt;JavaFX&lt;/a&gt; and Flex. Here is what I took away from it:&lt;br /&gt;&lt;br /&gt;No doubt, GWT looks great and I think it is in the process of capturing a good share of the pie among Java developers. Since you write the GUI using Java (Compiled into JavaScript), it is a really nice component-based Framework (forget JSF). The ability to unit test your GUI code with just jUnit is cool, too. Something I was not aware of prior to attending DevNexus is the ability to also embed GWT into existing applications (e.g. a DIV on a page). However, at the end of the day you're still creating HTML with its limitations in terms of richness.&lt;br /&gt;&lt;br /&gt;In terms of that, JavaFX has potential in my opinion. While it comes with its own scripting language you are still able to use the the full breath of exisitng Java libraries. Unfortunately, JavaFX does not seem to be there, yet. While some of the example application look nice, it still lacks some important pieces, e.g. lots of standard components. At the end of the day, most developers are building business apps and thus need standard components for datagrids, charting etc.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_A3zK3AEsRRU/Scof6GMVRGI/AAAAAAAABe4/GYh_BC-PgPE/s1600-h/Yakov+Fain+at+DevNexus+2009.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_A3zK3AEsRRU/Scof6GMVRGI/AAAAAAAABe4/GYh_BC-PgPE/s200/Yakov+Fain+at+DevNexus+2009.jpg" alt="" id="BLOGGER_PHOTO_ID_5317097393019503714" border="0" /&gt;&lt;/a&gt; This was also one of the key complaints Yakov Fain (See picture) made at his DevNexus presentation which gave the audience an overview of various RIA technologies. (Another perspective on the JavaFX was posted by Javalobby: &lt;a href="http://www.teamlalala.com/blog/2009/03/18/where-in-the-world-is-javafx/"&gt;Where in the world is JavaFX&lt;/a&gt;?)&lt;br /&gt;&lt;br /&gt;And therefore, by the end of the conference I was mostly convinced that Adobe Flex is the best technology &lt;span style="font-weight: bold;"&gt;at the moment&lt;/span&gt; for delivering rich internet applications. Don't get me wrong, I still hope that JavaFX can make it and maybe &lt;a href="http://online.wsj.com/article/SB123735970806267921.html"&gt;IBM&lt;/a&gt; fancies with the idea of becoming a player in that area and provides some more resources once &lt;a href="http://en.wikipedia.org/wiki/Blue_Sun"&gt;BlueSun&lt;/a&gt; is born.&lt;br /&gt;&lt;br /&gt;Nevertheless, once the conference was over, I made the decision to take the Flex deep dive. I mostly finished reading &lt;a href="http://oreilly.com/catalog/9780596517328/"&gt;Learning Flex 3&lt;/a&gt; and I just started reading &lt;a href="http://www.amazon.com/Pro-Flex-Spring-Chris-Giametta/dp/1430218355"&gt;Pro Flex on Spring&lt;/a&gt;. For both books I am planning on publishing book reviews soon.&lt;br /&gt;&lt;br /&gt;As an example I am in the process of creating a simple Flex-based front-end (highly experimental) for &lt;a href="http://www.jrecruiter.org/"&gt;jRecruiter&lt;/a&gt; my open source project. So far I have setup the &lt;a href="http://www.springsource.org/spring-flex"&gt;Spring BlazeDS &lt;/a&gt;1.0M2 integration and I am pulling back job postings from the server using &lt;a href="http://en.wikipedia.org/wiki/Action_Message_Format"&gt;AMF&lt;/a&gt; and showing them in a data-grid component. Furthermore, I added &lt;a href="http://code.google.com/apis/maps/documentation/flash/tutorial-flex.html"&gt;Google Maps&lt;/a&gt; to the Flex application which works pretty neat. It gives you the ability to show job postings on a map (and thus helping you estimate possible morning commutes). I hope to have a deployed version available soon. In the meantime, here is an early screen-shot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_A3zK3AEsRRU/Scr3NL59tfI/AAAAAAAABfA/-IAHBuvxrKw/s1600-h/jrecruiter-flex_screen.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 261px;" src="http://2.bp.blogspot.com/_A3zK3AEsRRU/Scr3NL59tfI/AAAAAAAABfA/-IAHBuvxrKw/s320/jrecruiter-flex_screen.png" alt="" id="BLOGGER_PHOTO_ID_5317334115970561522" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-4347357020686251467?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/4347357020686251467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=4347357020686251467' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4347357020686251467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/4347357020686251467'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/ria-flex-and-excitement.html' title='RIA, Flex and Excitement'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_A3zK3AEsRRU/Scof6GMVRGI/AAAAAAAABe4/GYh_BC-PgPE/s72-c/Yakov+Fain+at+DevNexus+2009.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-8381276972762678995</id><published>2009-03-16T07:42:00.004-04:00</published><updated>2009-03-16T07:56:11.871-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus Audio Files Available Now</title><content type='html'>Originally we did not plan on recording the sessions during DevNexus 2009, but thanks to the help of Stephen Davis we are able to provide recordings of ten presentations. The quality could be better but I think the presenter is mostly intelligible. The recordings are available &lt;a href="http://www.devnexus.com/download.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-8381276972762678995?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/8381276972762678995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=8381276972762678995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8381276972762678995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/8381276972762678995'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/devnexus-audio-files-available-now.html' title='DevNexus Audio Files Available Now'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-6673504008568317490</id><published>2009-03-13T22:32:00.006-04:00</published><updated>2009-03-13T23:42:38.542-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='devnexus'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus 2009 Report Part 1</title><content type='html'>More than half a year of preparation finally culminated in the &lt;span style="font-style: italic;"&gt;grande finale&lt;/span&gt; from March 10 to 11 at the &lt;a href="http://www.devnexus.com/"&gt;DevNexus&lt;/a&gt; conference. The result was in my opinion a great success. We received many emails from speakers and attendees alike, commenting on the very good quality of the DevNexus conference. This was the biggest event that I helped organizing, yet. I already have a few ideas and areas of improvement for DevNexus 2010. But that is subject of a future blog post…&lt;br /&gt;&lt;br /&gt;Overall, I truly enjoyed the speaker line-up. Here are the presentations I attended:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;March 10&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;On the Lam from the Furniture Police by &lt;span style="font-weight: bold;"&gt;Neil Ford&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Terracotta - Real Apps, Real Frameworks, Real Use Cases by &lt;span style="font-weight: bold;"&gt;Ari Zilka&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Introduction to Grid based computing with GridGain by &lt;span style="font-weight: bold;"&gt;Charlie Hubbard&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Scaling RESTful Services with JAX-RS by &lt;span style="font-weight: bold;"&gt;Bill Burke&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Software Teams Tuneup: Using Agile to Optimize by &lt;span style="font-weight: bold;"&gt;Jared Richardson&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Scaling Hibernate: tips, recipes and new perspectives by &lt;span style="font-weight: bold;"&gt;Emmanuel Bernard&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;March 11&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;JavaFX: The Platform for Rich Internet Applications by &lt;span style="font-weight: bold;"&gt;Doris Chen&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Picking the right technology for the Rich Internet Application by &lt;span style="font-weight: bold;"&gt;Yakov Fain&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;GWT by &lt;span style="font-weight: bold;"&gt;Bruce Johnson&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Developing Modular Web Applications with Spring 3.0 by &lt;span style="font-weight: bold;"&gt;Keith Donald&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Automatic generation of Flex/Java CRUD applications by &lt;span style="font-weight: bold;"&gt;Yakov Fain&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;By the way the slides are available &lt;a href="http://www.devnexus.com/download.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I will try to provide some more details and impressions about the attended talks in the next few days. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-6673504008568317490?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/6673504008568317490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=6673504008568317490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6673504008568317490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6673504008568317490'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/devnexus-2009-report-part-1.html' title='DevNexus 2009 Report Part 1'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-6276760914372627246</id><published>2009-03-13T02:00:00.002-04:00</published><updated>2009-03-13T07:20:28.059-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus 2009 Presentation Slides Available</title><content type='html'>This evening I uploaded a whole bunch of presentations from DevNexus 2009, the Atlanta developer conference. The majority of the talks is now available at: &lt;a href="http://www.devnexus.com/download.html"&gt;http://www.devnexus.com/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope that within the next couple of days, we will be able to make the remaining presentations available as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-6276760914372627246?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/6276760914372627246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=6276760914372627246' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6276760914372627246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6276760914372627246'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/devnexus-2009-presentation-slides.html' title='DevNexus 2009 Presentation Slides Available'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5796441354992947112</id><published>2009-03-12T01:20:00.000-04:00</published><updated>2009-03-12T01:20:00.291-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='I18N'/><title type='text'>I18N your Java Web Application</title><content type='html'>I went through the exercise of internationalizing (&lt;a href="http://en.wikipedia.org/wiki/Internationalization"&gt;I18N&lt;/a&gt;) my &lt;a href="http://www.jrecruiter.org/"&gt;home project&lt;/a&gt;. It is still work in progress but I added support for German in most places. Unfortunately, I got a bit bitten by the fact that by default properties files in Java have to be encoded in  &lt;a href="http://en.wikipedia.org/wiki/ISO/IEC_8859-1" title="ISO/IEC 8859-1"&gt;ISO-8859-1&lt;/a&gt;. Up to today, all web applications I helped developing, were created for an English speaking target audience, and therefore, even though they often used properties files, they never went beyond the standard character set.&lt;br /&gt;&lt;br /&gt;Interestingly, though, if you like using typographically correct characters like the &lt;a href="http://en.wikipedia.org/wiki/Ellipsis"&gt;ellipsis&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Quotation_mark"&gt;quotation marks&lt;/a&gt;, you would run into the same issue. For that reason alone I think everything (Your JSP files, server, database, source code etc. should all be able to handle &lt;a href="http://en.wikipedia.org/wiki/UTF-8"&gt;UTF-8&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Nevertheless, the limitation that properties files by default are not cannot be in UTF-8 is quite annoying, as it would require you to escape special non-ISO-8859-1 characters or use a conversion tools such as &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/windows/native2ascii.html"&gt;native2ascii&lt;/a&gt;. This &lt;a href="http://bordet.blogspot.com/2007/01/utf-8-handling-for-resourcebundle-and.html"&gt;blog post&lt;/a&gt; summarizes the general issue nicely.&lt;br /&gt;&lt;br /&gt;For my project I am using Struts 2.1. By default it does not allow for UTF-8 based message resources. Since Java 6 introduced support for creating a &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.Control.html"&gt;custom loader&lt;/a&gt; when accessing resource bundles, I was looking into ways of maybe extending Struts 2. Well, it looks like Struts 2 does neither allow a custom &lt;span style="font-style: italic;"&gt;ResourceBundle Control&lt;/span&gt; nor for easy patching of Struts itself. See also: &lt;a href="https://issues.apache.org/struts/browse/WW-2774"&gt;https://issues.apache.org/struts/browse/WW-2774&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nevertheless, even though Struts 2.1 improved substantially compared to Struts 2.0.x, I am still debating whether long-term Spring MVC (Especially Spring MVC 3.0) might represent a better choice—With Spring 2.5+ both web frameworks are certainly getting &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; similar. The nice thing about Spring (Core) is, that it provides the &lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/context/support/ReloadableResourceBundleMessageSource.html"&gt;ReloadableResourceBundleMessageSource&lt;/a&gt; which provides exactly what was looking for:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;bean id="messageSource"&lt;br /&gt;  class="org.springframework.context.support.ReloadableResourceBundleMessageSource"&amp;gt;&lt;br /&gt;    &amp;lt;property name="basename" value="classpath:messages"/&amp;gt;&lt;br /&gt;    &amp;lt;property name="defaultEncoding" value="utf-8"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;Unfortunately, as mentioned above, it looks like there is not an easy pluggable way of convincing Struts 2's &lt;a href="http://struts.apache.org/2.1.2/struts2-core/apidocs/com/opensymphony/xwork2/TextProvider.html"&gt;textprovider&lt;/a&gt; to use Spring's messageSource implementation. As I am already using Spring MVC for some of my actions, I decided to use Spring's message tag &lt;spring:message code=""&gt;within my JSPs, I am not crazy about it, as I now mix different web-frameworks but it seems to work like a charm right now.&lt;br /&gt;&lt;br /&gt;Two last questions to answer are:&lt;br /&gt;&lt;br /&gt;What is the best way to edit resource bundles using eclipse?&lt;br /&gt;How do ou structure your resource bundles without loosing track of things?&lt;br /&gt;&lt;br /&gt;After searching the web for a while, I finally settled for &lt;a href="http://sourceforge.net/projects/eclipse-rbe/"&gt;Eclipse Resource Bundle Editor&lt;/a&gt;. It works quite nicely, I just wish something useful like this would be built into Eclipse by default.&lt;br /&gt;&lt;br /&gt;As for structuring the property files, I settled pretty much on a jsp-by-jsp structure. E.g. if I have a file &lt;span style="font-style: italic;"&gt;edit-settings.jsp&lt;/span&gt; and I want to customize the page title, then I create a resource bundle entry &lt;span style="font-style: italic;"&gt;jsp.edit-settings.title=My settings&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Similarily I deal with class files:&lt;br /&gt;&lt;br /&gt;class.AddUserAcion.success  = The user has been successfully registered.&lt;br /&gt;&lt;br /&gt;Just as additional information: I wonder, whether it might be a cool thing, to be able to structure properties files similar to Rails 2.2+. There is an interesting &lt;a href="http://railscasts.com/episodes/138-i18n"&gt;RailsCast&lt;/a&gt; available about how to do I18N in Ruby On Rails.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/spring:message&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5796441354992947112?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5796441354992947112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5796441354992947112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5796441354992947112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5796441354992947112'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/i18n-your-java-web-application.html' title='I18N your Java Web Application'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-6335227222447432156</id><published>2009-03-10T00:05:00.002-04:00</published><updated>2009-03-10T00:09:57.602-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><title type='text'>DevNexus is here—See you there!</title><content type='html'>Over half a year in the making and the &lt;a href="http://www.devnexus.com/"&gt;conference&lt;/a&gt; is finally here. The last preparations are done, the goody bags are stuffed (yesterday). Let's rock :-)&lt;br /&gt;&lt;br /&gt;Hope to see you there tomorrow!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-6335227222447432156?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/6335227222447432156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=6335227222447432156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6335227222447432156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/6335227222447432156'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/devnexus-is-heresee-you-there.html' title='DevNexus is here—See you there!'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-5032755413262187564</id><published>2009-03-08T21:28:00.002-04:00</published><updated>2009-03-08T21:36:57.728-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><title type='text'>Information Resource regarding Climate Change</title><content type='html'>While reading Thomas Friedman's &lt;a href="http://www.nytimes.com/2009/03/08/opinion/08friedman.html"&gt;latest column&lt;/a&gt; in the New York Times, he pointed out the blog of &lt;a href="http://en.wikipedia.org/wiki/Joseph_J._Romm"&gt;Joseph J. Romm&lt;/a&gt;, which you can find at &lt;a href="http://climateprogress.org/"&gt;http://climateprogress.org/&lt;/a&gt;. It is an interesting blog that summarizes the latest developments regarding climate change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-5032755413262187564?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/5032755413262187564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=5032755413262187564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5032755413262187564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/5032755413262187564'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/information-resource-regarding-climate.html' title='Information Resource regarding Climate Change'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-1740295919749683259</id><published>2009-03-06T02:20:00.003-05:00</published><updated>2009-03-06T02:20:00.924-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>jQuery UI and ThemeRoller</title><content type='html'>I use &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; quite extensively in my projects these days, but I kind of ignored jQuery UI for too long. The last two days, though, I finally got more into &lt;a href="http://jqueryui.com/"&gt;jQuery UI&lt;/a&gt;, after I was looking for a modal dialog component and realized that jQuery UI provides a very nice implementation by itself.&lt;br /&gt;&lt;br /&gt;I haven't done much directly with the available components (except the dialog component), but&lt;br /&gt;I was very much impressed about the way you download jQuery UI. They call it "&lt;a href="http://jqueryui.com/download"&gt;Build Your Download&lt;/a&gt;" which let's you pick and choose which components of jQuery UI you may want to use and it creates a customized download bundle for you.&lt;br /&gt;&lt;br /&gt;But substantially more impressive is "&lt;a href="http://jqueryui.com/themeroller/"&gt;ThemeRoller&lt;/a&gt;", which not only let's you select between various themes but also allows for editing  and creating new themes. All changes are applied right on the spot and once you're done you can include the theme in your customized jQuery UI download.&lt;br /&gt;&lt;br /&gt;From there I discovered that jQuery released a new CSS Framework called "jQuery UI CSS Framework". It looks quite promising and I wonder if it might be applicable for my &lt;a href="http://www.jrecruiter.org/"&gt;pet project&lt;/a&gt;. I certainly need to learn more about it...it would be nice if it could serve as the main CSS for my web application and therefore allow for easy theming of the application.&lt;br /&gt;&lt;br /&gt;Anyway the docs can be found at &lt;a href="http://docs.jquery.com/UI/Theming/API"&gt;http://docs.jquery.com/UI/Theming/API&lt;/a&gt; and the wiki pages are located at &lt;a href="http://jqueryui.pbwiki.com/jQuery-UI-CSS-Framework"&gt;http://jqueryui.pbwiki.com/jQuery-UI-CSS-Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is also a themeswitcher component available.&lt;br /&gt;&lt;a href="http://docs.jquery.com/UI/Theming/ThemeSwitcher"&gt;http://docs.jquery.com/UI/Theming/ThemeSwitcher&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lastly there is an &lt;a href="http://www.filamentgroup.com/lab/styling_buttons_and_toolbars_with_the_jquery_ui_css_framework/"&gt;interesting article&lt;/a&gt; on the blog of &lt;a href="http://www.filamentgroup.com/"&gt;filament group&lt;/a&gt;, one of the main sponsors of jQuery UI, about styling buttons and toobars.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1699950446304666715-1740295919749683259?l=hillert.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hillert.blogspot.com/feeds/1740295919749683259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1699950446304666715&amp;postID=1740295919749683259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1740295919749683259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1699950446304666715/posts/default/1740295919749683259'/><link rel='alternate' type='text/html' href='http://hillert.blogspot.com/2009/03/jquery-ui-and-themeroller.html' title='jQuery UI and ThemeRoller'/><author><name>Gunnar Hillert</name><uri>http://www.blogger.com/profile/12757936011493339624</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_A3zK3AEsRRU/TVDYrmnhhVI/AAAAAAAAF8o/GQY5ohreQ-c/s220/gunnar_hillert80x80.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1699950446304666715.post-7297418374725229094</id><published>2009-02-22T02:50:00.009-05:00</published><updated>2009-02-22T15:05:27.639-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJUG'/><category scheme='http://www.blogger.com/atom/ns#' term='atlanta'/><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>Résumé and Career Advice – A Panel Discussion</title><content type='html'>Last Tuesday at our monthly &lt;a href="http://www.ajug.org/"&gt;AJUG meeting&lt;/a&gt;, we had a panel discussion on what hiring managers are looking for in software developer candidates and what you can do to improve the odds to get hired.&lt;br /&gt;&lt;br /&gt;The panel consisted of:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;David Brooks - VP Technology at LexisNexis&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mike Nearman - Consultant&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Deran Ross - Partner at Enablus&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pat Baumgartner - Director of Sales at Anteo&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dion Deloof - President at Anteo (Moderator)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;In case you missed the presentation, the presentation was recorded and is available for download &lt;a href="http://www.ajug.org/confluence/display/AJUG/StayHiredNotFired"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It was an interesting event and the room was certainly packed. It looks like the recession is slowly hitting the IT job market here in Atlanta. There were a few more unemployed attendees than we had been accustomed to in the past. One question raised during the panel discussion was how the Atlanta job market for software developers looks like right now. The panelists thought that Atlanta, while not being perfect, is one of the stronger IT job markets in the US currently, and stressed that the situation is certainly not horrible. Prior to the start of the meeting one visiting company was actually actively looking for quite a few developers.&lt;br /&gt;&lt;br /&gt;Anyway, the panel discussion raised a few other interesting points providing valuable career advice, of which some was new to me and some was pretty much common sense, such as not to have a résumé consisting of more than two pages—Well, some time ago I was interviewing a candidate who provided an eight-page résumé…&lt;br /&gt;&lt;br /&gt;Some general résumé advice was that: Simple is better. Include your formal education but then show progression and growing responsibility on your résumé. Summarize your experience for specific projects. Don't put references onto your résumé. Also, references these days are a mere pro forma check  for the hiring company, important but less so.&lt;br /&gt;&lt;br /&gt;One aspect that the panel stressed more than once was to concentrate on the last five years of experience and to make sure that your career follows a holistic picture, meaning not to branch out into vastly different areas of expertise (E.g. one year I am a DBA, the other year a BA and yet another year I develop some code).&lt;br /&gt;&lt;br /&gt;Another question that was addressed was: How important is it to know the latest and greatest technology out there? It is more important to understand the business and get the job done. The panelists made the point that it is important for software developers to be able to provide a holistic software solution, to stay current more in a broader sense, and not follow the latest greatest hype.&lt;br /&gt;&lt;br /&gt;This also played into one of the later questions: Is it better to have a broad focus on technology or to learn a very specific set of technologies and do them really, really well instead? The panel certainly seemed to be more split on this question as the best approach depends on your career goals. It was mentioned that knowing a specific technology can be very advantageous either while it is still cutting edge (E.g. Adobe Flex) or at the tail end of the popularity curve (Ever heard of &lt;a href="http://en.wikipedia.org/wiki/Powerbuilder"&gt;PowerBuilder&lt;/a&gt;?), particularly when doing consulting. For more permanent long-term employment, this may not be as significant, however.&lt;br /&gt;&lt;br /&gt;A question from the audience was about which value do certifications have in regards to hiring candidates. All panel participants voiced the importance of experience over having certifications. Another point that was mentioned several times was the importance of soft-skills.  How well developed are your estimation skills? How do you handle and execute given tasks? How well do you understand the larger picture of your business and your customers?&lt;br /&gt;&lt;br /&gt;Also, when you are looking for jobs, don't necessarily trust the job description. Internal recruiters may use a canned job description or the job description may deviate quite a bit form the actual duties. Thus, always ask lots of questions and don't get discouraged by a bad job posting. It may be better than the posting indicates.&lt;br /&gt;&lt;br /&gt;When asked about contracting and the advantages and disadvantages of  Corp-to-Corp versus W2, the panel was not too excited about Corp-to-Corp contracting but they noted that as long as your corporation consists of just yourself you won't run into too many issues.&lt;br /&gt;&lt;br /&gt;Someone from the audience asked about current hot technologies. The panelists thought that while there are still good opportunities in custom software development, there are even better opportunities around business intelligence projects. They also thought that knowledge in JBPM, Rules Engines and AJAX are very useful.&lt;br /&gt;&lt;br /&gt;What I thought was interesting from my European perspective, was, that companies especially in the financial service industry may actually check your credit-score. Thus, don't plan on doing too many bankruptcies.&lt;br /&gt;&lt;br /&gt;Another member from the audience asked about how companies use social networking services in order to source candidates. The panel indicated that they are not paying too much attention to it but that it might be very useful to check out connections of a potential candid
