<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0YAR3Y8fip7ImA9WhBVEkk.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352</id><updated>2013-04-17T18:39:06.876-07:00</updated><category term="Roo" /><category term="sonar" /><category term="java 5 generics tutorial howto name value pair" /><category term="spring boilerplate convention configuration annotations" /><category term="javascript" /><category term="startup tips" /><category term="IWebMvc" /><category term="java spring mvc thread safe form controller" /><category term="Mozilla firefox fullscreen" /><category term="oss support projects deployment" /><category term="deploy dojo java web application" /><category term="acegi security jsp secure widgets authorize tag roles" /><category term="robot" /><category term="glassfish" /><category term="Dynamic Languages" /><category term="DWR validator Spring MVC javascript client side" /><category term="Webflow" /><category term="JPA Spring vs EBJ3 facade" /><category term="birt spring report engine design" /><category term="JavaRebel" /><category term="Alfresco" /><category term="IWebJTracker" /><category term="jawr" /><category term="PhoneGap" /><category term="dojo DWR paging table grid" /><category term="zeroTurnAround" /><category term="Spring Roo" /><category term="java accessors law demeter" /><category term="Ivy" /><category term="FishCAT" /><category term="Alfresco CMS WCM portal XForms" /><category term="Scala" /><category term="spring dwr configuration" /><category term="AJAX frameworks Dojo DWR" /><category term="spring dwr ajax generic validation" /><category term="oss money" /><category term="java spring mvc annotations url mapping interceptors simpleUrlMapping" /><category term="Java Spring AOP DWR Controller MultiActionController" /><category term="web performance" /><category term="spring" /><category term="wrap alfresco spring mvc" /><category term="java EE spring aop declarative security request scope concerns rolesallowed denyall permitall annotations" /><category term="AJAX dojo DWR Paging table Filteringtable" /><category term="hibernate spring statistics service JPA" /><category term="spring ear war ejb root application context share" /><category term="Spring AOP i18n internationalization aspect" /><category term="Web Framework Smackdown" /><category term="review" /><category term="java spring agile buildix cobertura qalab trac" /><category term="spring data binding property editor" /><category term="java JPA generics query queries" /><category term="Spring MVC DWR" /><category term="screenshots" /><category term="weblogic 10 add" /><category term="oss support" /><category term="javafx" /><category term="embedded" /><category term="WCM" /><category term="log4j runtime ndc spring" /><category term="bot" /><category term="java" /><category term="dwr sources" /><category term="RoundCube vs SquirrelMail comparison Alfresco JBoss Portal" /><category term="java spring aop logging interceptor annotations" /><category term="how-to" /><category term="BlackBerry" /><category term="Multi File Upload" /><category term="book" /><category term="concurrency" /><category term="Groovy" /><category term="preview" /><category term="gmaps4jsf" /><category term="java package classes howto" /><category term="Ruby" /><category term="Maven" /><category term="generics" /><category term="IWebMvc2" /><category term="mario" /><category term="quality" /><category term="java Spring annotations Bean internna code example" /><category term="DWR AJAX image converter javascript data:image/* IE" /><category term="testing" /><category term="release" /><category term="plugins" /><category term="Ant" /><title>Internna - Geared towards Open Source</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://internna.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://internna.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>104</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/InternnaOSS" /><feedburner:info uri="internnaoss" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEIAR3wzfCp7ImA9WhdRFU4.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-3807936374394774330</id><published>2011-08-04T11:36:00.000-07:00</published><updated>2011-08-05T02:29:06.284-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-05T02:29:06.284-07:00</app:edited><title>Step by step: Executable WAR files</title><content type="html">&lt;div style="text-align: justify;"&gt;Have you ever executed &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;? One of the most valued features it packs is the embedded &lt;a href="http://winstone.sourceforge.net/"&gt;Winstone&lt;/a&gt; servlet container. It allows your favorite CI server to be launched without being deployed to a traditional server (say Tomcat) first. Unfortunately Winstone is not a viable choice for everybody, particulary if the app makes use of the latest servlet/JSP features. Fortunately there are other choices.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://jetty.codehaus.org/jetty/"&gt;Jetty&lt;/a&gt; has always had a good reputation in this field. As of today &lt;a href="http://glassfish.java.net/"&gt;Glassfish&lt;/a&gt; and &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt; also offer solutions for this need. I'll focus on Jetty, basically because it's easy and it works. There are good articles around the net about the topic but no step by step tutorial so let's see all the tasks it takes one by one.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;First of all, an executable WAR file is no different from an executable JAR file. That means that it needs an entry in the MANIFEST file that points to the class that will be launched. In this case, the main class has to start the server and deploy the very same WAR file.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;The source of the class:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;public final class Launcher {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void main(String[] args) throws Exception {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int port = Integer.parseInt(System.getProperty("port", "8080"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Server server = new Server(port);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ProtectionDomain domain = Launcher.class.getProtectionDomain();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;URL location = domain.getCodeSource().getLocation();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WebAppContext webapp = new WebAppContext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;webapp.setContextPath("/");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;webapp.setWar(location.toExternalForm());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server.setHandler(webapp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server.start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server.join();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;The above class was copypasted from &lt;a href="http://eclipsesource.com/blogs/2009/10/02/executable-wars-with-jetty/"&gt;here&lt;/a&gt;. All credit is due to the original author. It's a clever tweak over the official documentation to point to the WAR file location.&lt;br /&gt;&lt;br /&gt;To compile, Maven needs to download the dependencies. Easy:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;jetty-server&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;7.3.0.v20110203&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;jetty-webapp&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;7.3.0.v20110203&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Notice the scope is set as &lt;i&gt;provided&lt;/i&gt;. This will later be explained. For now the class compiles so the next step is to add the MANIFEST entry. This is usually done using the &lt;i&gt;&lt;a href="http://maven.apache.org/shared/maven-archiver/examples/classpath.html#Make"&gt;maven-jar-plugin&lt;/a&gt;&lt;/i&gt; so a WAR file will use the equivalent &lt;i&gt;maven-war-plugin&lt;/i&gt;:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;2.1-beta-1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;archive&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;manifest&amp;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;&amp;lt;mainClass&amp;gt;Launcher&amp;lt;/mainClass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/archive&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Right now the WAR file can be executed....but it will fail miserably. There are two problems, first the compiled class is located inside WEB-INF (as all classes in a WAR file) and second Jetty dependencies are not present in the classpath yet.&lt;br /&gt;&lt;br /&gt;The next task is to move the &lt;i&gt;Launcher&lt;/i&gt; class to the root of the WAR (classloading behaves the same as a JAR file). Maven can't do this easily so Ant to the rescue.&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;maven-antrun-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;executions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;execution&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;main-class-placement&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;phase&amp;gt;prepare-package&amp;lt;/phase&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;configuration&amp;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;&amp;lt;tasks&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;move todir="${project.build.directory}/${project.artifactId}-${project.version}/"&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;fileset dir="${project.build.directory}/classes/"&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;include name="Launcher.class" /&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/fileset&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/move&amp;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;&amp;lt;/tasks&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;goals&amp;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;&amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/goals&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/execution&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The second task is to provide Jetty dependencies. Java does not support JARs-inside-JARs (or JARs-inside-WARs for the matter). The only option is to unzip the dependencies and again at the root of the WAR file (WEB-INF cannot be reached). Remember the scope of the Jetty dependencies from above! Another plugin will help with the task:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;2.3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;executions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;execution&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;jetty-classpath&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;phase&amp;gt;prepare-package&amp;lt;/phase&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;goals&amp;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;&amp;lt;goal&amp;gt;unpack-dependencies&amp;lt;/goal&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/goals&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;configuration&amp;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;&amp;lt;includeGroupIds&amp;gt;org.eclipse.jetty,javax.servlet&amp;lt;/includeGroupIds&amp;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;&amp;lt;excludeArtifactIds&amp;gt;jsp-api,jstl&amp;lt;/excludeArtifactIds&amp;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;&amp;lt;outputDirectory&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;${project.build.directory}/${project.artifactId}-${project.version}&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;lt;/outputDirectory&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/execution&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Right now the WAR can be executed using &lt;i&gt;java -jar name_of_the_project.war&lt;/i&gt;. Unfortunately, the user would notice this on first access, it lacks JSP support throwing a 500 error. To add it another dependency has to be included. This dependency does not need to be unpacked, it's readed from WEB-INF/lib as any other library.&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;jsp-2.1-glassfish&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;2.1.v20100127&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;And that would be it! That would be it if the WAR doesn't need to be deployed to Tomcat any more. Yes, adding that last dependency breaks JSP support in the most used servlet container. Sad. That forces even more work to prepare everything. There's no good solution to this problem, if the JAR is downloaded and copied the WAR will not be deployable otherwise it won't have JSP support. The best workaround is to conditionally add the dependency if the desired outcome is a standalone, distributable, file (so the development process is not affected). In Maven this is achieved using a specific profile. What does it mean in the end? Two things, some refactoring in the POM file (so the specific tasks required by Jetty are relocated inside the profile) and starting the Maven process with the &lt;i&gt;-P&lt;/i&gt; flag.&lt;br /&gt;&lt;br /&gt;And finally we are there! If you need a complete working example I've comitted the changes to &lt;a href="http://code.google.com/p/ossmoney"&gt;OSSMoney&lt;/a&gt; which was my original intent anyway (distributing something that end users could execute in their machines without any knowledge of the Java ecosystem).&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/_PgVCK9uz0A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/3807936374394774330/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=3807936374394774330" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/3807936374394774330?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/3807936374394774330?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/_PgVCK9uz0A/step-by-step-executable-war-files.html" title="Step by step: Executable WAR files" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2011/08/step-by-step-executable-war-files.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQBQ386fSp7ImA9WhdTF04.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-2551520107379058280</id><published>2011-07-15T05:34:00.000-07:00</published><updated>2011-07-15T05:52:32.115-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-15T05:52:32.115-07:00</app:edited><title>OSSMoney Milestone III</title><content type="html">&lt;div style="text-align: justify;"&gt;Today I'm going on vacation and hence I won't be working on the project for some time. I didn't want to leave without releasing something so I've packaged a WAR file and uploaded it to the repository (&lt;a href="http://code.google.com/p/ossmoney/"&gt;http://code.google.com/p/ossmoney/&lt;/a&gt;). I couldn't test it, even a little so I hope I didn't break anything important while adding some of the latest features. As always, in memory databases and no installer so it's meant for devs only.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Here's the list of changes since 0.2:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;The user can now edit several important entities like accounts or transactions&lt;/li&gt;&lt;li&gt;Transactions can be deleted aswell&lt;/li&gt;&lt;li&gt;Partial investment support (buy, sell, interest, manual price updates) with imports from MS Money&lt;/li&gt;&lt;li&gt;The user can request a backup of the data in QIF format&lt;/li&gt;&lt;li&gt;Several new administration screens&lt;/li&gt;&lt;li&gt;Bug fixes galore&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Known issues (I couldn't get them in time):&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A Dojo bug (&lt;a href="http://bugs.dojotoolkit.org/ticket/13401" target="_blank" style="color: rgb(17, 65, 112); "&gt;http://bugs.dojotoolkit.org/ticket/13401&lt;/a&gt;) renders TreeGrids unusable&lt;/li&gt;&lt;li&gt;Net worth only takes cash into account (investments are not added to the sum)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Wish list:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Some more reports (like spendings in a given category during some period)&lt;/li&gt;&lt;li&gt;Support other investment operations (though I personally don't use any more so...)&lt;/li&gt;&lt;li&gt;A better administration (better CRUD support for base entities like categories)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Anyway, OSSMoney 1.0 right now is nearly finished. I really hope for a September release. Enjoy!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/9BV5qUIS2yM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/2551520107379058280/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=2551520107379058280" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2551520107379058280?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2551520107379058280?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/9BV5qUIS2yM/ossmoney-milestone-iii.html" title="OSSMoney Milestone III" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2011/07/ossmoney-milestone-iii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08ASXo8fCp7ImA9WhZbE00.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-2820395189838671342</id><published>2011-06-17T02:59:00.000-07:00</published><updated>2011-06-17T03:17:28.474-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-17T03:17:28.474-07:00</app:edited><title>OSSMoney Milestone II achieved</title><content type="html">&lt;div style="text-align: justify;"&gt;I've been unable to progress as much as I would have liked with the project. Nonetheless, for the last couple of weeks I've been able to devote some time and improve things here and there. I've uploaded a new build to the &lt;a href="http://code.google.com/p/ossmoney/"&gt;project page&lt;/a&gt;. As always, it's not meant yet for end users but for fellow developers (in memory database and such things), just for evaluation, you know.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The list of changes for this version can be summarized in:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;Credit card account support&lt;/li&gt;&lt;li&gt;QIF file import from MS Money (bank &amp;amp; CC accounts)&lt;/li&gt;&lt;li&gt;Dashboard ported to Dojox Charting&lt;/li&gt;&lt;li&gt;Bills &amp;amp; remainders&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Things left for the (near) future:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Reporting&lt;/li&gt;&lt;li&gt;Investment accounts&lt;/li&gt;&lt;li&gt;Administration tasks (in particular allow edits)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;And the always useful batch of screenshots:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;The new dashboard&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/-lE43nxFChYk/TfsnvSuEwUI/AAAAAAAAAZ4/9Vo6LmTn0A4/s1600/dashboard.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 325px;" src="http://3.bp.blogspot.com/-lE43nxFChYk/TfsnvSuEwUI/AAAAAAAAAZ4/9Vo6LmTn0A4/s400/dashboard.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619128653507248450" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;The account details page&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-LDS6apTUmJY/Tfsn92Mk1UI/AAAAAAAAAaA/KOfTP6uu8GY/s1600/details.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 238px; " src="http://1.bp.blogspot.com/-LDS6apTUmJY/Tfsn92Mk1UI/AAAAAAAAAaA/KOfTP6uu8GY/s400/details.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619128903548589378" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;Creating a new recurring bill&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/-Ox-Vmtsbo8o/TfsoHEqsZUI/AAAAAAAAAaI/JrXHThkDJUQ/s1600/bill.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 180px; " src="http://2.bp.blogspot.com/-Ox-Vmtsbo8o/TfsoHEqsZUI/AAAAAAAAAaI/JrXHThkDJUQ/s400/bill.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5619129062051833154" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;But try it for yourself and report issues or enhancement requests. Hope you enjoy it!&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/z_UUC7Lu-IQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/2820395189838671342/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=2820395189838671342" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2820395189838671342?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2820395189838671342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/z_UUC7Lu-IQ/ossmoney-milestone-ii-achieved.html" title="OSSMoney Milestone II achieved" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-lE43nxFChYk/TfsnvSuEwUI/AAAAAAAAAZ4/9Vo6LmTn0A4/s72-c/dashboard.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2011/06/ossmoney-milestone-ii-achieved.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQAQnYyfCp7ImA9Wx9aFE0.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-5056526575442108369</id><published>2011-03-06T01:20:00.000-08:00</published><updated>2011-03-06T01:39:03.894-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-06T01:39:03.894-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="oss money" /><title>OSS money first developer build available</title><content type="html">&lt;div style="text-align: justify;"&gt;So after a month of development I finally have something to show beyond this screenshots:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-k9rIWxT2PKo/TXNSVw6faKI/AAAAAAAAAYY/obixQvUfqrE/s1600/ossmoney-details.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 150px;" src="http://4.bp.blogspot.com/-k9rIWxT2PKo/TXNSVw6faKI/AAAAAAAAAYY/obixQvUfqrE/s400/ossmoney-details.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5580894897103136930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-g6DbwqUYIG8/TXNSV0Yh8qI/AAAAAAAAAYQ/0viJNeO9EBs/s1600/ossmoney-account.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 149px;" src="http://2.bp.blogspot.com/-g6DbwqUYIG8/TXNSV0Yh8qI/AAAAAAAAAYQ/0viJNeO9EBs/s400/ossmoney-account.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5580894898034438818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-idPtlVdjsGE/TXNSVtLn65I/AAAAAAAAAYI/LplYU-Jmsqg/s1600/ossmoney-dashboard.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 316px;" src="http://3.bp.blogspot.com/-idPtlVdjsGE/TXNSVtLn65I/AAAAAAAAAYI/LplYU-Jmsqg/s400/ossmoney-dashboard.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5580894896101256082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The current build only works in Firefox AFAIK (I know it doesn't work in Chrome for sure). That's one of the cons of working with a beta of Dojo. Anyway, download it at &lt;a href="http://code.google.com/p/ossmoney/downloads/list"&gt;http://code.google.com/p/ossmoney/downloads/list&lt;/a&gt; and try it. It uses an in-memory database and it hasn't been thoroughly tested (and it isn't very error friendly!) so this is not meant for end users. It's just a build for fellow developers (may be someone likes it and decides to contribute to the project).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;To use it just deploy to Tomcat (or whatever), access &lt;a href="http://localhost:8080/ossmoney-dev.build.29"&gt;http://localhost:8080/ossmoney-dev.build.29&lt;/a&gt; (probably) and  login with jose/jose or register a new user (the username requires more then three letters!).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;After this one, I won't probably release any more binaries (till the final one) unless there's some interest in the project out there. After all, I can build my own version and preparing a release takes time (even one like this).&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/L-o2b2UK0RE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/5056526575442108369/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=5056526575442108369" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/5056526575442108369?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/5056526575442108369?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/L-o2b2UK0RE/oss-money-first-developer-build.html" title="OSS money first developer build available" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-k9rIWxT2PKo/TXNSVw6faKI/AAAAAAAAAYY/obixQvUfqrE/s72-c/ossmoney-details.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2011/03/oss-money-first-developer-build.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUBRHk6cCp7ImA9Wx9bEE4.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-1835598738890245739</id><published>2011-02-18T05:56:00.000-08:00</published><updated>2011-02-18T06:10:55.718-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-18T06:10:55.718-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="oss money" /><title>Introducing OSS Money</title><content type="html">&lt;div style="text-align: justify;"&gt;Do you like MS Money? I do. A lot. That's the main reason that saddened me when Microsoft decided to discontinue the product. There are several good free online alternatives but I don't like to trust my financial data to anybody but me and my bank. In the Open Source scene there's GNU Cash but...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;During the last year I contributed very very little to the OSS scene (just some code to Gmaps4JSF actually) so I decided that I had an itch and may be I should take the opportunity to do something about it.  So, without further delays, I've started a new project at Google Code, it's called OSS Money (tribute to the mentioned MS software), and it'll be an expense tracker and budget planner. Right now I've barely scratched the surface but I have something to share. Here's the desktop screen as of today (in Spanish with two currencies):&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-7jPmDASl9Ik/TV580pvyoOI/AAAAAAAAAYA/6pexQ6_PNXU/s1600/desktop.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 396px; height: 400px;" src="http://1.bp.blogspot.com/-7jPmDASl9Ik/TV580pvyoOI/AAAAAAAAAYA/6pexQ6_PNXU/s400/desktop.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5575030632732598498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;For those willing to help with the project, it's a multi-language Spring Roo application with a Dojo 1.6 frontend. Right now, I'm not going to provide binaries (very alpha status, feature wise) but checkout the code and let me know your impressions. Or open some issues if you have any ideas!&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/W_FIJ6XC-qo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/1835598738890245739/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=1835598738890245739" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1835598738890245739?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1835598738890245739?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/W_FIJ6XC-qo/introducing-oss-money.html" title="Introducing OSS Money" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-7jPmDASl9Ik/TV580pvyoOI/AAAAAAAAAYA/6pexQ6_PNXU/s72-c/desktop.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2011/02/introducing-oss-money.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QCSHs-fSp7ImA9Wx9VFko.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-3018312281861987565</id><published>2011-02-02T10:48:00.000-08:00</published><updated>2011-02-02T11:36:09.555-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-02T11:36:09.555-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Spring Roo" /><title>Test driving Spring Roo..for real</title><content type="html">&lt;div style="text-align: justify;"&gt;I had the oportunity to evaluate Spring Roo some time ago but I didn't actually use it in a project till recently. Today, after hours and hours of heavy I wanted to share some thoughts about the tool.&lt;br /&gt;&lt;br /&gt;First, it has some &lt;u&gt;AWESOME&lt;/u&gt; features:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;There's absolutely no way to create a project from scratch that packs a Spring context, Maven, a security solution, REST/MVC and persistence in less time. Everything is very well configured and just works, in a matter of seconds and four commands. Congrats here to the Roo team.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The @Configurable entities (ala Grails) are incredibly useful. Having an EntityManager injected in the model and predefined CRUD methods is invaluable.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;I liked&lt;ul&gt;&lt;li&gt;The environment. Both, the command line tool and the STS plugin. IDE integration surprised me, it's well rounded.&lt;/li&gt;&lt;/ul&gt;So-so things I found:&lt;ul&gt;&lt;li&gt;As mentioned, Roo is fast when creating a new project. It comes at a price though as your commitment with the Spring stack is absolute. Of course, this may be a non-issue for many people as of today.&lt;/li&gt;&lt;li&gt;Roo values Convention over Configuration and in such spirit it makes a lot of assumptions..on your behalf. I've found some of them questionable. For example, in a tool so focused on persistence, why is the authentication provider configured in memory by default? Of course, it works out-of-the-box, but I'm pretty sure that 99.99% of the users will change that. Roo creates a login page for me, great but I was expecting a DB authenticator in there (and User and Role classes!)&lt;/li&gt;&lt;li&gt;Controller scaffolding...yeah. It works and it's fine. It's just that a real application may look like the generated pages...or not. If not, and that seems to be my case all the time, it's not worth the effort. For a rush...a good addition!&lt;/li&gt;&lt;/ul&gt;But there are things that are &lt;u&gt;PLAIN WRONG&lt;/u&gt;:&lt;ul&gt;&lt;li&gt;Roo seems to take a reckless approach to programming. It's not what I would call an error friendly tool, not even by a far margin. Not that Roo fails by itself (seems quite robust in fact) but the user will undoubtedly do it. That's not actually an issue, everybody makes errors. The problem is how easily you can fix them. Any IDE basically provides an unlimited UNDO/REDO capability. Fixing something is a matter of pressing CRTL+Z in most cases.&lt;br /&gt;&lt;br /&gt;Things are not that easy with Roo, obviously because it lacks the UNDO command, but in more subtle ways aswell. The generated code cannot be touched (it will be overwritten time and again) and pretty much everything is generated (90% of the code is hidden to the user). And even if it could it would be a daunting task unless you're an expert in AspectJ syntax.&lt;br /&gt;&lt;br /&gt;Many many times, it's just better to delete the involved source files and restart the work. Do I have to mention how frustrating this can get? May be it's me, I'm so used to it that I don't really pay the due attention anymore but, lo and behold! check twice before clicking that Execute button with Roo&lt;/li&gt;&lt;/ul&gt;Will I give Roo the  seal of approval then? I'm afraid I won't this time. Right now, it's a fantastic tool to create a project. And good for the advanced architect. But this is not a tool for neophits (a resounding no!) and still needs some work in key areas. But I won't ditch it. It's worked quite well for me! But before diving into Roo just check your knowledge with Spring and AOP in general. Otherwise, Roo will create you more headaches than it will solve.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/AYdn_IeBmMA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/3018312281861987565/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=3018312281861987565" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/3018312281861987565?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/3018312281861987565?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/AYdn_IeBmMA/test-driving-spring-roofor-real.html" title="Test driving Spring Roo..for real" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://internna.blogspot.com/2011/02/test-driving-spring-roofor-real.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBR3s-fyp7ImA9Wx9SE00.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-3763495549331818189</id><published>2010-12-02T07:02:00.001-08:00</published><updated>2010-12-02T07:17:36.557-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-02T07:17:36.557-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title>Escaping Spring EL</title><content type="html">&lt;div style="text-align: justify;"&gt;Months without blogging and finally today I've found a reason to write something! It's the first time Spring has failed me big time!!! And doing a trivial task to boot!!!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Let's recapitulate, I'm trying to inyect a simple String property in a bean. The value I have to inyect is: #{fwk:path('/')}. Simple, huh? Well, not so much it seems. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Can you spot the problem right there? I'll help you a little. Spring 3.0 includes an expression language. Fine...if it weren't for the fact that it uses #{} as the expression delimiter. Of course, that can cause a lot of trouble because:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;It seems Spring lacks the ability to turn off the EL if you're not using it&lt;/li&gt;&lt;li&gt;It seems Spring lacks the ability to configure the pattern&lt;/li&gt;&lt;li&gt;It seems Spring lacks the ability to escape single quotes inside the expression&lt;/li&gt;&lt;li&gt;The documentation isn't stellar this time&lt;/li&gt;&lt;/ul&gt;In the end I was able to solve the problem. I'm showing you how, just inject this (it took me several approaches to find it so it's a little useful snippet I guess):&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;#{ '#{' }fwk:path('/')}&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Great, isn't it? Elegant, clear, concise...wow! Now...c'mon!!! Am I missing something here?? Either I've lost my mojo (just this time) or SpringSource has some room for improvement! Please, prove me wrong.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/jcKAWCIBdeg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/3763495549331818189/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=3763495549331818189" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/3763495549331818189?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/3763495549331818189?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/jcKAWCIBdeg/escaping-spring-el.html" title="Escaping Spring EL" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2010/12/escaping-spring-el.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkINQX88fSp7ImA9WxBQE0w.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-1519768007356956674</id><published>2010-01-12T08:44:00.000-08:00</published><updated>2010-01-12T09:49:50.175-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-12T09:49:50.175-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Roo" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title>Spring Roo..is it worthwhile?</title><content type="html">&lt;div style="text-align: justify;"&gt;It's no secret that attaching a well recognized brand to the name of a product (software or not) is a wonderful recipe to get some public attention. In my opinion, Spring Source (see) abuses it. It's not alone though, just take a look at Google's portfolio. Nonetheless, beyond the name (which I like), Roo looks like a little gem. It's like extracting some of the best parts of AppFuse (project kickstart) and Grails (scaffolding) and joining them in an unobtrusive tool. Let's see how it performs.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Obviously, it goes without saying, Roo shines in new projects as it will help mostly in the first stages of the development. Well, that was like saying that Roo will be specially interesting in a project using both Java and the Spring framework. Whatever...&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Let's begin creating a project from scratch then. After opening the command line tool (there's a plugin but I prefer to always use the command line at the beginning to ensure everything will build later on) the user just needs to type&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;code&gt;project --topLevelPackage &lt;i&gt;org.internna.test&lt;/i&gt;&lt;/code&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And Roo will take care of creating the folder structure of a valid Maven &lt;b&gt;web&lt;/b&gt; project. Include there the pom file and some sweeties like a fully preconfigured Spring environment and the logging system. Let me stress this, if Roo's only mission would be to help with project creation it couldn't do any better already. Just by doing the above, Roo is useful in any project using Spring. Of course, this includes a trade off, the defaults may not suit you but chances are that the changes you'll need to provide will be minimal (after all, they are, purportedly, best practices) and much less work than doing everything manually from scratch (try the &lt;code&gt;logging setup&lt;/code&gt; command). There's something that worries me more though and something important. The current approach is monolithic. Where is the multi-module support?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;At this point, I have to admit that I'm pretty glad with the decisions taken about third party products. Maven, JPA/Hibernate, the Spring suite, JSPs all fit my style and that's something I value. People from other environments may find this ecosystem exogenous.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We've seen it already but I will state it clearly here: Roo is a Code Generator. And I do it because I HATE code generators. I avoid them like a plague actually. When I hear the words code generation I flinch. And then? Well, Roo wraps to modes of code generation: passive (once and forever) and active (incremental). For now, I'll stick to the first one and let Roo generate and manage all those tedious configuration files (like, say, persistence.xml) while leaving more advance uses to the future..whenever I feel comfortable. You may not feel the same but beware that choosing the second model, while powerful, it also (tightly) binds the application to Roo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;One last thing that didn't really convince me was the way that Maven is handled. I'm not sure why I have to type &lt;code&gt;perform test&lt;/code&gt; instead of the usual &lt;code&gt;mvn test&lt;/code&gt;. Or why I must exit the tool to launch a &lt;code&gt;mvn tomcat:run&lt;/code&gt;. Obviously there's room for improvement in this area. The integration between both should be seamless.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;All in all, it gets the approval seal around here. There are some rough edges yet mainly in the Maven support. And, of course, all the active code generation area is something I need to evaluate very carefully. But it's a 1.0 version and I expect improvements. It's sad they dropped the multi-module support, that bit alone will heavily hamper the adoption for medium to large projects.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/HbgsRyK9KRA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/1519768007356956674/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=1519768007356956674" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1519768007356956674?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1519768007356956674?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/HbgsRyK9KRA/spring-roois-it-worthwhile.html" title="Spring Roo..is it worthwhile?" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://internna.blogspot.com/2010/01/spring-roois-it-worthwhile.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEEQnw9fCp7ImA9WxBSFUs.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-4815263061771793502</id><published>2009-12-22T23:11:00.000-08:00</published><updated>2009-12-23T02:03:23.264-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-23T02:03:23.264-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebMvc2" /><title>IWebMvc 2.0 GA release available</title><content type="html">&lt;div style="text-align: justify;"&gt;I couldn't hold it anymore! Spring 3.0 is out, Hibernate 3.5 on the way, the Spring Roo team has posted several release candiates already and JEE6 is finally here (even with a reference implementation). I was risking becoming obsolete right fom the start! And there was still a more important reason, &lt;b&gt;IWebMvc will apply to join the &lt;a href="http://dojofoundation.org/" target="new"&gt;Dojo Foundation&lt;/a&gt; in January&lt;/b&gt;. I needed something complete to show to the board of members and I wanted to start fresh at this new home (and I'm adventuring here because I don't really have any clue if it will pass vote).&lt;br /&gt;&lt;br /&gt;Nonetheless I had many tasks to complete. Several nasty bugs still existed in the final RC (many IE issues, the long-standing RememberMe bug, ...), there was no real documentation and the demo application wasn't really up to date (or working for that matter). In addition I wanted to include last minute features like XSS attack prevention, a revamped chart support based on Google Chart APIs (Dojo charting is more visually appealing but sooo slow)) or RSS feeds. Unfortunately, I had to prune things in the process and the JasperReports support got the axe (I wasn't happy with the end result and it wasn't really useful for anyone).&lt;br /&gt;&lt;br /&gt;But everything or at least the great majority of things have been finished or resolved by now (sure, the documentation is still a WiP). But the time for a proper release has come. I've just uploaded the distribution package to the &lt;a href="http://code.google.com7p/internna" target="new"&gt;project page&lt;/a&gt;. Go, check it out.&lt;br /&gt;&lt;br /&gt;Here's a brief list of what IWebMvc 2.0 finally provides:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;A full Java stack (with both client and server side)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A Spring/JPA/Hibernate robust and reliable backend&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Full AJAX connectivity using DWR&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dozens of attractive client widgets based on Dojo 1.4&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A &lt;a href="http://en.wikipedia.org/wiki/Model-driven_engineering" target="new"&gt;model driven approach&lt;/a&gt; to development&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="new"&gt;CRUD&lt;/a&gt; from the start without a line of code&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A lean development experience in line with other modern frameworks&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;It's been a year of development but the result, in my humble opinion, shines. I'm proud of releasing this software project as is and do it with a clear OSS licence like the ASL2 is.&lt;br /&gt;&lt;br /&gt;Nonetheless the development doesn't stop here and I'm already planning v3. See you there.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/phpDb_IQlio" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/4815263061771793502/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=4815263061771793502" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4815263061771793502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4815263061771793502?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/phpDb_IQlio/iwebmvc-20-ga-release-available.html" title="IWebMvc 2.0 GA release available" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/12/iwebmvc-20-ga-release-available.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8BRX8ycCp7ImA9WxBTFkw.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-7888575353592468170</id><published>2009-12-12T03:00:00.001-08:00</published><updated>2009-12-12T03:54:14.198-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-12T03:54:14.198-08:00</app:edited><title>My TODO list for 2010</title><content type="html">&lt;div style="text-align: justify;"&gt;It's that time of the year again! A lot of good wishes most of which won't ever see the light of day, of course :-) But no more introduction, here's my task list for next year:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Spring 3.0&lt;/b&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/internna/" target="new"&gt;IWebMvc2&lt;/a&gt; is rapidly approaching a final release (I'm two bugs short). I'm already thinking in features for 3.0 and the new version of Spring tops the list. I'm specially interested in the new @REST/MVC support as I want to test an AJAX approach based on &lt;a href="http://jackson.codehaus.org/" target="new"&gt;Jackson&lt;/a&gt; views.&lt;/li&gt;&lt;li&gt;&lt;b&gt;JEE6&lt;/b&gt;&lt;br /&gt;Continuing the trend IWebMvc3 will be fully JEE6 compliant. The interesting parts of the specification are the new dependency injection JSR, the new validation model, web fragments, the web profile and (why not?) asynchronous servlets.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Maven 3 / Spring Roo&lt;/b&gt;&lt;br/&gt;What am I looking for actually? Scaffolding? No, not really. I'm more in the search for a project management tool that works at source level, integrates well with an IDE/third party tools (&lt;a href="https://hudson.dev.java.net/" target="new"&gt;Hudson&lt;/a&gt;, &lt;a href="http://sonar.codehaus.org/" target="new"&gt;Sonar&lt;/a&gt;) and saves me time applying all those things common to any web application like security, logging, testing, validation, you name it.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Open Source work&lt;/b&gt;&lt;br /&gt;I'm not going to abandon IWebMvc/&lt;a href="http://code.google.com/p/iwebjtracker/" target="new"&gt;IWebJTracker&lt;/a&gt; development, of course. But in addition I want to extend my commitment with &lt;a href="http://code.google.com/p/gmaps4jsf/" target="new"&gt;Gmaps4JSF&lt;/a&gt; (you like &lt;a href="http://gmaps-utility-library-dev.googlecode.com/svn/tags/mapsicle/1.0/examples/simple_demo.html" target="new"&gt;MapSicle&lt;/a&gt;?) I may even join Hazem in his &lt;a href="http://www.mashups4jsf.com/mashups4jsf-examples/pages/welcome.xhtml" target="new"&gt;new adventure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Google projects&lt;/b&gt;&lt;br/&gt;Probably the source of most interesting news this year has been hands down, Google. I'm going to closely follow &lt;a href="http://code.google.com/p/guava-libraries/" target="new"&gt;Guava&lt;/a&gt;, &lt;a href="http://code.google.com/intl/es-ES/appengine/" target="new"&gt;GAE&lt;/a&gt;, &lt;a href="http://code.google.com/intl/es-ES/closure/" target="new"&gt;Closure&lt;/a&gt;, Chrome and may be, just may be, &lt;a href="http://code.google.com/intl/en/webtoolkit/" target="new"&gt;GWT&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;HTML 5&lt;/b&gt;&lt;br/&gt;I'm not sure if next year will complete the transition but obviously you can't miss this train.&lt;/li&gt;&lt;li&gt;&lt;b&gt;OSGi&lt;/b&gt;&lt;br/&gt;I want to test Glassfish v3 OSGi capacilities. And Spring products as well. A project that has always appealed to me has been &lt;a href="http://classworlds.codehaus.org/" target="new"&gt;classworlds&lt;/a&gt;...may this is the time?&lt;/li&gt;&lt;/ul&gt;So what is yours?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/wllMd3ExWZY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/7888575353592468170/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=7888575353592468170" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/7888575353592468170?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/7888575353592468170?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/wllMd3ExWZY/my-todo-list-for-2010.html" title="My TODO list for 2010" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/12/my-todo-list-for-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMCSHo8fyp7ImA9WxBTEks.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-4460884081126567903</id><published>2009-12-08T01:27:00.000-08:00</published><updated>2009-12-08T02:17:49.477-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-08T02:17:49.477-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FishCAT" /><title>FishCAT testing for v3</title><content type="html">&lt;div style="text-align: justify;"&gt;Last week the latest installation of the &lt;a href="http://wiki.glassfish.java.net/Wiki.jsp?page=FishCAT" target="new"&gt;FishCAT&lt;/a&gt; program came to an end. FishCAT is the GlassFish Community Acceptance Testing program, that is, a community program run by Sun to QA GF (in this case v3) that gets participants from around the globe ().&lt;br /&gt;&lt;br /&gt;I like to join it each time for several selfish reasons. After all, Netbeans + Glassfish is my preferred development platform and if I'm going to use it extensively I want to ensure that it suits my needs. In addition, neither &lt;a href="http://code.google.com/p/internna/" target="new"&gt;IWebMvc&lt;/a&gt;/&lt;a href="http://code.google.com/p/iwebjtracker/" target="new"&gt;IWebJTracker&lt;/a&gt; nor &lt;a href="http://code.google.com/p/gmaps4jsf/" target="new"&gt;GMaps4JSF&lt;/a&gt; were working in GFv3 back at the start of the program. That, of course, forced me to use Tomcat as my main development server. Fortunately Glassfish shares code with Tomcat so having something working in the later means good news to solve the problem in the former. &lt;br /&gt;&lt;br /&gt;The process is really simple, when you find an issue you post a message in the mailing list and after a preliminary revision you're asked to post a bug report in the tracker. Just this initial check was enough to fix the Gmasp4JSF issue (a bug with the application code that traversed the folder structure below /, a subtle difference with Tomcat which wouldn't complain and just set the path to /) so it's a crucial step. There's an obvious commitment with the project and an internal dev is immediately assigned to the issue and you can see steady progress right form the start.&lt;br /&gt;&lt;br /&gt;Here's a brief list of pros:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The people at Sun top the list without doubt. I haven't ever seem a team of such positive and passionate folks. Special thanks go to Judy Tang and Jan Luehe who were always helpful!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The importance given to the bugs. FishCAT is not a PR project. Sun really wants external devs to participate and puts resources to fix the issues reported. Kudos to the company here. They really understand how to run this kind of activity.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;They helped me as much as I helped them. Yes, I reported several nasty bugs in the deployment and web container components but in the process I got advices and could fix several hidden issues of my applications as well. It was a clear win-win situation for all of us.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GFv3 will be the first EE 6 implementation available and that's a feat worth some testing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tens of developers from countries as different as Germany, China, South Africa, USA or Spain to mention some&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GMaps4JSF and IWebMVc will fully work in the final release of GFv3!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;I have one con though:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For God's sake, please upgrade the network infrastructure! And that twentieth century issue tracker as well! Some days just posting a bug was such an exasperating task..&lt;/li&gt;&lt;/ul&gt;All in all, a very positive interaction indeed. I hope to see some of you next year!&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/OPld05hRjrE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/4460884081126567903/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=4460884081126567903" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4460884081126567903?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4460884081126567903?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/OPld05hRjrE/fishcat-testing-for-v3.html" title="FishCAT testing for v3" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/12/fishcat-testing-for-v3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQARnkyfip7ImA9WxNaE04.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-4798516718988665002</id><published>2009-11-27T04:26:00.000-08:00</published><updated>2009-11-27T08:12:27.796-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-27T08:12:27.796-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebJTracker" /><title>IWebJTracker progress update</title><content type="html">&lt;div style="text-align: justify;"&gt;It seems to me that as of lately I just post about IWebJTracker/IWebMvc2 progress. I guess that I don't have time for more...a pity. Nevertheless here goes another update.&lt;br /&gt;&lt;br /&gt;Next IWebJTracker milestone will be mainly based around integration. The project more or less handles issues already but it needs to communicate better.&lt;br /&gt;&lt;br /&gt;The first step in this path is providing friendly URLs. IWebJTracker has them now (for example, /project/IWEBJTRACKER will load the dashboard and automatically open the project). A bookmarking option has been also added (though I have to improve it...I'm not happy with the result yet)&lt;br /&gt;&lt;br /&gt;The second step is RSS, my preferred way to get updates on things I'm interested. I've added support to the framework and now every action should be pusblished to a feed.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/Sw_MXlzLbVI/AAAAAAAAAQ0/Y3Rkw2GY9O4/s1600/gmaps_rss.PNG"&gt;&lt;img style="display:block;margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 208px; height: 42px;" src="http://3.bp.blogspot.com/_TOuRkiuovcI/Sw_MXlzLbVI/AAAAAAAAAQ0/Y3Rkw2GY9O4/s400/gmaps_rss.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5408766383151082834" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TOuRkiuovcI/Sw_MXbiqTUI/AAAAAAAAAQs/so2cSZXJTH4/s1600/all_rss.PNG"&gt;&lt;img style="display:block;margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 208px; height: 50px;" src="http://1.bp.blogspot.com/_TOuRkiuovcI/Sw_MXbiqTUI/AAAAAAAAAQs/so2cSZXJTH4/s400/all_rss.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5408766380397448514" /&gt;&lt;/a&gt;&lt;br /&gt;And the last step would be, something that can't be missed in an issue tracker, email support. I've added the Javamail connector but I haven't yet decided the interception points. Right now, IWebJTracker only emails the user to confirm the registration process. It's a matter of adding more templates.&lt;br /&gt;&lt;br /&gt;But the user is not the only target and continuing with the Java &amp; Open Source focus, the tracker can now get updates from the remote APIs of Hudson:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/Sw_Ii1qRkpI/AAAAAAAAAQU/vIyeZdSZH9g/s1600/hudson.PNG"&gt;&lt;img style="display:block;margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 205px; height: 145px;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/Sw_Ii1qRkpI/AAAAAAAAAQU/vIyeZdSZH9g/s400/hudson.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5408762178340754066" /&gt;&lt;/a&gt;&lt;br /&gt;And Sonar (data extracted from &lt;a href="http://nemo.sonarsource.org/components/index/176188" target="new"&gt;Nemo&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/Sw_IuBqkwZI/AAAAAAAAAQc/wYLvagXskYw/s1600/sonar.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 229px; height: 173px;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/Sw_IuBqkwZI/AAAAAAAAAQc/wYLvagXskYw/s400/sonar.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5408762370541797778" /&gt;&lt;/a&gt;&lt;br /&gt;Of course some other areas have received attention as well. For example, the My Projects tab now includes a timeline chart:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/Sw_LkQMsDoI/AAAAAAAAAQk/ilSGJfkOrrk/s1600/timeline.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 229px; height: 187px;" src="http://3.bp.blogspot.com/_TOuRkiuovcI/Sw_LkQMsDoI/AAAAAAAAAQk/ilSGJfkOrrk/s400/timeline.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5408765501179170434" /&gt;&lt;/a&gt;&lt;br /&gt;And..not really coding related...I've designed a logo for the project! I do not accept critics about this ;-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/Sw_NBhoOMMI/AAAAAAAAAQ8/b3Sl5mHKlDA/s1600/iwebjtracker-logo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 333px; height: 72px;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/Sw_NBhoOMMI/AAAAAAAAAQ8/b3Sl5mHKlDA/s400/iwebjtracker-logo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5408767103585890498" /&gt;&lt;/a&gt;&lt;br /&gt;I hope you like the changes. As always, comments and help are welcome!&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/TJBY8pIkwmw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/4798516718988665002/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=4798516718988665002" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4798516718988665002?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4798516718988665002?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/TJBY8pIkwmw/iwebjtracker-progress-update.html" title="IWebJTracker progress update" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_TOuRkiuovcI/Sw_MXlzLbVI/AAAAAAAAAQ0/Y3Rkw2GY9O4/s72-c/gmaps_rss.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/11/iwebjtracker-progress-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8MSX0-eip7ImA9WxNUEUo.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-2395897790520551027</id><published>2009-11-02T00:00:00.000-08:00</published><updated>2009-11-02T08:21:28.352-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T08:21:28.352-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebJTracker" /><category scheme="http://www.blogger.com/atom/ns#" term="IWebMvc2" /><title>Yet another...issue tracker</title><content type="html">&lt;div style="text-align: justify;"&gt;I started the development of &lt;a href="http://code.google.com/p/iwebjtracker/" target="new"&gt;IWebJTracker&lt;/a&gt; because I needed to demonstrate the public and myself that &lt;a href="http://code.google.com/p/internna/" target="new"&gt;IWebMvc&lt;/a&gt; was a good enough framework that simplified development of 2.0 applications. &lt;a href="http://en.wikipedia.org/wiki/Application_lifecycle_management" target="new"&gt;Application Lifecycle management&lt;/a&gt; has always been an area of interest for me so an issue tracker seemed like a good candidate to code.&lt;br /&gt;&lt;br /&gt;The truth is that in the midtime some things have happened that affect the project (for example, &lt;a href="http://www.atlassian.com/software/jira/" target="new"&gt;Jira&lt;/a&gt; has a new version and price scheme and JetBrains has released a new product in this space, &lt;a href="http://www.jetbrains.com/youtrack/index.html" target="new"&gt;YouTrack&lt;/a&gt;). So the market situation is this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are very good commercial solutions (Jira, &lt;a href="http://www.fogcreek.com/FogBUGZ/" target="new"&gt;FogBuzz&lt;/a&gt;, YouTrack)&lt;/li&gt;&lt;li&gt;There are very good Open Source solutions (&lt;a href="http://trac.edgewall.org/" target="new"&gt;Trac&lt;/a&gt;, &lt;a href="http://www.bugzilla.org/" target="new"&gt;Bugzilla&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;But, IMHO all that doesn't change anything. I still miss an open source bug tracking system written in Java and that deploys to Tomcat out-of-the-box. So that's why IWebJTracker may still make some sense to someone down the road. Even more so if Subversion and Maven are also their target.&lt;br /&gt;&lt;br /&gt;But, make no mistake, all the above alternatives are better than IWebJTracker. Not only because they're more mature (remember this is a first milestone what I'm releasing today) but because they have a team of people (probably way better coders than I am) helping with the development. Remember that this is a one-man project coded during free hours. No more, no less.&lt;br /&gt;&lt;br /&gt;If you still want to try it out, bear with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The fact that this is not production ready&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It has obvious flaws (no notification system yet, for example)&lt;/li&gt;&lt;/ul&gt;Last, I would like to publicly thank you the rest of the people that make  possible IWebMvc first and IWebJTracker later: the DWR team, the dojo team, SpringSource, &lt;a href="http://www.schillmania.com/" title="Scott Schiller's experimental design site"&gt;Scott Schiller&lt;/a&gt;, &lt;a href="http://alexgorbatchev.com/wiki/" target="new"&gt;Alex Gorbatchev&lt;/a&gt; or &lt;a href="https://jawr.dev.java.net/" target="new"&gt;Jordi Sellés&lt;/a&gt; among others.&lt;br /&gt;&lt;br /&gt;The download is available at &lt;a href="http://code.google.com/p/iwebjtracker/downloads/list" target="new"&gt;the project page&lt;/a&gt;. And more or less resembles like this:&lt;br /&gt;&lt;br /&gt;&lt;a rel="lightbox" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TOuRkiuovcI/Su3Sh9v1FDI/AAAAAAAAAQM/TKdMKngzTlU/s1600/iwebjtracker_project_main.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 174px;" src="http://4.bp.blogspot.com/_TOuRkiuovcI/Su3Sh9v1FDI/AAAAAAAAAQM/TKdMKngzTlU/s400/iwebjtracker_project_main.png" alt="" id="BLOGGER_PHOTO_ID_5399203009239782450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a rel="lightbox" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/Su3ShIlHdoI/AAAAAAAAAP8/GTiwHQvm8gk/s1600/iwebjtracker_dashboard.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 168px;" src="http://3.bp.blogspot.com/_TOuRkiuovcI/Su3ShIlHdoI/AAAAAAAAAP8/GTiwHQvm8gk/s400/iwebjtracker_dashboard.png" alt="" id="BLOGGER_PHOTO_ID_5399202994967770754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a rel="lightbox" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/Su3ShU8yQII/AAAAAAAAAQE/RsoqBlnPhVw/s1600/iwebjtracker_issue_main.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 164px;" src="http://3.bp.blogspot.com/_TOuRkiuovcI/Su3ShU8yQII/AAAAAAAAAQE/RsoqBlnPhVw/s400/iwebjtracker_issue_main.png" alt="" id="BLOGGER_PHOTO_ID_5399202998288269442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As always feedback, opinion or help is appreciated. Look for me on the &lt;a href="http://groups.google.com/group/internna" target="new"&gt;mailing list&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/ScGupRUJmvU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/2395897790520551027/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=2395897790520551027" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2395897790520551027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2395897790520551027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/ScGupRUJmvU/yet-anotherissue-tracker.html" title="Yet another...issue tracker" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_TOuRkiuovcI/Su3Sh9v1FDI/AAAAAAAAAQM/TKdMKngzTlU/s72-c/iwebjtracker_project_main.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/11/yet-anotherissue-tracker.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEMRnk4fyp7ImA9WxNXGU4.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-8609075438196439422</id><published>2009-10-07T05:27:00.000-07:00</published><updated>2009-10-07T10:48:07.737-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-07T10:48:07.737-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebJTracker" /><title>Jira 4 raises the bar...</title><content type="html">&lt;div style="text-align: justify;"&gt;In case you've missed it, &lt;a href="http://www.dzone.com/links/jira_4_the_centre_of_your_development_team.html?ref=ps" target="new"&gt;the announcement&lt;/a&gt;. Impressive, isn't it? Obviously I can't compete! A team of engineers and thirteen months of developement..starting with Jira 3. Admittedly, I'm a lonely developer, I've been working for three months during my free time and I started from scratch! Nonetheless, I won't despair...at least &lt;a href="http://code.google.com/p/iwebjtracker/" target="new"&gt;IWebJTracker&lt;/a&gt; will be fully Open Source and it doesn't look that bad actually (given that I'm not a designer, of course). Take a look at the main screen for an issue (as of now):&lt;br /&gt;&lt;br /&gt;&lt;a rel="lightbox" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/SsyKmOg7c3I/AAAAAAAAAPs/BOIiJjQutvo/s1600/issue.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 227px;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/SsyKmOg7c3I/AAAAAAAAAPs/BOIiJjQutvo/s400/issue.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5389835243391513458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And somehow I've managed to keep things under control (which is always good if other developers decide to help):&lt;br /&gt;&lt;br /&gt;&lt;a rel="lightbox" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/SsyZZXB3WrI/AAAAAAAAAP0/-h4QjSbzBtI/s1600/sonar_1_11.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 165px;" src="http://3.bp.blogspot.com/_TOuRkiuovcI/SsyZZXB3WrI/AAAAAAAAAP0/-h4QjSbzBtI/s400/sonar_1_11.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5389851515013257906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm really looking forward to releasing a first milestone and see the acceptance it gets from the community!&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/h1hzNjiDHXk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/8609075438196439422/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=8609075438196439422" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/8609075438196439422?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/8609075438196439422?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/h1hzNjiDHXk/jira-4-raises-bar.html" title="Jira 4 raises the bar..." /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_TOuRkiuovcI/SsyKmOg7c3I/AAAAAAAAAPs/BOIiJjQutvo/s72-c/issue.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/10/jira-4-raises-bar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08EQXs-cCp7ImA9WxNQFkk.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-5679739249531914902</id><published>2009-09-22T09:50:00.000-07:00</published><updated>2009-09-22T10:50:00.558-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T10:50:00.558-07:00</app:edited><title>The problem of Open Source</title><content type="html">&lt;div style="text-align: justify;"&gt;I've just had a meeting. The topic of today was finding a way to replace a software tool in use in some random area of a client. It's a testing tool but they have tweaked it to become a robot, like say &lt;a href="http://www.autoitscript.com/autoit3/" target="new"&gt;AutoIt&lt;/a&gt;. Not that I'm against of new uses for software but, really, using a testing application to create robots to manage windows created by your own code instead of using a batch process is a little bit over the top. But I digress as the problem, of course, is other.&lt;br /&gt;&lt;br /&gt;The problem is money. Licenses in fact. The issue is they're paying some royalties to another company (one that develops and sells software) and they're uncomfortable with the situation. Nobody says it like that and so the official excuse is the programming language of the scripts, VBA. But nonetheless, it's obvious to everybody.&lt;br /&gt;&lt;br /&gt;And so they've asked me if I knew of any Open Source library written in Java, free (as in beer) with a good community (support is crucial remember?) that could handle their use case. Right there I stopped paying attention. I have some &lt;a href="http://autodrum.com/img/media/wallpapers/porsche_911_turbo_2007_03.jpg" target="new"&gt;wishes&lt;/a&gt; myself.&lt;br /&gt;&lt;br /&gt;But, at least, I got something positive out of it. I got to think about why and/or how have we reached this situation? The outlook is indeed grim. Somehow nobody feels like paying for software anymore. Everybody expects to find some OSS project out there that resolves all kind of problems but, of course, just a minority of people (let alone enterprises!) consider donating code or contributing to any project. And worst, probably us (open source developers) have helped to create this kind of environment. Right now, Open Source and gratis are synonyms in the mind of many people. What was that about birds and beers? Heck, nobody really cares.&lt;br /&gt;&lt;br /&gt;Even worse is the disgrace that plagues the OSS world: whining users. Because too soon free is not enough and people demand more and more and more. Bandwith, documentation, examples, a forum, mailing lists, developers to answer promptly their question, enhancements, side projects...you name it. Sorry, I forgot to mention, free again.&lt;br /&gt;&lt;br /&gt;So our work and time is now expected to be altruist...and then cost us something in the process. But it never works the same the other way around. Sadly, it's sometimes becoming a burden. Too hefty.&lt;br /&gt;&lt;br /&gt;A rhetorical question, when will people awake and realize this is unsustainable? I've notice a trend, each year less and less people choose Computer Science as their studies. Can't help but think that they are not that wrong.&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/2zIZccNVlE4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/5679739249531914902/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=5679739249531914902" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/5679739249531914902?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/5679739249531914902?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/2zIZccNVlE4/problem-of-open-source.html" title="The problem of Open Source" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/09/problem-of-open-source.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04EQ3o9cCp7ImA9WxNRFUo.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-4942452116164906158</id><published>2009-09-10T01:07:00.000-07:00</published><updated>2009-09-10T01:38:22.468-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-10T01:38:22.468-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebJTracker" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="generics" /><title>They say generics are stupid...</title><content type="html">&lt;div style="text-align: justify;"&gt;Who am I to blame? This how my class declaration ended up being:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;&lt;b&gt;public abstract class&lt;/b&gt; AbstractProjectManager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;C &lt;b&gt;extends&lt;/b&gt; ConnectionDetails, M &lt;b&gt;extends&lt;/b&gt; Module&amp;lt;P, M&gt; &amp; DomainEntity,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;P &lt;b&gt;extends&lt;/b&gt; Project&amp;lt;C, M&gt;&gt; &lt;b&gt;implements&lt;/b&gt; ProjectManager&amp;lt;C, P&gt; {&lt;br /&gt;...&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;With other niceties such as:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;&lt;b&gt;public interface&lt;/b&gt; Module&amp;lt;P &lt;b&gt;extends&lt;/b&gt; Project&amp;lt;?, C&gt;, C &lt;b&gt;extends&lt;/b&gt; Module&gt; {&lt;br /&gt;...&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Now, I keep looking at them and thinking "if I have to do this there's something terribly wrong going with this design!" :-)&lt;br /&gt;&lt;br /&gt;On the other hand no one seems to complain about the overall quality of the code...&lt;br /&gt;&lt;br /&gt;&lt;a rel="lightbox" title="Sonar quality report for IWebJtracker" href="http://4.bp.blogspot.com/_TOuRkiuovcI/Sqi3dDhBNXI/AAAAAAAAAPc/kMyvjssyL2g/s1600/sonar_iwebjtracker_20090910.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 386px;" src="http://4.bp.blogspot.com/_TOuRkiuovcI/Sqi3dDhBNXI/AAAAAAAAAPc/kMyvjssyL2g/s400/sonar_iwebjtracker_20090910.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5379751464681944434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So the development of IWebJtracker continues at a good pace&lt;br /&gt;&lt;br /&gt;&lt;a rel="lightbox" title="IWebJTracker Module creation component" href="http://2.bp.blogspot.com/_TOuRkiuovcI/Sqi5K8-ch3I/AAAAAAAAAPk/gt60yDtI2PM/s1600/iwebjtracker.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 237px;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/Sqi5K8-ch3I/AAAAAAAAAPk/gt60yDtI2PM/s400/iwebjtracker.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5379753352711931762" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/C4sqWgyLN5Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/4942452116164906158/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=4942452116164906158" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4942452116164906158?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/4942452116164906158?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/C4sqWgyLN5Y/they-say-generics-are-stupid.html" title="They say generics are stupid..." /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_TOuRkiuovcI/Sqi3dDhBNXI/AAAAAAAAAPc/kMyvjssyL2g/s72-c/sonar_iwebjtracker_20090910.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/09/they-say-generics-are-stupid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQAQnk-eCp7ImA9WxNREUk.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-236233703008747466</id><published>2009-09-05T01:46:00.000-07:00</published><updated>2009-09-05T02:35:43.750-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-05T02:35:43.750-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="plugins" /><category scheme="http://www.blogger.com/atom/ns#" term="gmaps4jsf" /><title>New Gmaps4JSF plug-in architecture</title><content type="html">&lt;div style="text-align: justify;"&gt;Chances are that if you have ever needed to add some kind of geolocation to a "enterprise" application you have met &lt;a href="http://code.google.com/p/gmaps4jsf/" target="new"&gt;GMaps4JSF&lt;/a&gt;. For those who haven't the name says it all really but, nonetheless, I will translate for the lazy, Google Maps for JSF, that is. There are other alternatives, and good ones, like say &lt;a href="http://liferay.exadel.com/web/guest" target="new"&gt;Richfaces&lt;/a&gt; but AFAIK this is the only one that works wirh JSF 1.1, 1.2 and 2.0, with or without AJAX, with or without Facelets and so on. Basically it works everywhere.&lt;br /&gt;&lt;br /&gt;The library is pretty complete as it already supports the map component and several children like markers, information windows, event listeners, street views et al. But it didn't span beyond what Google offers. Till now I should say. The thing is a client asked (some time ago) to provide some map functionality that unfortunately wasn't covered by Gmaps4JSF. I tried a pure Javascript approach first but, obviously, the results were not elegant in an otherwise pure server side application. Then I tried patching the library. In the end I did the job but this solution had also many drawbacks, the main one being that future releases would be incompatible with the changes and would leave the client stuck with an old version and without access to bug fixes. This was unacceptable. So I asked Hazem Saleh, the author, about a third way, creating a plugin system that could allow me and others to create new functionality without touching the core. We quickly agreed of course :-)&lt;br /&gt;&lt;br /&gt;Hands on with the task I devised a possible alternative. As Gmaps4JSF is Maven based it needed to be a new module. That was pretty clear from the start. I then tought about diving it even further and force the creation of new subprojects inside this module. Two problems remained, the first being the distribution (because I didn't want to require a new JAR download for each new plugin) and the second the integration with the core (because it should be seamless for the user).&lt;br /&gt;&lt;br /&gt;The former issue was solved by using the &lt;a href="http://maven.apache.org/plugins/maven-shade-plugin/" target="new"&gt;Shade plugin&lt;/a&gt;. I tried the &lt;a href="http://maven.apache.org/plugins/maven-assembly-plugin/" target="new"&gt;Assembly plugin&lt;/a&gt; before but felt short soon. Both Maven plugins allow the developer to group project artifacts and apply some rules in the process. The sahed plugin fitted better because it allow us to combine all JARs in a single one AND merge XML and text files to obtain a unique tag library as the result.&lt;br /&gt;&lt;br /&gt;The later was solved by designing a very simple (we want other people to contribute!) plugin architecture in the core. Just one interface (three methods) is enough to determine how a plugin interacts with the rest of the environment. So to build a new plugin you just need to follow these steps:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Get the idea&lt;/b&gt;&lt;br/&gt;My first two plugins were ported from the &lt;a href="http://code.google.com/p/gmaps-utility-library-dev/" target="new"&gt;gmaps-utility-library&lt;/a&gt; project (drag zoom and tabbed max content). There are many other.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Create a Maven module&lt;/b&gt;&lt;br/&gt;Inside the Gmaps4JSF use the maven archetype to create a new module under the plugins folder. Add it to the parent POM if so you desire.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Declare the attributes of your component&lt;/b&gt;&lt;br/&gt;Just copy&amp;amp;paste one the available components and edit the attributes you need (for example, latitude and longitude).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Implement the Plugin interface&lt;/b&gt;&lt;br/&gt;You have examples available so it should be pretty straightforward. You have access to the parent component (where your component is nested) and the map (both in JSF and Javascript).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Register the plugin&lt;/b&gt;&lt;br/&gt;Just add one line (for each plugin) with the name of the implementation class to a plugins.txt file in your META-INF directory.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Create an example&lt;/b&gt;&lt;br/&gt;Nothing sells an idea better. It's just a simple JSP page.&lt;/li&gt;&lt;/ul&gt;And that's all really. If you decide to contribute an addition to the project drop a line in the mailing list. There are many interesting extensions to the map API so now you have the opportunity to colaborate without the fear of having to understand the entrails of JSF or the code of Gmaps4JSF. And for the rest, &lt;a href="http://mashups.s43.eatj.com/gmaps4jsf-examples/" target="new"&gt;enjoy the current work!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/ltzIrfR0LNE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/236233703008747466/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=236233703008747466" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/236233703008747466?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/236233703008747466?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/ltzIrfR0LNE/new-gmaps4jsf-plug-in-architecture.html" title="New Gmaps4JSF plug-in architecture" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/09/new-gmaps4jsf-plug-in-architecture.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQCR3Y4cSp7ImA9WxNSEko.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-755534731814881771</id><published>2009-08-26T01:33:00.000-07:00</published><updated>2009-08-26T01:46:06.839-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-26T01:46:06.839-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebMvc2" /><title>IWebMvc2 Final Release Candidate available</title><content type="html">&lt;div style="text-align: justify;"&gt;So, I've finally sit down to fix all the issues in IE and added some features required by &lt;a href="http://code.google.com/p/iwebjtracker/"&gt; IWebJTracker &lt;/a&gt; (like built-in grid filters and order by). I've uploaded a version with all the patches. Quite improved IMHO. And faster but beware that miracles in IE are beyond my capabilities. As a side effect it also works in Opera 10 Beta 3 in my tests and that's good as well.&lt;br /&gt;&lt;br /&gt;Not everything are good news though as I've introduced a (very visible) nasty bug that happens when the Locator tag file is compiled. It just happens once and it's resolved by hitting reload on the browser but the first impression (a Tomcat error page) is horrid, I know. Sigh..&lt;br /&gt;&lt;br /&gt;From now on I'll try to devote more time to the issue tracker and less to the framework. Let's see how it turns out.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/u8273aUNFVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/755534731814881771/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=755534731814881771" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/755534731814881771?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/755534731814881771?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/u8273aUNFVQ/iwebmvc2-final-release-candidate.html" title="IWebMvc2 Final Release Candidate available" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/08/iwebmvc2-final-release-candidate.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8ESHk9eSp7ImA9WxNTFkQ.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-6816626890457922756</id><published>2009-08-18T12:04:00.000-07:00</published><updated>2009-08-19T08:46:49.761-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-19T08:46:49.761-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebJTracker" /><category scheme="http://www.blogger.com/atom/ns#" term="screenshots" /><title>IWebJTracker...a teaser</title><content type="html">&lt;div style="text-align: justify;"&gt;Just some screenshots so you get a taste of the current state of &lt;a href="http://code.google.com/p/iwebjtracker/" target="new"&gt;IWebJTracker&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/Sor8F2SmroI/AAAAAAAAAPE/wewnMnjjrqE/s1600-h/dashboard.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 201px;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/Sor8F2SmroI/AAAAAAAAAPE/wewnMnjjrqE/s400/dashboard.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5371382682995830402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TOuRkiuovcI/Sor8OeszcSI/AAAAAAAAAPM/KiqIB4dnnLQ/s1600-h/newproject.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 56px;" src="http://1.bp.blogspot.com/_TOuRkiuovcI/Sor8OeszcSI/AAAAAAAAAPM/KiqIB4dnnLQ/s400/newproject.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5371382831282090274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/Sor8VqPv_7I/AAAAAAAAAPU/Y74pYR4AVns/s1600-h/edit_profile.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 138px;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/Sor8VqPv_7I/AAAAAAAAAPU/Y74pYR4AVns/s400/edit_profile.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5371382954640539570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IWebJTracker is/will be the first application built using &lt;a href="http://code.google.com/p/internna/" target="new"&gt;IWebMvc2&lt;/a&gt;. I hope it will become a full &lt;a href="http://en.wikipedia.org/wiki/Application_lifecycle_management" target="new"&gt;ALM solution&lt;/a&gt; but at least it will be a Java oriented issue (bug) tracker. Open source, of course :-)&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/ZbHu44FU0-c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/6816626890457922756/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=6816626890457922756" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/6816626890457922756?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/6816626890457922756?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/ZbHu44FU0-c/iwebjtrackera-teaser.html" title="IWebJTracker...a teaser" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_TOuRkiuovcI/Sor8F2SmroI/AAAAAAAAAPE/wewnMnjjrqE/s72-c/dashboard.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/08/iwebjtrackera-teaser.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IFQXw-fyp7ImA9WxJbF00.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-2887280384191343349</id><published>2009-07-25T09:52:00.000-07:00</published><updated>2009-07-27T06:31:50.257-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-27T06:31:50.257-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IWebJTracker" /><category scheme="http://www.blogger.com/atom/ns#" term="generics" /><title>Say it with me...GE-NE-RICS</title><content type="html">&lt;div style="text-align: justify;"&gt;Sorry, I'm in a bad mood today. It must be an uphill battle I guess. I've seen people confused with generics (I'm talking about Java here). They seem to get the concept and can use generic collections pretty well. Once teached they happily write:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;Set&amp;lt;Something&gt; somethings = new HashSet&amp;lt;Something&gt;();&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;And for some unforeseeable reason they're happy with themselfs and proud of using generics. Some of them even attempt to understand advanced concepts like erasure (a concept that shouldn't even exist by the way). And, in fact, they do. Now, that's the end of the story. A dead end indeed.&lt;br /&gt;&lt;br /&gt;For the great majority generics are something, revolving collections (and comparators..or was that TOO advanced?), made by Sun so everybody can use them later in their applications. Nobody seems to go one step beyond and try to develop generic classes of their own. Go figure!&lt;br /&gt;&lt;br /&gt;So say we are designing a client application that needs to connect to several types of servers. A downright mediocre architect would write:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;public interface Server {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object openConnection(Object connectionDetails);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;He will argue that the specific types are unknown at the moment. Utter crap, of course. While an old school, barely capable, one would instead put something like:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;public interface Server {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection openConnection(ConnectionDetails connectionDetails);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Better no doubt. But it suffers the same issue, namely &lt;a href="http://mindprod.com/jgloss/downcasting.html" target="new"&gt;downcasts&lt;/a&gt;. Downcasts are obviously not elegant but they also pinpoint problems and bad practices. Avoid like the plague.&lt;br /&gt;&lt;br /&gt;Generics to the rescue. Yes, you can do better! Believe me! That's what generics are really for. Not for collections but for you! For your designs! Let's refactor that interface of us a little. What would we need? Well, we know that a connection to the server is needed and that the server implementation and hence its connection are only known by the subclass in particular. So a FTP client has to return a different connection object that a Subversion client. Fine. Starting were our old good architect left the code we could try to modify it a bit. For example:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;public interface Server&amp;lt;T extens Connection&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;T openConnection(ConnectionDetails connectionDetails);&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I know what your going to say...does that even compile? But looking at it more closely the changes are really minimum. We are just declaring a generic server that has one unknown parameter. But not completely unknown , at least we know it will be some kind of Connection object. But didn't we have that already covered with the old example? Yes..and now. Let's see an implementation. First we are going to use an abstract base class with some minor checkings:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;public abstract class AbstractServer&amp;lt;T extends Connection&gt; implements Server&amp;lt;T&gt; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected abstract T doOpenConnection(ConnectionDetails connectionDetails);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public final T openConnection(ConnectionDetails connectionDetails) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;..do some checks...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return doOpenConnection(connectionDetails);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The only interesting bit of the above code is the way we carry the generic parameter down the hierarchy. Till when? Until the final Server implementation:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;public final class SubversionServer extends AbstractServer&amp;lt;SubversionConnection&gt; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public SubversionConnection doOpenConnection(ConnectionDetails connDetails) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;See the difference now? The openConnection returns a specific class so the compiler checks the types for us! No more downcasts in the process! No class cast exceptions at runtime. And finally something to be proud of to show to your colleagues ;-)&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;PS.- In case you're wondering where that code actually comes from I'm happy to announce that I've started a new Open Source project at Google Code: &lt;a href="http://code.google.com/p/iwebjtracker/" target="new"&gt;IWebJTracker&lt;/a&gt;. It's in its infancy right now but with time it will become an issue (project?) tracker built completely in Java. Think of &lt;a href="http://trac.edgewall.org/" target="new"&gt;Trac&lt;/a&gt; or &lt;a href="http://projecttracker.riaforge.org/" target="new"&gt;Project Tracker&lt;/a&gt;. Why I'm doing it? For two reasons: first so &lt;a href="http://code.google.com/p/internna/" target="new"&gt;IWebMvc&lt;/a&gt; has a poster child application, second because there are no good OSS Java issue trackers. And by good here I mean with good &lt;a href="http://maven.apache.org/" target="new"&gt;Maven&lt;/a&gt; integration..&lt;a href="http://sonar.codehaus.org/" target="new"&gt;Sonar&lt;/a&gt;...&lt;a href="https://hudson.dev.java.net/" target="new"&gt;Hudson&lt;/a&gt;...see where I plan to go?&lt;br /&gt;&lt;br /&gt;PSS.- Any help is gladly welcome :-)&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/bvFbWvrv95M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/2887280384191343349/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=2887280384191343349" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2887280384191343349?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2887280384191343349?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/bvFbWvrv95M/say-it-with-mege-ne-rics.html" title="Say it with me...GE-NE-RICS" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/07/say-it-with-mege-ne-rics.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkICQXs-eSp7ImA9WxJUGUQ.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-2003504685480102167</id><published>2009-07-19T02:22:00.001-07:00</published><updated>2009-07-19T03:16:00.551-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-19T03:16:00.551-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Multi File Upload" /><category scheme="http://www.blogger.com/atom/ns#" term="IWebMvc2" /><title>IWebMvc2 Release Candidate 10 available</title><content type="html">&lt;div style="text-align: justify;"&gt;For the last month or so I've been able to devote some time to &lt;a href="http://code.google.com/p/internna/" target="new"&gt;IWebMvc2&lt;/a&gt; and now it pays dividends. I've just uploaded a new Release Candidate and I'm well on track for a final release at the beginning of September.&lt;br /&gt;&lt;br /&gt;This new version has several interesting upgrades.&lt;br /&gt;&lt;br /&gt;Obviously the most notorious are the two new widgets: Multifile upload and Gallery. The former allows the user to upload a number of related documents and group them in the server as one entity. Documents can be added or removed as needed. It's been built from scratch as I wasn't happy with the matching widget in version one. Visually:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TOuRkiuovcI/SmLnrZUa9CI/AAAAAAAAAOk/3VedXvzrlf8/s1600-h/multifileupload2.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 230px; height: 242px;" src="http://4.bp.blogspot.com/_TOuRkiuovcI/SmLnrZUa9CI/AAAAAAAAAOk/3VedXvzrlf8/s400/multifileupload2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5360101239241241634" /&gt;&lt;/a&gt;&lt;br /&gt;Gallery is a direct consequence. It will show all the images from a MultiDocument in a slideshow manner. It's a direct port of the same widget in IWebMvc or a &lt;a href="http://www.dojotoolkit.org/book/dojo-book-0-9/part-5-dojox/dojox-image/thumbnailpicker" target="new"&gt;ThumbnailPicker&lt;/a&gt; from Dojo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/SmLpa1mH-_I/AAAAAAAAAOs/PTImtdL8ATw/s1600-h/gallery.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 301px; height: 79px;" src="http://3.bp.blogspot.com/_TOuRkiuovcI/SmLpa1mH-_I/AAAAAAAAAOs/PTImtdL8ATw/s400/gallery.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5360103153797168114" /&gt;&lt;/a&gt;&lt;br /&gt;But the improvements do not end here. I've invested a lot of time to increase performance. The use of &lt;a href="http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html" target="new"&gt;Hibernate batch&lt;/a&gt; has, at least, halved the boot time (DB populate has gone from over a minute to less than a few seconds) and offers a better response overall. The client has benefit from the new crop of browsers greatly and the demo application runs smoothly on FF 3.5 and Chrome 2 (IE continues to be my bane).&lt;br /&gt;&lt;br /&gt;Other minor issues include:&lt;ul&gt;&lt;li&gt;This release is based on Maven2 instead of Ant+Ivy&lt;/li&gt;&lt;li&gt;Dojo 1.3.2, SoundManager2 upgrade et al&lt;/li&gt;&lt;li&gt;&lt;a href="http://sonar.codehaus.org/" target="new"&gt;Sonar&lt;/a&gt; quality assurance (including core refactorings and new unit tests)&lt;/li&gt;&lt;li&gt;And add the usual bag of bug fixes..&lt;/li&gt;&lt;/ul&gt;Of course, this is the first publicized version in a while so you may have missed...&lt;br /&gt;&lt;br /&gt;The link widget:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/SmLtCgTz0YI/AAAAAAAAAO0/iXwvrHs0pVs/s1600-h/link.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/SmLtCgTz0YI/AAAAAAAAAO0/iXwvrHs0pVs/s400/link.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5360107133812855170" /&gt;&lt;/a&gt;&lt;br /&gt;Or the poll widget...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TOuRkiuovcI/SmLtwN6fn6I/AAAAAAAAAO8/Xe_TbWR-ulQ/s1600-h/poll.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_TOuRkiuovcI/SmLtwN6fn6I/AAAAAAAAAO8/Xe_TbWR-ulQ/s400/poll.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5360107919148818338" /&gt;&lt;/a&gt;&lt;br /&gt;Or the many other...just &lt;a href="http://code.google.com/p/internna/downloads/list" target="new"&gt;check and enjoy&lt;/a&gt;!&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/l_4k_Evzwu0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/2003504685480102167/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=2003504685480102167" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2003504685480102167?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/2003504685480102167?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/l_4k_Evzwu0/iwebmvc2-release-candidate-10-available.html" title="IWebMvc2 Release Candidate 10 available" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_TOuRkiuovcI/SmLnrZUa9CI/AAAAAAAAAOk/3VedXvzrlf8/s72-c/multifileupload2.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/07/iwebmvc2-release-candidate-10-available.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUMRH88fyp7ImA9WxJUEk8.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-1408933954005764720</id><published>2009-07-10T02:56:00.000-07:00</published><updated>2009-07-10T04:44:45.177-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-10T04:44:45.177-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="sonar" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>Quality assurance with Sonar</title><content type="html">&lt;div style="text-align: justify;"&gt;It's incredible how unknown a tool like &lt;a href="http://sonar.codehaus.org/" target="new"&gt;Sonar&lt;/a&gt; is yet. I guess &lt;a href="http://www.gradle.org/" target="new"&gt;Gradle&lt;/a&gt; suffers the same destiny. After all, they're both similar in their intent, improve the quality of your software. It seems lots of people know about unit testing (not so many about &lt;a href="http://en.wikipedia.org/wiki/Code_coverage" target="new"&gt;code coverage&lt;/a&gt;), less know about tools like &lt;a href="http://checkstyle.sourceforge.net/" target="new"&gt;Checkstyle&lt;/a&gt; or &lt;a href="http://findbugs.sourceforge.net/" target="new"&gt;FindBugs&lt;/a&gt; (static analysis of code) and just a minority are aware of other esoteric metrics like cyclomatic complexity. And even the few that use all of them do not extract all the value that a dashboard provides. That's what Sonar handles, it will take your project and stress it showing the results in a visually appealing site. With no extra work from you, the only requirement is to use Ant or, preferably, Maven.&lt;br /&gt;&lt;br /&gt;But seeing is believing so I'll try to convince you showing the whole process and what kind of enhancements you'll be getting. As the demo project I've chosen &lt;a href="http://code.google.com/p/internna/" target="new"&gt;IWebMvc2&lt;/a&gt;. I've nearly finished the development by now so it's a perfect timing to improve quality. In addition it's a complex web application made of three different sub-projects so something must arise. IMHO the quality of the code is pretty good, in theory I just want proofs...did I just say humble? ;-).&lt;br /&gt;&lt;br /&gt;The first task is downloading the project and installing it. It's trivial believe me (well as long as you know how to unpack an archive...). To run Sonar just go to the bin folder, select your OS and execute the provided script. Trivial again. Sonar show be accessible (although empty) at &lt;i&gt;http://localhost:9000&lt;/i&gt; by now. Go there and login with &lt;i&gt;admin/admin&lt;/i&gt;. Select configuration and under Quality Profiles click on &lt;i&gt;Sonar way with Findbugs&lt;/i&gt;: set as default.&lt;br /&gt;&lt;br /&gt;Next step is to build our project and include the Sonar phase. This is done typing:&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;"&gt;mvn clean compile sonar:sonar&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Pretty easy, wasn't it? If the project was built successfully the console was updated and shows something like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/SlcbAwgWViI/AAAAAAAAAN4/owe8PBXwVgA/s1600-h/sonar_projects.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand; width:100%" src="http://3.bp.blogspot.com/_TOuRkiuovcI/SlcbAwgWViI/AAAAAAAAAN4/owe8PBXwVgA/s400/sonar_projects.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5356779981615027746" /&gt;&lt;/a&gt;A quick glance reveals a row per project analyzed indicating the number of rules violated and the coverage of the unit tests. There's a little bug with the latest JDK and Cobertura that reports 0% coverage always. As a workaround use JDK6_Update13 for example. The build time reflects how long ago was this information retrieved (not how long took the build itself, tricky). One click on the project shows the dashboard (this is a trimmed version):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_TOuRkiuovcI/Slcewqfb2wI/AAAAAAAAAOA/PiFs4A5vep0/s1600-h/sonar_dashboard.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100%" src="http://3.bp.blogspot.com/_TOuRkiuovcI/Slcewqfb2wI/AAAAAAAAAOA/PiFs4A5vep0/s400/sonar_dashboard.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5356784103169186562" /&gt;&lt;/a&gt;Here's the bread and butter! All kind of metrics! From the whole project. The graphic displays the number of modules (JARs) and the relative size of each one. It's used to drill down and get module specific statistics. In fact, every link allows to navigate to new pages with deeper details.&lt;br /&gt;&lt;br /&gt;Our task is to improve the quality of the project (bit by bit) so we can navigate to the &lt;i&gt;Violations&lt;/i&gt; section and get a detailed report of the problems:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_TOuRkiuovcI/SlchPJJejPI/AAAAAAAAAOI/-N9wMIINGHs/s1600-h/violations.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100%" src="http://4.bp.blogspot.com/_TOuRkiuovcI/SlchPJJejPI/AAAAAAAAAOI/-N9wMIINGHs/s400/violations.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5356786825817918706" /&gt;&lt;/a&gt;The rules are divided in several areas, some are require while others are optional. Selecting one rule gives the complete list of locations where the code fails to comply. Selecting one of those locations highlights the code:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/SlcjytD-b_I/AAAAAAAAAOQ/qAGZnucG0_g/s1600-h/sonar_error.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100%" src="http://2.bp.blogspot.com/_TOuRkiuovcI/SlcjytD-b_I/AAAAAAAAAOQ/qAGZnucG0_g/s400/sonar_error.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5356789635777196018" /&gt;&lt;/a&gt;In the above example Sonar has detected a private method that is never called. For performance and maintainability  it should be removed altogether. Now, this is not true at all because I KNOW this method is called using reflection. So I should just ignore this error (caution! static analysis tools are not perfect!). Otherwise I could simply open an IDE and correct the mistake.&lt;br /&gt;&lt;br /&gt;Of course Sonar remembers previous scenarios and can track the project life cycle (time machine they call it). Ideally you should be tying Sonar with a Continuous Integration server (out-of-the-box includes a &lt;a href="https://hudson.dev.java.net/" target="new"&gt;Hudson&lt;/a&gt; plug-in).&lt;br /&gt;&lt;br /&gt;I'm not gonna lie, quality requires effort. Even if you're an outstanding programmer. Sonar will just help (a lot actually) by providing visual and reporting tools but expect a slow (sometime tedious) climb to the top. Fortunately, in the end, it pays dividends.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/aYVsD-_LbMg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/1408933954005764720/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=1408933954005764720" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1408933954005764720?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1408933954005764720?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/aYVsD-_LbMg/quality-assurance-with-sonar.html" title="Quality assurance with Sonar" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_TOuRkiuovcI/SlcbAwgWViI/AAAAAAAAAN4/owe8PBXwVgA/s72-c/sonar_projects.PNG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/07/quality-assurance-with-sonar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYCQ3Y8fCp7ImA9WxJVGUQ.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-5792537378491309830</id><published>2009-07-07T10:13:00.000-07:00</published><updated>2009-07-07T11:09:22.874-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T11:09:22.874-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ant" /><category scheme="http://www.blogger.com/atom/ns#" term="Maven" /><category scheme="http://www.blogger.com/atom/ns#" term="Ivy" /><title>Finally...Maven</title><content type="html">&lt;div style="text-align: justify;"&gt;I've always been a happy Ant user. Even more so since &lt;a href="http://ant.apache.org/ivy/" target="new"&gt;Ivy&lt;/a&gt; has been available. Obviously that puts me in one side of the fence and I've been a very proactive supporter of that kind of project configuration. I must admit that included some rants about &lt;a href="http://maven.apache.org/" target="new"&gt;Maven&lt;/a&gt; here and there. In my biased opinion Maven lacked the flexibility that Ant provided and it was all about dependency management which was handled fine by Ivy. Probably my lack of confidence (knowledge) with the tool had some influence there too.&lt;br /&gt;&lt;br /&gt;Four things made me reconsider my position: &lt;a href="https://hudson.dev.java.net/" target="new"&gt;Hudson&lt;/a&gt;, &lt;a href="http://sonar.codehaus.org/" target="new"&gt;Sonar&lt;/a&gt;, &lt;a href="http://www.netbeans.org/" target="new"&gt;Netbeans 6.7&lt;/a&gt; and the amount of time I was spending writing scripts. At work I had to install a CI server a couple of weeks ago and I was not using &lt;a href="http://cruisecontrol.sourceforge.net/" target="new"&gt;CruiseControl&lt;/a&gt; if at all possible (bad bad memories, I guess). That left Hudson as the best option (well, for me). I spent some time through the documentation and quickly realized that Maven was quite more straightforward than Ant this time. I needed a quality tool as well and Sonar has always been on my radar. Sonar works (again) out-of-the-box with Maven and requires some extra configuration with Ant. Being the lazy developer that I am I decided to test Maven with one project and see the results.&lt;br /&gt;&lt;br /&gt;My first impression was pretty favorable. Migrating a simple Java project was a breeze and setting the job in Hudson trivial. I had the statistics online in less than half an hour. Finally I was understanding what was so good with Maven. It was not transitive dependency management, it was Convention over Configuration with the added benefit that other people where writing very interesting plugins for me. With absolutely no work on my side I had an automated build, quality control (testing plus quality assurance) and Jetty running. By now, I was in love with Maven. In more detail:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Zero configuration&lt;/b&gt;&lt;br/&gt;So much time lost with Ant refurbishing the same scripts time and again...&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Dependency management&lt;/b&gt;&lt;br/&gt;I found Maven quite easier to handle than Ivy. I really really missed the master configuration of Ivy though (it saves time when you don't want transitivity for any reason).&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;IDE support&lt;/b&gt;&lt;br/&gt;Today all major IDEs include seamless integration with Maven2. Latest Netbeans release, in particular, works wonders (the &lt;a href="http://maven.apache.org/plugins/maven-reactor-plugin/" target="new"&gt;reactor plugin&lt;/a&gt; is awesome). Ivy support is scarce by contrast.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Redistribution&lt;/b&gt;&lt;br/&gt;I've had to invest quite some work, many times, to offer Ant+Ivy scripts along with different project files (Eclipse, Netbeans, IDEA) to appease all kind of users. Not any longer. POMs are treated as first class citizens everywhere now. With the added benefit that I'll be able to upload the builds to the &lt;a href="http://mvnrepository.com/" target="new"&gt;central repository&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Future&lt;/b&gt;&lt;br/&gt;I'm under the impression that things like OSGi will be pretty much simpler with this approach.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;All in all, I'm leaving Ant. For good. I can't say anything but praises about Ant, it's been years of comradery. And yes, it's a somewhat sad situation but I can't help seeing it obsolete, overridden..&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/bNX0w4tD-Nk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/5792537378491309830/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=5792537378491309830" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/5792537378491309830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/5792537378491309830?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/bNX0w4tD-Nk/finallymaven.html" title="Finally...Maven" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/07/finallymaven.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUHQXg9cCp7ImA9WxJQEUs.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-399693386709876223</id><published>2009-05-24T13:05:00.000-07:00</published><updated>2009-05-24T04:07:10.668-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-24T04:07:10.668-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Framework Smackdown" /><title>Web framework comparison - Prototyping</title><content type="html">&lt;div style="text-align: justify;"&gt;Some may say I have a biased opinion on the topic at hand. True. I hereby declare that I have a clear preference for &lt;a href="http://code.google.com/p/internna/" rel="external"&gt;dojo+DWR+Spring MVC&lt;/a&gt;. But I happen to have a cruel client as well and when they asked me to prepare a comparison between several modern web frameworks they purposely left Spring behind. The aim here was to build quick prototypes of enterprise applications to test new ideas proposed by the business people. Obviously they current architecture is a little bit outdated and not suitable for the task.&lt;br /&gt;&lt;br /&gt;They gave me a blank sheet to start although they did mention &lt;a href="http://rubyonrails.org/" rel="external"&gt;Ruby On Rails&lt;/a&gt; and &lt;a href="http://code.google.com/intl/en/webtoolkit/" rel="external"&gt;GWT&lt;/a&gt;. The first one was in the origin of everything, a new board member had recently joined the company and in his former position they were using RoR for the task. The second was probably due to the fact that several projects had spawned recently with Flex+BlazeDS as the client side technology but noone was really sure if it was the right path.&lt;br /&gt;&lt;br /&gt;Given this requirements I selected &lt;a href="http://seamframework.org/" target="new"&gt;Seam&lt;/a&gt;, &lt;a href="http://aribaweb.org/" target="new"&gt;AribaWeb&lt;/a&gt; and &lt;a href="http://www.grails.org/" target="new"&gt;Grails&lt;/a&gt; as well.&lt;br /&gt;&lt;br /&gt;Obviously this is not an apples-to-apples comparison. Ariba and Seam are both full Java stacks. RoR and Grails are server side backends very oriented to relational database repositories. While GWT is a RIA tool to layout views in pure Java with some communication middleware, like say, dojo+DWR or, as already mentioned, Flex+BlazeDS could be.&lt;br /&gt;&lt;br /&gt;But it makes for an interesting analysis anyway.&lt;br /&gt;&lt;br /&gt;The criteria to elect the champion contain the following points:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Learning curve&lt;/b&gt;&lt;br/&gt;We are talking about three hundred programmers that haven't ever coded in anything but JSF 1.1. Let's make the jump feasible.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Prototyping&lt;/b&gt;&lt;br/&gt;How suited for the task is the project? A scripting language seems better to throw something quickly even though it's not maintainable later. On the other hand, a good IDE with good component integration, a drag'n drop visual editor and a preview screen makes stupidly easy to churn pages.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Productivity&lt;/b&gt;&lt;br/&gt;How good are the APIs and third party libraries? How much code and configuration is needed to kick start a project? How easily is to connect client and server development?&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;CRUD&lt;/b&gt;&lt;br/&gt;Enterprise applications today always need to interact with a persistent backend.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Killer features&lt;/b&gt;&lt;br/&gt;Selling points for the upper management. What does this framework better? Where does it really shine? What unique characteristics does it put on the table?&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Weakness&lt;/b&gt;&lt;br/&gt;And what about these...?&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;b&gt;Maturity, popularity&lt;/b&gt;&lt;br/&gt;Is it a safe choice? Will it be around in the not so distant future?&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;There were others but neither as interesting (licensing, standardization) nor useful to you (migration, code reusability) so these make a good list. I'm not posting the tabular data for two reasons, first it depends heavily on the weights you assign to each column and second it's subjective and I don't want to start a flame war.&lt;br /&gt;&lt;br /&gt;But here are my personal conclussions.&lt;br /&gt;&lt;br /&gt;In the first round both RoR and GWT fell off the roaster but for very different reasons. In the case of RoR it scored very well in every technical category but, even if I could use it, the truth is a company like this is pretty commited to Java/JEE and such a rupture means time and money. And they're both scarce this days. Maybe for highly innovative teams in core areas but not as a general purpose tool. GWT didn't fare equally well. First for a RIA builder it lacks a decent widget library. Then I like DWR remoting better(biased again?). And finally it shuns standards like a plague. With this conditioning you're better served by Flex. Any day.&lt;br /&gt;&lt;br /&gt;The second round saw, and this was a suprise, Grails fail. Grails happens to have the same punch as Rails and then some more. A great ORM that simplifies greatly CRUD operations (nothing really can beat code generation and a &lt;i&gt;book.save()&lt;/i&gt;), scripting capabilities, joint compilation, Spring et al. Unfortunately it lacks a matching client plug-in. Flex is not there yet and dojo is too much work for a solution specifically looking for speed of development. The syntax is concise but many times awkward and in general Groovy/Grails still lack maturity (IDE support is minimum, plug-ins quality varies greatly, too many bugs yet). I guess you get used to Java's 24 months release cycle with bullet proof quality. Groovy is different in this aspect. I have good feelings about it (more with SpringSource behind the projects) but it takes time.&lt;br /&gt;&lt;br /&gt;The two final candidates provide the full stack, client and server. Seam is IMHO more powerful and a safer choice in general. The people behind Seam are the same that participate in several JSRs and other high profile projects like Hibernate. JBOSS has always been a very active OSS player and the quality of the components (EJB3, Richfaces, JBOSS Tools, Hibernate) is out of question. There's very little bad I can say about Ariba. It's new (very new) in the OSS space and the look&amp;amp;feel is not spectacular (subjective I know). That last bit was important because you want the wow factor when showing a innovative project to the final user. I have to admit that JSF weighed in favor of Seam here but in the end it was a worthy winner for us this time. Kudos to them!&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/OcFwQTRJ8Ic" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/399693386709876223/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=399693386709876223" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/399693386709876223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/399693386709876223?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/OcFwQTRJ8Ic/web-framework-comparison-prototyping.html" title="Web framework comparison - Prototyping" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/04/web-framework-comparison-prototyping.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYNRnY-cSp7ImA9WxJRE04.&quot;"><id>tag:blogger.com,1999:blog-1248732249041870352.post-1051076811941151197</id><published>2009-05-12T03:05:00.000-07:00</published><updated>2009-05-14T12:43:17.859-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-14T12:43:17.859-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Webflow" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Book review - Spring Web Flow Web Development</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;center&gt;&lt;div style="border: 1px solid gray; padding: 5px 2px 5px 3px; font-family: courier new; font-size: 12px; background-color: #E0E0E0;width:75%;text-align:center"&gt;This article was &lt;a href="http://java.dzone.com/articles/book-review-spring-web-flow" target="new"&gt;promoted to JavaLobby&lt;/a&gt; as well&lt;/div&gt;&lt;/center&gt;&lt;br /&gt;Right now there are two trends to develop web applications, either you choose the RIA model or a conversational approach.  In the former, say Flex with Cairgorm, both the model and the state is handled by the client. In the later, the server manages the scope sending a view to the browser which acts as a renderer. Of course, interactivity has improved over the years and nowadays partial requests are a must to improve user experience. &lt;a href="http://www.springsource.org/webflow" target="new"&gt;Spring WebFlow&lt;/a&gt; is the SpringSource approach to a server side (work/page) flow management for web applications and &lt;a href="http://www.packtpub.com/develop-powerful-web-applications-with-spring-web-flow-2/book" target="new"&gt;Spring Web Flow Web Development, the book,&lt;/a&gt; (I could think of better names!) tries to explain how to leverage it.&lt;br /&gt;&lt;br /&gt;The task is not minor because, let's face it, Java is a very complex platform and to start with WebFlow you should have a good understanding of JEE (at least JSF and the Servlet APIs), Spring and MVC in general. AJAX is welcome as well. The book, of course, can't help you there (you'd need a whole collection for that). This is not for novices! Fortunately a lot of people have learned JEE and Spring through the years and it's a matter of learning Webflow step by step but in depth.&lt;br /&gt;&lt;br /&gt;Now, here the book shines. I like the formating, very clear and clean, and the language, simple and direct. I would have changed the chapter structure a little though. I missed individual chapters for persistence (Security has one) and Spring MVC (Faces has one) and I would have reordered some things here and there (configuration is scattered) but that's subjective and overall the steps make sense. The concepts (flow, action, state, transition, continuation) are well defined and you get a grasp pretty soon but some times the book is too comprehensive like when enumerating the methods and fields of the available variables (messageContext, flowExecutionContext et al). This makes for a hard reading but it will be invaluable as a reference book to some. I prefer IDEs for that task though. In the same sense I missed more diagrams and graphs (I'm not referring to UML class diagrams here). In a book about flows it should be pretty easy to plot concepts using some circles here and there. In my mind, circles are not less valuable than XML snippets (the book has tons of these don't worry) and the reader will gladly accept some pictures to clarify concepts (and thank you for them). Nothing too fancy, this one (extracted from the book) is more than enough:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_TOuRkiuovcI/SgvURrfOspI/AAAAAAAAAM0/NNHFcQSMRJM/s1600-h/webflow_scopes.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_TOuRkiuovcI/SgvURrfOspI/AAAAAAAAAM0/NNHFcQSMRJM/s400/webflow_scopes.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5335591583747060370" /&gt;&lt;/a&gt;&lt;br /&gt;In summary, the book is extensive and a great tool to learn first, and as a reference guide later, to Spring Webflow. It's dense and it explains lots of concepts in depth. Be warned that to extract all value this book requires previous knowledge of complex notions, among them: Spring, JSF, AJAX, persistence/ORM, Security, unit testing and probably more. The authors have made the effort to introduce all these libraries/skills when they're first used but that just lessens the burden (a bit). All in all, an easy candidate to recommend to those who need to extract all the power that Webflow 2 has to offer or teams that are about to start a new project and need an initial push with the technology.&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InternnaOSS/~4/RVAqJBBRMiA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://internna.blogspot.com/feeds/1051076811941151197/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1248732249041870352&amp;postID=1051076811941151197" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1051076811941151197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1248732249041870352/posts/default/1051076811941151197?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InternnaOSS/~3/RVAqJBBRMiA/book-review-spring-web-flow-web.html" title="Book review - Spring Web Flow Web Development" /><author><name>Jose Noheda</name><uri>http://www.blogger.com/profile/05894885162810151648</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_TOuRkiuovcI/SgvURrfOspI/AAAAAAAAAM0/NNHFcQSMRJM/s72-c/webflow_scopes.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://internna.blogspot.com/2009/05/book-review-spring-web-flow-web.html</feedburner:origLink></entry></feed>
